Compare commits

...

76 Commits

Author SHA1 Message Date
Kalista Payne
7ecb83dc7e 5.40.2 2025-09-08 15:40:45 -05:00
Weblate
e8ffe2286c Translated using Weblate (Japanese)
Currently translated at 92.5% (3183 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (283 of 284 strings)

Translated using Weblate (German)

Currently translated at 99.2% (3415 of 3441 strings)

Translated using Weblate (German)

Currently translated at 98.7% (3397 of 3441 strings)

Translated using Weblate (Ukrainian)

Currently translated at 56.6% (1948 of 3441 strings)

Translated using Weblate (Ukrainian)

Currently translated at 88.1% (760 of 862 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (284 of 284 strings)

Translated using Weblate (Ukrainian)

Currently translated at 97.8% (278 of 284 strings)

Translated using Weblate (Japanese)

Currently translated at 92.2% (3174 of 3441 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (German)

Currently translated at 98.2% (3382 of 3441 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 85.7% (210 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 89.3% (825 of 923 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 87.8% (811 of 923 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 87.1% (804 of 923 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 30.2% (74 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 29.7% (73 of 245 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 83.0% (157 of 189 strings)

Translated using Weblate (Japanese)

Currently translated at 92.1% (3171 of 3441 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 82.6% (224 of 271 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.7% (108 of 114 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 82.0% (155 of 189 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.3% (917 of 923 strings)

Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
Co-authored-by: Luizo <t.czj2019@gmail.com>
Co-authored-by: Lyam Santos Peres <kaka1213spaenrteoss@gmail.com>
Co-authored-by: Mateus Scheper <mateus_scheper@hotmail.com>
Co-authored-by: Sara Olson <sara@habitica.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Музика Анастасія <ukrainianbimba25@gmail.com>
Co-authored-by: インコ <ayakabooker@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translation: Habitica/Backgrounds
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Limited
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Subscriber
2025-09-08 22:12:28 +02:00
Phillip Thelen
fe63436a57 Shorten missing auth headers error and include forwarder-for header 2025-09-05 11:10:20 +02:00
Phillip Thelen
5b93b9b37a fix crash on startup 2025-09-05 11:02:59 +02:00
Phillip Thelen
1d55027791 Trim logs sent to loggly (#15503)
* try making missing x-client header errors smaller

* add server emoji as tag

* always truncate headers
2025-09-04 14:36:23 -05:00
Kalista Payne
83f0984da1 5.40.1 2025-09-04 14:06:39 -05:00
Weblate
53d4f75cab Merge branch 'origin/develop' into Weblate. 2025-09-04 21:05:40 +02:00
Phillip Thelen
da45eb2adf Fix client side errors that happened on page load (#15502)
* fix momentjs error on page load

* use correct method to set moment locale

* fix vue draggable deprecation
2025-09-04 13:44:31 -05:00
Kalista Payne
3bf4af8d8b Set up analytics scripts on demand post user load (#15501)
* fix(analytics): can't get consented user during main,js load

* fix(race): don't let gtag load twice
also refactor to avoid unnecessary _getConsentedUser() calls

* fix(lint): need user ID for gtag config

* fix(analytics): adjust script loads and refs

* fix(vue): try moving plugin to most relevant file

* fix(amplitude): correct event fn

* fix(analytics): direct load gtag from uri

* fix(ga): use ga-gtag for loading google

* fix(lint): import order

* refactor(analytics): remove superfluous setUser fn

* fix(amplitude): return to Javascript SDK syntax

* refactor(misc): remove unneeded asyncs

* refactor(analytics): slim down if checks
2025-09-04 13:43:18 -05:00
Weblate
f030691fac Translated using Weblate (German)
Currently translated at 98.2% (3380 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 92.1% (3171 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (German)

Currently translated at 98.1% (3378 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Japanese)

Currently translated at 94.7% (817 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 93.4% (229 of 245 strings)

Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: インコ <ayakabooker@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translation: Habitica/Backgrounds
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Questscontent
2025-09-04 17:23:27 +02:00
Kalista Payne
1f94e51693 fix(migration): updateOne and minor usability refactor 2025-09-02 15:50:07 -05:00
Kalista Payne
86e7d7a72b 5.40.0 2025-09-02 09:01:10 -05:00
Weblate
140b852e03 Translated using Weblate (German)
Currently translated at 98.1% (3376 of 3441 strings)

Translated using Weblate (Russian)

Currently translated at 83.0% (225 of 271 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Russian)

Currently translated at 96.5% (415 of 430 strings)

Translated using Weblate (Russian)

Currently translated at 87.0% (2995 of 3441 strings)

Translated using Weblate (Russian)

Currently translated at 73.0% (179 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 98.9% (191 of 193 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (Russian)

Currently translated at 93.0% (254 of 273 strings)

Translated using Weblate (German)

Currently translated at 98.0% (3374 of 3441 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 80.4% (197 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 91.8% (3160 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 97.4% (264 of 271 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 96.3% (186 of 193 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 96.7% (893 of 923 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 88.9% (821 of 923 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 88.8% (820 of 923 strings)

Translated using Weblate (German)

Currently translated at 97.9% (3372 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Japanese)

Currently translated at 94.4% (814 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 94.4% (814 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 93.0% (228 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 91.4% (224 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 89.7% (220 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Polish)

Currently translated at 77.1% (219 of 284 strings)

Translated using Weblate (Polish)

Currently translated at 93.4% (402 of 430 strings)

Translated using Weblate (Polish)

Currently translated at 51.6% (1776 of 3441 strings)

Translated using Weblate (Polish)

Currently translated at 89.9% (170 of 189 strings)

Translated using Weblate (Polish)

Currently translated at 33.8% (83 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (Japanese)

Currently translated at 97.4% (264 of 271 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (283 of 284 strings)

Translated using Weblate (Japanese)

Currently translated at 94.3% (813 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 33.4% (82 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (271 of 271 strings)

Co-authored-by: Avoren5 <avoren@tuta.io>
Co-authored-by: Igor <777igor93@gmail.com>
Co-authored-by: Izzy <nineyellowgirl@gmail.com>
Co-authored-by: Kalista Payne <kalista@habitica.com>
Co-authored-by: TOMA Mitsuru <toma0001@gmail.com>
Co-authored-by: Thaíssa <zj8c8wkai@mozmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: インコ <ayakabooker@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/character/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/ja/
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2025-09-02 14:30:16 +02:00
Kalista Payne
8f949ce1cc fix(privacy): 18+ restriction 2025-08-29 16:12:12 -05:00
Weblate
5e21285370 Merge branch 'origin/develop' into Weblate. 2025-08-29 22:47:41 +02:00
Kalista Payne
7a65bc2d8d fix(privacy): wire up modal 2025-08-29 15:46:28 -05:00
Kalista Payne
a32fadbcbd fix(analytics): grab missing GA ID 2025-08-29 15:46:28 -05:00
Kalista Payne
305192ed1f fix(analytics): record user ID in GA if consented 2025-08-29 15:46:28 -05:00
Kalista Payne
7644e202c9 fix(lint): whitespace 2025-08-29 15:46:28 -05:00
Kalista Payne
d11c8442ef fix(settings): consistent layout with modal 2025-08-29 15:46:28 -05:00
Kalista Payne
d8b5391425 fix(terms): copy edits 2025-08-29 15:46:28 -05:00
Kalista Payne
dd287cd719 fix(signup): 18+ verbiage, refactor forms scss 2025-08-29 15:46:27 -05:00
Kalista Payne
e809d1f6e4 Privacy Controls (#15492)
* WIP(privacy): start of banner

* WIP(privacy): layout rough

* WIP(privacy): mobile layout, add modal

* fix(privacy): implement toggle disable and setting row fold

* fix(privacy): clean up a couple of styles

* fix(privacy): adjust banner width at mobile sizes

* WIP(privacy): remove Loggly echo of Amplitude data

* fix(banners): account for privacy in snackbar position

* WIP(privacy): dismiss banner

* chore(analytics): update to maintaned GA4 library

* fix(tests): lint, misuse of apiError

* fix(analytics): add debug mode

* fix(analytics): load new library on client

* WIP(privacy): gtag.js based implementation

* fix(analytics): lint issues

* fix(lint): one more unused

* fix(lint): client errors

* feat(privacy): draft workflows

* fix(analytics): linting, send needed user values

* fix(tests): use mock analytics service in test env

* fix(tests): restore previous logic for node env

* feat(intro): jump to page 2 onboarding

* WIP(auth): revisions to registration flow

* WIP(privacy): landing page and banner revisions

* WIP(signup): added new username, tos, privacy state

* fix(signup): revert debugging logic

* WIP(signup): add defaulting and checkbox

* wip(signup): move social auth behind username screen

* Squashed commit of the following:

commit ca0a238e5f008525ed154c5eaf12e44f2fc22b00
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed May 7 12:17:20 2025 +0200

    make emails lowercase

commit a2ce748558ce9134e6825208a7e66d78e720202e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:27:01 2025 +0200

    remove unused import

commit cc6ce6c388d9693cf192c4bea733931fc8c31c37
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:13:03 2025 +0200

    add tests for new api route

commit 0d40a6230b548625482aa9f6831c93ed9d62533a
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 18 15:50:22 2025 -0500

    update social tests

commit 79177d6754589b9e54682af8a531b63f60215dab
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:51 2025 +0200

    new api route to check if an email is available

commit 11df73fe07eeb730c2a95593e18e14a931f52429
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:39 2025 +0200

    Add field to not register social account when called

* Squashed commit of the following:

commit b8a2f0b8ee
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Jun 20 17:18:30 2024 -0400

    update privacy policy

* fix(vite): import syntax

* feat(auth): precheck on defaulted username

* feat(auth): add store action for check-email

* feat(auth): check email before proceeding

* WIP(login): refactor username screen

* WIP(auth): complete login/reg flow

* fix(auth): filter out expected 404

* fix(login): use allowRegister with Apple
and add z-index to component

* fix(login): style corrections and email passthru

* Fix edgecase

Signed-off-by: Kalista Payne <sabrecat@gmail.com>

* fix(auth): correct error behaviors

* fix(auth): rewire Apple auth

* make check-email check for restricted domains

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): all the style

* fix(express): return when responding

* fix(error): reduce specificity for restricted domain issue

* fix apple auth

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): change from blur to 500ms debounce

* fix(login): add missing 200 response in Apple flow

* fix(signup): more reconciliation with @phillipthelen's work

* fix(signup): now using token not code

* fix(reg): don't bail on Apple if we're allowing reg

* fix(auth): more reconciliation with @phillipthelen code

* feat(copy): privacy policy updates

* fix(copy): replace placeholder

* fix(vue): use Vite syntax for scss import

* fix(static): corrections to copy and css

* chore(style): remove excess whitespace

* use correct error

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(layout): inputs, add privacy banner

* fix(login): button hover, more validation states

* fix(login): further layout and UX corrections

* fix(static): add back containing div for show/hide

* fix(apple): clean out Apple token

* fix(settings): only change preference on save

* fix(settings): correct save/cancel behavior

* fix(layout): consistent use of header/footer

* fix(layout): reposition mountains for reg/login/forgot

* fix(signup): partial rollback of /username route

* refactor(signup): move /username to page

* fix(apple): don't overwrite reg method

* fix(username): don't skip empty validation

* fix(input): don't show valid if no username

* fix(login): clean out Apple token if using another method

* fix(apple): possible race with token

* fix(tests): some housekeeping

* fix(config): copypasta

* fix(lint): various cleanup

* fix(lint): line squeeze

* fix(lint): one more v-for

* fix(groups): funnel invite flow to new username page

* Squashed commit of the following:

commit 3c5ba4bf24e4bb7996786520101f27ad66405bce
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:38:31 2025 -0500

    fix(privacy): update link ref

commit 9d216f623b
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:18:22 2025 -0500

    fix(privacy-tos): copy edits cont'd

commit d744f47140
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 13:43:22 2025 -0500

    fix(privacy): copy edits and ToC reflow

commit 2c3c3fc9ce
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:46:24 2025 +0200

    lint

commit cf363034d5
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:54 2025 +0200

    fix link

commit 3afacd2c05
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:42 2025 +0200

    add updated terms

commit 258b722499
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:42 2025 +0200

    put back button to show/hide third party info

commit 2992e0299b
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:32 2025 +0200

    minor edits

commit bb5e252299
Author: Kalista Payne <kalista@habitica.com>
Date:   Sun Aug 17 21:01:50 2025 -0500

    fix(privacy): update Section 3

commit c79af7baa8
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 15 17:28:49 2025 -0500

    fix(privacy): various copy edits

commit 100f2f4574
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:37:37 2025 +0200

    add newline

commit 11d1cfd0d9
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:10:01 2025 +0200

    update privacy policy

commit 59b99badf3
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 14:04:19 2025 -0500

    5.38.2

commit 78daeb4191
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 13:36:19 2025 -0500

    fix(apple): don't run auth middleware during redirect

commit 93f8d60903
Author: Weblate <noreply@weblate.org>
Date:   Fri Aug 8 10:12:25 2025 +0200

    Translated using Weblate (German)

    Currently translated at 99.4% (185 of 186 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (54 of 54 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (Dutch)

    Currently translated at 78.0% (2643 of 3385 strings)

    Translated using Weblate (Dutch)

    Currently translated at 40.8% (100 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 89.9% (233 of 259 strings)

    Translated using Weblate (Dutch)

    Currently translated at 67.5% (175 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (110 of 110 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 20.8% (51 of 245 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.9% (44 of 245 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Linsey Dunya Pastoor <sekai.creations@gmail.com>
    Co-authored-by: Mete Olmez <metezori27@gmail.com>
    Co-authored-by: Sefa Uğurlu <ugurlusefa2@gmail.com>
    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: innnko <ayakabooker@gmail.com>
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/challenge/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/pl/
    Translation: Habitica/Backgrounds
    Translation: Habitica/Challenge
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Death
    Translation: Habitica/Defaulttasks
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Settings

commit eb16fec41e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Aug 6 22:08:07 2025 +0200

    Add interface to block ip-addresses or clients due to abuse (#15484)

    * Read IP blocks from database

    * begin building general blocking solution

    * add new frontend files

    * Add UI for managing blockers

    * correctly reset local data after creating blocker

    * Tweak wording

    * Add UI for managing blockers

    * restructure admin pages

    * improve test coverage

    * Improve blocker UI

    * add blocker to block emails from registration

    * lint fix

    * fix

    * lint fixes

    * fix import

    * add new permission for managing blockers

    * improve permission check

    * fix managing permissions from admin

    * improve navbar display for non fullAccess admin

    * update block error strings

    * lint fix

    * add option to errorHandler to skip logging

    * validate blocker value during input

    * improve blocker form display

    * chore(subproj): reconcile habitica-images

    * fix(scripts): use same Mongo version for dev/test

    * fix(whitespace): eof

    * documentation improvements

    * remove nconf import

    * remove old test

    ---------

    Co-authored-by: Kalista Payne <kalista@habitica.com>
    Co-authored-by: Kalista Payne <sabrecat@gmail.com>

commit 47d832bf12
Author: Fiz <34069775+Hafizzle@users.noreply.github.com>
Date:   Tue Aug 5 15:12:44 2025 -0500

    Add backend support for Hydra mount (#15482)

    * chore: update time travelers shop to display seasonal backgrounds

    * chore: update time travelers banner (note CSS borken rn)

    * chore: fix borken CSS and update logic in shop

    * chore: added isSubscribed function, not working

    * chore: isSubscribed working but no bg for subscribers

    * chore: logic and css updates

    * chore: update habitica-images

    * chore: add check for trinket

    * chore: more time traveler shop logicking

    * Add backend support for Hydra mount

    - Add Dragon-Hydra to special mounts in stable.js
      - Configure as contributor level 7 reward with canFind: true
      - Add GIF format support for mount sprites
      - Enable admin panel granting capability

    * Fix Vue template errors in timeTravelers component

    * Fix duplicate template block in timeTravelers component

    * add CSS for Hydra mount GIF sprites

    Added CSS rules for Mount_Head_Dragon-Hydra and Mount_Body_Dragon-Hydra GIF sprites

    * Remove the separate Hydra mount dimension declaration

    ---------

    Co-authored-by: CuriousMagpie <eilatan@gmail.com>

commit c03ab9855f
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 5 14:31:05 2025 -0500

    5.38.1

commit 8f96b7b7fd
Author: Weblate <noreply@weblate.org>
Date:   Tue Aug 5 13:02:45 2025 +0200

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.1% (42 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.7% (41 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.3% (40 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.8% (425 of 430 strings)

    Translated using Weblate (French)

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.9% (39 of 245 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (Polish)

    Currently translated at 95.5% (128 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.7% (254 of 268 strings)

    Translated using Weblate (Polish)

    Currently translated at 94.0% (126 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.6% (424 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.3% (423 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (798 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.4% (797 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.6% (781 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3112 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3111 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.0% (174 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (8 of 8 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.5% (38 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.5% (173 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.6% (279 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Japanese)

    Currently translated at 89.2% (769 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.4% (253 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 97.9% (421 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.6% (251 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.8% (168 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.1% (37 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Croatian)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Korean)

    Currently translated at 22.8% (56 of 245 strings)

    Translated using Weblate (Korean)

    Currently translated at 47.7% (128 of 268 strings)

    Translated using Weblate (Croatian)

    Currently translated at 45.1% (121 of 268 strings)

    Translated using Weblate (Korean)

    Currently translated at 71.9% (620 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 70.6% (609 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 75.0% (6 of 8 strings)

    Translated using Weblate (Korean)

    Currently translated at 67.6% (291 of 430 strings)

    Translated using Weblate (Korean)

    Currently translated at 52.8% (1788 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 50.3% (1706 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 51.7% (134 of 259 strings)

    Translated using Weblate (Czech)

    Currently translated at 92.8% (130 of 140 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 86.9% (233 of 268 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (Danish)

    Currently translated at 92.1% (105 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 89.4% (102 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 83.5% (112 of 134 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 71.6% (308 of 430 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (Serbian)

    Currently translated at 84.4% (49 of 58 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 51.4% (144 of 280 strings)

    Translated using Weblate (Swedish)

    Currently translated at 66.5% (286 of 430 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Slovak)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Romanian)

    Currently translated at 66.7% (287 of 430 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (430 of 430 strings)

    Translated using Weblate (Danish)

    Currently translated at 66.0% (284 of 430 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (300 of 430 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.7% (3377 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 54.1% (1834 of 3385 strings)

    Translated using Weblate (Serbian)

    Currently translated at 50.6% (1714 of 3385 strings)

    Translated using Weblate (Slovak)

    Currently translated at 50.0% (1695 of 3385 strings)

    Translated using Weblate (Romanian)

    Currently translated at 60.5% (2050 of 3385 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 38.4% (1301 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Danish)

    Currently translated at 54.0% (1829 of 3385 strings)

    Translated using Weblate (Czech)

    Currently translated at 59.6% (2020 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 75.6% (140 of 185 strings)

    Translated using Weblate (Serbian)

    Currently translated at 73.5% (136 of 185 strings)

    Translated using Weblate (Slovak)

    Currently translated at 84.8% (157 of 185 strings)

    Translated using Weblate (Romanian)

    Currently translated at 78.9% (146 of 185 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 82.1% (152 of 185 strings)

    Translated using Weblate (Italian)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Danish)

    Currently translated at 77.2% (143 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.7% (242 of 245 strings)

    Translated using Weblate (Czech)

    Currently translated at 75.1% (139 of 185 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 74.5% (138 of 185 strings)

    Translated using Weblate (Czech)

    Currently translated at 8.1% (20 of 245 strings)

    Translated using Weblate (Swedish)

    Currently translated at 72.0% (621 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.1% (562 of 862 strings)

    Translated using Weblate (Slovak)

    Currently translated at 66.9% (577 of 862 strings)

    Translated using Weblate (Romanian)

    Currently translated at 77.7% (670 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 70.0% (604 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Italian)

    Currently translated at 86.8% (749 of 862 strings)

    Translated using Weblate (Indonesian)

    Currently translated at 86.0% (742 of 862 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.0% (845 of 862 strings)

    Translated using Weblate (Danish)

    Currently translated at 69.9% (603 of 862 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (601 of 862 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 66.3% (572 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 74.0% (305 of 412 strings)

    Translated using Weblate (Turkish)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Danish)

    Currently translated at 90.0% (371 of 412 strings)

    Translated using Weblate (Ukrainian)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Swedish)

    Currently translated at 53.6% (139 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Danish)

    Currently translated at 62.1% (161 of 259 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 54.0% (140 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 82.8% (222 of 268 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.3% (241 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 88.4% (237 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 87.3% (234 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 86.4% (160 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.8% (913 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Russian)

    Currently translated at 88.5% (248 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (862 of 862 strings)

    Co-authored-by: Ayaka Booker <ayakabooker@gmail.com>
    Co-authored-by: Chaotic Lawful <habitica@eusebius.fr>
    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Lio Zam <zerofux@web.de>
    Co-authored-by: Mika <isekai.chr@gmail.com>
    Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
    Co-authored-by: Summer_GUI <heyang94@163.com>
    Co-authored-by: Vera <verasmolinap@gmail.com>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Zhi Hao Li <zhihaoli000@gmail.com>
    Co-authored-by: Zuz Q <zuzannakunik@gmail.com>
    Co-authored-by: innnko <ayakabooker@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Co-authored-by: 潘致翰 <happyq0908@gmail.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/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    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/it/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/hr/
    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/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/
    Translate-URL: https://translate.habitica.com/projects/habitica/messages/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
    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/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/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/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/tasks/cs/
    Translation: Habitica/Achievements
    Translation: Habitica/Backgrounds
    Translation: Habitica/Character
    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/Messages
    Translation: Habitica/Npc
    Translation: Habitica/Overview
    Translation: Habitica/Pets
    Translation: Habitica/Quests
    Translation: Habitica/Questscontent
    Translation: Habitica/Settings
    Translation: Habitica/Subscriber
    Translation: Habitica/Tasks

commit 1dde2674f6
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Jun 16 16:43:56 2025 -0500

    fix(content): don't filter out the thing we want

commit 76122a8889
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 4 14:28:27 2025 -0500

    fix(mobile): provide Challenge categories via API

commit 9e309a875e
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:15:00 2025 -0500

    5.38.0

commit 09e3a394b8
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:06:45 2025 -0500

    5.37.3

commit eba263360f
Author: Weblate <noreply@weblate.org>
Date:   Mon Jul 28 21:03:17 2025 +0200

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 98.6% (850 of 862 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.4% (3360 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 14.2% (35 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.8% (34 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.0% (32 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 2.0% (5 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 54.1% (1830 of 3377 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
    Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
    Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
    Co-authored-by: Remigiusz Haziak <haziakremigiusz@gmail.com>
    Co-authored-by: Uwe B <hbtca@tunixgut.de>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Wellinton Cardoso <wmcardoso1@hotmail.com>
    Co-authored-by: cloudzzy <truskawka412@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translation: Habitica/Character
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Npc
    Translation: Habitica/Questscontent

commit 9550eec718
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 28 16:50:38 2025 +0200

    Fix 500 when deleting a very old group plan account (#15481)

commit f267eb67e9
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Jul 29 14:12:35 2025 -0500

    fix(static): add back missing div for show/hide

commit 28251f42ab
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Jul 24 22:59:01 2025 -0500

    feat(privacy): preview page

* feat(privacy): respect Global Privacy Control

* fix(lint): remove unused component

* fix(test): test user opts in to tracking

* fix(test): add user pref to more contexts

* fix(test): final spot in api-unit

* fix(tests): update integrations

* chore(privacy): add paragraph to s1, retire separate preview pages

* fix(build): route copypasta

* fix(router): lingering dead import

---------

Signed-off-by: Kalista Payne <sabrecat@gmail.com>
Signed-off-by: Kalista Payne <kalista@habitica.com>
Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: CuriousMagpie <eilatan@gmail.com>
2025-08-29 15:46:00 -05:00
innnko
da90fa6aaf Translated using Weblate (Japanese)
Currently translated at 100.0% (114 of 114 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ja/
2025-08-29 15:44:21 -05:00
Weblate
77392db25a Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (German)

Currently translated at 97.9% (3370 of 3441 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.4% (857 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Portuguese)

Currently translated at 37.4% (91 of 243 strings)

Translated using Weblate (Japanese)

Currently translated at 98.9% (270 of 273 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Portuguese)

Currently translated at 35.8% (87 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 96.2% (414 of 430 strings)

Translated using Weblate (Russian)

Currently translated at 99.0% (914 of 923 strings)

Translated using Weblate (French)

Currently translated at 99.5% (3425 of 3441 strings)

Translated using Weblate (French)

Currently translated at 98.5% (3391 of 3441 strings)

Translated using Weblate (French)

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (French)

Currently translated at 98.5% (269 of 273 strings)

Translated using Weblate (French)

Currently translated at 98.1% (268 of 273 strings)

Translated using Weblate (French)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (French)

Currently translated at 97.8% (267 of 273 strings)

Translated using Weblate (Japanese)

Currently translated at 98.4% (186 of 189 strings)

Translated using Weblate (Indonesian)

Currently translated at 70.4% (2425 of 3441 strings)

Translated using Weblate (Indonesian)

Currently translated at 86.1% (743 of 862 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (French)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Portuguese)

Currently translated at 53.4% (1838 of 3441 strings)

Translated using Weblate (French)

Currently translated at 96.2% (182 of 189 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 28.9% (71 of 245 strings)

Translated using Weblate (German)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (German)

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Portuguese)

Currently translated at 53.2% (1834 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 97.8% (185 of 189 strings)

Translated using Weblate (German)

Currently translated at 99.4% (188 of 189 strings)

Translated using Weblate (German)

Currently translated at 99.6% (920 of 923 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (German)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (German)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Russian)

Currently translated at 98.9% (191 of 193 strings)

Translated using Weblate (Japanese)

Currently translated at 97.8% (185 of 189 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 27.7% (68 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (Japanese)

Currently translated at 97.3% (184 of 189 strings)

Translated using Weblate (Japanese)

Currently translated at 98.1% (268 of 273 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (German)

Currently translated at 100.0% (284 of 284 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Japanese)

Currently translated at 94.3% (813 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (Japanese)

Currently translated at 86.5% (212 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 93.7% (808 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 91.8% (3160 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 86.5% (212 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 99.3% (3420 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 91.7% (3158 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 99.7% (921 of 923 strings)

Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Hanayuri Kuchiki <chocochili.lover@gmail.com>
Co-authored-by: Igor <777igor93@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
Co-authored-by: Kubo Mizuki <m.kubo.0916@gmail.com>
Co-authored-by: Lyam Santos Peres <kaka1213spaenrteoss@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
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: Wellinton Cardoso <wmcardoso1@hotmail.com>
Co-authored-by: innnko <ayakabooker@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
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/character/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
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/ja/
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/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/id/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/es/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
2025-08-29 15:44:21 -05:00
Kalista Payne
1bc1bf0621 fix(signup): two style corrections 2025-08-29 15:44:21 -05:00
Kalista Payne
635a258d62 fix(signup): 18+ verbiage, refactor forms scss 2025-08-29 15:44:21 -05:00
Kalista Payne
384fb505c1 Privacy Controls (#15492)
* WIP(privacy): start of banner

* WIP(privacy): layout rough

* WIP(privacy): mobile layout, add modal

* fix(privacy): implement toggle disable and setting row fold

* fix(privacy): clean up a couple of styles

* fix(privacy): adjust banner width at mobile sizes

* WIP(privacy): remove Loggly echo of Amplitude data

* fix(banners): account for privacy in snackbar position

* WIP(privacy): dismiss banner

* chore(analytics): update to maintaned GA4 library

* fix(tests): lint, misuse of apiError

* fix(analytics): add debug mode

* fix(analytics): load new library on client

* WIP(privacy): gtag.js based implementation

* fix(analytics): lint issues

* fix(lint): one more unused

* fix(lint): client errors

* feat(privacy): draft workflows

* fix(analytics): linting, send needed user values

* fix(tests): use mock analytics service in test env

* fix(tests): restore previous logic for node env

* feat(intro): jump to page 2 onboarding

* WIP(auth): revisions to registration flow

* WIP(privacy): landing page and banner revisions

* WIP(signup): added new username, tos, privacy state

* fix(signup): revert debugging logic

* WIP(signup): add defaulting and checkbox

* wip(signup): move social auth behind username screen

* Squashed commit of the following:

commit ca0a238e5f008525ed154c5eaf12e44f2fc22b00
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed May 7 12:17:20 2025 +0200

    make emails lowercase

commit a2ce748558ce9134e6825208a7e66d78e720202e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:27:01 2025 +0200

    remove unused import

commit cc6ce6c388d9693cf192c4bea733931fc8c31c37
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:13:03 2025 +0200

    add tests for new api route

commit 0d40a6230b548625482aa9f6831c93ed9d62533a
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 18 15:50:22 2025 -0500

    update social tests

commit 79177d6754589b9e54682af8a531b63f60215dab
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:51 2025 +0200

    new api route to check if an email is available

commit 11df73fe07eeb730c2a95593e18e14a931f52429
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:39 2025 +0200

    Add field to not register social account when called

* Squashed commit of the following:

commit b8a2f0b8ee
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Jun 20 17:18:30 2024 -0400

    update privacy policy

* fix(vite): import syntax

* feat(auth): precheck on defaulted username

* feat(auth): add store action for check-email

* feat(auth): check email before proceeding

* WIP(login): refactor username screen

* WIP(auth): complete login/reg flow

* fix(auth): filter out expected 404

* fix(login): use allowRegister with Apple
and add z-index to component

* fix(login): style corrections and email passthru

* Fix edgecase

Signed-off-by: Kalista Payne <sabrecat@gmail.com>

* fix(auth): correct error behaviors

* fix(auth): rewire Apple auth

* make check-email check for restricted domains

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): all the style

* fix(express): return when responding

* fix(error): reduce specificity for restricted domain issue

* fix apple auth

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): change from blur to 500ms debounce

* fix(login): add missing 200 response in Apple flow

* fix(signup): more reconciliation with @phillipthelen's work

* fix(signup): now using token not code

* fix(reg): don't bail on Apple if we're allowing reg

* fix(auth): more reconciliation with @phillipthelen code

* feat(copy): privacy policy updates

* fix(copy): replace placeholder

* fix(vue): use Vite syntax for scss import

* fix(static): corrections to copy and css

* chore(style): remove excess whitespace

* use correct error

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(layout): inputs, add privacy banner

* fix(login): button hover, more validation states

* fix(login): further layout and UX corrections

* fix(static): add back containing div for show/hide

* fix(apple): clean out Apple token

* fix(settings): only change preference on save

* fix(settings): correct save/cancel behavior

* fix(layout): consistent use of header/footer

* fix(layout): reposition mountains for reg/login/forgot

* fix(signup): partial rollback of /username route

* refactor(signup): move /username to page

* fix(apple): don't overwrite reg method

* fix(username): don't skip empty validation

* fix(input): don't show valid if no username

* fix(login): clean out Apple token if using another method

* fix(apple): possible race with token

* fix(tests): some housekeeping

* fix(config): copypasta

* fix(lint): various cleanup

* fix(lint): line squeeze

* fix(lint): one more v-for

* fix(groups): funnel invite flow to new username page

* Squashed commit of the following:

commit 3c5ba4bf24e4bb7996786520101f27ad66405bce
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:38:31 2025 -0500

    fix(privacy): update link ref

commit 9d216f623b
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:18:22 2025 -0500

    fix(privacy-tos): copy edits cont'd

commit d744f47140
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 13:43:22 2025 -0500

    fix(privacy): copy edits and ToC reflow

commit 2c3c3fc9ce
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:46:24 2025 +0200

    lint

commit cf363034d5
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:54 2025 +0200

    fix link

commit 3afacd2c05
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:42 2025 +0200

    add updated terms

commit 258b722499
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:42 2025 +0200

    put back button to show/hide third party info

commit 2992e0299b
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:32 2025 +0200

    minor edits

commit bb5e252299
Author: Kalista Payne <kalista@habitica.com>
Date:   Sun Aug 17 21:01:50 2025 -0500

    fix(privacy): update Section 3

commit c79af7baa8
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 15 17:28:49 2025 -0500

    fix(privacy): various copy edits

commit 100f2f4574
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:37:37 2025 +0200

    add newline

commit 11d1cfd0d9
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:10:01 2025 +0200

    update privacy policy

commit 59b99badf3
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 14:04:19 2025 -0500

    5.38.2

commit 78daeb4191
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 13:36:19 2025 -0500

    fix(apple): don't run auth middleware during redirect

commit 93f8d60903
Author: Weblate <noreply@weblate.org>
Date:   Fri Aug 8 10:12:25 2025 +0200

    Translated using Weblate (German)

    Currently translated at 99.4% (185 of 186 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (54 of 54 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (Dutch)

    Currently translated at 78.0% (2643 of 3385 strings)

    Translated using Weblate (Dutch)

    Currently translated at 40.8% (100 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 89.9% (233 of 259 strings)

    Translated using Weblate (Dutch)

    Currently translated at 67.5% (175 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (110 of 110 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 20.8% (51 of 245 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.9% (44 of 245 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Linsey Dunya Pastoor <sekai.creations@gmail.com>
    Co-authored-by: Mete Olmez <metezori27@gmail.com>
    Co-authored-by: Sefa Uğurlu <ugurlusefa2@gmail.com>
    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: innnko <ayakabooker@gmail.com>
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/challenge/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/pl/
    Translation: Habitica/Backgrounds
    Translation: Habitica/Challenge
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Death
    Translation: Habitica/Defaulttasks
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Settings

commit eb16fec41e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Aug 6 22:08:07 2025 +0200

    Add interface to block ip-addresses or clients due to abuse (#15484)

    * Read IP blocks from database

    * begin building general blocking solution

    * add new frontend files

    * Add UI for managing blockers

    * correctly reset local data after creating blocker

    * Tweak wording

    * Add UI for managing blockers

    * restructure admin pages

    * improve test coverage

    * Improve blocker UI

    * add blocker to block emails from registration

    * lint fix

    * fix

    * lint fixes

    * fix import

    * add new permission for managing blockers

    * improve permission check

    * fix managing permissions from admin

    * improve navbar display for non fullAccess admin

    * update block error strings

    * lint fix

    * add option to errorHandler to skip logging

    * validate blocker value during input

    * improve blocker form display

    * chore(subproj): reconcile habitica-images

    * fix(scripts): use same Mongo version for dev/test

    * fix(whitespace): eof

    * documentation improvements

    * remove nconf import

    * remove old test

    ---------

    Co-authored-by: Kalista Payne <kalista@habitica.com>
    Co-authored-by: Kalista Payne <sabrecat@gmail.com>

commit 47d832bf12
Author: Fiz <34069775+Hafizzle@users.noreply.github.com>
Date:   Tue Aug 5 15:12:44 2025 -0500

    Add backend support for Hydra mount (#15482)

    * chore: update time travelers shop to display seasonal backgrounds

    * chore: update time travelers banner (note CSS borken rn)

    * chore: fix borken CSS and update logic in shop

    * chore: added isSubscribed function, not working

    * chore: isSubscribed working but no bg for subscribers

    * chore: logic and css updates

    * chore: update habitica-images

    * chore: add check for trinket

    * chore: more time traveler shop logicking

    * Add backend support for Hydra mount

    - Add Dragon-Hydra to special mounts in stable.js
      - Configure as contributor level 7 reward with canFind: true
      - Add GIF format support for mount sprites
      - Enable admin panel granting capability

    * Fix Vue template errors in timeTravelers component

    * Fix duplicate template block in timeTravelers component

    * add CSS for Hydra mount GIF sprites

    Added CSS rules for Mount_Head_Dragon-Hydra and Mount_Body_Dragon-Hydra GIF sprites

    * Remove the separate Hydra mount dimension declaration

    ---------

    Co-authored-by: CuriousMagpie <eilatan@gmail.com>

commit c03ab9855f
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 5 14:31:05 2025 -0500

    5.38.1

commit 8f96b7b7fd
Author: Weblate <noreply@weblate.org>
Date:   Tue Aug 5 13:02:45 2025 +0200

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.1% (42 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.7% (41 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.3% (40 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.8% (425 of 430 strings)

    Translated using Weblate (French)

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.9% (39 of 245 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (Polish)

    Currently translated at 95.5% (128 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.7% (254 of 268 strings)

    Translated using Weblate (Polish)

    Currently translated at 94.0% (126 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.6% (424 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.3% (423 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (798 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.4% (797 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.6% (781 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3112 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3111 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.0% (174 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (8 of 8 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.5% (38 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.5% (173 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.6% (279 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Japanese)

    Currently translated at 89.2% (769 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.4% (253 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 97.9% (421 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.6% (251 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.8% (168 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.1% (37 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Croatian)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Korean)

    Currently translated at 22.8% (56 of 245 strings)

    Translated using Weblate (Korean)

    Currently translated at 47.7% (128 of 268 strings)

    Translated using Weblate (Croatian)

    Currently translated at 45.1% (121 of 268 strings)

    Translated using Weblate (Korean)

    Currently translated at 71.9% (620 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 70.6% (609 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 75.0% (6 of 8 strings)

    Translated using Weblate (Korean)

    Currently translated at 67.6% (291 of 430 strings)

    Translated using Weblate (Korean)

    Currently translated at 52.8% (1788 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 50.3% (1706 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 51.7% (134 of 259 strings)

    Translated using Weblate (Czech)

    Currently translated at 92.8% (130 of 140 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 86.9% (233 of 268 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (Danish)

    Currently translated at 92.1% (105 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 89.4% (102 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 83.5% (112 of 134 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 71.6% (308 of 430 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (Serbian)

    Currently translated at 84.4% (49 of 58 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 51.4% (144 of 280 strings)

    Translated using Weblate (Swedish)

    Currently translated at 66.5% (286 of 430 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Slovak)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Romanian)

    Currently translated at 66.7% (287 of 430 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (430 of 430 strings)

    Translated using Weblate (Danish)

    Currently translated at 66.0% (284 of 430 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (300 of 430 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.7% (3377 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 54.1% (1834 of 3385 strings)

    Translated using Weblate (Serbian)

    Currently translated at 50.6% (1714 of 3385 strings)

    Translated using Weblate (Slovak)

    Currently translated at 50.0% (1695 of 3385 strings)

    Translated using Weblate (Romanian)

    Currently translated at 60.5% (2050 of 3385 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 38.4% (1301 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Danish)

    Currently translated at 54.0% (1829 of 3385 strings)

    Translated using Weblate (Czech)

    Currently translated at 59.6% (2020 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 75.6% (140 of 185 strings)

    Translated using Weblate (Serbian)

    Currently translated at 73.5% (136 of 185 strings)

    Translated using Weblate (Slovak)

    Currently translated at 84.8% (157 of 185 strings)

    Translated using Weblate (Romanian)

    Currently translated at 78.9% (146 of 185 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 82.1% (152 of 185 strings)

    Translated using Weblate (Italian)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Danish)

    Currently translated at 77.2% (143 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.7% (242 of 245 strings)

    Translated using Weblate (Czech)

    Currently translated at 75.1% (139 of 185 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 74.5% (138 of 185 strings)

    Translated using Weblate (Czech)

    Currently translated at 8.1% (20 of 245 strings)

    Translated using Weblate (Swedish)

    Currently translated at 72.0% (621 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.1% (562 of 862 strings)

    Translated using Weblate (Slovak)

    Currently translated at 66.9% (577 of 862 strings)

    Translated using Weblate (Romanian)

    Currently translated at 77.7% (670 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 70.0% (604 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Italian)

    Currently translated at 86.8% (749 of 862 strings)

    Translated using Weblate (Indonesian)

    Currently translated at 86.0% (742 of 862 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.0% (845 of 862 strings)

    Translated using Weblate (Danish)

    Currently translated at 69.9% (603 of 862 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (601 of 862 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 66.3% (572 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 74.0% (305 of 412 strings)

    Translated using Weblate (Turkish)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Danish)

    Currently translated at 90.0% (371 of 412 strings)

    Translated using Weblate (Ukrainian)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Swedish)

    Currently translated at 53.6% (139 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Danish)

    Currently translated at 62.1% (161 of 259 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 54.0% (140 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 82.8% (222 of 268 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.3% (241 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 88.4% (237 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 87.3% (234 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 86.4% (160 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.8% (913 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Russian)

    Currently translated at 88.5% (248 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (862 of 862 strings)

    Co-authored-by: Ayaka Booker <ayakabooker@gmail.com>
    Co-authored-by: Chaotic Lawful <habitica@eusebius.fr>
    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Lio Zam <zerofux@web.de>
    Co-authored-by: Mika <isekai.chr@gmail.com>
    Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
    Co-authored-by: Summer_GUI <heyang94@163.com>
    Co-authored-by: Vera <verasmolinap@gmail.com>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Zhi Hao Li <zhihaoli000@gmail.com>
    Co-authored-by: Zuz Q <zuzannakunik@gmail.com>
    Co-authored-by: innnko <ayakabooker@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Co-authored-by: 潘致翰 <happyq0908@gmail.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/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    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/it/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/hr/
    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/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/
    Translate-URL: https://translate.habitica.com/projects/habitica/messages/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
    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/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/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/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/tasks/cs/
    Translation: Habitica/Achievements
    Translation: Habitica/Backgrounds
    Translation: Habitica/Character
    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/Messages
    Translation: Habitica/Npc
    Translation: Habitica/Overview
    Translation: Habitica/Pets
    Translation: Habitica/Quests
    Translation: Habitica/Questscontent
    Translation: Habitica/Settings
    Translation: Habitica/Subscriber
    Translation: Habitica/Tasks

commit 1dde2674f6
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Jun 16 16:43:56 2025 -0500

    fix(content): don't filter out the thing we want

commit 76122a8889
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 4 14:28:27 2025 -0500

    fix(mobile): provide Challenge categories via API

commit 9e309a875e
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:15:00 2025 -0500

    5.38.0

commit 09e3a394b8
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:06:45 2025 -0500

    5.37.3

commit eba263360f
Author: Weblate <noreply@weblate.org>
Date:   Mon Jul 28 21:03:17 2025 +0200

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 98.6% (850 of 862 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.4% (3360 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 14.2% (35 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.8% (34 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.0% (32 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 2.0% (5 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 54.1% (1830 of 3377 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
    Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
    Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
    Co-authored-by: Remigiusz Haziak <haziakremigiusz@gmail.com>
    Co-authored-by: Uwe B <hbtca@tunixgut.de>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Wellinton Cardoso <wmcardoso1@hotmail.com>
    Co-authored-by: cloudzzy <truskawka412@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translation: Habitica/Character
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Npc
    Translation: Habitica/Questscontent

commit 9550eec718
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 28 16:50:38 2025 +0200

    Fix 500 when deleting a very old group plan account (#15481)

commit f267eb67e9
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Jul 29 14:12:35 2025 -0500

    fix(static): add back missing div for show/hide

commit 28251f42ab
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Jul 24 22:59:01 2025 -0500

    feat(privacy): preview page

* feat(privacy): respect Global Privacy Control

* fix(lint): remove unused component

* fix(test): test user opts in to tracking

* fix(test): add user pref to more contexts

* fix(test): final spot in api-unit

* fix(tests): update integrations

* chore(privacy): add paragraph to s1, retire separate preview pages

* fix(build): route copypasta

* fix(router): lingering dead import

---------

Signed-off-by: Kalista Payne <sabrecat@gmail.com>
Signed-off-by: Kalista Payne <kalista@habitica.com>
Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: CuriousMagpie <eilatan@gmail.com>
2025-08-29 15:44:19 -05:00
dependabot[bot]
3e0bc36373 chore(deps): bump tar-fs from 2.1.1 to 2.1.3 (#15446)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.1 to 2.1.3.
- [Commits](https://github.com/mafintosh/tar-fs/commits)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-29 15:43:46 -05:00
dependabot[bot]
0a431afaaf chore(deps): bump brace-expansion in /website/client (#15461)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-29 15:43:46 -05:00
dependabot[bot]
8c911bcd41 chore(deps): bump on-headers, compression, cookie-session and morgan (#15477)
Bumps [on-headers](https://github.com/jshttp/on-headers), [compression](https://github.com/expressjs/compression), [cookie-session](https://github.com/expressjs/cookie-session) and [morgan](https://github.com/expressjs/morgan). These dependencies needed to be updated together.

Updates `on-headers` from 1.0.2 to 1.1.0
- [Release notes](https://github.com/jshttp/on-headers/releases)
- [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0)

Updates `compression` from 1.7.4 to 1.8.1
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...v1.8.1)

Updates `cookie-session` from 2.0.0 to 2.1.1
- [Release notes](https://github.com/expressjs/cookie-session/releases)
- [Changelog](https://github.com/expressjs/cookie-session/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/cookie-session/compare/v2.0.0...v2.1.1)

Updates `morgan` from 1.10.0 to 1.10.1
- [Release notes](https://github.com/expressjs/morgan/releases)
- [Changelog](https://github.com/expressjs/morgan/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/morgan/compare/1.10.0...1.10.1)

---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: direct:production
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: direct:production
- dependency-name: cookie-session
  dependency-version: 2.1.1
  dependency-type: direct:production
- dependency-name: morgan
  dependency-version: 1.10.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-29 15:43:46 -05:00
dependabot[bot]
dcb7ac5955 chore(deps): bump form-data from 4.0.0 to 4.0.4 in /website/client (#15478)
Bumps [form-data](https://github.com/form-data/form-data) from 4.0.0 to 4.0.4.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.0...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-29 15:43:46 -05:00
Fiz
fb730942a0 Respect user language preference in content endpoint (#15485)
* Respect user language preference in content endpoint

Content API now returns data in user's preferred language when authenticated without language parameter. No breaking changes - existing clients unaffected.

* lint fix
2025-08-29 15:43:46 -05:00
Kalista Payne
9c92bf73f5 5.39.1 2025-08-29 15:43:30 -05:00
Weblate
58f195fdb7 Merge branch 'develop' of github.com:HabitRPG/habitica into develop 2025-08-29 22:39:07 +02:00
Kalista Payne
4b86c9c8a7 fix(privacy): update section 7 for new age limit 2025-08-29 15:28:01 -05:00
Kalista Payne
4cc689ec63 fix(privacy): wire up modal 2025-08-28 17:41:38 -05:00
innnko
8690484f5e Translated using Weblate (Japanese)
Currently translated at 100.0% (114 of 114 strings)

Translation: Habitica/Pets
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ja/
2025-08-28 11:40:25 +02:00
Kalista Payne
1f3e5b7a76 fix(analytics): grab missing GA ID 2025-08-27 14:25:21 -05:00
Kalista Payne
61c790f291 fix(analytics): record user ID in GA if consented 2025-08-27 13:59:15 -05:00
Weblate
b3440fa3a8 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (German)

Currently translated at 97.9% (3370 of 3441 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.4% (857 of 862 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (412 of 412 strings)

Translated using Weblate (Portuguese)

Currently translated at 37.4% (91 of 243 strings)

Translated using Weblate (Japanese)

Currently translated at 98.9% (270 of 273 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Portuguese)

Currently translated at 35.8% (87 of 243 strings)

Translated using Weblate (Russian)

Currently translated at 96.2% (414 of 430 strings)

Translated using Weblate (Russian)

Currently translated at 99.0% (914 of 923 strings)

Translated using Weblate (French)

Currently translated at 99.5% (3425 of 3441 strings)

Translated using Weblate (French)

Currently translated at 98.5% (3391 of 3441 strings)

Translated using Weblate (French)

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (French)

Currently translated at 98.5% (269 of 273 strings)

Translated using Weblate (French)

Currently translated at 98.1% (268 of 273 strings)

Translated using Weblate (French)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (French)

Currently translated at 97.8% (267 of 273 strings)

Translated using Weblate (Japanese)

Currently translated at 98.4% (186 of 189 strings)

Translated using Weblate (Indonesian)

Currently translated at 70.4% (2425 of 3441 strings)

Translated using Weblate (Indonesian)

Currently translated at 86.1% (743 of 862 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (French)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Portuguese)

Currently translated at 53.4% (1838 of 3441 strings)

Translated using Weblate (French)

Currently translated at 96.2% (182 of 189 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 28.9% (71 of 245 strings)

Translated using Weblate (German)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (German)

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Portuguese)

Currently translated at 53.2% (1834 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 97.8% (185 of 189 strings)

Translated using Weblate (German)

Currently translated at 99.4% (188 of 189 strings)

Translated using Weblate (German)

Currently translated at 99.6% (920 of 923 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (German)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (German)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Russian)

Currently translated at 98.9% (191 of 193 strings)

Translated using Weblate (Japanese)

Currently translated at 97.8% (185 of 189 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 27.7% (68 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (273 of 273 strings)

Translated using Weblate (Japanese)

Currently translated at 97.3% (184 of 189 strings)

Translated using Weblate (Japanese)

Currently translated at 98.1% (268 of 273 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (132 of 132 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (German)

Currently translated at 100.0% (284 of 284 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Japanese)

Currently translated at 94.3% (813 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (Japanese)

Currently translated at 86.5% (212 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 93.7% (808 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 91.8% (3160 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 86.5% (212 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 99.3% (3420 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 91.7% (3158 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 99.7% (921 of 923 strings)

Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Hanayuri Kuchiki <chocochili.lover@gmail.com>
Co-authored-by: Igor <777igor93@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
Co-authored-by: Kubo Mizuki <m.kubo.0916@gmail.com>
Co-authored-by: Lyam Santos Peres <kaka1213spaenrteoss@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
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: Wellinton Cardoso <wmcardoso1@hotmail.com>
Co-authored-by: innnko <ayakabooker@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
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/character/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
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/ja/
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/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/id/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/es/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
2025-08-27 20:08:43 +02:00
Kalista Payne
a3f1835d1d fix(lint): whitespace 2025-08-27 12:25:28 -05:00
Kalista Payne
9226f6f70e fix(settings): consistent layout with modal 2025-08-27 12:21:08 -05:00
Kalista Payne
1130f9957f fix(terms): copy edits 2025-08-27 11:40:00 -05:00
Kalista Payne
ad1fd03aad fix(signup): two style corrections 2025-08-27 11:35:17 -05:00
Kalista Payne
6c93033ad2 fix(signup): 18+ verbiage, refactor forms scss 2025-08-27 11:35:17 -05:00
Kalista Payne
dd97b11b60 Privacy Controls (#15492)
* WIP(privacy): start of banner

* WIP(privacy): layout rough

* WIP(privacy): mobile layout, add modal

* fix(privacy): implement toggle disable and setting row fold

* fix(privacy): clean up a couple of styles

* fix(privacy): adjust banner width at mobile sizes

* WIP(privacy): remove Loggly echo of Amplitude data

* fix(banners): account for privacy in snackbar position

* WIP(privacy): dismiss banner

* chore(analytics): update to maintaned GA4 library

* fix(tests): lint, misuse of apiError

* fix(analytics): add debug mode

* fix(analytics): load new library on client

* WIP(privacy): gtag.js based implementation

* fix(analytics): lint issues

* fix(lint): one more unused

* fix(lint): client errors

* feat(privacy): draft workflows

* fix(analytics): linting, send needed user values

* fix(tests): use mock analytics service in test env

* fix(tests): restore previous logic for node env

* feat(intro): jump to page 2 onboarding

* WIP(auth): revisions to registration flow

* WIP(privacy): landing page and banner revisions

* WIP(signup): added new username, tos, privacy state

* fix(signup): revert debugging logic

* WIP(signup): add defaulting and checkbox

* wip(signup): move social auth behind username screen

* Squashed commit of the following:

commit ca0a238e5f008525ed154c5eaf12e44f2fc22b00
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed May 7 12:17:20 2025 +0200

    make emails lowercase

commit a2ce748558ce9134e6825208a7e66d78e720202e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:27:01 2025 +0200

    remove unused import

commit cc6ce6c388d9693cf192c4bea733931fc8c31c37
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:13:03 2025 +0200

    add tests for new api route

commit 0d40a6230b548625482aa9f6831c93ed9d62533a
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 18 15:50:22 2025 -0500

    update social tests

commit 79177d6754589b9e54682af8a531b63f60215dab
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:51 2025 +0200

    new api route to check if an email is available

commit 11df73fe07eeb730c2a95593e18e14a931f52429
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:39 2025 +0200

    Add field to not register social account when called

* Squashed commit of the following:

commit b8a2f0b8ee
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Jun 20 17:18:30 2024 -0400

    update privacy policy

* fix(vite): import syntax

* feat(auth): precheck on defaulted username

* feat(auth): add store action for check-email

* feat(auth): check email before proceeding

* WIP(login): refactor username screen

* WIP(auth): complete login/reg flow

* fix(auth): filter out expected 404

* fix(login): use allowRegister with Apple
and add z-index to component

* fix(login): style corrections and email passthru

* Fix edgecase

Signed-off-by: Kalista Payne <sabrecat@gmail.com>

* fix(auth): correct error behaviors

* fix(auth): rewire Apple auth

* make check-email check for restricted domains

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): all the style

* fix(express): return when responding

* fix(error): reduce specificity for restricted domain issue

* fix apple auth

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): change from blur to 500ms debounce

* fix(login): add missing 200 response in Apple flow

* fix(signup): more reconciliation with @phillipthelen's work

* fix(signup): now using token not code

* fix(reg): don't bail on Apple if we're allowing reg

* fix(auth): more reconciliation with @phillipthelen code

* feat(copy): privacy policy updates

* fix(copy): replace placeholder

* fix(vue): use Vite syntax for scss import

* fix(static): corrections to copy and css

* chore(style): remove excess whitespace

* use correct error

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(layout): inputs, add privacy banner

* fix(login): button hover, more validation states

* fix(login): further layout and UX corrections

* fix(static): add back containing div for show/hide

* fix(apple): clean out Apple token

* fix(settings): only change preference on save

* fix(settings): correct save/cancel behavior

* fix(layout): consistent use of header/footer

* fix(layout): reposition mountains for reg/login/forgot

* fix(signup): partial rollback of /username route

* refactor(signup): move /username to page

* fix(apple): don't overwrite reg method

* fix(username): don't skip empty validation

* fix(input): don't show valid if no username

* fix(login): clean out Apple token if using another method

* fix(apple): possible race with token

* fix(tests): some housekeeping

* fix(config): copypasta

* fix(lint): various cleanup

* fix(lint): line squeeze

* fix(lint): one more v-for

* fix(groups): funnel invite flow to new username page

* Squashed commit of the following:

commit 3c5ba4bf24e4bb7996786520101f27ad66405bce
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:38:31 2025 -0500

    fix(privacy): update link ref

commit 9d216f623b
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:18:22 2025 -0500

    fix(privacy-tos): copy edits cont'd

commit d744f47140
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 13:43:22 2025 -0500

    fix(privacy): copy edits and ToC reflow

commit 2c3c3fc9ce
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:46:24 2025 +0200

    lint

commit cf363034d5
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:54 2025 +0200

    fix link

commit 3afacd2c05
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:42 2025 +0200

    add updated terms

commit 258b722499
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:42 2025 +0200

    put back button to show/hide third party info

commit 2992e0299b
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:32 2025 +0200

    minor edits

commit bb5e252299
Author: Kalista Payne <kalista@habitica.com>
Date:   Sun Aug 17 21:01:50 2025 -0500

    fix(privacy): update Section 3

commit c79af7baa8
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 15 17:28:49 2025 -0500

    fix(privacy): various copy edits

commit 100f2f4574
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:37:37 2025 +0200

    add newline

commit 11d1cfd0d9
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:10:01 2025 +0200

    update privacy policy

commit 59b99badf3
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 14:04:19 2025 -0500

    5.38.2

commit 78daeb4191
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 13:36:19 2025 -0500

    fix(apple): don't run auth middleware during redirect

commit 93f8d60903
Author: Weblate <noreply@weblate.org>
Date:   Fri Aug 8 10:12:25 2025 +0200

    Translated using Weblate (German)

    Currently translated at 99.4% (185 of 186 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (54 of 54 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (Dutch)

    Currently translated at 78.0% (2643 of 3385 strings)

    Translated using Weblate (Dutch)

    Currently translated at 40.8% (100 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 89.9% (233 of 259 strings)

    Translated using Weblate (Dutch)

    Currently translated at 67.5% (175 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (110 of 110 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 20.8% (51 of 245 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.9% (44 of 245 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Linsey Dunya Pastoor <sekai.creations@gmail.com>
    Co-authored-by: Mete Olmez <metezori27@gmail.com>
    Co-authored-by: Sefa Uğurlu <ugurlusefa2@gmail.com>
    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: innnko <ayakabooker@gmail.com>
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/challenge/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/pl/
    Translation: Habitica/Backgrounds
    Translation: Habitica/Challenge
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Death
    Translation: Habitica/Defaulttasks
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Settings

commit eb16fec41e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Aug 6 22:08:07 2025 +0200

    Add interface to block ip-addresses or clients due to abuse (#15484)

    * Read IP blocks from database

    * begin building general blocking solution

    * add new frontend files

    * Add UI for managing blockers

    * correctly reset local data after creating blocker

    * Tweak wording

    * Add UI for managing blockers

    * restructure admin pages

    * improve test coverage

    * Improve blocker UI

    * add blocker to block emails from registration

    * lint fix

    * fix

    * lint fixes

    * fix import

    * add new permission for managing blockers

    * improve permission check

    * fix managing permissions from admin

    * improve navbar display for non fullAccess admin

    * update block error strings

    * lint fix

    * add option to errorHandler to skip logging

    * validate blocker value during input

    * improve blocker form display

    * chore(subproj): reconcile habitica-images

    * fix(scripts): use same Mongo version for dev/test

    * fix(whitespace): eof

    * documentation improvements

    * remove nconf import

    * remove old test

    ---------

    Co-authored-by: Kalista Payne <kalista@habitica.com>
    Co-authored-by: Kalista Payne <sabrecat@gmail.com>

commit 47d832bf12
Author: Fiz <34069775+Hafizzle@users.noreply.github.com>
Date:   Tue Aug 5 15:12:44 2025 -0500

    Add backend support for Hydra mount (#15482)

    * chore: update time travelers shop to display seasonal backgrounds

    * chore: update time travelers banner (note CSS borken rn)

    * chore: fix borken CSS and update logic in shop

    * chore: added isSubscribed function, not working

    * chore: isSubscribed working but no bg for subscribers

    * chore: logic and css updates

    * chore: update habitica-images

    * chore: add check for trinket

    * chore: more time traveler shop logicking

    * Add backend support for Hydra mount

    - Add Dragon-Hydra to special mounts in stable.js
      - Configure as contributor level 7 reward with canFind: true
      - Add GIF format support for mount sprites
      - Enable admin panel granting capability

    * Fix Vue template errors in timeTravelers component

    * Fix duplicate template block in timeTravelers component

    * add CSS for Hydra mount GIF sprites

    Added CSS rules for Mount_Head_Dragon-Hydra and Mount_Body_Dragon-Hydra GIF sprites

    * Remove the separate Hydra mount dimension declaration

    ---------

    Co-authored-by: CuriousMagpie <eilatan@gmail.com>

commit c03ab9855f
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 5 14:31:05 2025 -0500

    5.38.1

commit 8f96b7b7fd
Author: Weblate <noreply@weblate.org>
Date:   Tue Aug 5 13:02:45 2025 +0200

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.1% (42 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.7% (41 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.3% (40 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.8% (425 of 430 strings)

    Translated using Weblate (French)

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.9% (39 of 245 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (Polish)

    Currently translated at 95.5% (128 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.7% (254 of 268 strings)

    Translated using Weblate (Polish)

    Currently translated at 94.0% (126 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.6% (424 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.3% (423 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (798 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.4% (797 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.6% (781 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3112 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3111 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.0% (174 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (8 of 8 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.5% (38 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.5% (173 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.6% (279 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Japanese)

    Currently translated at 89.2% (769 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.4% (253 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 97.9% (421 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.6% (251 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.8% (168 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.1% (37 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Croatian)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Korean)

    Currently translated at 22.8% (56 of 245 strings)

    Translated using Weblate (Korean)

    Currently translated at 47.7% (128 of 268 strings)

    Translated using Weblate (Croatian)

    Currently translated at 45.1% (121 of 268 strings)

    Translated using Weblate (Korean)

    Currently translated at 71.9% (620 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 70.6% (609 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 75.0% (6 of 8 strings)

    Translated using Weblate (Korean)

    Currently translated at 67.6% (291 of 430 strings)

    Translated using Weblate (Korean)

    Currently translated at 52.8% (1788 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 50.3% (1706 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 51.7% (134 of 259 strings)

    Translated using Weblate (Czech)

    Currently translated at 92.8% (130 of 140 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 86.9% (233 of 268 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (Danish)

    Currently translated at 92.1% (105 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 89.4% (102 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 83.5% (112 of 134 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 71.6% (308 of 430 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (Serbian)

    Currently translated at 84.4% (49 of 58 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 51.4% (144 of 280 strings)

    Translated using Weblate (Swedish)

    Currently translated at 66.5% (286 of 430 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Slovak)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Romanian)

    Currently translated at 66.7% (287 of 430 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (430 of 430 strings)

    Translated using Weblate (Danish)

    Currently translated at 66.0% (284 of 430 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (300 of 430 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.7% (3377 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 54.1% (1834 of 3385 strings)

    Translated using Weblate (Serbian)

    Currently translated at 50.6% (1714 of 3385 strings)

    Translated using Weblate (Slovak)

    Currently translated at 50.0% (1695 of 3385 strings)

    Translated using Weblate (Romanian)

    Currently translated at 60.5% (2050 of 3385 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 38.4% (1301 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Danish)

    Currently translated at 54.0% (1829 of 3385 strings)

    Translated using Weblate (Czech)

    Currently translated at 59.6% (2020 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 75.6% (140 of 185 strings)

    Translated using Weblate (Serbian)

    Currently translated at 73.5% (136 of 185 strings)

    Translated using Weblate (Slovak)

    Currently translated at 84.8% (157 of 185 strings)

    Translated using Weblate (Romanian)

    Currently translated at 78.9% (146 of 185 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 82.1% (152 of 185 strings)

    Translated using Weblate (Italian)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Danish)

    Currently translated at 77.2% (143 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.7% (242 of 245 strings)

    Translated using Weblate (Czech)

    Currently translated at 75.1% (139 of 185 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 74.5% (138 of 185 strings)

    Translated using Weblate (Czech)

    Currently translated at 8.1% (20 of 245 strings)

    Translated using Weblate (Swedish)

    Currently translated at 72.0% (621 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.1% (562 of 862 strings)

    Translated using Weblate (Slovak)

    Currently translated at 66.9% (577 of 862 strings)

    Translated using Weblate (Romanian)

    Currently translated at 77.7% (670 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 70.0% (604 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Italian)

    Currently translated at 86.8% (749 of 862 strings)

    Translated using Weblate (Indonesian)

    Currently translated at 86.0% (742 of 862 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.0% (845 of 862 strings)

    Translated using Weblate (Danish)

    Currently translated at 69.9% (603 of 862 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (601 of 862 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 66.3% (572 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 74.0% (305 of 412 strings)

    Translated using Weblate (Turkish)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Danish)

    Currently translated at 90.0% (371 of 412 strings)

    Translated using Weblate (Ukrainian)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Swedish)

    Currently translated at 53.6% (139 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Danish)

    Currently translated at 62.1% (161 of 259 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 54.0% (140 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 82.8% (222 of 268 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.3% (241 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 88.4% (237 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 87.3% (234 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 86.4% (160 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.8% (913 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Russian)

    Currently translated at 88.5% (248 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (862 of 862 strings)

    Co-authored-by: Ayaka Booker <ayakabooker@gmail.com>
    Co-authored-by: Chaotic Lawful <habitica@eusebius.fr>
    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Lio Zam <zerofux@web.de>
    Co-authored-by: Mika <isekai.chr@gmail.com>
    Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
    Co-authored-by: Summer_GUI <heyang94@163.com>
    Co-authored-by: Vera <verasmolinap@gmail.com>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Zhi Hao Li <zhihaoli000@gmail.com>
    Co-authored-by: Zuz Q <zuzannakunik@gmail.com>
    Co-authored-by: innnko <ayakabooker@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Co-authored-by: 潘致翰 <happyq0908@gmail.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/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    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/it/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/hr/
    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/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/
    Translate-URL: https://translate.habitica.com/projects/habitica/messages/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
    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/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/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/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/tasks/cs/
    Translation: Habitica/Achievements
    Translation: Habitica/Backgrounds
    Translation: Habitica/Character
    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/Messages
    Translation: Habitica/Npc
    Translation: Habitica/Overview
    Translation: Habitica/Pets
    Translation: Habitica/Quests
    Translation: Habitica/Questscontent
    Translation: Habitica/Settings
    Translation: Habitica/Subscriber
    Translation: Habitica/Tasks

commit 1dde2674f6
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Jun 16 16:43:56 2025 -0500

    fix(content): don't filter out the thing we want

commit 76122a8889
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 4 14:28:27 2025 -0500

    fix(mobile): provide Challenge categories via API

commit 9e309a875e
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:15:00 2025 -0500

    5.38.0

commit 09e3a394b8
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:06:45 2025 -0500

    5.37.3

commit eba263360f
Author: Weblate <noreply@weblate.org>
Date:   Mon Jul 28 21:03:17 2025 +0200

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 98.6% (850 of 862 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.4% (3360 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 14.2% (35 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.8% (34 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.0% (32 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 2.0% (5 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 54.1% (1830 of 3377 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
    Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
    Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
    Co-authored-by: Remigiusz Haziak <haziakremigiusz@gmail.com>
    Co-authored-by: Uwe B <hbtca@tunixgut.de>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Wellinton Cardoso <wmcardoso1@hotmail.com>
    Co-authored-by: cloudzzy <truskawka412@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translation: Habitica/Character
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Npc
    Translation: Habitica/Questscontent

commit 9550eec718
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 28 16:50:38 2025 +0200

    Fix 500 when deleting a very old group plan account (#15481)

commit f267eb67e9
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Jul 29 14:12:35 2025 -0500

    fix(static): add back missing div for show/hide

commit 28251f42ab
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Jul 24 22:59:01 2025 -0500

    feat(privacy): preview page

* feat(privacy): respect Global Privacy Control

* fix(lint): remove unused component

* fix(test): test user opts in to tracking

* fix(test): add user pref to more contexts

* fix(test): final spot in api-unit

* fix(tests): update integrations

* chore(privacy): add paragraph to s1, retire separate preview pages

* fix(build): route copypasta

* fix(router): lingering dead import

---------

Signed-off-by: Kalista Payne <sabrecat@gmail.com>
Signed-off-by: Kalista Payne <kalista@habitica.com>
Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: CuriousMagpie <eilatan@gmail.com>
2025-08-27 11:35:17 -05:00
dependabot[bot]
59ba07d4f3 chore(deps): bump tar-fs from 2.1.1 to 2.1.3 (#15446)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.1 to 2.1.3.
- [Commits](https://github.com/mafintosh/tar-fs/commits)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-27 11:34:46 -05:00
dependabot[bot]
d2bfd1e3a9 chore(deps): bump brace-expansion in /website/client (#15461)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-27 11:34:46 -05:00
dependabot[bot]
a8264bf526 chore(deps): bump on-headers, compression, cookie-session and morgan (#15477)
Bumps [on-headers](https://github.com/jshttp/on-headers), [compression](https://github.com/expressjs/compression), [cookie-session](https://github.com/expressjs/cookie-session) and [morgan](https://github.com/expressjs/morgan). These dependencies needed to be updated together.

Updates `on-headers` from 1.0.2 to 1.1.0
- [Release notes](https://github.com/jshttp/on-headers/releases)
- [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0)

Updates `compression` from 1.7.4 to 1.8.1
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...v1.8.1)

Updates `cookie-session` from 2.0.0 to 2.1.1
- [Release notes](https://github.com/expressjs/cookie-session/releases)
- [Changelog](https://github.com/expressjs/cookie-session/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/cookie-session/compare/v2.0.0...v2.1.1)

Updates `morgan` from 1.10.0 to 1.10.1
- [Release notes](https://github.com/expressjs/morgan/releases)
- [Changelog](https://github.com/expressjs/morgan/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/morgan/compare/1.10.0...1.10.1)

---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: direct:production
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: direct:production
- dependency-name: cookie-session
  dependency-version: 2.1.1
  dependency-type: direct:production
- dependency-name: morgan
  dependency-version: 1.10.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-27 11:34:46 -05:00
dependabot[bot]
f202f2b3d3 chore(deps): bump form-data from 4.0.0 to 4.0.4 in /website/client (#15478)
Bumps [form-data](https://github.com/form-data/form-data) from 4.0.0 to 4.0.4.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.0...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-27 11:34:46 -05:00
Fiz
4ea9f8282e Respect user language preference in content endpoint (#15485)
* Respect user language preference in content endpoint

Content API now returns data in user's preferred language when authenticated without language parameter. No breaking changes - existing clients unaffected.

* lint fix
2025-08-27 11:34:46 -05:00
Kalista Payne
205d84a111 fix(terms): copy edits 2025-08-27 11:34:32 -05:00
Kalista Payne
5810853cc2 fix(signup): two style corrections 2025-08-25 15:00:08 -05:00
Kalista Payne
4547204bd8 fix(signup): 18+ verbiage, refactor forms scss 2025-08-22 17:38:44 -05:00
Kalista Payne
f17a0c91a3 Privacy Controls (#15492)
* WIP(privacy): start of banner

* WIP(privacy): layout rough

* WIP(privacy): mobile layout, add modal

* fix(privacy): implement toggle disable and setting row fold

* fix(privacy): clean up a couple of styles

* fix(privacy): adjust banner width at mobile sizes

* WIP(privacy): remove Loggly echo of Amplitude data

* fix(banners): account for privacy in snackbar position

* WIP(privacy): dismiss banner

* chore(analytics): update to maintaned GA4 library

* fix(tests): lint, misuse of apiError

* fix(analytics): add debug mode

* fix(analytics): load new library on client

* WIP(privacy): gtag.js based implementation

* fix(analytics): lint issues

* fix(lint): one more unused

* fix(lint): client errors

* feat(privacy): draft workflows

* fix(analytics): linting, send needed user values

* fix(tests): use mock analytics service in test env

* fix(tests): restore previous logic for node env

* feat(intro): jump to page 2 onboarding

* WIP(auth): revisions to registration flow

* WIP(privacy): landing page and banner revisions

* WIP(signup): added new username, tos, privacy state

* fix(signup): revert debugging logic

* WIP(signup): add defaulting and checkbox

* wip(signup): move social auth behind username screen

* Squashed commit of the following:

commit ca0a238e5f008525ed154c5eaf12e44f2fc22b00
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed May 7 12:17:20 2025 +0200

    make emails lowercase

commit a2ce748558ce9134e6825208a7e66d78e720202e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:27:01 2025 +0200

    remove unused import

commit cc6ce6c388d9693cf192c4bea733931fc8c31c37
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 13:13:03 2025 +0200

    add tests for new api route

commit 0d40a6230b548625482aa9f6831c93ed9d62533a
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 18 15:50:22 2025 -0500

    update social tests

commit 79177d6754589b9e54682af8a531b63f60215dab
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:51 2025 +0200

    new api route to check if an email is available

commit 11df73fe07eeb730c2a95593e18e14a931f52429
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Apr 9 10:21:39 2025 +0200

    Add field to not register social account when called

* Squashed commit of the following:

commit b8a2f0b8ee
Author: CuriousMagpie <eilatan@gmail.com>
Date:   Thu Jun 20 17:18:30 2024 -0400

    update privacy policy

* fix(vite): import syntax

* feat(auth): precheck on defaulted username

* feat(auth): add store action for check-email

* feat(auth): check email before proceeding

* WIP(login): refactor username screen

* WIP(auth): complete login/reg flow

* fix(auth): filter out expected 404

* fix(login): use allowRegister with Apple
and add z-index to component

* fix(login): style corrections and email passthru

* Fix edgecase

Signed-off-by: Kalista Payne <sabrecat@gmail.com>

* fix(auth): correct error behaviors

* fix(auth): rewire Apple auth

* make check-email check for restricted domains

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): all the style

* fix(express): return when responding

* fix(error): reduce specificity for restricted domain issue

* fix apple auth

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(signup): change from blur to 500ms debounce

* fix(login): add missing 200 response in Apple flow

* fix(signup): more reconciliation with @phillipthelen's work

* fix(signup): now using token not code

* fix(reg): don't bail on Apple if we're allowing reg

* fix(auth): more reconciliation with @phillipthelen code

* feat(copy): privacy policy updates

* fix(copy): replace placeholder

* fix(vue): use Vite syntax for scss import

* fix(static): corrections to copy and css

* chore(style): remove excess whitespace

* use correct error

Signed-off-by: Kalista Payne <kalista@habitica.com>

* fix(layout): inputs, add privacy banner

* fix(login): button hover, more validation states

* fix(login): further layout and UX corrections

* fix(static): add back containing div for show/hide

* fix(apple): clean out Apple token

* fix(settings): only change preference on save

* fix(settings): correct save/cancel behavior

* fix(layout): consistent use of header/footer

* fix(layout): reposition mountains for reg/login/forgot

* fix(signup): partial rollback of /username route

* refactor(signup): move /username to page

* fix(apple): don't overwrite reg method

* fix(username): don't skip empty validation

* fix(input): don't show valid if no username

* fix(login): clean out Apple token if using another method

* fix(apple): possible race with token

* fix(tests): some housekeeping

* fix(config): copypasta

* fix(lint): various cleanup

* fix(lint): line squeeze

* fix(lint): one more v-for

* fix(groups): funnel invite flow to new username page

* Squashed commit of the following:

commit 3c5ba4bf24e4bb7996786520101f27ad66405bce
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:38:31 2025 -0500

    fix(privacy): update link ref

commit 9d216f623b
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:18:22 2025 -0500

    fix(privacy-tos): copy edits cont'd

commit d744f47140
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 13:43:22 2025 -0500

    fix(privacy): copy edits and ToC reflow

commit 2c3c3fc9ce
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:46:24 2025 +0200

    lint

commit cf363034d5
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:54 2025 +0200

    fix link

commit 3afacd2c05
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:42 2025 +0200

    add updated terms

commit 258b722499
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:42 2025 +0200

    put back button to show/hide third party info

commit 2992e0299b
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:32 2025 +0200

    minor edits

commit bb5e252299
Author: Kalista Payne <kalista@habitica.com>
Date:   Sun Aug 17 21:01:50 2025 -0500

    fix(privacy): update Section 3

commit c79af7baa8
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 15 17:28:49 2025 -0500

    fix(privacy): various copy edits

commit 100f2f4574
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:37:37 2025 +0200

    add newline

commit 11d1cfd0d9
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:10:01 2025 +0200

    update privacy policy

commit 59b99badf3
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 14:04:19 2025 -0500

    5.38.2

commit 78daeb4191
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 13:36:19 2025 -0500

    fix(apple): don't run auth middleware during redirect

commit 93f8d60903
Author: Weblate <noreply@weblate.org>
Date:   Fri Aug 8 10:12:25 2025 +0200

    Translated using Weblate (German)

    Currently translated at 99.4% (185 of 186 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (54 of 54 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (Dutch)

    Currently translated at 78.0% (2643 of 3385 strings)

    Translated using Weblate (Dutch)

    Currently translated at 40.8% (100 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 89.9% (233 of 259 strings)

    Translated using Weblate (Dutch)

    Currently translated at 67.5% (175 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (110 of 110 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 20.8% (51 of 245 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.9% (44 of 245 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Linsey Dunya Pastoor <sekai.creations@gmail.com>
    Co-authored-by: Mete Olmez <metezori27@gmail.com>
    Co-authored-by: Sefa Uğurlu <ugurlusefa2@gmail.com>
    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: innnko <ayakabooker@gmail.com>
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/challenge/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/pl/
    Translation: Habitica/Backgrounds
    Translation: Habitica/Challenge
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Death
    Translation: Habitica/Defaulttasks
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Settings

commit eb16fec41e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Aug 6 22:08:07 2025 +0200

    Add interface to block ip-addresses or clients due to abuse (#15484)

    * Read IP blocks from database

    * begin building general blocking solution

    * add new frontend files

    * Add UI for managing blockers

    * correctly reset local data after creating blocker

    * Tweak wording

    * Add UI for managing blockers

    * restructure admin pages

    * improve test coverage

    * Improve blocker UI

    * add blocker to block emails from registration

    * lint fix

    * fix

    * lint fixes

    * fix import

    * add new permission for managing blockers

    * improve permission check

    * fix managing permissions from admin

    * improve navbar display for non fullAccess admin

    * update block error strings

    * lint fix

    * add option to errorHandler to skip logging

    * validate blocker value during input

    * improve blocker form display

    * chore(subproj): reconcile habitica-images

    * fix(scripts): use same Mongo version for dev/test

    * fix(whitespace): eof

    * documentation improvements

    * remove nconf import

    * remove old test

    ---------

    Co-authored-by: Kalista Payne <kalista@habitica.com>
    Co-authored-by: Kalista Payne <sabrecat@gmail.com>

commit 47d832bf12
Author: Fiz <34069775+Hafizzle@users.noreply.github.com>
Date:   Tue Aug 5 15:12:44 2025 -0500

    Add backend support for Hydra mount (#15482)

    * chore: update time travelers shop to display seasonal backgrounds

    * chore: update time travelers banner (note CSS borken rn)

    * chore: fix borken CSS and update logic in shop

    * chore: added isSubscribed function, not working

    * chore: isSubscribed working but no bg for subscribers

    * chore: logic and css updates

    * chore: update habitica-images

    * chore: add check for trinket

    * chore: more time traveler shop logicking

    * Add backend support for Hydra mount

    - Add Dragon-Hydra to special mounts in stable.js
      - Configure as contributor level 7 reward with canFind: true
      - Add GIF format support for mount sprites
      - Enable admin panel granting capability

    * Fix Vue template errors in timeTravelers component

    * Fix duplicate template block in timeTravelers component

    * add CSS for Hydra mount GIF sprites

    Added CSS rules for Mount_Head_Dragon-Hydra and Mount_Body_Dragon-Hydra GIF sprites

    * Remove the separate Hydra mount dimension declaration

    ---------

    Co-authored-by: CuriousMagpie <eilatan@gmail.com>

commit c03ab9855f
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 5 14:31:05 2025 -0500

    5.38.1

commit 8f96b7b7fd
Author: Weblate <noreply@weblate.org>
Date:   Tue Aug 5 13:02:45 2025 +0200

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.1% (42 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.7% (41 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.3% (40 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.8% (425 of 430 strings)

    Translated using Weblate (French)

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.9% (39 of 245 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (Polish)

    Currently translated at 95.5% (128 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.7% (254 of 268 strings)

    Translated using Weblate (Polish)

    Currently translated at 94.0% (126 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.6% (424 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.3% (423 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (798 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.4% (797 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.6% (781 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3112 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3111 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.0% (174 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (8 of 8 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.5% (38 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.5% (173 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.6% (279 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Japanese)

    Currently translated at 89.2% (769 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.4% (253 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 97.9% (421 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.6% (251 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.8% (168 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.1% (37 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Croatian)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Korean)

    Currently translated at 22.8% (56 of 245 strings)

    Translated using Weblate (Korean)

    Currently translated at 47.7% (128 of 268 strings)

    Translated using Weblate (Croatian)

    Currently translated at 45.1% (121 of 268 strings)

    Translated using Weblate (Korean)

    Currently translated at 71.9% (620 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 70.6% (609 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 75.0% (6 of 8 strings)

    Translated using Weblate (Korean)

    Currently translated at 67.6% (291 of 430 strings)

    Translated using Weblate (Korean)

    Currently translated at 52.8% (1788 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 50.3% (1706 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 51.7% (134 of 259 strings)

    Translated using Weblate (Czech)

    Currently translated at 92.8% (130 of 140 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 86.9% (233 of 268 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (Danish)

    Currently translated at 92.1% (105 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 89.4% (102 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 83.5% (112 of 134 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 71.6% (308 of 430 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (Serbian)

    Currently translated at 84.4% (49 of 58 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 51.4% (144 of 280 strings)

    Translated using Weblate (Swedish)

    Currently translated at 66.5% (286 of 430 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Slovak)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Romanian)

    Currently translated at 66.7% (287 of 430 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (430 of 430 strings)

    Translated using Weblate (Danish)

    Currently translated at 66.0% (284 of 430 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (300 of 430 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.7% (3377 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 54.1% (1834 of 3385 strings)

    Translated using Weblate (Serbian)

    Currently translated at 50.6% (1714 of 3385 strings)

    Translated using Weblate (Slovak)

    Currently translated at 50.0% (1695 of 3385 strings)

    Translated using Weblate (Romanian)

    Currently translated at 60.5% (2050 of 3385 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 38.4% (1301 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Danish)

    Currently translated at 54.0% (1829 of 3385 strings)

    Translated using Weblate (Czech)

    Currently translated at 59.6% (2020 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 75.6% (140 of 185 strings)

    Translated using Weblate (Serbian)

    Currently translated at 73.5% (136 of 185 strings)

    Translated using Weblate (Slovak)

    Currently translated at 84.8% (157 of 185 strings)

    Translated using Weblate (Romanian)

    Currently translated at 78.9% (146 of 185 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 82.1% (152 of 185 strings)

    Translated using Weblate (Italian)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Danish)

    Currently translated at 77.2% (143 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.7% (242 of 245 strings)

    Translated using Weblate (Czech)

    Currently translated at 75.1% (139 of 185 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 74.5% (138 of 185 strings)

    Translated using Weblate (Czech)

    Currently translated at 8.1% (20 of 245 strings)

    Translated using Weblate (Swedish)

    Currently translated at 72.0% (621 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.1% (562 of 862 strings)

    Translated using Weblate (Slovak)

    Currently translated at 66.9% (577 of 862 strings)

    Translated using Weblate (Romanian)

    Currently translated at 77.7% (670 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 70.0% (604 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Italian)

    Currently translated at 86.8% (749 of 862 strings)

    Translated using Weblate (Indonesian)

    Currently translated at 86.0% (742 of 862 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.0% (845 of 862 strings)

    Translated using Weblate (Danish)

    Currently translated at 69.9% (603 of 862 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (601 of 862 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 66.3% (572 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 74.0% (305 of 412 strings)

    Translated using Weblate (Turkish)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Danish)

    Currently translated at 90.0% (371 of 412 strings)

    Translated using Weblate (Ukrainian)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Swedish)

    Currently translated at 53.6% (139 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Danish)

    Currently translated at 62.1% (161 of 259 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 54.0% (140 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 82.8% (222 of 268 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.3% (241 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 88.4% (237 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 87.3% (234 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 86.4% (160 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.8% (913 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Russian)

    Currently translated at 88.5% (248 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (862 of 862 strings)

    Co-authored-by: Ayaka Booker <ayakabooker@gmail.com>
    Co-authored-by: Chaotic Lawful <habitica@eusebius.fr>
    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Lio Zam <zerofux@web.de>
    Co-authored-by: Mika <isekai.chr@gmail.com>
    Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
    Co-authored-by: Summer_GUI <heyang94@163.com>
    Co-authored-by: Vera <verasmolinap@gmail.com>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Zhi Hao Li <zhihaoli000@gmail.com>
    Co-authored-by: Zuz Q <zuzannakunik@gmail.com>
    Co-authored-by: innnko <ayakabooker@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Co-authored-by: 潘致翰 <happyq0908@gmail.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/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    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/it/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/hr/
    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/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/
    Translate-URL: https://translate.habitica.com/projects/habitica/messages/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
    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/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/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/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/tasks/cs/
    Translation: Habitica/Achievements
    Translation: Habitica/Backgrounds
    Translation: Habitica/Character
    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/Messages
    Translation: Habitica/Npc
    Translation: Habitica/Overview
    Translation: Habitica/Pets
    Translation: Habitica/Quests
    Translation: Habitica/Questscontent
    Translation: Habitica/Settings
    Translation: Habitica/Subscriber
    Translation: Habitica/Tasks

commit 1dde2674f6
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Jun 16 16:43:56 2025 -0500

    fix(content): don't filter out the thing we want

commit 76122a8889
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 4 14:28:27 2025 -0500

    fix(mobile): provide Challenge categories via API

commit 9e309a875e
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:15:00 2025 -0500

    5.38.0

commit 09e3a394b8
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:06:45 2025 -0500

    5.37.3

commit eba263360f
Author: Weblate <noreply@weblate.org>
Date:   Mon Jul 28 21:03:17 2025 +0200

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 98.6% (850 of 862 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.4% (3360 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 14.2% (35 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.8% (34 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.0% (32 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 2.0% (5 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 54.1% (1830 of 3377 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
    Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
    Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
    Co-authored-by: Remigiusz Haziak <haziakremigiusz@gmail.com>
    Co-authored-by: Uwe B <hbtca@tunixgut.de>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Wellinton Cardoso <wmcardoso1@hotmail.com>
    Co-authored-by: cloudzzy <truskawka412@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translation: Habitica/Character
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Npc
    Translation: Habitica/Questscontent

commit 9550eec718
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 28 16:50:38 2025 +0200

    Fix 500 when deleting a very old group plan account (#15481)

commit f267eb67e9
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Jul 29 14:12:35 2025 -0500

    fix(static): add back missing div for show/hide

commit 28251f42ab
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Jul 24 22:59:01 2025 -0500

    feat(privacy): preview page

* feat(privacy): respect Global Privacy Control

* fix(lint): remove unused component

* fix(test): test user opts in to tracking

* fix(test): add user pref to more contexts

* fix(test): final spot in api-unit

* fix(tests): update integrations

* chore(privacy): add paragraph to s1, retire separate preview pages

* fix(build): route copypasta

* fix(router): lingering dead import

---------

Signed-off-by: Kalista Payne <sabrecat@gmail.com>
Signed-off-by: Kalista Payne <kalista@habitica.com>
Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: CuriousMagpie <eilatan@gmail.com>
2025-08-22 10:08:33 -05:00
dependabot[bot]
16e1523b08 chore(deps): bump tar-fs from 2.1.1 to 2.1.3 (#15446)
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.1 to 2.1.3.
- [Commits](https://github.com/mafintosh/tar-fs/commits)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-21 17:09:23 -05:00
dependabot[bot]
0f06ec1ab8 chore(deps): bump brace-expansion in /website/client (#15461)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 1.1.11 to 1.1.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/1.1.11...v1.1.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 1.1.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-21 17:09:13 -05:00
dependabot[bot]
641266122a chore(deps): bump on-headers, compression, cookie-session and morgan (#15477)
Bumps [on-headers](https://github.com/jshttp/on-headers), [compression](https://github.com/expressjs/compression), [cookie-session](https://github.com/expressjs/cookie-session) and [morgan](https://github.com/expressjs/morgan). These dependencies needed to be updated together.

Updates `on-headers` from 1.0.2 to 1.1.0
- [Release notes](https://github.com/jshttp/on-headers/releases)
- [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0)

Updates `compression` from 1.7.4 to 1.8.1
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...v1.8.1)

Updates `cookie-session` from 2.0.0 to 2.1.1
- [Release notes](https://github.com/expressjs/cookie-session/releases)
- [Changelog](https://github.com/expressjs/cookie-session/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/cookie-session/compare/v2.0.0...v2.1.1)

Updates `morgan` from 1.10.0 to 1.10.1
- [Release notes](https://github.com/expressjs/morgan/releases)
- [Changelog](https://github.com/expressjs/morgan/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/morgan/compare/1.10.0...1.10.1)

---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: direct:production
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: direct:production
- dependency-name: cookie-session
  dependency-version: 2.1.1
  dependency-type: direct:production
- dependency-name: morgan
  dependency-version: 1.10.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-21 16:45:01 -05:00
dependabot[bot]
5ba939ee9c chore(deps): bump form-data from 4.0.0 to 4.0.4 in /website/client (#15478)
Bumps [form-data](https://github.com/form-data/form-data) from 4.0.0 to 4.0.4.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.0...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-21 16:44:41 -05:00
Fiz
c979e568f1 Respect user language preference in content endpoint (#15485)
* Respect user language preference in content endpoint

Content API now returns data in user's preferred language when authenticated without language parameter. No breaking changes - existing clients unaffected.

* lint fix
2025-08-21 16:44:15 -05:00
Kalista Payne
93f0c240f9 5.39.0 2025-08-21 13:36:45 -05:00
Weblate
ad04b077a4 Merge branch 'origin/develop' into Weblate. 2025-08-21 20:33:08 +02:00
Weblate
7ffc454320 Translated using Weblate (Japanese)
Currently translated at 97.4% (264 of 271 strings)

Translated using Weblate (Spanish)

Currently translated at 99.0% (3409 of 3441 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (French)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (284 of 284 strings)

Translated using Weblate (French)

Currently translated at 100.0% (284 of 284 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (3441 of 3441 strings)

Translated using Weblate (French)

Currently translated at 98.1% (3377 of 3441 strings)

Translated using Weblate (Spanish)

Currently translated at 98.8% (3402 of 3441 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 88.4% (215 of 243 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (923 of 923 strings)

Translated using Weblate (Japanese)

Currently translated at 91.7% (3156 of 3441 strings)

Translated using Weblate (Japanese)

Currently translated at 95.9% (260 of 271 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (283 of 284 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Japanese)

Currently translated at 99.6% (920 of 923 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (271 of 271 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (284 of 284 strings)

Translated using Weblate (Spanish)

Currently translated at 98.6% (3395 of 3441 strings)

Translated using Weblate (French)

Currently translated at 100.0% (923 of 923 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Chinese (Traditional))

Currently translated at 86.4% (210 of 243 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 96.3% (186 of 193 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (167 of 167 strings)

Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Kerry Lu <kerryyk.lu@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: innnko <ayakabooker@gmail.com>
Co-authored-by: ? <importantdata78@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hant/
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/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hant/
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/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
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/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Limited
Translation: Habitica/Npc
Translation: Habitica/Subscriber
2025-08-21 20:32:58 +02:00
Kalista Payne
dae0fbff16 fix(privacy): add caution against providing sensitive info 2025-08-21 12:35:38 -05:00
Kalista Payne
5648092112 Squashed commit of the following:
commit deecf669d3
Author: Kalista Payne <kalista@habitica.com>
Date:   Wed Aug 13 17:37:41 2025 -0500

    fix(background): *inside* forest witchs cottage

commit 977ebb5b78
Author: Kalista Payne <kalista@habitica.com>
Date:   Wed Aug 13 17:08:05 2025 -0500

    feat(content): October and November releases

commit fe46733a61
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 12 17:06:59 2025 -0500

    fix(content): missing strings and release dates

commit fd4d69be71
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 12 16:51:06 2025 -0500

    chore(sprites): compile, update subproj

commit c055213790
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 12 16:49:14 2025 -0500

    feat(content): September 2025 Gala and monthly
2025-08-19 14:37:42 -05:00
Kalista Payne
275b15b773 5.38.4 2025-08-19 14:24:52 -05:00
Weblate
1025635e34 Merge branch 'origin/develop' into Weblate. 2025-08-19 21:23:02 +02:00
Phillip Thelen
836cbdb81e update timestamp when user logs in (#15489)
* update timestamp when user logs in

* fix(comment): typo

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-08-19 14:04:33 -05:00
Weblate
be922de7ba Translated using Weblate (Chinese (Traditional))
Currently translated at 82.4% (711 of 862 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 82.4% (711 of 862 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 94.6% (390 of 412 strings)

Translated using Weblate (French)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 96.3% (186 of 193 strings)

Translated using Weblate (Portuguese)

Currently translated at 54.8% (147 of 268 strings)

Translated using Weblate (Portuguese)

Currently translated at 98.2% (112 of 114 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Portuguese)

Currently translated at 34.5% (84 of 243 strings)

Translated using Weblate (German)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Portuguese)

Currently translated at 95.6% (87 of 91 strings)

Translated using Weblate (Portuguese)

Currently translated at 69.4% (180 of 259 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (186 of 186 strings)

Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
Co-authored-by: LPDJ <petits.julius@gmail.com>
Co-authored-by: Summer_GUI <heyang94@163.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: daniel caze <dsscaze@gmail.com>
Co-authored-by: innnko <ayakabooker@gmail.com>
Co-authored-by: ? <importantdata78@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/death/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt/
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
2025-08-19 14:56:07 +02:00
Kalista Payne
3a2f5e724d 5.38.3 2025-08-18 15:20:54 -05:00
Kalista Payne
8a105c6a14 chore(subproj): update habitica-images 2025-08-18 15:20:31 -05:00
Weblate
7f1c64a50e Merge branch 'origin/develop' into Weblate. 2025-08-18 22:18:14 +02:00
Weblate
125f472f34 Translated using Weblate (Polish)
Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (Polish)

Currently translated at 61.7% (173 of 280 strings)

Translated using Weblate (Polish)

Currently translated at 33.0% (81 of 245 strings)

Translated using Weblate (Polish)

Currently translated at 68.3% (589 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 97.2% (252 of 259 strings)

Translated using Weblate (Polish)

Currently translated at 52.3% (1773 of 3385 strings)

Translated using Weblate (Polish)

Currently translated at 92.4% (172 of 186 strings)

Translated using Weblate (Japanese)

Currently translated at 93.1% (803 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 92.6% (799 of 862 strings)

Translated using Weblate (Polish)

Currently translated at 86.0% (160 of 186 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 82.4% (711 of 862 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 69.8% (2364 of 3385 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 69.8% (2363 of 3385 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 86.4% (210 of 243 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 96.3% (186 of 193 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 82.8% (222 of 268 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 94.7% (108 of 114 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 95.5% (128 of 134 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 83.9% (235 of 280 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 86.4% (210 of 243 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 23.2% (57 of 245 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 82.4% (711 of 862 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 63.7% (58 of 91 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 96.3% (186 of 193 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 96.3% (186 of 193 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 71.8% (186 of 259 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 94.7% (127 of 134 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 91.8% (395 of 430 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 82.4% (711 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 95.5% (256 of 268 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Japanese)

Currently translated at 86.1% (211 of 245 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (French)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (Japanese)

Currently translated at 85.7% (210 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 85.7% (210 of 245 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 88.0% (236 of 268 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 69.7% (2362 of 3385 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.1% (846 of 862 strings)

Translated using Weblate (Japanese)

Currently translated at 92.6% (3135 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 99.4% (185 of 186 strings)

Translated using Weblate (Japanese)

Currently translated at 82.8% (203 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Korean)

Currently translated at 53.5% (150 of 280 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (914 of 914 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 21.2% (52 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 92.6% (3135 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 92.4% (3128 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 92.5% (798 of 862 strings)

Translated using Weblate (Dutch)

Currently translated at 42.4% (104 of 245 strings)

Translated using Weblate (Japanese)

Currently translated at 91.9% (3113 of 3385 strings)

Translated using Weblate (Japanese)

Currently translated at 94.0% (175 of 186 strings)

Translated using Weblate (German)

Currently translated at 100.0% (186 of 186 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 87.3% (234 of 268 strings)

Translated using Weblate (Polish)

Currently translated at 98.5% (138 of 140 strings)

Translated using Weblate (Polish)

Currently translated at 98.9% (93 of 94 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 92.1% (3118 of 3385 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.6% (253 of 259 strings)

Co-authored-by: Alexandre Le Mercier <couzinemile@gmail.com>
Co-authored-by: Bernard Kwok <bunlik@gmail.com>
Co-authored-by: FingerTiao <787170918@qq.com>
Co-authored-by: Izzy <nineyellowgirl@gmail.com>
Co-authored-by: Kalista Payne <kalista@habitica.com>
Co-authored-by: Karictre <karictre.git@gmail.com>
Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
Co-authored-by: Kubo Mizuki <m.kubo.0916@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Wellinton Cardoso <wmcardoso1@hotmail.com>
Co-authored-by: innnko <ayakabooker@gmail.com>
Co-authored-by: 황재아 <wodk123mj@naver.com>
Co-authored-by: ? <importantdata78@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
Translate-URL: https://translate.habitica.com/projects/habitica/front/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/front/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/front/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hant/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/pl/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2025-08-18 22:18:04 +02:00
Kalista Payne
bafd273475 fix(ToS): terminology and date changes, with @hafizzle 2025-08-18 14:44:28 -05:00
Kalista Payne
365cb1c2eb feat(legal): Privacy and TOS updates preview, with @phillipthelen
Squashed commit of the following:

commit 3c5ba4bf24e4bb7996786520101f27ad66405bce
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:38:31 2025 -0500

    fix(privacy): update link ref

commit 9d216f623b
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 14:18:22 2025 -0500

    fix(privacy-tos): copy edits cont'd

commit d744f47140
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Aug 18 13:43:22 2025 -0500

    fix(privacy): copy edits and ToC reflow

commit 2c3c3fc9ce
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:46:24 2025 +0200

    lint

commit cf363034d5
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:54 2025 +0200

    fix link

commit 3afacd2c05
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 18:34:42 2025 +0200

    add updated terms

commit 258b722499
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:42 2025 +0200

    put back button to show/hide third party info

commit 2992e0299b
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Aug 18 17:58:32 2025 +0200

    minor edits

commit bb5e252299
Author: Kalista Payne <kalista@habitica.com>
Date:   Sun Aug 17 21:01:50 2025 -0500

    fix(privacy): update Section 3

commit c79af7baa8
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 15 17:28:49 2025 -0500

    fix(privacy): various copy edits

commit 100f2f4574
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:37:37 2025 +0200

    add newline

commit 11d1cfd0d9
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Aug 15 11:10:01 2025 +0200

    update privacy policy

commit 59b99badf3
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 14:04:19 2025 -0500

    5.38.2

commit 78daeb4191
Author: Kalista Payne <kalista@habitica.com>
Date:   Fri Aug 8 13:36:19 2025 -0500

    fix(apple): don't run auth middleware during redirect

commit 93f8d60903
Author: Weblate <noreply@weblate.org>
Date:   Fri Aug 8 10:12:25 2025 +0200

    Translated using Weblate (German)

    Currently translated at 99.4% (185 of 186 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (186 of 186 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (54 of 54 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (Dutch)

    Currently translated at 78.0% (2643 of 3385 strings)

    Translated using Weblate (Dutch)

    Currently translated at 40.8% (100 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 89.9% (233 of 259 strings)

    Translated using Weblate (Dutch)

    Currently translated at 67.5% (175 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (110 of 110 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 20.8% (51 of 245 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Turkish)

    Currently translated at 65.9% (60 of 91 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.9% (44 of 245 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Linsey Dunya Pastoor <sekai.creations@gmail.com>
    Co-authored-by: Mete Olmez <metezori27@gmail.com>
    Co-authored-by: Sefa Uğurlu <ugurlusefa2@gmail.com>
    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: innnko <ayakabooker@gmail.com>
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/challenge/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/nl/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/pl/
    Translation: Habitica/Backgrounds
    Translation: Habitica/Challenge
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Death
    Translation: Habitica/Defaulttasks
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Settings

commit eb16fec41e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Aug 6 22:08:07 2025 +0200

    Add interface to block ip-addresses or clients due to abuse (#15484)

    * Read IP blocks from database

    * begin building general blocking solution

    * add new frontend files

    * Add UI for managing blockers

    * correctly reset local data after creating blocker

    * Tweak wording

    * Add UI for managing blockers

    * restructure admin pages

    * improve test coverage

    * Improve blocker UI

    * add blocker to block emails from registration

    * lint fix

    * fix

    * lint fixes

    * fix import

    * add new permission for managing blockers

    * improve permission check

    * fix managing permissions from admin

    * improve navbar display for non fullAccess admin

    * update block error strings

    * lint fix

    * add option to errorHandler to skip logging

    * validate blocker value during input

    * improve blocker form display

    * chore(subproj): reconcile habitica-images

    * fix(scripts): use same Mongo version for dev/test

    * fix(whitespace): eof

    * documentation improvements

    * remove nconf import

    * remove old test

    ---------

    Co-authored-by: Kalista Payne <kalista@habitica.com>
    Co-authored-by: Kalista Payne <sabrecat@gmail.com>

commit 47d832bf12
Author: Fiz <34069775+Hafizzle@users.noreply.github.com>
Date:   Tue Aug 5 15:12:44 2025 -0500

    Add backend support for Hydra mount (#15482)

    * chore: update time travelers shop to display seasonal backgrounds

    * chore: update time travelers banner (note CSS borken rn)

    * chore: fix borken CSS and update logic in shop

    * chore: added isSubscribed function, not working

    * chore: isSubscribed working but no bg for subscribers

    * chore: logic and css updates

    * chore: update habitica-images

    * chore: add check for trinket

    * chore: more time traveler shop logicking

    * Add backend support for Hydra mount

    - Add Dragon-Hydra to special mounts in stable.js
      - Configure as contributor level 7 reward with canFind: true
      - Add GIF format support for mount sprites
      - Enable admin panel granting capability

    * Fix Vue template errors in timeTravelers component

    * Fix duplicate template block in timeTravelers component

    * add CSS for Hydra mount GIF sprites

    Added CSS rules for Mount_Head_Dragon-Hydra and Mount_Body_Dragon-Hydra GIF sprites

    * Remove the separate Hydra mount dimension declaration

    ---------

    Co-authored-by: CuriousMagpie <eilatan@gmail.com>

commit c03ab9855f
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Aug 5 14:31:05 2025 -0500

    5.38.1

commit 8f96b7b7fd
Author: Weblate <noreply@weblate.org>
Date:   Tue Aug 5 13:02:45 2025 +0200

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 17.1% (42 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.7% (41 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 16.3% (40 of 245 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.8% (425 of 430 strings)

    Translated using Weblate (French)

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.9% (39 of 245 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (Polish)

    Currently translated at 95.5% (128 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.7% (254 of 268 strings)

    Translated using Weblate (Polish)

    Currently translated at 94.0% (126 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.6% (424 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 98.3% (423 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (798 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.4% (797 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.6% (781 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3112 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.9% (3111 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.0% (174 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (8 of 8 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.5% (38 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.5% (173 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.6% (279 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Japanese)

    Currently translated at 89.2% (769 of 862 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 94.4% (253 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 97.9% (421 of 430 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.6% (3104 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 93.6% (251 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 90.8% (168 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 15.1% (37 of 245 strings)

    Translated using Weblate (French)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 92.5% (248 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Croatian)

    Currently translated at 100.0% (15 of 15 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (167 of 167 strings)

    Translated using Weblate (Korean)

    Currently translated at 22.8% (56 of 245 strings)

    Translated using Weblate (Korean)

    Currently translated at 47.7% (128 of 268 strings)

    Translated using Weblate (Croatian)

    Currently translated at 45.1% (121 of 268 strings)

    Translated using Weblate (Korean)

    Currently translated at 71.9% (620 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 70.6% (609 of 862 strings)

    Translated using Weblate (Croatian)

    Currently translated at 75.0% (6 of 8 strings)

    Translated using Weblate (Korean)

    Currently translated at 67.6% (291 of 430 strings)

    Translated using Weblate (Korean)

    Currently translated at 52.8% (1788 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 50.3% (1706 of 3385 strings)

    Translated using Weblate (Croatian)

    Currently translated at 51.7% (134 of 259 strings)

    Translated using Weblate (Czech)

    Currently translated at 92.8% (130 of 140 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 86.9% (233 of 268 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (94 of 94 strings)

    Translated using Weblate (Danish)

    Currently translated at 92.1% (105 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 89.4% (102 of 114 strings)

    Translated using Weblate (Czech)

    Currently translated at 83.5% (112 of 134 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 71.6% (308 of 430 strings)

    Translated using Weblate (Spanish (Latin America))

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (Serbian)

    Currently translated at 84.4% (49 of 58 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 51.4% (144 of 280 strings)

    Translated using Weblate (Swedish)

    Currently translated at 66.5% (286 of 430 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Slovak)

    Currently translated at 65.5% (282 of 430 strings)

    Translated using Weblate (Romanian)

    Currently translated at 66.7% (287 of 430 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (430 of 430 strings)

    Translated using Weblate (Danish)

    Currently translated at 66.0% (284 of 430 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (300 of 430 strings)

    Translated using Weblate (Chinese (Simplified))

    Currently translated at 99.7% (3377 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 54.1% (1834 of 3385 strings)

    Translated using Weblate (Serbian)

    Currently translated at 50.6% (1714 of 3385 strings)

    Translated using Weblate (Slovak)

    Currently translated at 50.0% (1695 of 3385 strings)

    Translated using Weblate (Romanian)

    Currently translated at 60.5% (2050 of 3385 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 38.4% (1301 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Danish)

    Currently translated at 54.0% (1829 of 3385 strings)

    Translated using Weblate (Czech)

    Currently translated at 59.6% (2020 of 3385 strings)

    Translated using Weblate (Swedish)

    Currently translated at 75.6% (140 of 185 strings)

    Translated using Weblate (Serbian)

    Currently translated at 73.5% (136 of 185 strings)

    Translated using Weblate (Slovak)

    Currently translated at 84.8% (157 of 185 strings)

    Translated using Weblate (Romanian)

    Currently translated at 78.9% (146 of 185 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 82.1% (152 of 185 strings)

    Translated using Weblate (Italian)

    Currently translated at 91.8% (170 of 185 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Danish)

    Currently translated at 77.2% (143 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.7% (242 of 245 strings)

    Translated using Weblate (Czech)

    Currently translated at 75.1% (139 of 185 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 74.5% (138 of 185 strings)

    Translated using Weblate (Czech)

    Currently translated at 8.1% (20 of 245 strings)

    Translated using Weblate (Swedish)

    Currently translated at 72.0% (621 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 65.1% (562 of 862 strings)

    Translated using Weblate (Slovak)

    Currently translated at 66.9% (577 of 862 strings)

    Translated using Weblate (Romanian)

    Currently translated at 77.7% (670 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 70.0% (604 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Italian)

    Currently translated at 86.8% (749 of 862 strings)

    Translated using Weblate (Indonesian)

    Currently translated at 86.0% (742 of 862 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.0% (845 of 862 strings)

    Translated using Weblate (Danish)

    Currently translated at 69.9% (603 of 862 strings)

    Translated using Weblate (Czech)

    Currently translated at 69.7% (601 of 862 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 66.3% (572 of 862 strings)

    Translated using Weblate (Serbian)

    Currently translated at 74.0% (305 of 412 strings)

    Translated using Weblate (Turkish)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Danish)

    Currently translated at 90.0% (371 of 412 strings)

    Translated using Weblate (Ukrainian)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Swedish)

    Currently translated at 53.6% (139 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Danish)

    Currently translated at 62.1% (161 of 259 strings)

    Translated using Weblate (Bulgarian)

    Currently translated at 54.0% (140 of 259 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 82.8% (222 of 268 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 99.4% (184 of 185 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 98.3% (241 of 245 strings)

    Translated using Weblate (Japanese)

    Currently translated at 91.3% (3092 of 3385 strings)

    Translated using Weblate (Japanese)

    Currently translated at 88.4% (237 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Japanese)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (Japanese)

    Currently translated at 82.4% (202 of 245 strings)

    Translated using Weblate (English (United Kingdom))

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Japanese)

    Currently translated at 87.3% (234 of 268 strings)

    Translated using Weblate (Japanese)

    Currently translated at 86.4% (160 of 185 strings)

    Translated using Weblate (Japanese)

    Currently translated at 99.8% (913 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (259 of 259 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (3385 of 3385 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (914 of 914 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (268 of 268 strings)

    Translated using Weblate (Russian)

    Currently translated at 88.5% (248 of 280 strings)

    Translated using Weblate (Spanish)

    Currently translated at 99.8% (3379 of 3385 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (862 of 862 strings)

    Co-authored-by: Ayaka Booker <ayakabooker@gmail.com>
    Co-authored-by: Chaotic Lawful <habitica@eusebius.fr>
    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Lio Zam <zerofux@web.de>
    Co-authored-by: Mika <isekai.chr@gmail.com>
    Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
    Co-authored-by: Summer_GUI <heyang94@163.com>
    Co-authored-by: Vera <verasmolinap@gmail.com>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Zhi Hao Li <zhihaoli000@gmail.com>
    Co-authored-by: Zuz Q <zuzannakunik@gmail.com>
    Co-authored-by: innnko <ayakabooker@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Co-authored-by: 潘致翰 <happyq0908@gmail.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/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/content/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/death/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    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/it/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/hr/
    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/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/es_419/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/groups/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/limited/ru/
    Translate-URL: https://translate.habitica.com/projects/habitica/messages/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/overview/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/pets/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/quests/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/cs/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/id/
    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/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ro/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sk/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sr/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/bg/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/da/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/en_GB/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/sv/
    Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/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/hr/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ja/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
    Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/zh_Hans/
    Translate-URL: https://translate.habitica.com/projects/habitica/tasks/cs/
    Translation: Habitica/Achievements
    Translation: Habitica/Backgrounds
    Translation: Habitica/Character
    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/Messages
    Translation: Habitica/Npc
    Translation: Habitica/Overview
    Translation: Habitica/Pets
    Translation: Habitica/Quests
    Translation: Habitica/Questscontent
    Translation: Habitica/Settings
    Translation: Habitica/Subscriber
    Translation: Habitica/Tasks

commit 1dde2674f6
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Mon Jun 16 16:43:56 2025 -0500

    fix(content): don't filter out the thing we want

commit 76122a8889
Author: Kalista Payne <sabrecat@gmail.com>
Date:   Wed Jun 4 14:28:27 2025 -0500

    fix(mobile): provide Challenge categories via API

commit 9e309a875e
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:15:00 2025 -0500

    5.38.0

commit 09e3a394b8
Author: Kalista Payne <kalista@habitica.com>
Date:   Mon Jul 28 14:06:45 2025 -0500

    5.37.3

commit eba263360f
Author: Weblate <noreply@weblate.org>
Date:   Mon Jul 28 21:03:17 2025 +0200

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (134 of 134 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (3377 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (243 of 243 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 98.6% (850 of 862 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.8% (3373 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.5% (3361 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 99.4% (3360 of 3377 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (Spanish)

    Currently translated at 100.0% (185 of 185 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 67.1% (579 of 862 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (Polish)

    Currently translated at 100.0% (91 of 91 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (184 of 184 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (245 of 245 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (47 of 47 strings)

    Translated using Weblate (German)

    Currently translated at 100.0% (193 of 193 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 14.2% (35 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.8% (34 of 245 strings)

    Translated using Weblate (Chinese (Traditional))

    Currently translated at 13.0% (32 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 2.0% (5 of 245 strings)

    Translated using Weblate (Hebrew)

    Currently translated at 66.1% (570 of 862 strings)

    Translated using Weblate (Portuguese)

    Currently translated at 54.1% (1830 of 3377 strings)

    Co-authored-by: FingerTiao <787170918@qq.com>
    Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
    Co-authored-by: Jan Freihöfer <jan.stauch.is@gmail.com>
    Co-authored-by: Jonathan Niessen <37.friedrich@gmail.com>
    Co-authored-by: Karmelkowy <kicimeow.karmelio@gmail.com>
    Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
    Co-authored-by: Laura Fleckenstein <fleckenstein_laura@web.de>
    Co-authored-by: Omer I.S <omeritzicschwartz@gmail.com>
    Co-authored-by: Remigiusz Haziak <haziakremigiusz@gmail.com>
    Co-authored-by: Uwe B <hbtca@tunixgut.de>
    Co-authored-by: Weblate <noreply@weblate.org>
    Co-authored-by: Wellinton Cardoso <wmcardoso1@hotmail.com>
    Co-authored-by: cloudzzy <truskawka412@gmail.com>
    Co-authored-by: 吳昀錡 <J1120241@gm.fdhs.tyc.edu.tw>
    Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pl/
    Translate-URL: https://translate.habitica.com/projects/habitica/contrib/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hant/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/front/es/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
    Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/npc/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
    Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pl/
    Translation: Habitica/Character
    Translation: Habitica/Communityguidelines
    Translation: Habitica/Contrib
    Translation: Habitica/Faq
    Translation: Habitica/Front
    Translation: Habitica/Gear
    Translation: Habitica/Generic
    Translation: Habitica/Npc
    Translation: Habitica/Questscontent

commit 9550eec718
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 28 16:50:38 2025 +0200

    Fix 500 when deleting a very old group plan account (#15481)

commit f267eb67e9
Author: Kalista Payne <kalista@habitica.com>
Date:   Tue Jul 29 14:12:35 2025 -0500

    fix(static): add back missing div for show/hide

commit 28251f42ab
Author: Kalista Payne <kalista@habitica.com>
Date:   Thu Jul 24 22:59:01 2025 -0500

    feat(privacy): preview page
2025-08-18 14:39:51 -05:00
273 changed files with 5199 additions and 2602 deletions

View File

@@ -8,18 +8,26 @@
"AMAZON_PAYMENTS_SELLER_ID": "SELLER_ID",
"AMPLITUDE_KEY": "AMPLITUDE_KEY",
"AMPLITUDE_SECRET": "AMPLITUDE_SECRET",
"APPLE_AUTH_CLIENT_ID": "",
"APPLE_AUTH_KEY_ID": "",
"APPLE_AUTH_PRIVATE_KEY": "",
"APPLE_TEAM_ID": "",
"BASE_URL": "http://localhost:3000",
"BLOCKED_IPS": "",
"CONTENT_SWITCHOVER_TIME_OFFSET": 8,
"CRON_SAFE_MODE": "false",
"CRON_SEMI_SAFE_MODE": "false",
"DEBUG_ENABLED": "false",
"DISABLE_REQUEST_LOGGING": "true",
"EMAILS_COMMUNITY_MANAGER_EMAIL": "admin@habitica.com",
"EMAILS_PRESS_ENQUIRY_EMAIL": "admin@habitica.com",
"EMAILS_TECH_ASSISTANCE_EMAIL": "admin@habitica.com",
"EMAIL_SERVER_AUTH_PASSWORD": "password",
"EMAIL_SERVER_AUTH_USER": "user",
"EMAIL_SERVER_URL": "http://example.com",
"EMAILS_COMMUNITY_MANAGER_EMAIL": "admin@habitica.com",
"EMAILS_PRESS_ENQUIRY_EMAIL": "admin@habitica.com",
"EMAILS_TECH_ASSISTANCE_EMAIL": "admin@habitica.com",
"ENABLE_CONSOLE_LOGS_IN_PROD": "false",
"ENABLE_CONSOLE_LOGS_IN_TEST": "false",
"ENABLE_STACKDRIVER_TRACING": "false",
"FACEBOOK_KEY": "123456789012345",
"FACEBOOK_SECRET": "aaaabbbbccccddddeeeeffff00001111",
"FLAG_REPORT_EMAIL": "email@example.com, email2@example.com",
@@ -29,15 +37,16 @@
"IAP_GOOGLE_KEYDIR": "/path/to/google/public/key/dir/",
"IGNORE_REDIRECT": "true",
"ITUNES_SHARED_SECRET": "aaaabbbbccccddddeeeeffff00001111",
"LIVELINESS_PROBE_KEY": "",
"LOG_AMPLITUDE_EVENTS": "false",
"LOG_REQUESTS_EXCESSIVE_MODE": "false",
"LOGGLY_CLIENT_TOKEN": "token",
"LOGGLY_SUBDOMAIN": "example-subdomain",
"LOGGLY_TOKEN": "example-token",
"LOG_REQUESTS_EXCESSIVE_MODE": "false",
"MAINTENANCE_MODE": "false",
"NODE_DB_URI": "mongodb://localhost:27017/habitica-dev?replicaSet=rs",
"TEST_DB_URI": "mongodb://localhost:27017/habitica-test?replicaSet=rs",
"MONGODB_POOL_SIZE": "10",
"MONGODB_SOCKET_TIMEOUT": "20000",
"NODE_DB_URI": "mongodb://localhost:27017/habitica-dev?replicaSet=rs",
"NODE_ENV": "development",
"PATH": "bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin",
"PAYPAL_BILLING_PLANS_basic_12mo": "basic_12mo",
@@ -55,44 +64,34 @@
"PLAY_API_REFRESH_TOKEN": "aaaabbbbccccddddeeeeffff00001111",
"PORT": 3000,
"PUSH_CONFIGS_APN_ENABLED": "false",
"PUSH_CONFIGS_APN_KEY": "xxxxxxxxxx",
"PUSH_CONFIGS_APN_KEY_ID": "xxxxxxxxxx",
"PUSH_CONFIGS_APN_KEY": "xxxxxxxxxx",
"PUSH_CONFIGS_APN_TEAM_ID": "aaabbbcccd",
"PUSH_CONFIGS_FCM_SERVER_API_KEY": "aaabbbcccd",
"RATE_LIMITER_ENABLED": "false",
"REDIS_HOST": "aaabbbcccdddeeefff",
"REDIS_PASSWORD": "12345678",
"REDIS_PORT": "1234",
"S3_ACCESS_KEY_ID": "accessKeyId",
"S3_BUCKET": "bucket",
"S3_SECRET_ACCESS_KEY": "secretAccessKey",
"SESSION_SECRET": "YOUR SECRET HERE",
"SESSION_SECRET_IV": "12345678912345678912345678912345",
"SESSION_SECRET_KEY": "1234567891234567891234567891234567891234567891234567891234567891",
"SESSION_SECRET": "YOUR SECRET HERE",
"SITE_HTTP_AUTH_ENABLED": "false",
"SITE_HTTP_AUTH_PASSWORDS": "password,wordpass,passkey",
"SITE_HTTP_AUTH_USERNAMES": "admin,tester,contributor",
"SKIP_SSL_CHECK_KEY": "key",
"SLACK_FLAGGING_FOOTER_LINK": "https://habitrpg.github.io/flag-o-rama/",
"SLACK_FLAGGING_URL": "https://hooks.slack.com/services/id/id/id",
"SLACK_SUBSCRIPTIONS_URL": "https://hooks.slack.com/services/id/id/id",
"SLACK_URL": "https://hooks.slack.com/services/some-url",
"SLOW_REQUEST_THRESHOLD": 1000,
"STRIPE_API_KEY": "aaaabbbbccccddddeeeeffff00001111",
"STRIPE_PUB_KEY": "22223333444455556666777788889999",
"STRIPE_WEBHOOKS_ENDPOINT_SECRET": "111111",
"TRANSIFEX_SLACK_CHANNEL": "transifex",
"WEB_CONCURRENCY": 1,
"SKIP_SSL_CHECK_KEY": "key",
"ENABLE_STACKDRIVER_TRACING": "false",
"APPLE_AUTH_PRIVATE_KEY": "",
"APPLE_TEAM_ID": "",
"APPLE_AUTH_CLIENT_ID": "",
"APPLE_AUTH_KEY_ID": "",
"BLOCKED_IPS": "",
"LOG_AMPLITUDE_EVENTS": "false",
"RATE_LIMITER_ENABLED": "false",
"LIVELINESS_PROBE_KEY": "",
"REDIS_HOST": "aaabbbcccdddeeefff",
"REDIS_PORT": "1234",
"REDIS_PASSWORD": "12345678",
"TRUSTED_DOMAINS": "localhost,https://habitica.com",
"TEST_DB_URI": "mongodb://localhost:27017/habitica-test?replicaSet=rs",
"TIME_TRAVEL_ENABLED": "false",
"DEBUG_ENABLED": "false",
"CONTENT_SWITCHOVER_TIME_OFFSET": 8,
"SLOW_REQUEST_THRESHOLD": 1000
"TRUSTED_DOMAINS": "localhost,https://habitica.com",
"WEB_CONCURRENCY": 1
}

View File

@@ -10,7 +10,7 @@ function setUpServer () {
setupNconf();
// We require src/server and npt src/index because
// We require src/server and not src/index because
// 1. nconf is already setup
// 2. we don't need clustering
require('../website/server/server'); // eslint-disable-line global-require

View File

@@ -11,7 +11,7 @@ const progressCount = 1000;
let count = 0;
/*
* Award users every extant pet and mount
* Award every extant piece of equippable gear
*/
async function updateUser (user) {

View File

@@ -3,7 +3,8 @@ import { v4 as uuid } from 'uuid';
import { model as User } from '../../website/server/models/user';
const MIGRATION_NAME = '20181203_take_this';
const MIGRATION_NAME = 'YYYYMMDD_take_this';
const CHALLENGE_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx';
const progressCount = 1000;
let count = 0;
@@ -41,15 +42,15 @@ async function updateUser (user) {
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
if (push) {
return User.update({ _id: user._id }, { $set: set, $push: push }).exec();
return User.updateOne({ _id: user._id }, { $set: set, $push: push }).exec();
}
return User.update({ _id: user._id }, { $set: set }).exec();
return User.updateOne({ _id: user._id }, { $set: set }).exec();
}
export default async function processUsers () {
const query = {
migration: { $ne: MIGRATION_NAME },
challenges: '00708425-d477-41a5-bf27-6270466e7976',
challenges: CHALLENGE_ID,
};
const fields = {

215
package-lock.json generated
View File

@@ -1,17 +1,18 @@
{
"name": "habitica",
"version": "5.38.2",
"version": "5.40.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "habitica",
"version": "5.38.2",
"version": "5.40.2",
"hasInstallScript": true,
"dependencies": {
"@babel/core": "^7.22.10",
"@babel/preset-env": "^7.22.10",
"@babel/register": "^7.22.15",
"@google-analytics/data": "^4.12.1",
"@google-cloud/trace-agent": "^7.1.2",
"@parse/node-apn": "^5.2.3",
"@slack/webhook": "^6.1.0",
@@ -24,8 +25,8 @@
"bcrypt": "^5.1.1",
"body-parser": "^1.20.3",
"bootstrap": "^4.6.2",
"compression": "^1.7.4",
"cookie-session": "^2.0.0",
"compression": "^1.8.1",
"cookie-session": "^2.1.1",
"coupon-code": "^0.4.5",
"csv-stringify": "^5.6.5",
"cwait": "^1.1.1",
@@ -56,10 +57,10 @@
"moment": "^2.29.4",
"moment-recur": "git://github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"mongoose": "^8.9.5",
"morgan": "^1.10.0",
"morgan": "^1.10.1",
"nconf": "^0.12.1",
"node-gcm": "^1.0.5",
"on-headers": "^1.0.2",
"on-headers": "^1.1.0",
"passport": "^0.5.3",
"passport-facebook": "^3.0.0",
"passport-google-oauth2": "^0.2.0",
@@ -75,7 +76,6 @@
"sinon": "^15.2.0",
"stripe": "^12.18.0",
"superagent": "^8.1.2",
"universal-analytics": "^0.5.3",
"useragent": "^2.1.9",
"uuid": "^9.0.0",
"validator": "^13.11.0",
@@ -1975,6 +1975,17 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/@google-analytics/data": {
"version": "4.12.1",
"resolved": "https://registry.npmjs.org/@google-analytics/data/-/data-4.12.1.tgz",
"integrity": "sha512-LzyrkVrnVUTYTmdmHayOZoroc+YA9GHEUrkSSuiXSmMSNbesuWy/MoTXugC1V7+8PCGqb2eQ1UtVVv/2BCAQYA==",
"dependencies": {
"google-gax": "^4.0.3"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@google-cloud/common": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-4.0.3.tgz",
@@ -2318,7 +2329,6 @@
"version": "1.10.8",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz",
"integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==",
"optional": true,
"dependencies": {
"@grpc/proto-loader": "^0.7.13",
"@js-sdsl/ordered-map": "^4.4.2"
@@ -2331,7 +2341,6 @@
"version": "0.7.13",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
"integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
"optional": true,
"dependencies": {
"lodash.camelcase": "^4.3.0",
"long": "^5.0.0",
@@ -2349,7 +2358,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"optional": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -2364,7 +2372,6 @@
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"optional": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
@@ -2378,7 +2385,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"optional": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -2389,14 +2395,12 @@
"node_modules/@grpc/proto-loader/node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"optional": true
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/@grpc/proto-loader/node_modules/get-caller-file": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"optional": true,
"engines": {
"node": "6.* || 8.* || >= 10.*"
}
@@ -2405,7 +2409,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"optional": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -2422,7 +2425,6 @@
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
"optional": true,
"engines": {
"node": ">=10"
}
@@ -2431,7 +2433,6 @@
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"optional": true,
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
@@ -2449,7 +2450,6 @@
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"optional": true,
"engines": {
"node": ">=12"
}
@@ -2620,7 +2620,6 @@
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz",
"integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==",
"optional": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/js-sdsl"
@@ -2933,32 +2932,27 @@
"node_modules/@protobufjs/aspromise": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==",
"optional": true
"integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
},
"node_modules/@protobufjs/base64": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
"optional": true
"integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="
},
"node_modules/@protobufjs/codegen": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
"optional": true
"integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="
},
"node_modules/@protobufjs/eventemitter": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==",
"optional": true
"integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="
},
"node_modules/@protobufjs/fetch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
"integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==",
"optional": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.1",
"@protobufjs/inquire": "^1.1.0"
@@ -2967,32 +2961,27 @@
"node_modules/@protobufjs/float": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz",
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==",
"optional": true
"integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="
},
"node_modules/@protobufjs/inquire": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==",
"optional": true
"integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="
},
"node_modules/@protobufjs/path": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==",
"optional": true
"integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="
},
"node_modules/@protobufjs/pool": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==",
"optional": true
"integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="
},
"node_modules/@protobufjs/utf8": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==",
"optional": true
"integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="
},
"node_modules/@sindresorhus/is": {
"version": "4.6.0",
@@ -3127,8 +3116,7 @@
"node_modules/@types/caseless": {
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz",
"integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==",
"optional": true
"integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg=="
},
"node_modules/@types/connect": {
"version": "3.4.38",
@@ -3231,8 +3219,7 @@
"node_modules/@types/long": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==",
"optional": true
"integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA=="
},
"node_modules/@types/mime": {
"version": "1.3.5",
@@ -3282,7 +3269,6 @@
"version": "2.48.12",
"resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.12.tgz",
"integrity": "sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==",
"optional": true,
"dependencies": {
"@types/caseless": "*",
"@types/node": "*",
@@ -3294,7 +3280,6 @@
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
"integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
"optional": true,
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
@@ -3334,8 +3319,7 @@
"node_modules/@types/tough-cookie": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
"optional": true
"integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="
},
"node_modules/@types/triple-beam": {
"version": "1.3.5",
@@ -3545,7 +3529,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"optional": true,
"dependencies": {
"event-target-shim": "^5.0.0"
},
@@ -6906,30 +6889,23 @@
}
},
"node_modules/compression": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
"integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
"integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.5",
"bytes": "3.0.0",
"compressible": "~2.0.16",
"bytes": "3.1.2",
"compressible": "~2.0.18",
"debug": "2.6.9",
"on-headers": "~1.0.2",
"safe-buffer": "5.1.2",
"negotiator": "~0.6.4",
"on-headers": "~1.1.0",
"safe-buffer": "5.2.1",
"vary": "~1.1.2"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/compression/node_modules/bytes": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
"integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/compression/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -6943,6 +6919,35 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
},
"node_modules/compression/node_modules/negotiator": {
"version": "0.6.4",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
"integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/compression/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"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"
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -7113,13 +7118,14 @@
}
},
"node_modules/cookie-session": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.0.0.tgz",
"integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==",
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.1.1.tgz",
"integrity": "sha512-ji3kym/XZaFVew1+tIZk5ZLp9Z/fLv9rK1aZmpug0FsgE7Cu3ZDrUdRo7FT9vFjMYfNimrrUHJzywDwT7XEFlg==",
"license": "MIT",
"dependencies": {
"cookies": "0.8.0",
"cookies": "0.9.1",
"debug": "3.2.7",
"on-headers": "~1.0.2",
"on-headers": "~1.1.0",
"safe-buffer": "5.2.1"
},
"engines": {
@@ -7164,9 +7170,10 @@
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
},
"node_modules/cookies": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz",
"integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==",
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz",
"integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==",
"license": "MIT",
"dependencies": {
"depd": "~2.0.0",
"keygrip": "~1.1.0"
@@ -9339,7 +9346,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
"optional": true,
"engines": {
"node": ">=6"
}
@@ -11591,7 +11597,6 @@
"version": "4.3.3",
"resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.3.3.tgz",
"integrity": "sha512-f4F2Y9X4+mqsrJuLZsuTljYuQpcBnQsCt9ScvZpdM8jGjqrcxyJi5JUiqtq0jtpdHVPzyit0N7f5t07e+kH5EA==",
"optional": true,
"dependencies": {
"@grpc/grpc-js": "~1.10.3",
"@grpc/proto-loader": "^0.7.0",
@@ -11614,7 +11619,6 @@
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
"integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
"optional": true,
"dependencies": {
"debug": "^4.3.4"
},
@@ -11626,7 +11630,6 @@
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz",
"integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==",
"optional": true,
"dependencies": {
"extend": "^3.0.2",
"https-proxy-agent": "^7.0.1",
@@ -11642,7 +11645,6 @@
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz",
"integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==",
"optional": true,
"dependencies": {
"gaxios": "^6.0.0",
"json-bigint": "^1.0.0"
@@ -11655,7 +11657,6 @@
"version": "9.10.0",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz",
"integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==",
"optional": true,
"dependencies": {
"base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11",
@@ -11672,7 +11673,6 @@
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz",
"integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==",
"optional": true,
"dependencies": {
"gaxios": "^6.0.0",
"jws": "^4.0.0"
@@ -11685,7 +11685,6 @@
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz",
"integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==",
"optional": true,
"dependencies": {
"agent-base": "^7.0.2",
"debug": "4"
@@ -11699,7 +11698,6 @@
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz",
"integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==",
"hasInstallScript": true,
"optional": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
@@ -11722,7 +11720,6 @@
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz",
"integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==",
"optional": true,
"dependencies": {
"@types/request": "^2.48.8",
"extend": "^3.0.2",
@@ -11736,7 +11733,6 @@
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz",
"integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==",
"optional": true,
"dependencies": {
"http-proxy-agent": "^5.0.0",
"https-proxy-agent": "^5.0.0",
@@ -11752,7 +11748,6 @@
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"optional": true,
"dependencies": {
"debug": "4"
},
@@ -11764,7 +11759,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
"integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"optional": true,
"dependencies": {
"agent-base": "6",
"debug": "4"
@@ -14005,6 +13999,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz",
"integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==",
"license": "MIT",
"dependencies": {
"tsscmp": "1.0.6"
},
@@ -14242,8 +14237,7 @@
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"optional": true
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
@@ -15519,15 +15513,16 @@
"dev": true
},
"node_modules/morgan": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
"integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz",
"integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==",
"license": "MIT",
"dependencies": {
"basic-auth": "~2.0.1",
"debug": "2.6.9",
"depd": "~2.0.0",
"on-finished": "~2.3.0",
"on-headers": "~1.0.2"
"on-headers": "~1.1.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -16665,7 +16660,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
"integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
"optional": true,
"engines": {
"node": ">= 6"
}
@@ -16856,9 +16850,10 @@
}
},
"node_modules/on-headers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
"integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -17887,7 +17882,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.1.tgz",
"integrity": "sha512-8awBvjO+FwkMd6gNoGFZyqkHZXCFd54CIYTb6De7dPaufGJ2XNW+QUNqbMr8MaAocMdb+KpsD4rxEOaTBDCffA==",
"optional": true,
"dependencies": {
"protobufjs": "^7.2.5"
},
@@ -17900,7 +17894,6 @@
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz",
"integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==",
"hasInstallScript": true,
"optional": true,
"dependencies": {
"@protobufjs/aspromise": "^1.1.2",
"@protobufjs/base64": "^1.1.2",
@@ -20501,9 +20494,10 @@
}
},
"node_modules/tar-fs": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
"integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
"license": "MIT",
"dependencies": {
"chownr": "^1.1.1",
"mkdirp-classic": "^0.5.2",
@@ -21043,6 +21037,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz",
"integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==",
"license": "MIT",
"engines": {
"node": ">=0.6.x"
}
@@ -21368,26 +21363,6 @@
"through2-filter": "^3.0.0"
}
},
"node_modules/universal-analytics": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.5.3.tgz",
"integrity": "sha512-HXSMyIcf2XTvwZ6ZZQLfxfViRm/yTGoRgDeTbojtq6rezeyKB0sTBcKH2fhddnteAHRcHiKgr/ACpbgjGOC6RQ==",
"dependencies": {
"debug": "^4.3.1",
"uuid": "^8.0.0"
},
"engines": {
"node": ">=12.18.2"
}
},
"node_modules/universal-analytics/node_modules/uuid": {
"version": "8.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",

View File

@@ -1,12 +1,13 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.38.2",
"version": "5.40.2",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.22.10",
"@babel/preset-env": "^7.22.10",
"@babel/register": "^7.22.15",
"@google-analytics/data": "^4.12.1",
"@google-cloud/trace-agent": "^7.1.2",
"@parse/node-apn": "^5.2.3",
"@slack/webhook": "^6.1.0",
@@ -19,8 +20,8 @@
"bcrypt": "^5.1.1",
"body-parser": "^1.20.3",
"bootstrap": "^4.6.2",
"compression": "^1.7.4",
"cookie-session": "^2.0.0",
"compression": "^1.8.1",
"cookie-session": "^2.1.1",
"coupon-code": "^0.4.5",
"csv-stringify": "^5.6.5",
"cwait": "^1.1.1",
@@ -51,10 +52,10 @@
"moment": "^2.29.4",
"moment-recur": "git://github.com/HabitRPG/moment-recur.git#d3e8e6da0806f13b74dd2e4d7d9053e6a63db119",
"mongoose": "^8.9.5",
"morgan": "^1.10.0",
"morgan": "^1.10.1",
"nconf": "^0.12.1",
"node-gcm": "^1.0.5",
"on-headers": "^1.0.2",
"on-headers": "^1.1.0",
"passport": "^0.5.3",
"passport-facebook": "^3.0.0",
"passport-google-oauth2": "^0.2.0",
@@ -70,7 +71,6 @@
"sinon": "^15.2.0",
"stripe": "^12.18.0",
"superagent": "^8.1.2",
"universal-analytics": "^0.5.3",
"useragent": "^2.1.9",
"uuid": "^9.0.0",
"validator": "^13.11.0",
@@ -106,8 +106,8 @@
"start": "node --watch ./website/server/index.js",
"start:simple": "node ./website/server/index.js",
"debug": "node --watch --inspect ./website/server/index.js",
"mongo:dev": "run-rs -v 7.0.23 -l ubuntu2404 --keep --dbpath mongodb-data --number 1 --quiet",
"mongo:test": "run-rs -v 7.0.23 -l ubuntu2404 --keep --dbpath mongodb-data-testing --number 1 --quiet",
"mongo:dev": "run-rs -v 7.0.23 -l ubuntu2204 --keep --dbpath mongodb-data --number 1 --quiet",
"mongo:test": "run-rs -v 7.0.23 -l ubuntu2204 --keep --dbpath mongodb-data-testing --number 1 --quiet",
"postinstall": "git config --global url.\"https://\".insteadOf git:// && gulp build && cd website/client && npm install",
"apidoc": "gulp apidoc",
"heroku-postbuild": ".heroku/report_deploy.sh"

View File

@@ -1,15 +1,11 @@
/* eslint-disable camelcase */
import nconf from 'nconf';
import Amplitude from 'amplitude';
import { Visitor } from 'universal-analytics';
import * as analyticsService from '../../../../website/server/libs/analyticsService';
describe('analyticsService', () => {
beforeEach(() => {
sandbox.stub(Amplitude.prototype, 'track').returns(Promise.resolve());
sandbox.stub(Visitor.prototype, 'event');
sandbox.stub(Visitor.prototype, 'transaction');
});
afterEach(() => {
@@ -37,8 +33,6 @@ describe('analyticsService', () => {
data;
beforeEach(() => {
Visitor.prototype.event.yields();
eventType = 'Cron';
data = {
category: 'behavior',
@@ -49,6 +43,11 @@ describe('analyticsService', () => {
'x-client': 'habitica-web',
'user-agent': '',
},
user: {
preferences: {
analyticsConsent: true,
},
},
};
});
@@ -295,6 +294,9 @@ describe('analyticsService', () => {
rewards: [{ _id: 'reward' }],
balance: 12,
loginIncentives: 1,
preferences: {
analyticsConsent: true,
},
};
data.user = user;
@@ -326,37 +328,12 @@ describe('analyticsService', () => {
});
});
});
context('GA', () => {
it('calls out to GA', () => analyticsService.track(eventType, data)
.then(() => {
expect(Visitor.prototype.event).to.be.calledOnce;
}));
it('sends details about event', () => analyticsService.track(eventType, data)
.then(() => {
expect(Visitor.prototype.event).to.be.calledWith({
ea: 'Cron',
ec: 'behavior',
});
}));
});
});
describe('#trackPurchase', () => {
let data; let
itemSpy;
let data;
beforeEach(() => {
Visitor.prototype.event.yields();
itemSpy = sandbox.stub().returnsThis();
Visitor.prototype.transaction.returns({
item: itemSpy,
send: sandbox.stub().yields(),
});
data = {
uuid: 'user-id',
sku: 'paypal-checkout',
@@ -370,6 +347,11 @@ describe('analyticsService', () => {
'x-client': 'habitica-web',
'user-agent': '',
},
user: {
preferences: {
analyticsConsent: true,
},
},
};
});
@@ -533,6 +515,9 @@ describe('analyticsService', () => {
dailys: [{ _id: 'daily' }],
todos: [{ _id: 'todo' }],
rewards: [{ _id: 'reward' }],
preferences: {
analyticsConsent: true,
},
};
data.user = user;
@@ -561,26 +546,6 @@ describe('analyticsService', () => {
});
});
});
context('GA', () => {
it('calls out to GA', () => analyticsService.trackPurchase(data)
.then(() => {
expect(Visitor.prototype.event).to.be.calledOnce;
expect(Visitor.prototype.transaction).to.be.calledOnce;
}));
it('sends details about purchase', () => analyticsService.trackPurchase(data)
.then(() => {
expect(Visitor.prototype.event).to.be.calledWith({
ea: 'checkout',
ec: 'commerce',
el: 'PayPal',
ev: 8,
});
expect(Visitor.prototype.transaction).to.be.calledWith('user-id', 8);
expect(itemSpy).to.be.calledWith(8, 1, 'paypal-checkout', 'Gems', 'checkout');
}));
});
});
describe('mockAnalyticsService', () => {

View File

@@ -34,6 +34,7 @@ describe('bug-report', () => {
emailData: {
BROWSER_UA: userAgent,
REPORT_MSG: userMessage,
USER_ANALYTICS: undefined,
USER_CLASS: 'warrior',
USER_CONSECUTIVE_MONTHS: 0,
USER_COSTUME: 'false',

View File

@@ -1,6 +1,7 @@
import {
requester,
translate as t,
generateUser,
} from '../../../../helpers/api-integration/v3';
import i18n from '../../../../../website/common/script/i18n';
@@ -56,4 +57,28 @@ describe('GET /content', () => {
const res = await requester().get('/content?filter=backgroundsFlat,invalid');
expect(res).to.not.have.property('backgroundsFlat');
});
describe('authenticated user', () => {
let user;
it('returns content in user\'s preferred language when no language parameter is provided', async () => {
user = await generateUser({ 'preferences.language': 'de' });
const res = await user.get('/content');
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'de'));
});
it('respects language parameter over user\'s preferred language', async () => {
user = await generateUser({ 'preferences.language': 'de' });
const res = await user.get('/content?language=fr');
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'fr'));
});
it('falls back to English if user\'s preferred language is invalid', async () => {
user = await generateUser({ 'preferences.language': 'invalid_lang' });
const res = await user.get('/content');
expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach');
expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText'));
});
});
});

View File

@@ -25,7 +25,7 @@ describe('GET /user/auth/apple', () => {
});
it('registers a new user', async () => {
const response = await api.get(appleEndpoint);
const response = await api.get(`${appleEndpoint}?allowRegister=true`);
expect(response.apiToken).to.exist;
expect(response.id).to.exist;
@@ -35,7 +35,7 @@ describe('GET /user/auth/apple', () => {
});
it('logs an existing user in', async () => {
const registerResponse = await api.get(appleEndpoint);
const registerResponse = await api.get(`${appleEndpoint}?allowRegister=true`);
const response = await api.get(appleEndpoint);

View File

@@ -110,6 +110,18 @@ describe('POST /user/auth/local/login', () => {
expect(isValidPassword).to.equal(true);
});
it('sets auth.timestamps.updated', async () => {
const oldUpdated = new Date(user.auth.timestamps.updated);
// login
await api.post(endpoint, {
username: user.auth.local.email,
password,
});
await user.sync();
expect(user.auth.timestamps.updated).to.be.greaterThan(oldUpdated);
});
it('user uses social authentication and has no password', async () => {
await user.unset({
'auth.local.hashed_password': 1,

View File

@@ -6,6 +6,7 @@ import {
translate as t,
getProperty,
} from '../../../../../helpers/api-integration/v3';
import apiErrorMessages from '../../../../../../website/common/script/errors/apiErrorMessages';
describe('POST /user/auth/social', () => {
let api;
@@ -64,6 +65,18 @@ describe('POST /user/auth/social', () => {
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a google user');
});
it('fails if allowRegister is false and user does not exist', async () => {
await expect(api.post(endpoint, {
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
network,
allowRegister: false,
})).to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: `${apiErrorMessages.socialFlowUserNotFound} ${user.auth.local.username}+google@example.com`,
});
});
it('logs an existing user in', async () => {
const registerResponse = await api.post(endpoint, {
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
@@ -131,6 +144,36 @@ describe('POST /user/auth/social', () => {
expect(response.newUser).to.be.false;
});
it('logs an existing user into their social account if allowRegister is false', async () => {
const registerResponse = await api.post(endpoint, {
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
network,
});
expect(registerResponse.newUser).to.be.true;
// This is important for existing accounts before the new social handling
passport._strategies.google.userProfile.restore();
const expectedResult = {
id: randomGoogleId,
displayName: 'a google user',
emails: [
{ value: user.auth.local.email },
],
};
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
const response = await api.post(endpoint, {
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
network,
allowRegister: false,
});
expect(response.apiToken).to.eql(registerResponse.apiToken);
expect(response.id).to.eql(registerResponse.id);
expect(response.apiToken).not.to.eql(user.apiToken);
expect(response.id).not.to.eql(user._id);
expect(response.newUser).to.be.false;
});
it('add social auth to an existing user', async () => {
const response = await user.post(endpoint, {
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
@@ -167,5 +210,24 @@ describe('POST /user/auth/social', () => {
await expect(getProperty('users', user._id, '_ABtests')).to.eventually.be.a('object');
});
it('sets auth.timestamps.updated', async () => {
let oldUpdated = new Date(user.auth.timestamps.updated);
await user.post(endpoint, {
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
network,
});
await user.sync();
expect(user.auth.timestamps.updated).to.be.greaterThan(oldUpdated);
oldUpdated = new Date(user.auth.timestamps.updated);
// Do it again to ensure it updates even when nothing else changes
await api.post(endpoint, {
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
network,
});
await user.sync();
expect(user.auth.timestamps.updated).to.be.greaterThan(oldUpdated);
});
});
});

View File

@@ -0,0 +1,66 @@
import {
translate as t,
requester,
generateUser,
} from '../../../../helpers/api-integration/v4';
const ENDPOINT = '/user/auth/check-email';
describe('POST /user/auth/check-email', () => {
const email = 'SOmE-nEw-emAIl_2@example.net';
let api;
beforeEach(async () => {
api = requester();
});
it('returns email if it is not used yet', async () => {
const response = await api.post(ENDPOINT, {
email,
});
expect(response.email).to.eql(email);
expect(response.valid).to.be.true;
});
it('rejects if email is not provided', async () => {
await expect(api.post(ENDPOINT, {
})).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
message: 'Invalid request parameters.',
});
});
it('rejects if email is already taken', async () => {
const user = await generateUser();
const response = await api.post(ENDPOINT, {
email: user.auth.local.email,
});
expect(response).to.eql({
valid: false,
email: user.auth.local.email,
error: t('cannotFulfillReq'),
});
});
it('rejects if casing is different', async () => {
const user = await generateUser();
const response = await api.post(ENDPOINT, {
email: user.auth.local.email.toUpperCase(),
});
expect(response).to.eql({
valid: false,
email: user.auth.local.email.toUpperCase(),
error: t('cannotFulfillReq'),
});
});
it('rejects if email uses restricted domain', async () => {
const response = await api.post(ENDPOINT, {
email: 'fake@habitica.com',
});
expect(response.valid).to.be.false;
});
});

View File

@@ -23,6 +23,7 @@
"eslint-config-habitrpg": "6.2.0",
"eslint-plugin-mocha": "5.3.0",
"eslint-plugin-vue": "7.20.0",
"ga-gtag": "^1.2.0",
"habitica-markdown": "^3.0.0",
"hellojs": "^1.20.0",
"intro.js": "^7.2.0",
@@ -3393,9 +3394,10 @@
"integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA=="
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -4024,13 +4026,15 @@
}
},
"node_modules/es-set-tostringtag": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
"integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.2",
"has-tostringtag": "^1.0.0",
"hasown": "^2.0.0"
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -5081,12 +5085,15 @@
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
"integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
@@ -5154,6 +5161,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/ga-gtag": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/ga-gtag/-/ga-gtag-1.2.0.tgz",
"integrity": "sha512-j9gxutMdpGMdwaX1SzOG31Ddm+IGFjeNf+N3Z5g+BBpS8FSXOALlrM+ORIGc/QKszGJEDlw+6PfIsJZICsqsGQ=="
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -5364,11 +5376,12 @@
}
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.2"
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"

View File

@@ -27,6 +27,7 @@
"eslint-config-habitrpg": "6.2.0",
"eslint-plugin-mocha": "5.3.0",
"eslint-plugin-vue": "7.20.0",
"ga-gtag": "^1.2.0",
"habitica-markdown": "^3.0.0",
"hellojs": "^1.20.0",
"intro.js": "^7.2.0",

View File

@@ -108,7 +108,6 @@
<script>
import axios from 'axios';
import * as Analytics from '@/libs/analytics';
import { mapState } from '@/libs/store';
import snackbars from '@/components/snackbars/notifications';
import { LOCALSTORAGE_AUTH_KEY } from '@/libs/auth';
@@ -150,10 +149,6 @@ export default {
this.hideLoadingScreen();
}
});
this.$nextTick(() => {
// Load external scripts after the app has been rendered
Analytics.load();
});
axios.interceptors.response.use(response => { // Set up Response interceptors
// Verify that the user was not updated from another browser/app/client
@@ -212,13 +207,25 @@ export default {
const isBanned = this.checkForBannedUser(error);
if (isBanned === true) return null; // eslint-disable-line consistent-return
// Don't show errors from getting user details. These users have delete their account,
// Don't show errors from getting user details. These users have deleted their account,
// but their chat message still exists.
const configExists = Boolean(error.response) && Boolean(error.response.config);
if (configExists && error.response.config.method === 'get' && error.response.config.url.indexOf('/api/v4/members/') !== -1) {
// @TODO: We resolve the promise because we need our caching to cache this user as tried
// Chat paging should help this, but maybe we can also find another solution..
return Promise.resolve(error);
if (configExists) {
if (error.response.config.method === 'get' && error.response.config.url.indexOf('/api/v4/members/') !== -1) {
// @TODO: We resolve the promise because we need our caching to cache this user as tried
// Chat paging should help this, but maybe we can also find another solution..
return Promise.resolve(error);
}
// Also, a 404 occurs during routine attempt to log in with social,
// when we check for account already existing.
if (error.response.config.method === 'post' && (error.response.config.url.indexOf('/api/v4/user/auth/social') !== -1
|| error.response.config.url.indexOf('/api/v4/user/auth/apple') !== -1)) {
const socialEmail = error.response.data.message.split(': ')[1];
if (socialEmail) {
window.sessionStorage.setItem('social-email', socialEmail);
}
return Promise.resolve(error);
}
}
const errorData = error.response.data;

View File

@@ -635,6 +635,11 @@
width: 141px;
height: 147px;
}
.background_autumn_swamp {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_autumn_swamp.png');
width: 141px;
height: 147px;
}
.background_autumn_tree_tunnel {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_autumn_tree_tunnel.png');
width: 141px;
@@ -810,6 +815,11 @@
width: 141px;
height: 147px;
}
.background_castle_keep_with_banners {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_castle_keep_with_banners.png');
width: 141px;
height: 147px;
}
.background_cemetery_gate {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_cemetery_gate.png');
width: 141px;
@@ -1546,6 +1556,11 @@
width: 141px;
height: 147px;
}
.background_inside_forest_witchs_cottage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_inside_forest_witchs_cottage.png');
width: 141px;
height: 147px;
}
.background_iridescent_clouds {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_iridescent_clouds.png');
width: 141px;
@@ -29565,6 +29580,16 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_blackPartyDress {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_blackPartyDress.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_blacksmithsApron {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_blacksmithsApron.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_blueMoonShozoku {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_blueMoonShozoku.png');
width: 114px;
@@ -30000,6 +30025,11 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_softOrangeSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_softOrangeSuit.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_softPinkSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_softPinkSuit.png');
width: 114px;
@@ -30200,11 +30230,21 @@
width: 114px;
height: 90px;
}
.head_armoire_blackHairbow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_blackHairbow.png');
width: 90px;
height: 90px;
}
.head_armoire_blackSpookySorceryHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_blackSpookySorceryHat.png');
width: 114px;
height: 90px;
}
.head_armoire_blacksmithsGoggles {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_blacksmithsGoggles.png');
width: 114px;
height: 90px;
}
.head_armoire_blueFloppyHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_blueFloppyHat.png');
width: 90px;
@@ -30315,6 +30355,11 @@
width: 114px;
height: 90px;
}
.head_armoire_floppyOrangeHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_floppyOrangeHat.png');
width: 114px;
height: 90px;
}
.head_armoire_flutteryWig {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_flutteryWig.png');
width: 114px;
@@ -31010,6 +31055,11 @@
width: 114px;
height: 90px;
}
.shield_armoire_softOrangePillow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_softOrangePillow.png');
width: 114px;
height: 90px;
}
.shield_armoire_softPinkPillow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_softPinkPillow.png');
width: 114px;
@@ -31150,6 +31200,16 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_blackPartyDress {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_blackPartyDress.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_blacksmithsApron {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_blacksmithsApron.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_blueMoonShozoku {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_blueMoonShozoku.png');
width: 114px;
@@ -31585,6 +31645,11 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_softOrangeSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_softOrangeSuit.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_softPinkSuit {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_softPinkSuit.png');
width: 114px;
@@ -31735,6 +31800,11 @@
width: 114px;
height: 90px;
}
.weapon_armoire_blacksmithsHammer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_blacksmithsHammer.png');
width: 114px;
height: 90px;
}
.weapon_armoire_blueKite {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_blueKite.png');
width: 114px;
@@ -33025,6 +33095,26 @@
width: 114px;
height: 90px;
}
.broad_armor_special_fall2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2025Healer.png');
width: 114px;
height: 90px;
}
.broad_armor_special_fall2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2025Mage.png');
width: 114px;
height: 90px;
}
.broad_armor_special_fall2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2025Rogue.png');
width: 114px;
height: 90px;
}
.broad_armor_special_fall2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fall2025Warrior.png');
width: 114px;
height: 90px;
}
.broad_armor_special_fallHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_fallHealer.png');
width: 90px;
@@ -33255,6 +33345,26 @@
width: 114px;
height: 90px;
}
.head_special_fall2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2025Healer.png');
width: 114px;
height: 90px;
}
.head_special_fall2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2025Mage.png');
width: 114px;
height: 90px;
}
.head_special_fall2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2025Rogue.png');
width: 114px;
height: 90px;
}
.head_special_fall2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fall2025Warrior.png');
width: 114px;
height: 90px;
}
.head_special_fallHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_fallHealer.png');
width: 90px;
@@ -33425,6 +33535,21 @@
width: 114px;
height: 90px;
}
.shield_special_fall2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fall2025Healer.png');
width: 114px;
height: 90px;
}
.shield_special_fall2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fall2025Rogue.png');
width: 114px;
height: 90px;
}
.shield_special_fall2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fall2025Warrior.png');
width: 114px;
height: 90px;
}
.shield_special_fallHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_fallHealer.png');
width: 90px;
@@ -33640,6 +33765,26 @@
width: 114px;
height: 90px;
}
.slim_armor_special_fall2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2025Healer.png');
width: 114px;
height: 90px;
}
.slim_armor_special_fall2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2025Mage.png');
width: 114px;
height: 90px;
}
.slim_armor_special_fall2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2025Rogue.png');
width: 114px;
height: 90px;
}
.slim_armor_special_fall2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fall2025Warrior.png');
width: 114px;
height: 90px;
}
.slim_armor_special_fallHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_fallHealer.png');
width: 90px;
@@ -33860,6 +34005,26 @@
width: 114px;
height: 90px;
}
.weapon_special_fall2025Healer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2025Healer.png');
width: 114px;
height: 90px;
}
.weapon_special_fall2025Mage {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2025Mage.png');
width: 114px;
height: 90px;
}
.weapon_special_fall2025Rogue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2025Rogue.png');
width: 114px;
height: 90px;
}
.weapon_special_fall2025Warrior {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fall2025Warrior.png');
width: 114px;
height: 90px;
}
.weapon_special_fallHealer {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_fallHealer.png');
width: 90px;
@@ -35665,6 +35830,41 @@
width: 117px;
height: 120px;
}
.back_mystery_202510 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202510.png');
width: 114px;
height: 90px;
}
.body_mystery_202509 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/body_mystery_202509.png');
width: 117px;
height: 120px;
}
.broad_armor_mystery_202509 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202509.png');
width: 117px;
height: 120px;
}
.eyewear_mystery_202510 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_mystery_202510.png');
width: 114px;
height: 90px;
}
.shield_mystery_202511 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202511.png');
width: 114px;
height: 90px;
}
.slim_armor_mystery_202509 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202509.png');
width: 117px;
height: 120px;
}
.weapon_mystery_202511 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202511.png');
width: 114px;
height: 90px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -10,7 +10,7 @@
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
color: $white;
&:hover, &:focus {
&:hover:not(:disabled):not(.disabled), &:focus {
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
&.btn-flat {
@@ -28,8 +28,8 @@
&:disabled, &.disabled {
cursor: default;
color: $gray-50;
opacity: 0.75;
color: $gray-200;
opacity: 1;
box-shadow: none;
background-color: $gray-700;
border: 2px solid transparent;
@@ -164,7 +164,6 @@
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
&:hover:not(:disabled):not(.disabled) {
background: $maroon-100;
border: 2px solid transparent;
@@ -242,29 +241,32 @@
}
.btn-info {
background: $blue-50;
background-color: $blue-100;
color: $black;
font-weight: 700;
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 2px 0 rgba($black, 0.24);
&:disabled {
background: $blue-50;
background-color: $white;
box-shadow: none;
}
&:hover {
&:hover:not(:disabled):not(.disabled) {
border: 2px solid transparent;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
&:focus {
background: $blue-100;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
color: $black;
}
&:hover:not(:disabled):not(.disabled) {
background-color: $blue-100;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
background-color: $blue-50;
color: $black;
}
&:active:not(:disabled):not(.disabled), &.active:not(:disabled):not(.disabled) {

View File

@@ -0,0 +1,168 @@
// Inputs and textareas
input, textarea, input.form-control, textarea.form-control {
border-radius: 3px;
font-size: 14px;
line-height: 1.714;
padding: 4px 12px;
color: $gray-50;
border: 1px solid $gray-400;
&:hover:not(:disabled):not(:read-only):not(:focus):not(:disabled):not(.input-valid):not(.input-invalid):not(.dark) {
border-color: $gray-200;
}
&:active:not(:disabled):not(:read-only), &:focus:not(:disabled):not(:read-only),
&:active:not(:disabled):not(:read-only).dark, &:focus:not(:disabled):not(:read-only).dark {
border: 1px solid $purple-400;
outline: 1px solid $purple-400;
box-shadow: none;
}
&.input-valid {
padding-right: 27px;
background-image: url(@/assets/svg/for-css/check.svg);
background-size: 1rem;
border-color: $green-10;
}
&.input-invalid, .input-invalid:hover {
padding-right: 40px;
background-image: url(@/assets/svg/for-css/alert.svg);
background-size: 16px 16px;
border-color: $red-100;
}
&::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: $gray-200;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $gray-200;
}
&:-ms-input-placeholder { /* IE 10+ */
color: $gray-200;
}
&:-moz-placeholder { /* Firefox 18- */
color: $gray-200;
}
&::placeholder { // Standard browsers
color: $gray-200;
}
.input-invalid.input-with-error {
margin-bottom: 0.5em;
}
&.dark {
background-color: $purple-100;
color: $white;
&:not(.input-valid):not(.input-invalid) {
border: 1px solid $purple-300;
}
&:focus {
background-color: $purple-100;
color: $white;
}
&:hover:not(:focus):not(:disabled):not(.input-valid):not(.input-invalid) {
border-color: $purple-400;
}
&::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: $purple-500;
}
&::-moz-placeholder { /* Firefox 19+ */
color: $purple-500;
}
&:-ms-input-placeholder { /* IE 10+ */
color: $purple-500;
}
&:-moz-placeholder { /* Firefox 18- */
color: $purple-500;
}
&::placeholder { // Standard browsers
color: $purple-500;
}
}
}
.input-error {
font-size: 12px;
line-height: 1.33;
color: $maroon-500;
}
// checkboxes
.custom-checkbox {
.custom-control-label::before {
border-radius: 2px;
}
.custom-control-input {
&:hover~.custom-control-label::before {
border-color: $gray-100;
}
&:checked~.custom-control-label::before {
background-color: $purple-300;
border-color: $purple-300;
}
&:hover:checked:not(:disabled)~.custom-control-label::before,
&:active:not(:disabled)~.custom-control-label::before {
background-color: $purple-400;
border-color: $purple-400;
}
&:checked~.custom-control-label::after {
width: 18px;
height: 18px;
background-image: url(@/assets/svg/for-css/checkbox-white.svg);
background-size: 13px 10px;
}
&:checked:disabled~.custom-control-label::after {
background-image: url(@/assets/svg/for-css/checkbox-gray.svg);
}
&:active~.custom-control-label::before {
background-color: inherit;
}
&:focus~.custom-control-label::before,
&:active~.custom-control-label::before {
border-color: $purple-400;
box-shadow: none;
}
&:disabled~.custom-control-label::before, &:disabled:checked~.custom-control-label::before {
border-color: $gray-400;
background-color: $gray-400;
}
&.dark {
~.custom-control-label::before {
border-color: $purple-100;
}
&:hover~.custom-control-label::before,
&:active~.custom-control-label::before {
border-color: $purple-50;
}
&:checked~.custom-control-label::before {
background-color: $purple-100;
border-color: $purple-100;
}
&:focus~.custom-control-label::before,
&:active~.custom-control-label::before {
border-color: $purple-400;
box-shadow: none;
}
&:disabled~.custom-control-label::before, &:disabled:checked~.custom-control-label::before {
border-color: $gray-400;
background-color: $gray-400;
}
}
}
}

View File

@@ -0,0 +1,16 @@
.privacy-banner {
position: fixed;
bottom: 24px;
border-radius: 8px;
background-color: $white;
z-index: 5;
box-shadow: 0px 3px 6px 0px rgba(26, 24, 29, 0.16), 0px 3px 6px 0px rgba(26, 24, 29, 0.24);
width: calc(66vw + 96px);
@media only screen and (max-width: 992px) {
margin: auto 12.5%;
}
@media only screen and (min-width: 992px) {
margin: auto 14.5%;
}
}

View File

@@ -14,7 +14,7 @@
color: $purple-200;
}
li, p {
li, p:not(.purple-600) {
font-size: 16px;
}

View File

@@ -111,6 +111,10 @@ h4 {
background-color: $green-100 !important;
}
.bg-purple-50 {
background-color: $purple-50 !important;
}
.bg-purple-100 {
background-color: $purple-100 !important;
}
@@ -131,6 +135,10 @@ h4 {
color: $gray-50 !important;
}
.gray-100 {
color: $gray-100 !important;
}
.gray-200 {
color: $gray-200 !important;
}

View File

@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 13 10">
<path fill="#878190" fill-rule="evenodd" d="M4.662 9.832c-.312 0-.61-.123-.83-.344L0 5.657l1.662-1.662 2.934 2.934L10.534 0l1.785 1.529-6.764 7.893a1.182 1.182 0 0 1-.848.409l-.045.001"/>
</svg>

After

Width:  |  Height:  |  Size: 261 B

View File

@@ -1,5 +1,5 @@
<svg width="217" height="48" viewBox="0 0 217 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M108.785 0.0195312C106.343 0.0195312 104.355 1.99967 104.355 4.44184C104.355 6.88401 106.343 8.86415 108.785 8.86415C111.227 8.86415 113.215 6.87668 113.215 4.44184C113.215 2.007 111.227 0.0195312 108.785 0.0195312Z" fill="#FF6165"/>
<path d="M148.564 0.0195312C146.121 0.0195312 144.134 1.99967 144.134 4.44184C144.134 6.88401 146.121 8.86415 148.564 8.86415C151.006 8.86415 152.993 6.87668 152.993 4.44184C152.993 2.007 151.006 0.0195312 148.564 0.0195312Z" fill="#50B5E9"/>
<path d="M184.2 42.1989C181.332 45.8879 177.005 48 172.319 48C164.355 48 157.776 41.8176 157.344 33.9264C157.322 33.5303 157.322 28.8367 157.322 28.7927C157.322 20.5788 164.047 13.8976 172.319 13.8976C176.411 13.8976 180.379 15.5917 183.195 18.54C184.053 19.4347 184.515 20.6154 184.478 21.8548C184.449 23.0943 183.928 24.2457 183.019 25.0964C181.156 26.8565 178.201 26.7759 176.426 24.9277C175.341 23.7983 173.881 23.1749 172.312 23.1749C169.188 23.1749 166.65 25.6904 166.65 28.7853C166.65 29.2694 166.65 32.995 166.665 33.5083C166.841 36.4052 169.327 38.7154 172.312 38.7154C174.087 38.7154 175.722 37.916 176.8 36.5225C178.369 34.4984 181.31 34.1244 183.342 35.6865C184.332 36.4419 184.962 37.5346 185.124 38.7667C185.285 39.9988 184.948 41.2162 184.192 42.1989H184.2ZM216.82 18.4739V43.4164C216.82 45.9392 214.774 47.9927 212.258 47.9927C210.916 47.9927 209.669 47.3986 208.819 46.4159C206.787 47.45 204.543 47.9927 202.262 47.9927C194.533 47.9927 188.145 41.9129 187.727 34.1464C187.705 33.7577 187.705 29.152 187.705 29.1007C187.705 21.0261 194.239 14.4623 202.262 14.4623C204.419 14.4623 206.545 14.9537 208.503 15.8924C209.332 14.6677 210.726 13.8903 212.266 13.8903C214.781 13.8903 216.827 15.9438 216.827 18.4666L216.82 18.4739ZM207.689 33.721C207.697 33.1196 207.704 29.5774 207.704 29.108C207.704 26.0791 205.262 23.6223 202.262 23.6223C199.263 23.6223 196.821 26.0865 196.821 29.108C196.821 29.5701 196.821 33.2443 196.836 33.7577C197.004 36.5812 199.395 38.84 202.262 38.84C205.13 38.84 207.506 36.5959 207.689 33.721ZM63.3042 18.4739V43.4164C63.3042 45.9392 61.2581 47.9927 58.7426 47.9927C57.4006 47.9927 56.1539 47.3986 55.3032 46.4159C53.2717 47.45 51.0276 47.9927 48.7469 47.9927C41.0099 47.9927 34.6296 41.9129 34.2115 34.1464C34.1895 33.8017 34.1895 30.2008 34.1895 29.1007C34.1895 21.0261 40.7238 14.4623 48.7469 14.4623C50.903 14.4623 53.0371 14.9537 54.9878 15.8924C55.8165 14.6677 57.2099 13.8903 58.75 13.8903C61.2654 13.8903 63.3115 15.9438 63.3115 18.4666L63.3042 18.4739ZM48.7469 23.6223C45.7474 23.6223 43.3053 26.0865 43.3053 29.108C43.3053 29.5847 43.3053 33.237 43.32 33.7503C43.4886 36.5812 45.8794 38.84 48.7469 38.84C51.6143 38.84 53.9904 36.5959 54.1738 33.721C54.1811 33.1196 54.1884 29.5847 54.1884 29.108C54.1884 26.0791 51.7463 23.6223 48.7469 23.6223ZM108.78 14.1396C106.338 14.1396 104.351 16.1931 104.351 18.716V43.4164C104.351 45.9392 106.338 47.9927 108.78 47.9927C111.222 47.9927 113.21 45.9392 113.21 43.4164V18.716C113.21 16.1931 111.222 14.1396 108.78 14.1396ZM148.558 14.1396C146.116 14.1396 144.129 16.1931 144.129 18.716V43.4164C144.129 45.9392 146.116 47.9927 148.558 47.9927C151 47.9927 152.988 45.9392 152.988 43.4164V18.716C152.988 16.1931 151 14.1396 148.558 14.1396ZM98.7551 28.866C98.7551 28.91 98.7551 33.5817 98.7331 33.9704C98.3151 41.8396 91.9275 48 84.1978 48C81.917 48 79.6729 47.45 77.6415 46.4012C76.7908 47.3986 75.5441 48 74.1947 48C71.6792 48 69.6331 45.9245 69.6331 43.3797V4.62032C69.6331 2.07548 71.6792 0 74.1947 0C76.7101 0 78.7562 2.07548 78.7562 4.62032V15.1224C80.487 14.411 82.3351 14.037 84.1978 14.037C92.2282 14.037 98.7551 20.6888 98.7551 28.866ZM84.1978 23.285C81.1983 23.285 78.7562 25.7858 78.7562 28.866C78.7562 29.35 78.7562 33.0536 78.7709 33.5743C78.9469 36.4565 81.3303 38.752 84.1978 38.752C87.0653 38.752 89.434 36.4712 89.6247 33.5523C89.6247 32.929 89.6394 29.328 89.6394 28.866C89.6394 25.7858 87.1973 23.285 84.1978 23.285ZM14.3887 14.037C12.6139 14.037 10.8612 14.3597 9.21109 14.9757V4.62766C9.21109 2.08281 7.14299 0.00733401 4.60554 0.00733401C2.06809 0.00733401 0 2.08281 0 4.62766V43.3797C0 45.9319 2.06809 48 4.60554 48C7.14299 48 9.21109 45.9245 9.21109 43.3797V26.5412C9.40176 26.3358 11.1178 23.285 14.3887 23.285C17.4395 23.285 19.9182 25.7858 19.9182 28.866C19.9182 29.482 19.9182 42.529 19.9036 43.2623C19.8376 45.7852 21.759 47.868 24.2524 47.9927C24.3404 47.9927 24.4211 47.9927 24.5091 47.9927C26.9586 47.9927 28.9753 46.0639 29.1 43.607C29.122 43.2257 29.122 29.0053 29.122 28.866C29.122 20.6888 22.5144 14.037 14.3887 14.037ZM136.399 14.037H133.7V4.62032C133.7 2.07548 131.61 0 129.036 0C126.462 0 124.372 2.07548 124.372 4.62032V14.037H121.673C119.106 14.037 117.009 16.1125 117.009 18.6646C117.009 21.2168 119.099 23.285 121.673 23.285H124.372V43.3797C124.372 45.9319 126.462 48 129.036 48C131.61 48 133.7 45.9245 133.7 43.3797V23.285H136.399C138.973 23.285 141.063 21.2095 141.063 18.6646C141.063 16.1198 138.973 14.037 136.399 14.037Z" fill="white"/>
<svg width="145" height="32" viewBox="0 0 145 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M72.7484 0.0131836C71.1152 0.0131836 69.7861 1.33328 69.7861 2.96139C69.7861 4.5895 71.1152 5.90959 72.7484 5.90959C74.3816 5.90959 75.7106 4.58461 75.7106 2.96139C75.7106 1.33816 74.3816 0.0131836 72.7484 0.0131836Z" fill="#FF6165"/>
<path d="M99.3498 0.0131836C97.7166 0.0131836 96.3875 1.33328 96.3875 2.96139C96.3875 4.5895 97.7166 5.90959 99.3498 5.90959C100.983 5.90959 102.312 4.58461 102.312 2.96139C102.312 1.33816 100.983 0.0131836 99.3498 0.0131836Z" fill="#50B5E9"/>
<path d="M123.181 28.1326C121.263 30.5919 118.37 32 115.236 32C109.91 32 105.511 27.8784 105.221 22.6176C105.207 22.3536 105.207 19.2244 105.207 19.1951C105.207 13.7192 109.704 9.26509 115.236 9.26509C117.973 9.26509 120.626 10.3945 122.509 12.36C123.083 12.9565 123.392 13.7436 123.367 14.5699C123.348 15.3962 122.999 16.1638 122.391 16.7309C121.146 17.9044 119.169 17.8506 117.982 16.6185C117.256 15.8655 116.281 15.45 115.231 15.45C113.142 15.45 111.445 17.127 111.445 19.1902C111.445 19.5129 111.445 21.9966 111.455 22.3389C111.572 24.2701 113.235 25.8102 115.231 25.8102C116.418 25.8102 117.511 25.2773 118.232 24.3484C119.282 22.9989 121.249 22.7496 122.607 23.791C123.269 24.2946 123.691 25.0231 123.799 25.8445C123.907 26.6659 123.681 27.4775 123.176 28.1326H123.181ZM144.995 12.316V28.9442C144.995 30.6261 143.627 31.9951 141.945 31.9951C141.047 31.9951 140.213 31.5991 139.645 30.9439C138.286 31.6333 136.785 31.9951 135.26 31.9951C130.091 31.9951 125.819 27.9419 125.54 22.7642C125.525 22.5051 125.525 19.4347 125.525 19.4005C125.525 14.0174 129.895 9.64156 135.26 9.64156C136.702 9.64156 138.124 9.96914 139.434 10.595C139.988 9.77846 140.92 9.2602 141.95 9.2602C143.632 9.2602 145 10.6292 145 12.3111L144.995 12.316ZM138.889 22.4807C138.894 22.0798 138.899 19.7183 138.899 19.4053C138.899 17.3861 137.266 15.7482 135.26 15.7482C133.254 15.7482 131.621 17.391 131.621 19.4053C131.621 19.7134 131.621 22.1629 131.631 22.5051C131.744 24.3875 133.343 25.8934 135.26 25.8934C137.178 25.8934 138.767 24.3972 138.889 22.4807ZM42.3338 12.316V28.9442C42.3338 30.6261 40.9655 31.9951 39.2833 31.9951C38.3858 31.9951 37.5521 31.5991 36.9832 30.9439C35.6247 31.6333 34.124 31.9951 32.5988 31.9951C27.4247 31.9951 23.158 27.9419 22.8785 22.7642C22.8638 22.5345 22.8638 20.1338 22.8638 19.4005C22.8638 14.0174 27.2335 9.64156 32.5988 9.64156C34.0406 9.64156 35.4678 9.96914 36.7723 10.595C37.3265 9.77846 38.2583 9.2602 39.2882 9.2602C40.9704 9.2602 42.3387 10.6292 42.3387 12.3111L42.3338 12.316ZM32.5988 15.7482C30.5929 15.7482 28.9598 17.391 28.9598 19.4053C28.9598 19.7231 28.9598 22.158 28.9696 22.5002C29.0824 24.3875 30.6812 25.8934 32.5988 25.8934C34.5163 25.8934 36.1053 24.3972 36.2279 22.4807C36.2328 22.0798 36.2377 19.7231 36.2377 19.4053C36.2377 17.3861 34.6046 15.7482 32.5988 15.7482ZM72.7452 9.42643C71.1121 9.42643 69.783 10.7954 69.783 12.4773V28.9442C69.783 30.6261 71.1121 31.9951 72.7452 31.9951C74.3783 31.9951 75.7074 30.6261 75.7074 28.9442V12.4773C75.7074 10.7954 74.3783 9.42643 72.7452 9.42643ZM99.346 9.42643C97.7129 9.42643 96.3838 10.7954 96.3838 12.4773V28.9442C96.3838 30.6261 97.7129 31.9951 99.346 31.9951C100.979 31.9951 102.308 30.6261 102.308 28.9442V12.4773C102.308 10.7954 100.979 9.42643 99.346 9.42643ZM66.041 19.244C66.041 19.2733 66.0411 22.3878 66.0264 22.6469C65.7468 27.893 61.4752 32 56.3061 32C54.7808 32 53.2801 31.6333 51.9216 30.9342C51.3527 31.5991 50.519 32 49.6166 32C47.9344 32 46.5662 30.6164 46.5662 28.9198V3.08021C46.5662 1.38365 47.9344 0 49.6166 0C51.2988 0 52.6671 1.38365 52.6671 3.08021V10.0816C53.8245 9.60734 55.0604 9.35798 56.3061 9.35798C61.6762 9.35798 66.041 13.7925 66.041 19.244ZM56.3061 15.5233C54.3002 15.5233 52.6671 17.1905 52.6671 19.244C52.6671 19.5667 52.6671 22.0358 52.6769 22.3829C52.7946 24.3044 54.3885 25.8347 56.3061 25.8347C58.2236 25.8347 59.8077 24.3141 59.9352 22.3682C59.9352 21.9526 59.945 19.552 59.945 19.244C59.945 17.1905 58.3119 15.5233 56.3061 15.5233ZM9.62221 9.35798C8.43537 9.35798 7.26325 9.57311 6.15978 9.98381V3.0851C6.15978 1.38854 4.77677 0.00488934 3.07989 0.00488934C1.38301 0.00488934 0 1.38854 0 3.0851V28.9198C0 30.6212 1.38301 32 3.07989 32C4.77677 32 6.15978 30.6164 6.15978 28.9198V17.6941C6.28729 17.5572 7.4349 15.5233 9.62221 15.5233C11.6624 15.5233 13.32 17.1905 13.32 19.244C13.32 19.6547 13.32 28.3526 13.3102 28.8416C13.2661 30.5235 14.551 31.912 16.2185 31.9951C16.2773 31.9951 16.3313 31.9951 16.3901 31.9951C18.0281 31.9951 19.3768 30.7092 19.4602 29.0714C19.4749 28.8171 19.4749 19.3369 19.4749 19.244C19.4749 13.7925 15.0561 9.35798 9.62221 9.35798ZM91.2147 9.35798H89.41V3.08021C89.41 1.38365 88.0122 0 86.2908 0C84.5694 0 83.1717 1.38365 83.1717 3.08021V9.35798H81.3669C79.6504 9.35798 78.2478 10.7416 78.2478 12.4431C78.2478 14.1445 79.6455 15.5233 81.3669 15.5233H83.1717V28.9198C83.1717 30.6212 84.5694 32 86.2908 32C88.0122 32 89.41 30.6164 89.41 28.9198V15.5233H91.2147C92.9361 15.5233 94.3339 14.1396 94.3339 12.4431C94.3339 10.7465 92.9361 9.35798 91.2147 9.35798Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.9 KiB

After

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,6 +1,7 @@
<template>
<div>
<buy-gems-modal v-if="user" />
<privacy-modal />
<footer>
<!-- Product -->
<div class="product">
@@ -848,6 +849,7 @@ import heart from '@/assets/svg/heart.svg?raw';
// components & modals
import { mapState } from '@/libs/store';
import buyGemsModal from './payments/buyGemsModal.vue';
import privacyModal from './settings/privacyModal.vue';
import reportBug from '@/mixins/reportBug.js';
import { worldStateMixin } from '@/mixins/worldState';
@@ -864,6 +866,7 @@ if (import.meta.env.TIME_TRAVEL_ENABLED === 'true') {
export default {
components: {
buyGemsModal,
privacyModal,
},
mixins: [
reportBug,

View File

@@ -140,11 +140,6 @@
>
{{ $t('passwordConfirmationMatch') }}
</div>
<small
v-once
class="form-text"
v-html="$t('termsAndAgreement')"
></small>
</div>
<div class="text-center">
<div

View File

@@ -3,6 +3,9 @@
<div id="top-background">
<div class="seamless_stars_varied_opacity_repeat"></div>
</div>
<privacy-banner
class="privacy-banner"
/>
<form
v-if="!forgotPassword && !resetPasswordSetNewOne"
id="login-form"
@@ -10,17 +13,18 @@
>
<div class="text-center">
<div>
<div
class="svg-icon svg habitica-logo"
<a
href="/static/home"
class="svg-icon svg habitica-logo mx-auto mb-4"
v-html="icons.habiticaIcon"
></div>
></a>
</div>
</div>
<div class="form-group row text-center">
<div class="col-12 col-md-12">
<div class="form-group">
<div>
<div
class="btn btn-secondary social-button"
@click="socialAuth('google')"
@click="proceed('google')"
>
<div
class="svg-icon social-icon"
@@ -29,18 +33,16 @@
<div
class="text"
>
{{ registering
? $t('signUpWithSocial', {social: 'Google'})
: $t('loginWithSocial', {social: 'Google'}) }}
{{ $t('signUpWithSocial', {social: 'Google'}) }}
</div>
</div>
</div>
</div>
<div class="form-group row text-center">
<div class="col-12 col-md-12">
<div class="form-group">
<div>
<div
class="btn btn-secondary social-button"
@click="socialAuth('apple')"
@click="proceed('apple')"
>
<div
class="svg-icon social-icon"
@@ -49,43 +51,18 @@
<div
class="text"
>
{{ registering
? $t('signUpWithSocial', {social: 'Apple'})
: $t('loginWithSocial', {social: 'Apple'}) }}
{{ $t('signUpWithSocial', {social: 'Apple'}) }}
</div>
</div>
</div>
</div>
<div class="strike">
<div class="strike mb-3">
<span>{{ $t('or') }}</span>
</div>
<div
v-if="registering"
class="form-group"
>
<label
v-once
for="usernameInput"
>{{ $t('username') }}</label>
<input
id="usernameInput"
v-model="username"
class="form-control input-with-error"
type="text"
:placeholder="$t('usernamePlaceholder')"
:class="{'input-valid': usernameValid, 'input-invalid': usernameInvalid}"
>
<div
v-for="issue in usernameIssues"
:key="issue"
class="input-error"
>
{{ issue }}
</div>
</div>
<div
v-if="!registering"
class="form-group"
:class="{ 'mb-2': usernameIssues.length > 0 }"
>
<label
v-once
@@ -94,11 +71,22 @@
<input
id="usernameInput"
v-model="username"
class="form-control"
class="form-control dark"
type="text"
:placeholder="$t('emailOrUsername')"
:class="{
'input-valid': usernameValid,
'input-invalid': usernameInvalid,
}"
>
</div>
<div
v-for="issue in usernameIssues"
:key="issue"
class="input-error"
>
{{ issue }}
</div>
<div
v-if="registering"
class="form-group"
@@ -110,13 +98,25 @@
<input
id="emailInput"
v-model="email"
class="form-control"
class="form-control dark"
type="email"
:placeholder="$t('emailPlaceholder')"
:class="{'input-invalid': emailInvalid, 'input-valid': emailValid}"
:class="{
'input-invalid input-with-error': emailError,
'input-valid': emailValid,
}"
>
<div
v-if="emailError"
class="input-error"
>
{{ emailError }}
</div>
</div>
<div class="form-group">
<div
class="form-group"
:class="{ 'mt-2': usernameIssues.length > 0 }"
>
<label
v-once
for="passwordInput"
@@ -130,12 +130,12 @@
<input
id="passwordInput"
v-model="password"
class="form-control"
class="form-control dark"
type="password"
:placeholder="$t(registering ? 'passwordPlaceholder' : 'password')"
:class="{
'input-invalid input-with-error': registering && passwordInvalid,
'input-valid': registering && passwordValid
'input-invalid input-with-error': passwordInvalid,
'input-valid': passwordValid
}"
>
<div
@@ -144,10 +144,16 @@
>
{{ $t('minPasswordLength') }}
</div>
<div
v-if="passwordInvalid && !registering"
class="input-error"
>
{{ $t('minPasswordLengthLogin') }}
</div>
</div>
<div
v-if="registering"
class="form-group"
class="form-group mb-4"
>
<label
v-once
@@ -156,7 +162,7 @@
<input
id="confirmPasswordInput"
v-model="passwordConfirm"
class="form-control input-with-error"
class="form-control dark input-with-error"
type="password"
:placeholder="$t('confirmPasswordPlaceholder')"
:class="{'input-invalid': passwordConfirmInvalid, 'input-valid': passwordConfirmValid}"
@@ -167,30 +173,26 @@
>
{{ $t('passwordConfirmationMatch') }}
</div>
<small
v-once
class="form-text"
v-html="$t('termsAndAgreement')"
></small>
</div>
<div class="text-center">
<button
v-if="registering"
id="continue-button"
type="submit"
class="btn btn-info"
:disabled="signupFormInvalid"
class="btn btn-info w-100 mb-4"
:disabled="!(emailValid && passwordValid && passwordConfirmValid)"
>
{{ $t('joinHabitica') }}
{{ $t('continue') }}
</button>
<button
v-if="!registering"
v-once
type="submit"
class="btn btn-info"
class="btn btn-info w-100 mb-4"
:disabled="!usernameValid || !passwordValid"
>
{{ $t('login') }}
</button>
<div class="toggle-links">
<div>
<router-link
v-if="registering"
:to="{name: 'login'}"
@@ -198,7 +200,7 @@
>
<a
v-once
class="toggle-link"
class="white"
v-html="$t('alreadyHaveAccountLogin')"
></a>
</router-link>
@@ -209,7 +211,7 @@
>
<a
v-once
class="toggle-link"
class="white"
v-html="$t('dontHaveAccountSignup')"
></a>
</router-link>
@@ -221,45 +223,66 @@
id="forgot-form"
@submit.prevent="handleSubmit"
>
<div class="text-center">
<div>
<div>
<div class="svg-icon gryphon"></div>
</div>
<div>
<div
class="svg-icon habitica-logo"
<a
href="/static/home"
class="svg-icon habitica-logo mx-auto mb-4"
v-html="icons.habiticaIcon"
></div>
></a>
</div>
<div class="header">
<h2 v-once>
<h2
v-once
class="text-center"
>
{{ $t('emailNewPass') }}
</h2>
<p v-once>
<p
v-once
class="purple-600 text-left"
>
{{ $t('forgotPasswordSteps') }}
</p>
</div>
</div>
<div class="form-group row text-center">
<label
v-once
for="usernameInput"
>{{ $t('emailOrUsername') }}</label>
<input
id="usernameInput"
v-model="username"
class="form-control"
type="text"
:placeholder="$t('emailUsernamePlaceholder')"
>
</div>
<div class="text-center">
<div
v-once
class="btn btn-info"
@click="forgotPasswordLink()"
class="form-group"
:class="{
'mb-2': usernameIssues.length > 0,
'mb-4': usernameIssues.length === 0,
}"
>
{{ $t('sendLink') }}
<label
v-once
for="usernameInput"
>{{ $t('emailOrUsername') }}</label>
<input
id="usernameInput"
v-model="username"
class="form-control dark"
type="text"
:placeholder="$t('emailUsernamePlaceholder')"
:class="{
'input-valid': usernameValid,
'input-invalid': usernameInvalid,
}"
>
</div>
<div
v-for="issue in usernameIssues"
:key="issue"
class="input-error mb-2"
>
{{ issue }}
</div>
<div class="text-center">
<button
class="btn btn-info w-100"
:disabled="!username || usernameIssues.length > 0"
@click="forgotPasswordLink()"
>
{{ $t('sendLink') }}
</button>
</div>
</div>
</form>
@@ -270,10 +293,11 @@
>
<div class="text-center">
<div>
<div
class="svg-icon habitica-logo"
<a
href="/static/home"
class="svg-icon habitica-logo mx-auto mb-4"
v-html="icons.habiticaIcon"
></div>
></a>
</div>
<div class="header">
<h2>{{ $t('passwordResetPage') }}</h2>
@@ -329,15 +353,6 @@
</div>
</div>
</form>
<div
id="bottom-wrap"
:class="`bottom-wrap-${!registering ? 'login' : 'register'}`"
>
<div id="bottom-background">
<div class="seamless_mountains_demo_repeat"></div>
<div class="midground_foreground_extended2"></div>
</div>
</div>
</div>
</template>
@@ -354,30 +369,10 @@
<style lang="scss" scoped>
@import '@/assets/scss/colors.scss';
@media only screen and (min-height: 1080px) {
.bottom-wrap-register {
margin-top: 6em;
position: fixed !important;
width: 100%;
bottom: 0;
}
}
@media only screen and (min-height: 862px) {
.bottom-wrap-login {
margin-top: 6em;
position: fixed !important;
width: 100%;
bottom: 0;
}
}
@import '@/assets/scss/forms.scss';
@import '@/assets/scss/privacy.scss';
@media only screen and (max-width: 768px) {
#login-form {
width: 100% !important;
}
.form-group {
padding-left: .5em;
padding-right: .5em;
@@ -388,28 +383,28 @@
background-color: $purple-200;
background: $purple-200; /* For browsers that do not support gradients */
background: linear-gradient(to bottom, #4f2a93, #6133b4); /* Standard syntax */
min-height: 100vh;
}
::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: $purple-400;
color: $purple-500;
}
::-moz-placeholder { /* Firefox 19+ */
color: $purple-400;
color: $purple-500;
}
:-ms-input-placeholder { /* IE 10+ */
color: $purple-400;
color: $purple-500;
}
:-moz-placeholder { /* Firefox 18- */
color: $purple-400;
color: $purple-500;
}
::placeholder { // Standard browsers
color: $purple-400;
color: $purple-500;
}
#login-form, #forgot-form, #reset-password-set-new-one-form {
margin: 0 auto;
width: 40em;
width: 448px;
height: 700px;
padding-top: 5em;
padding-bottom: 4em;
position: relative;
@@ -417,39 +412,23 @@
.header {
h2 {
font-size: 24px;
color: $white;
}
color: $white;
}
.gryphon {
background-size: cover;
color: $white;
height: 69.4px;
margin: 0 auto;
width: 63.2px;
p {
line-height: 1.714;
}
}
.habitica-logo {
width: 175px;
height: 64px;
margin: 2em auto 0;
z-index: 0;
width: 145px;
}
label {
color: $white;
font-weight: bold;
}
input {
margin-bottom: 2em;
border-radius: 2px;
background-color: #432874;
border-color: transparent;
height: 50px;
color: $white;
line-height: 1.714;
}
.input-with-error.input-invalid {
@@ -497,54 +476,10 @@
}
}
#bottom-wrap {
margin-top: 6em;
position: static;
width: 100%;
bottom: 0;
}
#bottom-background {
position: relative;
.seamless_mountains_demo_repeat {
background-image: url('@/assets/images/auth/seamless_mountains_demo.png');
background-repeat: repeat-x;
width: 100%;
height: 300px;
position: absolute;
z-index: 0;
bottom: 0;
}
.midground_foreground_extended2 {
background-image: url('@/assets/images/auth/midground_foreground_extended2.png');
position: relative;
width: 1500px;
max-width: 100%;
height: 150px;
margin: 0 auto;
}
}
.toggle-links {
margin-top: 1em;
}
.toggle-link {
color: $white !important;
}
.forgot-password {
color: #bda8ff !important;
}
.input-error {
color: #fff;
font-size: 90%;
width: 100%;
}
.warning-banner {
color: $white;
background-color: $maroon-100;
@@ -569,14 +504,13 @@
text-align: center;
overflow: hidden;
white-space: nowrap;
margin-top: 1.5em;
margin-bottom: 1.5em;
}
.strike > span {
font-weight: 700;
position: relative;
display: inline-block;
line-height: 1.14;
line-height: 1.714;
color: #fff;
}
@@ -587,7 +521,7 @@
top: 50%;
width: 9999px;
height: 1px;
background: #fff;
background: $purple-400;
}
.strike > span:before {
@@ -603,26 +537,24 @@
<script>
import axios from 'axios';
import hello from 'hellojs';
import debounce from 'lodash/debounce';
import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { buildAppleAuthUrl } from '../../libs/auth';
import PrivacyBanner from '@/components/header/banners/privacy';
import notifications from '@/mixins/notifications';
import sanitizeRedirect from '@/mixins/sanitizeRedirect';
import accountCreation from '@/mixins/accountCreation';
import exclamation from '@/assets/svg/exclamation.svg?raw';
import gryphon from '@/assets/svg/gryphon.svg?raw';
import habiticaIcon from '@/assets/svg/logo-horizontal.svg?raw';
import habiticaIcon from '@/assets/svg/habitica-logo.svg?raw';
import googleIcon from '@/assets/svg/google.svg?raw';
import appleIcon from '@/assets/svg/apple_black.svg?raw';
export default {
mixins: [sanitizeRedirect],
components: {
PrivacyBanner,
},
mixins: [accountCreation, notifications, sanitizeRedirect],
data () {
const data = {
username: '',
email: '',
password: '',
passwordConfirm: '',
forgotPassword: false,
resetPasswordSetNewOneData: {
hasError: null,
@@ -633,7 +565,6 @@ export default {
data.icons = Object.freeze({
exclamation,
gryphon,
habiticaIcon,
googleIcon,
appleIcon,
@@ -654,14 +585,6 @@ export default {
}
return false;
},
emailValid () {
if (this.email.length < 1) return false;
return isEmail(this.email);
},
emailInvalid () {
if (this.email.length < 1) return false;
return !this.emailValid;
},
usernameValid () {
if (this.username.length < 1) return false;
return this.usernameIssues.length === 0;
@@ -670,28 +593,6 @@ export default {
if (this.username.length < 1) return false;
return !this.usernameValid;
},
passwordValid () {
if (this.password.length <= 0) return false;
return this.password.length >= MINIMUM_PASSWORD_LENGTH;
},
passwordInvalid () {
if (this.password.length <= 0) return false;
return this.password.length < MINIMUM_PASSWORD_LENGTH;
},
passwordConfirmValid () {
if (this.passwordConfirm.length <= 3) return false;
return this.passwordConfirm === this.password;
},
passwordConfirmInvalid () {
if (this.passwordConfirm.length <= 3) return false;
return !this.passwordConfirmValid;
},
signupFormInvalid () {
return this.usernameInvalid
|| this.emailInvalid
|| this.passwordInvalid
|| this.passwordConfirmInvalid;
},
},
watch: {
$route: {
@@ -729,71 +630,11 @@ export default {
this.username = this.$route.query.email;
}
}
hello.init({
google: import.meta.env.GOOGLE_CLIENT_ID, // eslint-disable-line
});
},
methods: {
// eslint-disable-next-line func-names
validateUsername: debounce(function (username) {
if (username.length <= 3 || !this.registering) {
return;
}
this.$store.dispatch('auth:verifyUsername', {
username: this.username,
}).then(res => {
if (res.issues !== undefined) {
this.usernameIssues = res.issues;
} else {
this.usernameIssues = [];
}
});
}, 500),
async register () {
// @TODO do not use alert
if (!this.email) {
window.alert(this.$t('missingEmail')); // eslint-disable-line no-alert
return;
}
if (this.password !== this.passwordConfirm) {
window.alert(this.$t('passwordConfirmationMatch')); // eslint-disable-line no-alert
return;
}
// @TODO: implement language and invite accepting
// var url = ApiUrl.get() + "/api/v4/user/auth/local/register";
// if (location.search && location.search.indexOf('Invite=') !== -1)
// { // matches groupInvite and partyInvite
// url += location.search;
// }
//
// if($rootScope.selectedLanguage) {
// var toAppend = url.indexOf('?') !== -1 ? '&' : '?';
// url = url + toAppend + 'lang=' + $rootScope.selectedLanguage.code;
// }
await this.$store.dispatch('auth:register', {
username: this.username,
email: this.email,
password: this.password,
passwordConfirm: this.passwordConfirm,
});
const redirectTo = this.sanitizeRedirect(this.$route.query.redirectTo);
// @TODO do not reload entire page
// problem is that app.vue created hook should be called again
// after user is logged in / just signed up
// ALSO it's the only way to make sure language data
// is reloaded and correct for the logged in user
// Same situation in login and socialAuth functions
window.location.href = redirectTo;
},
async login () {
await this.$store.dispatch('auth:login', {
username: this.username,
// email: this.email,
password: this.password,
});
@@ -801,31 +642,6 @@ export default {
window.location.href = redirectTo;
},
// @TODO: Abstract hello in to action or lib
async socialAuth (network) {
if (network === 'apple') {
window.location.href = buildAppleAuthUrl();
} else {
try {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
// explicitly pass the redirect url or it might redirect to /home
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
auth,
});
const redirectTo = this.sanitizeRedirect(this.$route.query.redirectTo);
window.location.href = redirectTo;
}
},
setTitle () {
if (this.resetPasswordSetNewOne) {
return;
@@ -840,7 +656,7 @@ export default {
},
handleSubmit () {
if (this.registering) {
this.register();
this.proceed('local');
return;
}
@@ -896,6 +712,20 @@ export default {
this.resetPasswordSetNewOneData.hasError = false;
this.$router.push({ name: 'login' });
},
validateUsername: debounce(function valUsername (username) {
const usernameIssues = [];
if (username.length > 0 && !isEmail(username)) {
if (username.length > 20) {
usernameIssues.push(this.$t('usernameIssueLength'));
}
const invalidCharsRegex = /[^a-z0-9_-]/i;
const match = username.match(invalidCharsRegex);
if (match !== null && match[0] !== null) {
usernameIssues.push(this.$t('usernameIssueInvalidCharacters'));
}
}
this.usernameIssues = usernameIssues;
}, 500),
},
};
</script>

View File

@@ -0,0 +1,267 @@
<template>
<div class="gradient-bg">
<div
id="privacy-tos"
class="w-100"
>
<privacy-banner
class="privacy-banner"
/>
<div class="d-flex flex-column mx-auto pt-5 w-448px">
<img
class="mx-auto"
src="@/assets/images/home/signup-quill@2x.png"
width="120px"
>
<h1 class="mt-0 mb-3 white mx-auto">
{{ $t('whatToCallYou') }}
</h1>
<form
class="form mx-auto"
@submit.prevent.stop="register()"
>
<input
id="usernameInput"
v-model="username"
class="form-control dark"
type="text"
:placeholder="$t('username')"
:class="{
'mb-3': !usernameInvalid,
'input-valid': username && usernameValid,
'input-invalid mb-2': usernameInvalid,
}"
>
<!-- eslint-disable vue/require-v-for-key -->
<div
v-for="issue in usernameIssues"
class="input-error"
>
<!-- eslint-enable vue/require-v-for-key -->
{{ issue }}
</div>
<p class="purple-600">
{{ $t('usernameLimitations') }}
</p>
<div class="custom-control custom-checkbox mb-4">
<input
id="privacyTOS"
v-model="privacyAccepted"
class="custom-control-input dark"
type="checkbox"
>
<label
v-once
class="custom-control-label purple-600"
for="privacyTOS"
v-html="$t('acceptPrivacyTOS')"
></label>
</div>
<button
class="btn btn-info d-block w-100 sign-up mx-auto mb-5"
:disabled="!username || usernameInvalid || !privacyAccepted"
type="submit"
>
{{ $t('getStarted') }}
</button>
</form>
</div>
</div>
</div>
</template>
<style lang="scss">
@import '@/assets/scss/colors.scss';
#privacy-tos {
position: relative;
z-index: 2;
width: 448px;
background-image: url('@/assets/images/auth/seamless_stars_varied_opacity.png');
background-repeat: repeat-x;
a {
color: $white;
font-weight: bold;
text-decoration: underline;
}
.privacy-banner a {
color: $purple-300;
font-weight: normal;
text-decoration: none;
&:hover {
text-decoration: underline;
}
}
}
</style>
<style lang="scss" scoped>
@import '@/assets/scss/colors.scss';
@import '@/assets/scss/privacy.scss';
@import '@/assets/scss/forms.scss';
p.purple-600 {
line-height: 1.714;
}
.custom-checkbox {
.custom-control-label::before {
border-radius: 2px;
margin-top: 2px;
}
.custom-control-input:checked~.custom-control-label::after {
margin-top: 2px;
}
}
.gradient-bg {
background: linear-gradient(to bottom, $purple-200, $purple-300);
height: 700px;
}
.input-error {
font-size: 90%;
width: 100%;
margin-bottom: 1em;
}
.sign-up {
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
&:focus, &:active {
background-color: $blue-50;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
}
.w-448px {
width: 448px;
}
</style>
<script>
import debounce from 'lodash/debounce';
import PrivacyBanner from '@/components/header/banners/privacy';
import sanitizeRedirect from '@/mixins/sanitizeRedirect';
export default {
components: {
PrivacyBanner,
},
mixins: [sanitizeRedirect],
data () {
return {
authData: {},
email: '',
password: '',
passwordConfirm: '',
privacyAccepted: false,
registrationMethod: null,
username: '',
usernameIssues: [],
};
},
computed: {
usernameValid () {
if (this.username?.length < 1) return false;
return this.usernameIssues.length === 0;
},
usernameInvalid () {
if (this.username?.length < 1) return false;
return !this.usernameValid;
},
},
watch: {
username () {
this.validateUsername(this.username || '');
},
},
mounted () {
if (window.sessionStorage.getItem('apple-token')) {
this.registrationMethod = 'apple';
} else if (!this.$store.state.registrationOptions.registrationMethod) {
this.$router.push('/');
} else {
this.registrationMethod = this.$store.state.registrationOptions.registrationMethod;
}
this.authData = this.$store.state.registrationOptions.authData;
this.email = this.$store.state.registrationOptions.email;
this.username = this.$store.state.registrationOptions.username;
this.password = this.$store.state.registrationOptions.password;
this.passwordConfirm = this.$store.state.registrationOptions.passwordConfirm;
if (!this.email) {
return;
}
const usernameToCheck = this.email.split('@')[0].replace(/[^a-zA-Z0-9\-_]/g, '');
this.$store.dispatch('auth:verifyUsername', {
username: usernameToCheck,
}).then(res => {
if (!res.issues) {
this.username = usernameToCheck;
}
});
document.getElementById('usernameInput').focus();
},
methods: {
async register () {
if (this.registrationMethod === 'local') {
let groupInvite = '';
if (this.$route.query && this.$route.query.p) {
groupInvite = this.$route.query.p;
}
if (this.$route.query && this.$route.query.groupInvite) {
groupInvite = this.$route.query.groupInvite;
}
await this.$store.dispatch('auth:register', {
username: this.username,
email: this.email,
password: this.password,
passwordConfirm: this.passwordConfirm,
groupInvite,
});
const redirect = this.sanitizeRedirect(this.$route.query.redirectTo);
window.location.href = redirect;
} else if (this.registrationMethod === 'apple') {
await this.$store.dispatch('auth:appleAuth', {
idToken: window.sessionStorage.getItem('apple-token'),
name: window.sessionStorage.getItem('apple-name'),
username: this.username,
allowRegister: true,
});
} else {
await this.$store.dispatch('auth:socialAuth', {
auth: this.authData,
username: this.username,
});
}
window.location.href = '/';
},
// eslint-disable-next-line func-names
validateUsername: debounce(function (username) {
if (username.length < 1) {
return;
}
this.$store.dispatch('auth:verifyUsername', {
username: this.username,
}).then(res => {
if (res.issues !== undefined) {
this.usernameIssues = res.issues;
} else {
this.usernameIssues = [];
}
});
}, 500),
},
};
</script>

View File

@@ -321,8 +321,8 @@ export default {
return null;
},
petClass () {
const foolEvent = this.currentEventList?.find(event => moment()
.isBetween(event.start, event.end) && event.aprilFools);
const foolEvent = this.currentEventList?.find(event => event.aprilFools && moment()
.isBetween(event.start, event.end));
if (foolEvent) {
return this.foolPet(this.member.items.currentPet, foolEvent.aprilFools);
}

View File

@@ -5,7 +5,7 @@
:size="editing ? 'lg' : 'md'"
:hide-header="true"
:hide-footer="true"
:modal-class="{'page-2':modalPage > 1 && !editing}"
:modal-class="{'page-2': !editing}"
:no-close-on-esc="!editing"
:no-close-on-backdrop="!editing"
>
@@ -13,20 +13,6 @@
v-if="editing"
@close="close()"
/>
<div
v-if="modalPage === 1 && !editing"
class="section row welcome-section"
>
<div class="col-6 offset-3 text-center">
<h3 v-once>
{{ $t('welcomeTo') }}
</h3>
<div
class="svg-icon logo"
v-html="icons.logoPurple"
></div>
</div>
</div>
<h2
v-if="editing"
class="text-center pt-2 mt-4 mb-4"
@@ -34,7 +20,6 @@
{{ $t('editAvatar') }}
</h2>
<div
v-if="modalPage > 1"
class="avatar-section d-flex justify-content-center"
:class="{'page-2': modalPage === 2}"
>
@@ -433,8 +418,7 @@
</div>
<div
v-if="!editing"
class="section d-flex justify-content-center justin-outer-section"
:class="{top: modalPage > 1}"
class="section d-flex justify-content-center justin-outer-section top"
>
<div class="justin-section d-flex align-items-center">
<div class="featured-label">
@@ -459,17 +443,8 @@
class="corner-decoration"
:style="{bottom: '-2px', left: '-2px'}"
></div>
<div v-if="modalPage === 1">
<p
v-once
v-html="$t('justinIntroMessage1')"
></p>
<p v-once>
{{ $t('justinIntroMessageUsername') }}
</p>
</div>
<div v-if="modalPage === 2">
<p>{{ $t('justinIntroMessageAppearance') }}</p>
<p v-html="$t('justinIntroMessage1')"></p>
</div>
<div v-if="modalPage === 3">
<p v-once>
@@ -484,25 +459,12 @@
</div>
</div>
<div
v-if="modalPage === 1"
class="section mr-5 ml-5 first-page-footer"
>
<username-form
:avatar-intro="true"
@usernameConfirmed="modalPage += 1"
/>
<div
class="small text-center"
v-html="$t('usernameTOSRequirements')"
></div>
</div>
<div
v-if="!editing && !(modalPage === 1)"
v-if="!editing"
class="section container footer"
>
<div class="footer-left">
<div
v-if="modalPage > 1"
v-if="modalPage > 2"
class="prev-outer"
@click="prev()"
>
@@ -519,10 +481,6 @@
</div>
</div>
<div class="footer-center text-center circles">
<div
class="circle"
:class="{active: modalPage === 1}"
></div>
<div
class="circle"
:class="{active: modalPage === 2}"
@@ -991,7 +949,6 @@ import forEach from 'lodash/forEach';
import content from '@/../../common/script/content/index';
import { mapState } from '@/libs/store';
import avatar from './avatar';
import usernameForm from './settings/usernameForm';
import guide from '@/mixins/guide';
import notifications from '@/mixins/notifications';
import customizeBanner from './avatarModal/customize-banner';
@@ -1025,7 +982,6 @@ export default {
extraSettings,
hairSettings,
skinSettings,
usernameForm,
Sprite,
},
mixins: [guide, notifications, avatarEditorUtilities],
@@ -1053,7 +1009,7 @@ export default {
arrowLeft,
close: svgClose,
}),
modalPage: 1,
modalPage: 2,
activeTopPage: 'body',
activeSubPage: 'size',
taskCategories: [],

View File

@@ -0,0 +1,126 @@
<template>
<div
class="banner d-flex align-items-center justify-content-between py-3 px-4"
id="privacy-banner"
v-if="!hidden"
>
<p
class="mr-3 mb-0"
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy')"
>
</p>
<div
class="navigation d-flex flex-column justify-content-around text-center ml-2"
:class="{ static: isStaticPage }"
>
<button
class="btn btn-primary mb-2"
@click="consent(true)"
>
{{ $t('acceptAllCookies') }}
</button>
<button
class="btn btn-secondary mb-2"
@click="consent(false)"
>
{{ $t('denyNonEssentialCookies') }}
</button>
<a
v-if="isStaticPage"
@click="showPrivacyModal"
>
{{ $t('managePrivacyPreferences') }}
</a>
<router-link
v-else
to="/user/settings/siteData"
>
{{ $t('managePrivacyPreferences') }}
</router-link>
</div>
</div>
</template>
<style lang="scss" scoped>
button {
width: 558px;
}
a, p {
line-height: 1.714;
}
@media only screen and (max-width: 1300px) {
.banner {
flex-direction: column !important;
button {
width: 100%;
}
.navigation {
width: 100%;
margin-left: 0px !important;
}
p {
margin-bottom: 16px !important;
}
}
}
</style>
<script>
import { nextTick } from 'vue';
import { GenericUserPreferencesMixin } from '@/pages/settings/components/genericUserPreferencesMixin';
import { EVENTS } from '@/libs/events';
import { mapState } from '@/libs/store';
export default {
mixins: [GenericUserPreferencesMixin],
computed: {
isStaticPage () {
return this.$route.meta.requiresLogin === false;
},
...mapState({
user: 'user.data',
}),
},
data () {
return {
hidden: false,
};
},
mounted () {
if (localStorage.getItem('analyticsConsent') !== null
|| this.user?.preferences?.analyticsConsent !== undefined
|| navigator.globalPrivacyControl
) {
this.hidden = true;
}
this.$root.$on('privacy-complete', () => {
this.close();
});
},
methods: {
close () {
this.hidden = true;
nextTick(() => {
this.$root.$emit(EVENTS.BANNER_HEIGHT_UPDATED);
});
},
consent (decision) {
if (this.user) {
this.user.preferences.analyticsConsent = decision;
this.setUserPreference('analyticsConsent');
} else {
localStorage.setItem('analyticsConsent', decision);
}
this.close();
},
showPrivacyModal () {
this.$root.$emit('bv::show::modal', 'privacy-preferences');
},
},
};
</script>

View File

@@ -0,0 +1,122 @@
<template>
<b-modal
id="privacy-preferences"
size="md"
:hide-footer="true"
:hide-header="true"
>
<close-x
@close="close()"
/>
<h1 class="purple-200 mb-3">
{{ $t('yourPrivacyPreferences') }}
</h1>
<p>
{{ $t('privacySettingsOverview') }}
</p>
<div class="mb-4">
<div
class="d-flex justify-content-between align-items-center mb-1"
>
<label class="mb-0">
{{ $t('performanceAnalytics') }}
</label>
<toggle-switch
v-model="privacyConsent"
/>
</div>
<small>
{{ $t('usedForSupport') }}
</small>
</div>
<div class="mt-1 mb-4">
<div
class="d-flex justify-content-between align-items-center mb-1"
>
<label class="mb-0">
{{ $t('strictlyNecessary') }}
</label>
<toggle-switch
:checked="true"
:disabled="true"
/>
</div>
<small>
{{ $t('requiredToRun') }}
</small>
</div>
<div class="d-flex flex-column text-center">
<button
class="btn btn-primary mb-2"
@click="consent(true)"
>
{{ $t('acceptAllCookies') }}
</button>
<button
class="btn btn-primary mb-2"
@click="consent(false)"
>
{{ $t('denyNonEssentialCookies') }}
</button>
<button
class="btn btn-secondary mb-3"
@click="consent(privacyConsent)"
>
{{ $t('savePreferences') }}
</button>
<a
href="/static/privacy"
target="_blank"
>
{{ $t('habiticaPrivacyPolicy') }}
</a>
</div>
</b-modal>
</template>
<style lang="scss">
#privacy-preferences {
.modal-body {
padding: 24px;
}
.modal-content {
width: 448px;
}
}
</style>
<style lang="scss" scoped>
label {
font-weight: 700;
}
label, p {
line-height: 1.714;
}
</style>
<script>
import closeX from '@/components/ui/closeX';
import ToggleSwitch from '@/components/ui/toggleSwitch.vue';
export default {
components: {
closeX,
ToggleSwitch,
},
data () {
return {
privacyConsent: true,
};
},
methods: {
consent (decision) {
localStorage.setItem('analyticsConsent', decision);
this.$root.$emit('privacy-complete');
this.close();
},
close () {
this.$root.$emit('bv::hide::modal', 'privacy-preferences');
},
},
};
</script>

View File

@@ -96,6 +96,7 @@ export default {
notificationTopY: '0px',
preventMultipleWatchExecution: false,
eventPromoBannerHeight: null,
privacyBannerHeight: null,
sleepingBannerHeight: null,
warningBannerHeight: null,
};
@@ -114,6 +115,10 @@ export default {
notificationBannerHeight () {
let scrollPosToCheck = 56;
if (this.privacyBannerHeight) {
scrollPosToCheck += this.privacyBannerHeight;
}
if (this.warningBannerHeight) {
scrollPosToCheck += this.warningBannerHeight;
}
@@ -164,6 +169,9 @@ export default {
window.addEventListener('scroll', this.updateScrollY, {
passive: true,
});
window.addEventListener('resize', this.updateBannerHeightAndScrollY, {
passive: true,
});
this.$root.$on(EVENTS.BANNER_HEIGHT_UPDATED, () => {
this.updateBannerHeightAndScrollY();
@@ -339,6 +347,7 @@ export default {
updateBannerHeightAndScrollY () {
this.updateEventBannerHeight();
this.privacyBannerHeight = document.getElementById('privacy-banner')?.getBoundingClientRect().height || 0;
this.warningBannerHeight = getBannerHeight('chat-warning');
this.sleepingBannerHeight = getBannerHeight('damage-paused');
this.updateScrollY();

View File

@@ -16,7 +16,7 @@
.static-view p {
padding-top: 100px;
font-size: 2em
font-size: 2em;
}
</style>
@@ -26,13 +26,19 @@ export default {
async mounted () {
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
const reqParams = { code: urlParams.get('code') };
const reqParams = { code: urlParams.get('code'), allowRegister: false };
if (urlParams.has('name')) {
reqParams.name = urlParams.get('name');
window.sessionStorage.setItem('apple-name', reqParams.name);
}
const response = await this.$store.dispatch('auth:appleAuth', reqParams);
if (response.id) {
window.sessionStorage.removeItem('apple-token');
window.location.href = '/';
} else {
window.sessionStorage.setItem('apple-token', response.idToken);
window.location.href = '/username';
}
await this.$store.dispatch('auth:appleAuth', reqParams);
window.location.href = '/';
},
};
</script>

View File

@@ -117,18 +117,6 @@
</div>
<div class="bot-right"></div>
</div>
<b-modal
id="group-plan"
title
size="md"
:hide-footer="true"
:hide-header="true"
>
<div>
<h2>{{ $t('letsMakeAccount') }}</h2>
<auth-form @authenticate="authenticate()" />
</div>
</b-modal>
</div>
</div>
<div
@@ -315,12 +303,10 @@
<script>
import { setup as setupPayments } from '@/libs/payments';
import paymentsMixin from '../../mixins/payments';
import AuthForm from '../auth/authForm.vue';
import GroupPlanCreationModal from '../group-plans/groupPlanCreationModal.vue';
export default {
components: {
AuthForm,
GroupPlanCreationModal,
},
mixins: [paymentsMixin],
@@ -353,13 +339,11 @@ export default {
},
methods: {
authenticate () {
this.$root.$emit('bv::hide::modal', 'group-plan');
this.$root.$emit('bv::show::modal', 'create-group');
},
goToNewGroupPage () {
if (this.isStaticPage && !this.user) {
this.modalOption = 'static';
return this.$root.$emit('bv::show::modal', 'group-plan');
return this.$router.push('/register');
}
if (this.upgradingGroup._id) {
return this.stripeGroup({ group: this.upgradingGroup, upgrade: true });

View File

@@ -8,124 +8,117 @@
<br />
<a href="https://www.enable-javascript.com/" target="_blank">{{ $t('jsDisabledLink') }}</a>
</noscript>
<div
id="intro-signup"
class="purple-1"
>
<div class="container">
<div class="row">
<div class="col-12 col-md-6 col-lg-6">
<img
src="@/assets/images/home/home-main@3x.png"
width="357px"
>
<h1>{{ $t('motivateYourself') }}</h1>
<p class="section-main">
{{ $t('timeToGetThingsDone', {userCountInMillions}) }}
</p>
</div>
<div class="col-12 col-md-6 col-lg-6">
<h3 class="text-center">
{{ $t('singUpForFree') }}
</h3>
<form
class="form"
@submit.prevent.stop="register()"
>
<p class="form-text">
{{ $t('usernameLimitations') }}
<privacy-banner
class="privacy-banner"
/>
<div class="bg-purple-300 white">
<div>
<div
id="intro-signup"
>
<div class="d-flex justify-content-center">
<div class="w-33 mr-5 mt-5">
<img
src="@/assets/images/home/home-main@3x.png"
width="357px"
>
<h1>{{ $t('motivateYourself') }}</h1>
<p class="section-main">
{{ $t('timeToGetThingsDone', {userCountInMillions}) }}
</p>
<input
id="usernameInput"
v-model="username"
class="form-control input-with-error"
type="text"
:placeholder="$t('username')"
:class="{'input-valid': usernameValid, 'input-invalid': usernameInvalid}"
>
<!-- eslint-disable vue/require-v-for-key -->
<div
v-for="issue in usernameIssues"
class="input-error"
>
<!-- eslint-enable vue/require-v-for-key -->
{{ issue }}
</div>
<input
v-model="email"
class="form-control"
type="email"
:placeholder="$t('email')"
:class="{'input-invalid': emailInvalid, 'input-valid': emailValid}"
>
<input
v-model="password"
class="form-control input-with-error"
type="password"
:placeholder="$t('password')"
:class="{
'input-valid': passwordValid,
'input-invalid': passwordInvalid,
}"
>
<div
v-if="passwordInvalid"
class="input-error"
>
{{ $t('minPasswordLength') }}
</div>
<input
v-model="passwordConfirm"
class="form-control input-with-error"
type="password"
:placeholder="$t('confirmPassword')"
:class="{
'input-invalid': passwordConfirmInvalid,
'input-valid': passwordConfirmValid}"
>
<div
v-if="passwordConfirmInvalid"
class="input-error"
>
{{ $t('passwordConfirmationMatch') }}
</div>
<p
v-once
class="form-text"
v-html="$t('termsAndAgreement')"
></p>
<button
class="btn btn-block btn-info sign-up"
:disabled="signupFormInvalid"
type="submit"
>
{{ $t('signup') }}
</button>
</form>
<div class="strike">
<span>{{ $t('or') }}</span>
</div>
<div class="text-center">
<button
class="social-button"
@click="socialAuth('google')"
<div class="w-33 ml-5">
<h3 class="text-center">
{{ $t('singUpForFree') }}
</h3>
<form
class="form pb-0"
@submit.prevent.stop="proceed('local')"
>
<input
v-model="email"
class="form-control input-with-error dark"
type="email"
:placeholder="$t('email')"
:class="{
'mb-3': !emailError,
'input-valid': emailValid,
'input-invalid mb-2': emailError,
}"
>
<div
class="svg-icon social-icon"
v-html="icons.googleIcon"
></div>
<span>{{ $t('signUpWithSocial', {social: 'Google'}) }}</span>
</button>
<button
class="social-button"
@click="socialAuth('apple')"
>
v-if="emailError"
class="input-error"
>
{{ emailError }}
</div>
<input
v-model="password"
class="form-control input-with-error dark"
type="password"
:placeholder="$t('password')"
:class="{
'mb-3': !passwordInvalid,
'input-valid': passwordValid,
'input-invalid mb-2': passwordInvalid,
}"
>
<div
class="svg svg-icon social-icon apple-icon color"
v-html="icons.appleIcon"
></div>
<span>{{ $t('signUpWithSocial', {social: 'Apple'}) }}</span>
</button>
v-if="passwordInvalid"
class="input-error"
>
{{ $t('minPasswordLength') }}
</div>
<input
v-model="passwordConfirm"
class="form-control input-with-error dark"
type="password"
:placeholder="$t('confirmPassword')"
:class="{
'mb-3': !passwordConfirmInvalid,
'input-invalid mb-2': passwordConfirmInvalid,
'input-valid': passwordConfirmValid}"
>
<div
v-if="passwordConfirmInvalid"
class="input-error"
>
{{ $t('passwordConfirmationMatch') }}
</div>
<button
id="continue-button"
class="btn btn-block btn-info"
:disabled="!(emailValid && passwordValid && passwordConfirmValid)"
type="submit"
>
{{ $t('continue') }}
</button>
</form>
<div class="strike">
<span>{{ $t('or') }}</span>
</div>
<div class="text-center">
<button
class="social-button"
@click="proceed('google')"
>
<div
class="svg-icon social-icon"
v-html="icons.googleIcon"
></div>
<span>{{ $t('signUpWithSocial', {social: 'Google'}) }}</span>
</button>
<button
class="social-button"
@click="proceed('apple')"
>
<div
class="svg svg-icon social-icon apple-icon color"
v-html="icons.appleIcon"
></div>
<span>{{ $t('signUpWithSocial', {social: 'Apple'}) }}</span>
</button>
</div>
</div>
</div>
<div class="col-12">
@@ -135,218 +128,218 @@
></div>
</div>
</div>
</div>
</div>
<div
id="gamify-life"
class="purple-2"
>
<div class="container-fluid">
<div
class="pixel-horizontal svg-icon"
v-html="icons.pixelHorizontal"
></div>
</div>
<div class="container">
<div class="row">
<div class="col-12 col-sm-6 col-md-6 col-lg-6 offset-sm-3 text-center">
<h2>{{ $t('gamifyYourLife') }}</h2>
<p class="section-main">
{{ $t('aboutHabitica') }}
</p>
id="gamify-life"
class="bg-purple-100 white"
>
<div class="container-fluid">
<div
class="pixel-horizontal svg-icon"
v-html="icons.pixelHorizontal"
></div>
</div>
</div>
<div class="row">
<div class="col-12 col-md-4">
<img
class="track-habits"
src="@/assets/images/home/track-habits@3x.png"
width="354px"
height="228px"
>
<strong>{{ $t('trackYourGoals') }}</strong>
<p>{{ $t('trackYourGoalsDesc') }}</p>
<div class="container">
<div class="row">
<div class="col-12 col-sm-6 col-md-6 col-lg-6 offset-sm-3 text-center">
<h2>{{ $t('gamifyYourLife') }}</h2>
<p class="section-main">
{{ $t('aboutHabitica') }}
</p>
</div>
</div>
<div class="row">
<div class="col-12 col-md-4">
<img
class="track-habits"
src="@/assets/images/home/track-habits@3x.png"
width="354px"
height="228px"
>
<strong>{{ $t('trackYourGoals') }}</strong>
<p>{{ $t('trackYourGoalsDesc') }}</p>
</div>
<div class="col-12 col-md-4">
<img
src="@/assets/images/home/earn-rewards@3x.png"
width="316px"
height="244px"
>
<strong>{{ $t('earnRewards') }}</strong>
<p>{{ $t('earnRewardsDesc') }}</p>
</div>
<div class="col-12 col-md-4">
<img
src="@/assets/images/home/battle-monsters@3x.png"
width="303px"
height="244px"
>
<strong>{{ $t('battleMonsters') }}</strong>
<p>{{ $t('battleMonstersDesc') }}</p>
</div>
</div>
</div>
<div class="col-12 col-md-4">
<img
src="@/assets/images/home/earn-rewards@3x.png"
width="316px"
height="244px"
>
<strong>{{ $t('earnRewards') }}</strong>
<p>{{ $t('earnRewardsDesc') }}</p>
</div>
<div class="col-12 col-md-4">
<img
src="@/assets/images/home/battle-monsters@3x.png"
width="303px"
height="244px"
>
<strong>{{ $t('battleMonsters') }}</strong>
<p>{{ $t('battleMonstersDesc') }}</p>
</div>
</div>
</div>
<div class="col-12">
<div
class="spacer svg-icon"
v-html="icons.spacer"
></div>
</div>
</div>
<div
id="use-cases"
class="purple-2"
>
<div class="container text-center">
<div class="row">
<div class="col-12">
<h2>{{ $t('playersUseToImprove') }}</h2>
<div
class="spacer svg-icon"
v-html="icons.spacer"
></div>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-4">
<img
src="@/assets/images/home/health-fitness@3x.png"
width="300px"
height="300px"
>
<strong>{{ $t('healthAndFitness') }}</strong>
<p>{{ $t('healthAndFitnessDesc') }}</p>
</div>
<div class="col-12 col-sm-4">
<img
src="@/assets/images/home/school-work@3x.png"
width="300px"
height="300px"
>
<strong>{{ $t('schoolAndWork') }}</strong>
<p>{{ $t('schoolAndWorkDesc') }}</p>
</div>
<div class="col-12 col-sm-4">
<img
src="@/assets/images/home/much-more@3x.png"
width="300px"
height="300px"
>
<strong>{{ $t('muchmuchMore') }}</strong>
<p>{{ $t('muchmuchMoreDesc') }}</p>
</div>
</div>
</div>
<div class="col-12">
<div
class="spacer svg-icon"
v-html="icons.spacer"
></div>
</div>
<div class="container-fluid">
id="use-cases"
class="bg-purple-100 white"
>
<div class="container text-center">
<div class="row">
<div class="col-12">
<h2>{{ $t('playersUseToImprove') }}</h2>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-4">
<img
src="@/assets/images/home/health-fitness@3x.png"
width="300px"
height="300px"
>
<strong>{{ $t('healthAndFitness') }}</strong>
<p>{{ $t('healthAndFitnessDesc') }}</p>
</div>
<div class="col-12 col-sm-4">
<img
src="@/assets/images/home/school-work@3x.png"
width="300px"
height="300px"
>
<strong>{{ $t('schoolAndWork') }}</strong>
<p>{{ $t('schoolAndWorkDesc') }}</p>
</div>
<div class="col-12 col-sm-4">
<img
src="@/assets/images/home/much-more@3x.png"
width="300px"
height="300px"
>
<strong>{{ $t('muchmuchMore') }}</strong>
<p>{{ $t('muchmuchMoreDesc') }}</p>
</div>
</div>
</div>
<div class="col-12">
<div
class="spacer svg-icon"
v-html="icons.spacer"
></div>
</div>
<div class="container-fluid">
<div
class="pixel-horizontal-2 svg-icon"
v-html="icons.pixelHorizontal2"
></div>
</div>
</div>
<div
class="pixel-horizontal-2 svg-icon"
v-html="icons.pixelHorizontal2"
></div>
</div>
</div>
<div
id="level-up-anywhere"
class="purple-3"
>
<div class="container">
<div class="row">
<div class="col-12 col-md-6 col-lg-6">
<div class="iphones"></div>
id="level-up-anywhere"
class="bg-purple-50 white"
>
<div class="container">
<div class="row">
<div class="col-12 col-md-6 col-lg-6">
<div class="iphones"></div>
</div>
<div class="col-12 col-md-6 col-lg-6 text-column">
<h2>{{ $t('levelUpAnywhere') }}</h2>
<p>{{ $t('levelUpAnywhereDesc') }}</p>
<a
class="app svg-icon"
href="https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica"
target="_blank"
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"
v-html="icons.iosAppStore"
></a>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-lg-6 text-column">
<h2>{{ $t('levelUpAnywhere') }}</h2>
<p>{{ $t('levelUpAnywhereDesc') }}</p>
<a
class="app svg-icon"
href="https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica"
target="_blank"
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"
v-html="icons.iosAppStore"
></a>
<div class="container-fluid">
<div
class="pixel-horizontal-3 svg-icon"
v-html="icons.pixelHorizontal3"
></div>
</div>
</div>
</div>
<div class="container-fluid">
<div
class="pixel-horizontal-3 svg-icon"
v-html="icons.pixelHorizontal3"
></div>
</div>
</div>
<div
id="call-to-action"
class="purple-4"
>
<div class="container featured">
<div class="row text-center">
<h3 class="col-12">
{{ $t('joinMany', {userCountInMillions}) }}
</h3>
</div>
<div class="row">
<div class="col-12 text-center">
<button
class="btn btn-primary btn-front join-button"
@click="playButtonClick()"
>
{{ $t('joinToday') }}
</button>
id="call-to-action"
class="purple-4 white"
>
<div class="container featured">
<div class="row text-center">
<h3 class="col-12">
{{ $t('joinMany', {userCountInMillions}) }}
</h3>
</div>
<div class="row">
<div class="col-12 text-center">
<button
class="btn btn-primary btn-front join-button"
@click="playButtonClick()"
>
{{ $t('joinToday') }}
</button>
</div>
</div>
<div class="row featured">
<div class="col-12 text-center">
<strong>{{ $t('featuredIn') }}</strong>
</div>
</div>
</div>
<div class="container-fluid featured">
<div class="row">
<div class="col-12 text-center">
<div
class="lifehacker svg-icon"
v-html="icons.lifehacker"
></div>
<div
class="thenewyorktimes svg-icon"
v-html="icons.thenewyorktimes"
></div>
<div
class="makeuseof svg-icon"
v-html="icons.makeuseof"
></div>
<div
class="forbes svg-icon"
v-html="icons.forbes"
></div>
<div
class="cnet svg-icon"
v-html="icons.cnet"
></div>
<div
class="kickstarter svg-icon"
v-html="icons.kickstarter"
></div>
<div
class="fast-company svg-icon"
v-html="icons.fastCompany"
></div>
<div
class="discover svg-icon"
v-html="icons.discover"
></div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row seamless_stars_varied_opacity_repeat"></div>
</div>
</div>
<div class="row featured">
<div class="col-12 text-center">
<strong>{{ $t('featuredIn') }}</strong>
</div>
</div>
</div>
<div class="container-fluid featured">
<div class="row">
<div class="col-12 text-center">
<div
class="lifehacker svg-icon"
v-html="icons.lifehacker"
></div>
<div
class="thenewyorktimes svg-icon"
v-html="icons.thenewyorktimes"
></div>
<div
class="makeuseof svg-icon"
v-html="icons.makeuseof"
></div>
<div
class="forbes svg-icon"
v-html="icons.forbes"
></div>
<div
class="cnet svg-icon"
v-html="icons.cnet"
></div>
<div
class="kickstarter svg-icon"
v-html="icons.kickstarter"
></div>
<div
class="fast-company svg-icon"
v-html="icons.fastCompany"
></div>
<div
class="discover svg-icon"
v-html="icons.discover"
></div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row seamless_stars_varied_opacity_repeat"></div>
</div>
</div>
</div>
@@ -354,16 +347,27 @@
<style lang='scss'>
@import '@/assets/scss/static.scss';
#front .form-text a {
color: $white !important;
#front {
.form-text a {
color: $white !important;
}
.privacy-banner p {
font-size: 14px;
}
}
</style>
<style lang="scss" scoped>
@import '@/assets/scss/colors.scss';
@import '@/assets/scss/privacy.scss';
@import '@/assets/scss/forms.scss';
@import url('https://fonts.googleapis.com/css?family=Varela+Round');
.w-33 {
width: 33%;
}
#front {
.container-fluid {
margin: 0;
@@ -374,22 +378,10 @@
padding-bottom: 5em;
}
.purple-1, .purple-2, .purple-3, .purple-4, h1, h2, h3, h4, h5 {
.custom-control-label, h1, h2, h3, h4, h5 {
color: $white;
}
.purple-1 {
background-color: $purple-300;
}
.purple-2 {
background-color: $purple-100;
}
.purple-3 {
background-color: $purple-50;
}
.purple-4 {
background-color: $header-dark-background;
}
@@ -423,18 +415,26 @@
color: $header-dark-background;
}
h1, h2, h3, h4, h5, h6, button, .strike > span, input {
h1, h2, h3, h4, h5, h6, .strike > span {
font-family: 'Varela Round', sans-serif;
font-weight: normal;
}
.seamless_stars_varied_opacity_repeat {
background-image: url('@/assets/images/auth/seamless_stars_varied_opacity.png');
background-repeat: repeat-x;
height: 500px;
width: 100%;
}
}
#intro-signup {
background-image: url('@/assets/svg/for-css/confetti.svg?raw');
img {
margin: 0 auto;
display: block;
@media only screen and (min-width: 992px) {
margin-left: 15%;
}
}
h1 {
@@ -458,6 +458,7 @@
transition: .5s;
span {
font-weight: 700;
transition: none;
}
}
@@ -521,64 +522,6 @@
padding-top: 1em;
padding-bottom: 1em;
}
input {
margin-bottom: 1em;
border-radius: 2px;
background-color: $purple-100;
border-color: $purple-100;
color: $purple-400;
border: solid 2px transparent;
transition-timing-function: ease;
transition: border .5s, color .5s;
}
.input-invalid.input-with-error {
margin-bottom: 0.5em;
}
.input-valid {
color: $white;
}
input:focus {
border: solid 2px $purple-400;
color: #fff;
background-color: $purple-50;
}
input:hover {
background-color: $purple-50;
}
.sign-up {
border: 2px solid transparent;
box-shadow: 0 1px 3px 0 rgba($black, 0.16), 0 1px 3px 0 rgba($black, 0.24);
padding-top: 11px;
padding-bottom: 11px;
&:focus, &:active {
background-color: $blue-50;
border: 2px solid $purple-400;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
}
}
::-webkit-input-placeholder { /* Chrome/Opera/Safari */
color: $purple-400;
}
::-moz-placeholder { /* Firefox 19+ */
color: $purple-400;
}
:-ms-input-placeholder { /* IE 10+ */
color: $purple-400;
}
:-moz-placeholder { /* Firefox 18- */
color: $purple-400;
}
::placeholder { // Standard browsers
color: $purple-400;
}
}
#gamify-life {
@@ -779,20 +722,14 @@
}
.input-error {
color: $white;
font-size: 90%;
width: 100%;
margin-bottom: 1em;
}
</style>
<script>
import hello from 'hellojs';
import debounce from 'lodash/debounce';
import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { buildAppleAuthUrl } from '../../libs/auth';
import sanitizeRedirect from '@/mixins/sanitizeRedirect';
import notifications from '@/mixins/notifications';
import accountCreation from '@/mixins/accountCreation';
import PrivacyBanner from '@/components/header/banners/privacy';
import googlePlay from '@/assets/images/home/google-play-badge.svg?raw';
import iosAppStore from '@/assets/images/home/ios-app-store.svg?raw';
import iphones from '@/assets/images/home/iphones.svg?raw';
@@ -813,7 +750,10 @@ import makeuseof from '@/assets/images/home/make-use-of.svg?raw';
import thenewyorktimes from '@/assets/images/home/the-new-york-times.svg?raw';
export default {
mixins: [sanitizeRedirect],
components: {
PrivacyBanner,
},
mixins: [accountCreation, notifications],
data () {
return {
icons: Object.freeze({
@@ -837,132 +777,17 @@ export default {
thenewyorktimes,
}),
userCountInMillions: 4,
username: '',
password: '',
passwordConfirm: '',
email: '',
usernameIssues: [],
};
},
computed: {
emailValid () {
if (this.email.length < 1) return false;
return isEmail(this.email);
},
emailInvalid () {
if (this.email.length < 1) return false;
return !isEmail(this.email);
},
usernameValid () {
if (this.username.length < 1) return false;
return this.usernameIssues.length === 0;
},
usernameInvalid () {
if (this.username.length < 1) return false;
return !this.usernameValid;
},
passwordValid () {
if (this.password.length <= 0) return false;
return this.password.length >= MINIMUM_PASSWORD_LENGTH;
},
passwordInvalid () {
if (this.password.length <= 0) return false;
return this.password.length < MINIMUM_PASSWORD_LENGTH;
},
passwordConfirmValid () {
if (this.passwordConfirm.length <= 3) return false;
return this.passwordConfirm === this.password;
},
passwordConfirmInvalid () {
if (this.passwordConfirm.length <= 3) return false;
return this.passwordConfirm !== this.password;
},
signupFormInvalid () {
return this.usernameInvalid
|| this.emailInvalid
|| this.passwordInvalid
|| this.passwordConfirmInvalid;
},
},
watch: {
username () {
this.validateUsername(this.username);
},
},
mounted () {
hello.init({
google: import.meta.env.GOOGLE_CLIENT_ID, // eslint-disable-line
});
this.$store.dispatch('common:setTitle', {
fullTitle: 'Habitica - Gamify Your Life',
});
},
methods: {
// eslint-disable-next-line func-names
validateUsername: debounce(function (username) {
if (username.length < 1) {
return;
}
this.$store.dispatch('auth:verifyUsername', {
username: this.username,
}).then(res => {
if (res.issues !== undefined) {
this.usernameIssues = res.issues;
} else {
this.usernameIssues = [];
}
});
}, 500),
// @TODO this is totally duplicate from the registerLogin component
async register () {
let groupInvite = '';
if (this.$route.query && this.$route.query.p) {
groupInvite = this.$route.query.p;
}
if (this.$route.query && this.$route.query.groupInvite) {
groupInvite = this.$route.query.groupInvite;
}
await this.$store.dispatch('auth:register', {
username: this.username,
email: this.email,
password: this.password,
passwordConfirm: this.passwordConfirm,
groupInvite,
});
const redirect = this.sanitizeRedirect(this.$route.query.redirectTo);
window.location.href = redirect;
},
playButtonClick () {
this.$router.push('/register');
},
// @TODO: Abstract hello in to action or lib
async socialAuth (network) {
if (network === 'apple') {
window.location.href = buildAppleAuthUrl();
} else {
try {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
// explicitly pass the redirect url or it might redirect to /home
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
await this.$store.dispatch('auth:socialAuth', {
auth,
});
window.location.href = '/';
}
},
},
};
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,7 @@
<div>
<chat-banner />
<static-header
v-if="showContentWrap"
v-if="showContentWrap && !loginFlow"
:class="{
'home-header': ['home', 'front'].indexOf($route.name) !== -1,
'white-header': $route.name === 'plans'
@@ -15,17 +15,23 @@
<router-view />
</div>
<div
id="bottom-background"
v-if="loginFlow"
class="bg-purple-300"
>
<div class="seamless_mountains_demo_repeat"></div>
<div class="midground_foreground_extended2"></div>
</div>
<app-footer
v-if="showContentWrap"
:id="footerId"
>
<app-footer />
</div>
/>
<div
v-if="showContentWrap && footerId"
id="bottom-wrap"
class="purple-4"
>
<div id="bottom-background">
<div id="bottom-background" v-if="!loginFlow">
<div class="seamless_mountains_demo_repeat"></div>
<div class="midground_foreground_extended2"></div>
</div>
@@ -263,13 +269,16 @@ export default {
StaticHeader,
},
computed: {
showContentWrap () {
return this.$route.name !== 'news';
},
footerId () {
if (this.$route.name === 'plans') return null;
return 'purple-footer';
},
loginFlow () {
return ['login', 'register', 'username'].indexOf(this.$route.name) !== -1;
},
showContentWrap () {
return this.$route.name !== 'news';
},
},
};
</script>

View File

@@ -3,49 +3,130 @@
<div class="container-fluid">
<h1>Terms of Service</h1>
<p class="strong pagemeta">
Last Updated: December 14, 2021
Last Updated September 1, 2025.
</p>
<p>Thanks for choosing Habitica!</p>
<p>
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"
>https://habitica.com/static/privacy</a> (collectively, the "Agreement"), registering for the Service (as defined below), accessing or using any part of the Service, 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.
>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>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.</p>
<p class="strong">
THE SECTIONS BELOW TITLED "BINDING ARBITRATION," AND "CLASS ACTION WAIVER" CONTAIN A BINDING ARBITRATION AGREEMENT AND CLASS ACTION WAIVER. THEY AFFECT YOUR LEGAL RIGHTS. PLEASE READ THEM.
THE SECTIONS BELOW TITLED "BINDING ARBITRATION' AND "CLASS ACTION WAIVER" CONTAIN A BINDING ARBITRATION AGREEMENT AND CLASS ACTION WAIVER. THEY AFFECT YOUR LEGAL RIGHTS. PLEASE READ THEM CAREFULLY.
</p>
<h2>Changes to the Terms of Service</h2>
<p>These Terms of Service are effective as of the last updated date stated at the top of this page. We may change these Terms of Service from time to time with or without notice to you. By accessing the Service after we make any such changes to this Terms of Service, you are deemed to have accepted such changes. Please be aware that, to the extent permitted by applicable law, our use of the information collected is governed by the Terms of Service in effect at the time we collect the information. Please refer back to this Terms of Service on a regular basis.</p>
<p>Our Service allows you to upload, store, send, download, or receive content, including but not limited to information, text, graphics, artwork, or other material ("Content"). You retain ownership of any intellectual property rights that you have in your Content. You hereby grant HabitRPG a worldwide, perpetual, irrevocable, sublicenseable, transferable, assignable, non-exclusive, and royalty-free right and license to use, reproduce, distribute, adapt, modify, translate, create derivative works of, publicly perform, publicly display, digitally perform, make, have made, sell, offer for sale, and import your Content, including all intellectual property rights therein. You represent, warrant, and agree that your Content does not and will not violate any third-party intellectual property, privacy, or other rights, and that you have all right, title and interest in and to your Content required to grant us the license above. We reserve the right at all times, but have no obligation, to delete or refuse to use or distribute any Content on or through the Service, including your Content.</p>
<h2>Ideas and Suggestions/Requests</h2>
<p>HabitRPG appreciates receiving your ideas, comments, suggestions and requests regarding the Service ("Unsolicited Ideas"). By submitting your Unsolicited Ideas (in any form or medium), you are transferring all your right, title and interest therein exclusively to HabitRPG. As the owner of Unsolicited Ideas, we have unrestricted rights to use, disclose and process the Unsolicited Ideas for any purpose whatsoever without any compensation to you. You also give up any claim that any use, disclosure and processing by us or our licensees of your Unsolicited Ideas violates any of your rights, including moral rights, privacy rights, rights to publicity, proprietary or other rights, and rights to credit for the material or ideas set for therein.</p>
<h2>Software in Our Service</h2>
<p>When the Service requires or includes downloadable software ("Software"), it may may update automatically on your device once a new version or features become available to you. Some platforms may let you adjust your automatic update settings.</p>
<p>HabitRPG hereby grants you a personal, worldwide, royalty-free, non-assignable and non-exclusive license to use the Software provided by HabitRPG as part of the Service. You may not copy, modify, distribute, sell, or lease any part of our Service or included Software you are explicitly allowed to do so by the GPL-3.0 license, or you have our written permission for those parts not covered by the open source license.</p>
<p>Third party applications may use one of the permitted logos and signifiers in order to represent their applicability to the Service, but may not claim formal association with and/or impersonate HabitRPG or our staff without prior written consent. Third Party applications, the companies that own or provide them, and their employees and agents, are not authorized to make any promises or representations on our behalf, or change the terms of this Agreement.</p>
<p>We allow for personal, non-commercial uses like fanart under Commercial Commons License CC-NC-SA 3.0 terms.</p>
<p>Outside the above explicitly allowed use cases, you may not use our trademarks, service marks, trade names, logos, domain names, taglines, or trade dress without a signed written contract with us granting you a license to do so.</p>
<h2>Modifying and Termination of Service</h2>
<p>HabitRPG reserves the right, in its sole discretion, to add, modify, or remove functionalities or features from the Service, and improve, change and/or update the Service. We may also suspend or terminate the Service at any time, with or without notice to you.</p>
<p>You can choose to stop using our Service at any time. We may suspend or cease providing the Service to you at any time, including if we determine in our sole discretion, that:</p>
<p>
These Terms of Service are effective as of the last updated date stated at the top of this page. We may change these Terms of Service from time to time with or without notice to you. By accessing the Service after we make any such changes to this Terms of Service, you are deemed to have accepted such changes. Please be aware that, to the extent permitted by applicable law, our use of the information collected is governed by the Terms of Service in effect at the time we collect the information. Please refer back to this Terms of Service on a regular basis.
</p>
<h2>Intellectual Property</h2>
<p>
Our Services allow you to upload, store, send, download, or receive content, including but not limited to information, text, graphics, artwork, or other material ("Content"). You retain ownership of any intellectual property rights that you had in your Content prior to using it in connection with the Service. You hereby grant HabitRPG a worldwide, perpetual, irrevocable, sublicenseable, transferable, assignable, non-exclusive, and royalty-free right and license to use, reproduce, distribute, adapt, modify, translate, create derivative works of, publicly perform, publicly display, digitally perform, make, have made, sell, offer for sale, and import your Content, including all intellectual property rights therein. You represent, warrant, and agree that your Content does not and will not violate any third-party intellectual property, privacy, or other rights, and that you have all right, title and interest in and to your Content required to grant us the license above. We reserve the right at all times, but have no obligation, to delete or refuse to use or distribute any Content on or through the Service, including your Content.
</p>
<p>
HabitRPG appreciates receiving your ideas, comments, suggestions and requests regarding the Service ("Unsolicited Ideas"). By submitting your Unsolicited Ideas (in any form or medium), you are transferring all your right, title and interest therein exclusively to HabitRPG. As the owner of Unsolicited Ideas, we have unrestricted rights to use, disclose and process the Unsolicited Ideas for any purpose whatsoever without any compensation to you. You also give up any claim that any use, disclosure, and/or processing by us or our licensees of your Unsolicited Ideas violates any of your rights, including moral rights, privacy rights, rights to publicity, proprietary or other rights, and rights to credit for the material or ideas set forth therein.
</p>
<p>
<strong>DMCA Notice</strong>. We respect the intellectual property rights of third parties. We respond to notices of alleged copyright infringement according to the Digital Millennium Copyright Act (“DMCA”) at 17 U.S.C. § 512 et seq. Regardless of whether or not the we believe that we are liable for any copyright infringement for which we are provided notice, our response may include removing or disabling access to material claimed to be the subject of infringing activity and/or terminating an individuals access to the Service, in our sole discretion and operating within the parameters of the DMCA.
</p>
<p>
If you believe that your work has been copied in a manner that constitutes copyright infringement, please contact us at <a href="mailto:admin@habitica.com">admin@habitica.com</a> with the following information:
</p>
<ul>
<li>Your name, address, telephone number, and email address;</li>
<li>A description of the copyrighted work that you claim has been infringed;</li>
<li>A description of the allegedly infringing material and where it is located on the Service;</li>
<li>A statement by you that you have a good faith belief that the disputed use is not authorized by the copyright owner, its agents, or the law;</li>
<li>A statement by you under penalty of perjury that your notice is accurate, that you are the copyright owner, or that the copyright holder has authorized you to act on its behalf; and</li>
<li>Your written or electronic signature attesting to the above.</li>
</ul>
<p>
If your content has been removed from the Service in response to our receipt of a DMCA Notification as outlined above, and you believe the removal was inappropriate, you may submit a DMCA Counter-Notification by contacting us using the information above with the following information:
</p>
<ul>
<li>Your name, address, telephone number, and email address;</li>
<li>A statement that you consent to the jurisdiction of Federal District Court for the judicial district in which your address is located, or if your address is outside of the United States, for any judicial district for which jurisdiction for us would be appropriate, and that you will accept service of process from the person who submitted the DMCA notification or an agent of such person;</li>
<li>A description of the material that has been removed or to which access has been disabled and the location at which the material appeared before it was removed or access to it was disabled;</li>
<li>A statement by you under penalty of perjury that you have a good faith belief that the material was removed or disabled as a result of mistake or misidentification of the material to be removed or disabled; and</li>
<li>Your written or electronic signature attesting to the above.</li>
</ul>
<h2>Software in our Service</h2>
<p>
When the Service requires or includes downloadable software ("Software"), it may update automatically on your device once a new version or features become available to you. Some platforms may let you adjust your automatic update settings.
</p>
<p>
HabitRPG hereby grants you a non-commercial, worldwide, royalty-free, non-assignable and non-exclusive license to use the Software provided by HabitRPG as part of the Service. You may not copy, modify, distribute, sell, or lease any part of our Service or included Software unless you are explicitly allowed to do so by the GPL-3.0 license, or you have our written permission to do so with respect to those parts not covered by the open-source license.
</p>
<p>
Third party applications may use one of the permitted logos and signifiers in order to represent their compatibility with the Service, but may not claim formal association with and/or impersonate HabitRPG or our staff without prior written consent. Third Party applications, the companies that own or provide them, and their employees and agents, are not authorized to make any promises or representations on our behalf, or change the terms of this Agreement.
</p>
<p>
We allow for personal, non-commercial uses like fanart under Commercial Commons License CC-NC-SA 3.0 terms.
</p>
<p>
Outside the above explicitly allowed use cases, you may not use our trademarks, service marks, trade names, logos, domain names, taglines, or trade dress without a signed written contract with us granting you a license to do so.
</p>
<h2>Modification and Termination of Service</h2>
<p>
HabitRPG reserves the right, in its sole discretion, to add, modify, or remove functionalities or features from the Service, and improve, change and/or update the Service. We may also suspend or terminate the Service at any time, with or without notice to you.
</p>
<p>
You can choose to stop using our Service at any time. We may suspend or cease providing the Service to you at any time, including if we determine in our sole discretion, that:
</p>
<ul>
<li>You have violated any part of this Agreement, the Privacy Policy, or the Community Guidelines;</li>
<li>We have stopped offering the Service in your region; or</li>
<li>Doing so would be in the best interests of our community, the Service, or the rights of a third party.</li>
</ul>
<p>If your account is terminated, you will no longer have access to it, including to any of the associated data or Content. You will not be entitled to any refunds and we will have no liability to you. We also reserve the right to terminate any other accounts you may have created, as well as access to any other HabitRPG Service (also without refunds or liability to you).</p>
<p>You understand and agree that using the Service comes with the risk that your account may be terminated or suspended at our discretion and at any time. Please keep this risk in mind and comport yourself appropriately.</p>
<p>
If your account is terminated, you will no longer have access to it, including to any of the associated data or Content. We also reserve the right to terminate any other accounts you may have created, as well as access to any other HabitRPG Service.
</p>
<p>
You understand and agree that using the Service comes with the risk that your account may be terminated or suspended at our discretion and at any time. Please keep this risk in mind and comport yourself appropriately.
</p>
<h2>API</h2>
<p>You may access your Service data via the Application Program Interface ("API"). By using API you are automatically bound by the Agreement.</p>
<p>
You may access your Service data via the Application Program Interface ("API"). By using API you are automatically bound by the Agreement.
</p>
<h2>Links to Third-Party Sites</h2>
<p>
The Service may contain links to other web sites (“Linked Sites”). The Linked Sites are not under our control and we are not responsible for the contents of any Linked Site, including, without limitation, any link contained in a Linked Site, or any changes or updates to a Linked Site.
</p>
<p>
By providing these links, we do not endorse, sponsor, or recommend such sites or the materials disseminated by or services provided by them, and are not responsible for the materials, services, or other situations at or related to or from any other site. We are not responsible for webcasting or any other form of transmission received from any Linked Site. We are providing these links to you only as a convenience, and the inclusion of any link does not imply endorsement by us of the Linked Site or any association with its operators. We reserve the right to disable links from any third-party sites to the Service.
</p>
<p>
Please exercise discretion while using the Service. You should be aware that when you are using the Service, you could be directed to other sites that are beyond our control. There are links to other sites from the Service pages that take you outside of the Service. These other sites may send their own cookies to users, collect data, solicit personal information, or contain information that you may find inappropriate or offensive.
</p>
<h2>Links to Third-Party Integrations</h2>
<p>
We may provide links to third-party integrations. Third-party integrations are websites or platforms that synchronize with our Service to provide you with additional functionality, tools, or services, such as delivering content based on your location.
</p>
<p>
You acknowledge and agree that we are not responsible for the availability of such sites or resources and do not endorse and are not responsible or liable for any content, advertising, goods, services, or other materials on, available through, or provided by such sites or resources.
</p>
<p>
We are not responsible for the privacy or other practices of such sites and cannot guarantee the security of any personal information that you provide to such sites or that such sites collect. We encourage you to review the privacy policies and terms and conditions on those linked sites.
</p>
<h2>Using Our Service</h2>
<p>You must follow any policies made available to you within the Service, including but not limited to the Terms of Service, Privacy Policy, and Community Guidelines. You may only use our Service as permitted by law. HabitRPG may investigate and/or suspend or terminate our Service to you at any time if we find your use of our Service violates the Terms and/or any policies.</p>
<p>Using our Service does not grant you ownership of any intellectual property rights in our Service or the content you may have access to. You may not use any copyrighted content in our Service unless you obtain permission from the content owner and/or are otherwise permitted by law. The Terms do not grant you the right to use any branding or logos used in our Service. Our Service may display some logos, trademarks, or branding materials that are not the property of HabitRPG. Such content is the sole responsibility of the entity that makes it available.</p>
<p>You may not abuse and/or misuse our Service, including but not limited to the following actions:</p>
<p>
You must follow any policies made available to you within the Service, including but not limited to the Terms of Service, Privacy Policy, and Community Guidelines. You may only use our Service as permitted by law. HabitRPG may investigate and/or suspend or terminate our Service to you at any time if we find your use of our Service violates the Agreement, applicable law, and/or any of our policies.
</p>
<p>
Using our Service does not grant you ownership of any intellectual property rights in our Service or the content you may have access to. You may not use any copyrighted content in our Service unless you obtain permission from the content owner and/or are otherwise permitted by law. The Agreement does not grant you the right to use any branding or logos used in our Service. Our Service may display some logos, trademarks, or branding materials that are not the property of HabitRPG. Such content is the sole property of the entity that makes it available.
</p>
<p>
You may not abuse and/or misuse our Service, including but not limited to the following actions:
</p>
<ul>
<li>Using the Service for any unlawful purposes or activities;</li>
<li>Uploading any content to the Service in violation of any applicable law, including but not limited to intellectual property laws and publicity laws;</li>
<li>Uploading any content to the Service in violation of any applicable law, including but not limited to intellectual property laws, privacy laws, and publicity laws;</li>
<li>Sending unsolicited promotions or advertisements;</li>
<li>Accessing or tampering with the Service's server systems;</li>
<li>Interfering with or disrupting the access of any user, host, or network;</li>
@@ -53,53 +134,113 @@
<li>Spamming chat, whether for personal or commercial purposes, by disrupting the flow of conversation with repeated postings;</li>
<li>Impersonating any person, business, or entity, including an employee of HabitRPG, or member of the Habitica moderation team, or communicating in any way that makes it appear that the communication originates from Habitica staff or HabitRPG;</li>
<li>Transmitting or communicating any content which, in the sole and exclusive discretion of HabitRPG, is deemed offensive, including language that is unlawful, harmful, threatening, abusive, harassing, defamatory, vulgar, obscene, sexually explicit, or racially, ethically, or otherwise objectionable,</li>
<li>Participating in any action which, in the sole and exclusive judgment of HabitRPG, defrauds any other user of the Game, including by scamming or social engineering; or</li>
<li>Participating in any action which, in the sole and exclusive judgment of HabitRPG, defrauds any other user of the Service, including by scamming or social engineering; or</li>
<li>Inducing or encouraging others to violate the Community Guidelines or the Agreement.</li>
</ul>
<p>HabitRPG, in its sole discretion, will determine what constitutes abuse and/or misuse of our Service.</p>
<p>
HabitRPG, in its sole discretion, will determine what constitutes abuse and/or misuse of our Service.
</p>
<h2>Premium Service and Payments</h2>
<p>You may choose our free Service or paid Service ("Premium") depending on your needs. We do not guarantee when, if ever, Premium features will be available in the free Service. You may upgrade from free Service to Premium at any time by any of the following methods:</p>
<p>
You may choose our free Service or paid Service ("Premium") depending on your needs. We do not guarantee when, if ever, Premium features will be available in the free Service. You may upgrade from free Service to Premium at any time by any of the following methods:
</p>
<ul>
<li>Web: Selecting the user icon in the top right corner and selecting "Subscription" from the dropdown menu,</li>
<li>Web: Clicking the green gem icon in the navigation bar at the top of the screen and following instructions to Subscribe or Buy Gems,</li>
<li>Android: Tap the menu icon in the top left corner of the main screen and select "Gems & Subscription". Follow the instructions to make a purchase.</li>
<li>iOS: Tap the menu icon in the lower right and select "Gems & Subscriptions". Follow the instructions to make a purchase.</li>
<li>Android: Tap the menu icon in the top left corner of the main screen and select “Purchase Gems” or “Subscription. Follow the instructions to make a purchase.</li>
<li>iOS: Tap the menu icon in the lower right and select “Purchase Gems” or “Subscription. Follow the instructions to make a purchase.</li>
</ul>
<p>You will be charged the amount shown on Pricing before you can access Premium Service. All prices shown on Pricing are inclusive of any applicable sales taxes, levies, value-added taxes, or duties imposed by taxing authorities, and you are responsible for payment of all such taxes, levies, or duties. We may revise the Pricing at any time and may, from time to time, modify, amend, or supplement our fees and fee-billing methods. Such changes shall be effective upon posting on the Pricing page or elsewhere in the Service. If there is a dispute regarding payment of fees to us, we reserve the right to terminate or suspend your account at our sole discretion.</p>
<p>BY PURCHASING PREMIUM YOU EXPRESSLY UNDERSTAND AND AGREE TO OUR REFUND POLICY:</p>
<p>WITHIN THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE AS SHOWN ON YOUR PAYMENT BILL, YOU CAN REQUEST A FULL REFUND BY CONTACTING US AT ADMIN@HABITICA.COM. AFTER THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE, ANY PAYMENT REFUND IS SOLELY SUBJECT TO OUR DISCRETION. THE REFUND SHALL BE YOUR SOLE AND EXCLUSIVE REMEDY.</p>
<p>
You will be charged the amount shown on Pricing before you can access Premium Service. All prices shown on Pricing are inclusive of any applicable sales taxes, levies, value-added taxes, or duties imposed by taxing authorities, and you are responsible for payment of all such taxes, levies, or duties. We may revise the Pricing at any time and may, from time to time, modify, amend, or supplement our fees and fee-billing methods. Such changes shall be effective upon posting on the Pricing page or elsewhere in the Service. If there is a dispute regarding payment of fees to us, we reserve the right to terminate or suspend your account at our sole discretion.
</p>
<p>
BY PURCHASING PREMIUM YOU EXPRESSLY UNDERSTAND AND AGREE TO OUR REFUND POLICY:
</p>
<p>
YOU CAN REQUEST A REFUND OF YOUR MOST RECENT PAYMENT TO US BY CONTACTING US AT <a href='mailto:admin@habitica.com'>ADMIN@HABITICA.COM</a>. THE AMOUNT OF YOUR REFUND, IF ANY, WILL BE BASED ON (1) THE AMOUNT OF YOUR PURCHASED BUT UNUSED SUBSCRIPTION BENEFITS AND (2) THE TERMS IMPOSED ON US BY OUR PAYMENT PROCESSING VENDORS (E.G., WITH RESPECT TO THE DURATION OF THE REFUND PERIOD).
</p>
<p>
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
href="https://reportaproblem.apple.com"
target="_blank"
>https://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUND FOR APP STORE PURCHASES MADE BY CUSTOMERS.
>https://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUNDS FOR APP STORE PURCHASES MADE BY CUSTOMERS.
</p>
<h2>Warranty Disclaimer</h2>
<p>THE SERVICE AND ANY CONTENT MADE AVAILABLE BY HABITRPG VIA THE SERVICE IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT ANY WARRANTIES OF ANY KIND, INCLUDING, WITHOUT LIMITATION, THAT THE SERVICE OR CONTENT WILL OPERATE ERROR-FREE OR THAT THE SERVICE OR CONTENT OR ITS SERVERS ARE FREE OF COMPUTER VIRUSES OR SIMILAR CONTAMINATION OR DESTRUCTIVE FEATURES.</p>
<p>WE DISCLAIM ALL WARRANTIES, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE, MERCHANTABILITY, NON-INFRINGEMENT OF THIRD PARTIES' RIGHTS, AND FITNESS FOR PARTICULAR PURPOSE AND ANY WARRANTIES ARISING FROM A COURSE OF DEALING, COURSE OF PERFORMANCE, OR USAGE OF TRADE.</p>
<p>WE RESERVE THE RIGHT TO MAKE CHANGES, CORRECTIONS, AND/OR IMPROVEMENTS TO THE SERVICE OR THE CONTENT AT ANY TIME WITHOUT NOTICE.</p>
<p>IN CONNECTION WITH ANY WARRANTY, CONTRACT, OR COMMON LAW TORT CLAIMS: (I) WE AND OUR LICENSORS SHALL NOT BE LIABLE FOR ANY INCIDENTAL OR CONSEQUENTIAL DAMAGES, LOST PROFITS, OR DAMAGES RESULTING FROM LOST DATA OR BUSINESS INTERRUPTION RESULTING FROM THE USE OR INABILITY TO ACCESS AND USE THE SERVICE OR CONTENT POSTED BY HABITPRG, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES; AND (II) ANY DIRECT DAMAGES THAT YOU MAY SUFFER AS A RESULT OF YOUR USE OF THE PLATFORM SHALL BE LIMITED TO THE GREATER OF (I) MONIES YOU HAVE PAID US IN CONNECTION WITH YOUR USE OF THE PLATFORM DURING THE TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENTS GIVING RISE TO THE CLAIM, OR (II) ONE HUNDRED US DOLLARS ($100).</p>
<p>SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES. THEREFORE, SOME OF THE ABOVE LIMITATIONS ON WARRANTIES IN THIS SECTION MAY NOT APPLY TO YOU. NOTHING IN THIS AGREEMENT SHALL AFFECT ANY NON-WAIVABLE STATUTORY RIGHTS THAT APPLY TO YOU.</p>
<h2>Warranty Disclaimer and Limitation on Liability</h2>
<p>
THE SERVICE AND ANY CONTENT MADE AVAILABLE BY HABITRPG VIA THE SERVICE IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT ANY WARRANTIES OF ANY KIND, INCLUDING, WITHOUT LIMITATION, THAT THE SERVICE OR CONTENT WILL OPERATE ERROR-FREE OR THAT THE SERVICE OR CONTENT OR ITS SERVERS ARE FREE OF COMPUTER VIRUSES OR SIMILAR CONTAMINATION OR DESTRUCTIVE FEATURES.
</p>
<p>
WE DISCLAIM ALL WARRANTIES, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE, MERCHANTABILITY, NON-INFRINGEMENT OF THIRD PARTIES' RIGHTS, AND FITNESS FOR PARTICULAR PURPOSE AND ANY WARRANTIES ARISING FROM A COURSE OF DEALING, COURSE OF PERFORMANCE, OR USAGE OF TRADE.
</p>
<p>
WE RESERVE THE RIGHT TO MAKE CHANGES, CORRECTIONS, AND/OR IMPROVEMENTS TO THE SERVICE OR THE CONTENT AT ANY TIME WITHOUT NOTICE. IN CONNECTION WITH ANY WARRANTY, CONTRACT, OR COMMON LAW TORT CLAIMS: (I) WE AND OUR LICENSORS SHALL NOT BE LIABLE FOR ANY INCIDENTAL OR CONSEQUENTIAL DAMAGES, LOST PROFITS, OR DAMAGES RESULTING FROM LOST DATA OR BUSINESS INTERRUPTION RESULTING FROM THE USE OR INABILITY TO ACCESS AND USE THE SERVICE OR CONTENT POSTED BY HABITRPG, EVEN IF WE HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES; AND (II) ANY DIRECT DAMAGES THAT YOU MAY SUFFER AS A RESULT OF YOUR USE OF THE PLATFORM SHALL BE LIMITED TO THE GREATER OF (I) MONIES YOU HAVE PAID US IN CONNECTION WITH YOUR USE OF THE PLATFORM DURING THE TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENTS GIVING RISE TO THE CLAIM, OR (II) ONE HUNDRED US DOLLARS ($100).
</p>
<p>
SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES. THEREFORE, SOME OF THE ABOVE LIMITATIONS ON WARRANTIES IN THIS SECTION MAY NOT APPLY TO YOU. NOTHING IN THIS AGREEMENT SHALL AFFECT ANY NON-WAIVABLE STATUTORY RIGHTS THAT APPLY TO YOU.
</p>
<h2>Indemnification</h2>
<p>You agree to defend, indemnify, and hold us and our officers, directors, employees, agents, successors, licensees, licensors, and assigns harmless from and against any damages, liabilities, losses, expenses, claims, actions, and/or demands, including, without limitation, reasonable legal and accounting fees, arising or resulting from: (i) your breach of any of your representations, warranties or other obligations under this Agreement; (ii) your use or misuse of the Service or content posted or made available by HabitRPG; and/or (iii) your violation of any third-party rights, including without limitation any copyright, trademark, property, publicity, or privacy right. We shall provide notice to you of any such claim, suit, or proceeding and shall assist you, at your expense, in defending any such claim, suit, or proceeding. We reserve the right to assume the exclusive defense and control (at your expense) of any matter that is subject to indemnification under this section. In such case, you agree to cooperate with any reasonable requests assisting our defense of such matter.</p>
<p>
You agree to defend, indemnify, and hold us and our officers, directors, employees, agents, successors, licensees, licensors, and assigns harmless from and against any damages, liabilities, losses, expenses, claims, actions, and/or demands, including, without limitation, reasonable legal and accounting fees, arising or resulting from: (i) your breach of any of your representations, warranties or other obligations under this Agreement; (ii) your use or misuse of the Service or content posted or made available by HabitRPG; and/or (iii) your violation of any third-party rights in connection with your use of the Service, including without limitation any copyright, trademark, property, publicity, or privacy right. We shall provide notice to you of any such claim, suit, or proceeding and shall assist you, at your expense, in defending any such claim, suit, or proceeding. We reserve the right to participate in the defense (at our expense) of any matter that is subject to indemnification under this section. In such case, you agree to cooperate with any reasonable requests assisting our defense of such matter.
</p>
<h2>Electronic Communications Privacy Act Notice (18 U.S.C. 2701-2711)</h2>
<p>
We make no guaranty of confidentiality or privacy with respect to any communication or information transmitted via the Service. We will not be liable for the privacy of the information, e-mail addresses, registration, and identification information, disk space, communications, confidential or trade-secret information, or any other content transmitted over networks accessed by the Service, or otherwise connected with your use of the Service.
</p>
<h2>Compliance with Applicable Laws</h2>
<p>The Service is based in the United States. We make no claims concerning whether the Service or posted content may be downloaded, viewed, or be appropriate for use outside of the United States. If you access the Service or such content from outside of the United States, you do so at your own risk. Whether inside or outside of the United States, you are solely responsible for ensuring compliance with the laws of your specific jurisdiction.</p>
<p>
The Service is based in the United States. We make no claims concerning whether the Service or posted content may be downloaded, viewed, or be appropriate for use outside of the United States. If you access the Service or such content from outside of the United States, you do so at your own risk. Whether inside or outside of the United States, you are solely responsible for ensuring compliance with the laws of your specific jurisdiction.
</p>
<h2>Binding Arbitration</h2>
<p>
In the event of a dispute arising under or relating to this Agreement or the Service (each, a "<u>Dispute</u>"), such dispute will be finally and exclusively resolved by binding arbitration governed by the Federal Arbitration Act ("<u>FAA</u>"). Any election to arbitrate, at any time, shall be final and binding on the other party. NEITHER PARTY SHALL HAVE THE RIGHT TO LITIGATE SUCH CLAIM IN COURT OR TO HAVE A JURY TRIAL, EXCEPT EITHER PARTY MAY BRING ITS CLAIM IN ITS LOCAL SMALL CLAIMS COURT, IF PERMITTED BY THAT SMALL CLAIMS COURT RULES AND IF WITHIN SUCH COURT'S JURISDICTION. ARBITRATION IS DIFFERENT FROM COURT, AND DISCOVERY AND APPEAL RIGHTS MAY ALSO BE LIMITED IN ARBITRATION. 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
In the event of a dispute arising under or relating to this Agreement or the Service (each, a "Dispute"), such dispute will be finally and exclusively resolved by binding arbitration governed by the Federal Arbitration Act ("FAA"). Any election to arbitrate, at any time, shall be final and binding on the other party. NEITHER PARTY SHALL HAVE THE RIGHT TO LITIGATE SUCH CLAIM IN COURT OR TO HAVE A JURY TRIAL, EXCEPT EITHER PARTY MAY BRING ITS CLAIM IN ITS LOCAL SMALL CLAIMS COURT, IF PERMITTED BY THAT SMALL CLAIMS COURT RULES AND IF WITHIN SUCH COURT'S JURISDICTION. ARBITRATION IS DIFFERENT FROM COURT, AND DISCOVERY AND APPEAL RIGHTS MAY ALSO BE LIMITED IN ARBITRATION.
</p>
<p>
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"
>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>ANY CLAIMS, ACTIONS OR PROCEEDINGS BY YOU MUST BE COMMENCED WITHIN ONE YEAR AFTER THE EVENT THAT GAVE RISE TO YOUR CLAIM OCCURS. ALL OTHER CLAIMS YOU MAY HAVE ARE PERMANENTLY BARRED.</p>
<p>
ANY CLAIMS, ACTIONS OR PROCEEDINGS BY YOU MUST BE COMMENCED WITHIN ONE YEAR AFTER THE EVENT THAT GAVE RISE TO YOUR CLAIM OCCURS. ALL OTHER CLAIMS YOU MAY HAVE ARE PERMANENTLY BARRED.
</p>
<h2>Class Action Waiver</h2>
<p>You agree that any arbitration or proceeding shall be limited to the Dispute between us and you individually. To the full extent permitted by law, (i) no arbitration or proceeding shall be joined with any other; (ii) there is no right or authority for any Dispute to be arbitrated or resolved on a class action-basis or to utilize class action procedures; and (iii) there is no right or authority for any Dispute to be brought in a purported representative capacity on behalf of the general public or any other persons. YOU AGREE THAT YOU MAY BRING CLAIMS AGAINST US ONLY IN YOUR INDIVIDUAL CAPACITY AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING.</p>
<p>
You agree that any arbitration or proceeding shall be limited to the Dispute between us and you individually. To the full extent permitted by law, (i) no arbitration or proceeding shall be joined with any other; (ii) there is no right or authority for any Dispute to be arbitrated or resolved on a class action-basis or to utilize class action procedures; and (iii) there is no right or authority for any Dispute to be brought in a purported representative capacity on behalf of the general public or any other persons. YOU AGREE THAT YOU MAY BRING CLAIMS AGAINST US ONLY IN YOUR INDIVIDUAL CAPACITY AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING.
</p>
<h2>Jury Trial Waiver</h2>
<p>
IF FOR ANY REASON A DISPUTE OR CLAIM MAY PROCEED IN COURT RATHER THAN IN ARBITRATION, EACH PARTY TO THIS AGREEMENT IRREVOCABLY WAIVES, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, ANY RIGHT IT MAY HAVE TO A TRIAL BY JURY IN ANY LEGAL PROCEEDING DIRECTLY OR INDIRECTLY ARISING OUT OF OR RELATING TO THESE TERMS OR THE SERVICE (WHETHER BASED ON CONTRACT, TORT, OR ANY OTHER THEORY), UNLESS SUCH WAIVERS ARE UNENFORCEABLE.
</p>
<h2>Equitable Relief</h2>
<p>You acknowledge and agree that in the event of a breach or threatened violation of our intellectual property rights and confidential and proprietary information by you, we will suffer irreparable harm and will therefore be entitled to injunctive relief to enforce this Agreement. We may, without waiving any other remedies under this Agreement, seek from any court having jurisdiction any interim, equitable, provisional, or injunctive relief that is necessary to protect our rights and property pending the outcome of the arbitration referenced above.</p>
<p>
You acknowledge and agree that in the event of a breach or threatened violation by you of our intellectual property rights and/or rights related to our confidential and proprietary information, we will suffer irreparable harm and will therefore be entitled to injunctive relief to enforce this Agreement. We may, without waiving any other remedies under this Agreement, seek from any court having jurisdiction any interim, equitable, provisional, or injunctive relief that is necessary to protect our rights and property pending the outcome of the arbitration referenced above.
</p>
<h2>Contact Us</h2>
<p>If you have any questions about the Agreement, or want to report a violation (including DMCA take-down notices relating to infringement of copyright) please contact us at <a href="mailto:admin@habitica.com">admin@habitica.com</a>.</p>
<p>
If you have any questions about the Agreement, or want to report a violation, please contact us at <a href="mailto:admin@habitica.com">admin@habitica.com</a>.
</p>
<h2>Miscellaneous</h2>
<p>This Agreement and any action related thereto will be governed by the laws of the State of California without regard to its conflict of laws provisions. Our failure to act on or enforce any provision of this Agreement shall not be construed as a waiver of that provision or any other provision therein. No waiver shall be effective against us unless made in writing, and no such waiver shall be construed as a waiver in any other or subsequent instance. Except as expressly agreed by us and you in writing, this Agreement constitutes the entire agreement between you and us with respect to the subject matter, and supersedes all previous or contemporaneous agreements, whether written or oral, between the parties with respect to the subject matter. The section headings are provided merely for convenience and shall not be given any legal import. This Agreement will inure to the benefit of our successors, assigns, licensees, and sublicensees.</p>
<ul>
<li>This Agreement and any action related thereto will be governed by the laws of the State of California without regard to its conflict of laws provisions.</li>
<li>Our failure to act on or enforce any provision of this Agreement shall not be construed as a waiver of that provision or any other provision therein. No waiver shall be effective against us unless made in writing, and no such waiver shall be construed as a waiver in any other or subsequent instance.</li>
<li>Except as expressly agreed by us and you in writing, this Agreement constitutes the entire agreement between you and us with respect to the subject matter, and supersedes all previous or contemporaneous agreements, whether written or oral, between the parties with respect to the subject matter.</li>
<li>The section headings are provided merely for convenience and shall not be given any legal import. This Agreement will inure to the benefit of our successors, assigns, licensees, and sublicensees.</li>
<li>You agree that no joint venture, partnership, employment, or agency relationship exists between you and us as a result of the Agreement or your use of the Service.</li>
<li>Our performance under the Agreement is subject to existing laws and legal process, and nothing contained in the Agreement is in derogation of our right to comply with governmental, court, and law enforcement requests, or requirements relating to your use of the Service or information provided to or gathered by us with respect to such use.</li>
<li>If any part of the Agreement is determined to be invalid or unenforceable pursuant to applicable law, including, without limitation, the warranty disclaimers and liability limitations set forth above, then the invalid or unenforceable provision will be deemed superseded by a valid, enforceable provision that most closely matches the intent of the original provision and the remainder of the Agreement shall continue in effect.</li>
<li>A printed version of the Agreement and of any notice given in electronic form shall be admissible in judicial or administrative proceedings based upon or relating to the Agreement to the same extent and subject to the same conditions as other business documents and records originally generated and maintained in printed form.</li>
</ul>
</div>
<!-- eslint-enable max-len -->
</template>

View File

@@ -86,8 +86,8 @@
v-if="taskList.length > 0"
ref="tasksList"
class="sortable-tasks"
:options="{disabled: activeFilter.label === 'scheduled' || !canBeDragged(),
scrollSensitivity: 64}"
:disabled="activeFilter.label === 'scheduled' || !canBeDragged()"
scrollSensitivity="64"
:delay-on-touch-only="true"
:delay="100"
@update="taskSorted"

View File

@@ -21,11 +21,9 @@
>
<draggable
v-model="checklist"
:options="{
handle: '.grippy',
filter: '.task-dropdown',
disabled: disabled,
}"
handle=".grippy"
filter=".task-dropdown"
:disabled="disabled"
@update="updateChecklist"
>
<div

View File

@@ -26,12 +26,17 @@
:checked="isChecked"
:value="value"
@change="handleChange"
:disabled="disabled"
>
<label
class="toggle-switch-label"
:for="toggleId"
:class="{ disabled }"
>
<span class="toggle-switch-inner"></span>
<span
class="toggle-switch-inner"
>
</span>
<span
class="toggle-switch-switch"
tabindex="0"
@@ -111,7 +116,7 @@
.toggle-switch-inner:before {
content: "";
padding-left: 10px;
background-color: $green-50;
background-color: $green-10;
}
.toggle-switch-inner:after {
@@ -121,6 +126,14 @@
text-align: right;
}
.disabled {
cursor: auto;
.toggle-switch-inner:before, .toggle-switch-inner:after {
opacity: 0.5;
}
}
.toggle-switch-switch {
box-shadow: 0 1px 3px 0 rgba($black, 0.12), 0 1px 2px 0 rgba($black, 0.24);
display: block;
@@ -181,6 +194,10 @@ export default {
hoverText: {
type: String,
},
disabled: {
type: Boolean,
default: false,
},
},
data () {
return {

View File

@@ -2,26 +2,28 @@ import forEach from 'lodash/forEach';
import isEqual from 'lodash/isEqual';
import keys from 'lodash/keys';
import pick from 'lodash/pick';
import includes from 'lodash/includes';
import amplitude from 'amplitude-js';
import { gtag, install } from 'ga-gtag';
import Vue from 'vue';
import getStore from '@/store';
const IS_PRODUCTION = import.meta.env.NODE_ENV === 'production'; // eslint-disable-line no-process-env
const AMPLITUDE_KEY = import.meta.env.AMPLITUDE_KEY; // eslint-disable-line no-process-env
const GA_ID = import.meta.env.GA_ID; // eslint-disable-line no-process-env
const AMPLITUDE_KEY = import.meta.env.AMPLITUDE_KEY;
const DEBUG_ENABLED = import.meta.env.DEBUG_ENABLED === 'true';
const GA_ID = import.meta.env.GA_ID;
const IS_PRODUCTION = import.meta.env.NODE_ENV === 'production';
const REQUIRED_FIELDS = ['eventCategory', 'eventAction'];
const REQUIRED_FIELDS = ['hitType', 'eventCategory', 'eventAction'];
const ALLOWED_HIT_TYPES = [
'pageview',
'screenview',
'event',
'transaction',
'item',
'social',
'exception',
'timing',
];
let analyticsLoading = false;
let analyticsReady = false;
function _getConsentedUser () {
const store = getStore();
const user = store.state.user.data;
if (!user?.preferences?.analyticsConsent || navigator.globalPrivacyControl) {
return false;
}
return user;
}
function _doesNotHaveRequiredFields (properties) {
if (!isEqual(keys(pick(properties, REQUIRED_FIELDS)), REQUIRED_FIELDS)) {
@@ -34,17 +36,6 @@ function _doesNotHaveRequiredFields (properties) {
return false;
}
function _doesNotHaveAllowedHitType (properties) {
if (!includes(ALLOWED_HIT_TYPES, properties.hitType)) {
// @TODO: Log with Winston?
// console.log('Hit type of Analytics event must be one
// of the following: ' + JSON.stringify(ALLOWED_HIT_TYPES));
return true;
}
return false;
}
function _gatherUserStats (properties) {
const store = getStore();
const user = store.state.user.data;
@@ -75,24 +66,31 @@ function _gatherUserStats (properties) {
if (user.purchased.plan.planId) properties.subscription = user.purchased.plan.planId;
}
export function setUser () {
const store = getStore();
const user = store.state.user.data;
amplitude.getInstance().setUserId(user._id);
window.ga('set', { userId: user._id });
export function safeSetup (userId) {
if (analyticsLoading || analyticsReady) return;
analyticsLoading = true;
install(GA_ID, {
debug_mode: DEBUG_ENABLED || !IS_PRODUCTION,
user_id: userId,
});
amplitude.getInstance().init(AMPLITUDE_KEY, userId);
analyticsReady = true;
analyticsLoading = false;
}
export function track (properties, options = {}) {
const user = _getConsentedUser();
if (!user) return;
safeSetup(user._id);
// Use nextTick to avoid blocking the UI
Vue.nextTick(() => {
if (_doesNotHaveRequiredFields(properties)) return;
if (_doesNotHaveAllowedHitType(properties)) return;
const trackOnClient = options && options.trackOnClient === true;
// Track events on the server by default
if (trackOnClient === true) {
amplitude.getInstance().logEvent(properties.eventAction, properties);
window.ga('send', properties);
gtag('event', properties.eventAction, properties);
} else {
const store = getStore();
store.dispatch('analytics:trackEvent', properties);
@@ -101,45 +99,16 @@ export function track (properties, options = {}) {
}
export function updateUser (properties = {}) {
const user = _getConsentedUser();
if (!user) return;
safeSetup(user._id);
// Use nextTick to avoid blocking the UI
Vue.nextTick(() => {
_gatherUserStats(properties);
gtag('set', 'user_properties', properties);
forEach(properties, (value, key) => {
const identify = new amplitude.Identify().set(key, value);
amplitude.getInstance().identify(identify);
});
window.ga('set', properties);
});
}
export function setup () {
// Setup queues until the real scripts are loaded
/* eslint-disable */
// Amplitude
amplitude.getInstance().init(AMPLITUDE_KEY);
// Google Analytics (aka Universal Analytics)
window['GoogleAnalyticsObject'] = 'ga';
window['ga'] = window['ga'] || function() {
(window['ga'].q = window['ga'].q || []).push(arguments)
}, window['ga'].l = 1 * new Date();
ga('create', GA_ID);
/* eslint-enable */
}
export function load () {
// Load real scripts
if (!IS_PRODUCTION) return;
let firstScript = document.getElementsByTagName('script')[0];
// Google Analytics
const gaScript = document.createElement('script');
[firstScript] = document.getElementsByTagName('script');
gaScript.async = 1;
gaScript.src = '//www.google-analytics.com/analytics.js';
firstScript.parentNode.insertBefore(gaScript, firstScript);
}

View File

@@ -21,7 +21,7 @@ function loadLocale (i18nData) {
script.type = 'text/javascript';
script.text = i18nData.momentLang;
head.appendChild(script);
moment.locale(language.momentLangCode);
moment.updateLocale(language.momentLangCode);
}
}

View File

@@ -13,9 +13,6 @@ import {
} from 'bootstrap-vue';
import Fragment from 'vue-fragment';
import AppComponent from './app';
import {
setup as setupAnalytics,
} from '@/libs/analytics';
import { setUpLogging } from '@/libs/logging';
import router from './router/index';
import getStore from './store';
@@ -50,7 +47,6 @@ Vue.use(CollapsePlugin);
Vue.use(Fragment.Plugin);
setUpLogging();
setupAnalytics(); // just create queues for analytics, no scripts loaded at this time
const store = getStore();
if (import.meta.env.TIME_TRAVEL_ENABLED === 'true') {

View File

@@ -0,0 +1,128 @@
import debounce from 'lodash/debounce';
import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import hello from 'hellojs';
import { buildAppleAuthUrl } from '../libs/auth';
export default {
data () {
return {
authData: {},
email: '',
emailError: null,
emailValid: false,
password: '',
passwordConfirm: '',
passwordValid: false,
passwordInvalid: false,
passwordConfirmValid: false,
passwordConfirmInvalid: false,
registrationMethod: null,
username: '',
};
},
watch: {
email () {
this.validateEmail(this.email);
},
password () {
this.validatePassword(this.password);
},
passwordConfirm () {
this.validatePasswordConfirm(this.passwordConfirm);
},
},
// @TODO: Abstract hello in to action or lib
mounted () {
hello.init({
google: import.meta.env.GOOGLE_CLIENT_ID, // eslint-disable-line
});
},
methods: {
validateEmail: debounce(function valEmail (email) {
if (!email) {
this.emailValid = false;
this.emailError = null;
return;
}
if (!isEmail(email)) {
this.emailValid = false;
this.emailError = this.$t('enterValidEmail');
return;
}
this.$store.dispatch('auth:checkEmail', {
email,
}).then(res => {
if (!res.valid) {
this.emailValid = false;
this.emailError = this.$t('cannotFulfillReq');
return;
}
this.emailValid = true;
this.emailError = null;
});
}, 500),
validatePassword: debounce(function valPass (password) {
if (!password) {
this.passwordValid = false;
this.passwordInvalid = false;
return;
}
this.passwordValid = password.length >= MINIMUM_PASSWORD_LENGTH;
this.passwordInvalid = password.length < MINIMUM_PASSWORD_LENGTH;
}, 500),
validatePasswordConfirm: debounce(function valPassConf (passwordConfirm) {
if (!passwordConfirm) {
this.passwordConfirmValid = false;
this.passwordConfirmInvalid = false;
return;
}
this.passwordConfirmValid = passwordConfirm === this.password;
this.passwordConfirmInvalid = passwordConfirm !== this.password;
}, 500),
async proceed (accountType) {
if (accountType === 'apple') {
window.location.href = buildAppleAuthUrl();
} else {
window.sessionStorage.removeItem('apple-token');
}
if (accountType === 'local') {
this.$store.state.registrationOptions = {
email: this.email,
password: this.password,
passwordConfirm: this.passwordConfirm,
registrationMethod: 'local',
};
} else {
this.authData = await this.socialAuth(accountType);
const authId = await this.$store.dispatch('auth:socialAuth', {
auth: this.authData,
allowRegister: false,
});
if (authId) {
window.location.href = '/';
} else {
this.$store.state.registrationOptions = {
authData: this.authData,
email: window.sessionStorage.getItem('social-email'),
registrationMethod: accountType,
};
}
}
this.$router.push({ name: 'username', query: this.$route.query });
},
async socialAuth (network) {
try {
await hello(network).logout();
} catch (e) {} // eslint-disable-line
const redirectUrl = `${window.location.protocol}//${window.location.host}`;
const auth = await hello(network).login({
scope: 'email',
// explicitly pass the redirect url or it might redirect to /home
redirect_uri: redirectUrl, // eslint-disable-line camelcase
});
return auth;
},
},
};

View File

@@ -102,12 +102,6 @@
max-width: unset;
::v-deep {
line-height: 1.71;
.small {
line-height: 1.33;
}
table td {
padding: 0.5rem;
}
@@ -123,6 +117,14 @@
width: 23%;
}
small {
line-height: 1.33;
}
.settings-label, .settings-value, a, p {
line-height: 1.71;
}
.input-area .settings-label {
width: unset;
}

View File

@@ -5,7 +5,7 @@
>
<button
v-if="!hideSave"
class="btn btn-save"
class="btn btn-save mb-2"
:class="primaryButtonColor ?? 'btn-primary'"
type="submit"
:disabled="disableSave"
@@ -61,8 +61,4 @@ export default {
margin-top: 1.5rem;
}
}
.btn-save {
margin-bottom: 1rem;
}
</style>

View File

@@ -16,6 +16,7 @@
<table class="table">
<user-id-row />
<user-data-row />
<privacy-preferences-row />
<tr>
<td colspan="3">
</td>
@@ -45,6 +46,7 @@
<script>
import UserIdRow from '@/pages/settings/siteDataRows/userIdRow.vue';
import UserDataRow from '@/pages/settings/siteDataRows/userDataRow.vue';
import PrivacyPreferencesRow from '@/pages/settings/siteDataRows/privacyPreferencesRow.vue';
import ApiRow from '@/pages/settings/siteDataRows/apiRow.vue';
import WebhooksRow from '@/pages/settings/siteDataRows/webhooksRow.vue';
import DeveloperModeRow from '@/pages/settings/siteDataRows/developerModeRow.vue';
@@ -56,6 +58,7 @@ export default {
ApiRow,
UserDataRow,
UserIdRow,
PrivacyPreferencesRow,
},
mounted () {
this.$store.dispatch('common:setTitle', {

View File

@@ -0,0 +1,142 @@
<template>
<tr>
<td colspan="3"
v-if="!mixinData.inlineSettingMixin.modalVisible"
>
<div class="d-flex justify-content-between align-items-center">
<h3
v-once
class="gray-50 mb-0"
>
{{ $t('yourPrivacyPreferences') }}
</h3>
<a
class="edit-link"
@click.prevent="openModal()"
>
{{ $t('edit') }}
</a>
</div>
</td>
<td colspan="3"
v-if="mixinData.inlineSettingMixin.modalVisible"
>
<h3
v-once
class="purple-200 mb-0"
>
{{ $t('yourPrivacyPreferences') }}
</h3>
<p
v-once
class="gray-50 mb-4"
v-html="$t('privacySettingsOverview') + ' ' + $t('learnMorePrivacy')"
>
</p>
<div
class="d-flex justify-content-center"
>
<div class="w-66">
<div
class="d-flex justify-content-between align-items-center mb-1"
>
<label class="settings-label w-50 mb-0">
{{ $t('performanceAnalytics') }}
</label>
<toggle-switch
class="mb-auto"
v-model="user.preferences.analyticsConsent"
@change="prefToggled()"
/>
</div>
<div class="mb-28p">
<small class="gray-50">
{{ $t('usedForSupport') }}
</small>
</div>
<div
class="d-flex justify-content-between align-items-center mb-1"
>
<label class="settings-label w-50 mb-0">
{{ $t('strictlyNecessary') }}
</label>
<toggle-switch
:checked="true"
:disabled="true"
/>
</div>
<small class="gray-50">
{{ $t('requiredToRun') }}
</small>
<save-cancel-buttons
class="mb-4"
:disable-save="!mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues"
@saveClicked="finalize()"
@cancelClicked="requestCloseModal()"
/>
</div>
</div>
</td>
</tr>
</template>
<style lang="scss" scoped>
@import '@/assets/scss/colors.scss';
button {
width: fit-content;
}
small {
line-height: 1.33;
}
.mb-28p {
margin-bottom: 28px;
}
.popover-box {
margin-top: 1px;
}
.w-66 {
width: 66.7%;
}
</style>
<script>
import SaveCancelButtons from '@/pages/settings/components/saveCancelButtons.vue';
import ToggleSwitch from '@/components/ui/toggleSwitch.vue';
import { GenericUserPreferencesMixin } from '@/pages/settings/components/genericUserPreferencesMixin';
import { InlineSettingMixin } from '../components/inlineSettingMixin';
import { mapState } from '@/libs/store';
export default {
mixins: [
GenericUserPreferencesMixin,
InlineSettingMixin,
],
components: {
SaveCancelButtons,
ToggleSwitch,
},
computed: {
...mapState({
user: 'user.data',
}),
},
methods: {
finalize () {
this.setUserPreference('analyticsConsent');
this.mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues = false;
},
prefToggled () {
const newVal = !this.mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues;
this.mixinData.inlineSettingMixin.sharedState.inlineSettingUnsavedValues = newVal;
},
resetControls () {
this.user.preferences.analyticsConsent = !this.user.preferences.analyticsConsent;
},
},
};
</script>

View File

@@ -15,6 +15,7 @@
<external-link-modal />
<birthday-modal />
<template v-if="isUserLoaded">
<privacy-banner />
<chat-banner />
<damage-paused-banner />
<gems-promo-banner />
@@ -118,11 +119,12 @@ import { loadProgressBar } from 'axios-progress-bar';
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';
import BirthdayBanner from '@/components/header/banners/birthdayBanner';
import PrivacyBanner from '@/components/header/banners/privacy';
import AppFooter from '@/components/appFooter';
import notificationsDisplay from '@/components/notifications';
import { mapState } from '@/libs/store';
@@ -159,6 +161,7 @@ export default {
GemsPromoBanner,
GiftPromoBanner,
BirthdayBanner,
PrivacyBanner,
notificationsDisplay,
BuyModal,
SelectMembersModal,
@@ -260,18 +263,23 @@ export default {
this.$store.dispatch('tasks:fetchUserTasks'),
]).then(() => {
this.$store.state.isUserLoaded = true;
Analytics.setUser();
const analyticsConsent = localStorage.getItem('analyticsConsent');
if (analyticsConsent !== null
&& analyticsConsent !== this.user.preferences.analyticsConsent
) {
this.$store.dispatch('user:set', { 'preferences.analyticsConsent': analyticsConsent });
}
if (window && window['habitica-i18n']) {
if (this.user.preferences.language === window['habitica-i18n'].language.code) {
return null;
}
}
if (window && window['habitica-i18n']) {
if (this.user.preferences.language === window['habitica-i18n'].language.code) {
return null;
}
}
Analytics.updateUser();
if (window && window['habitica-i18n']) {
if (this.user.preferences.language === window['habitica-i18n'].language.code) {
return null;
}
}
if (window && window['habitica-i18n']) {
if (this.user.preferences.language === window['habitica-i18n'].language.code) {
return null;
}
}
return axios.get(
'/api/v4/i18n/browser-script',
{

View File

@@ -76,12 +76,6 @@ const router = new VueRouter({
// NOTE: when adding a new route entry make sure to implement the `common:setTitle` action
// in the route component to set a specific subtitle for the page.
routes: [
{
name: 'register', path: '/register', component: RegisterLoginReset, meta: { requiresLogin: false },
},
{
name: 'login', path: '/login', component: RegisterLoginReset, meta: { requiresLogin: false },
},
{ name: 'logout', path: '/logout', component: Logout },
{
name: 'resetPassword', path: '/reset-password', component: RegisterLoginReset, meta: { requiresLogin: false },

View File

@@ -6,13 +6,12 @@ const StaticWrapper = () => import('@/components/static/staticWrapper');
const HomePage = () => import('@/components/static/home');
const AppleRedirectPage = () => import('@/components/static/appleRedirect');
const ChatSunsetFaq = () => import('@/components/static/chatSunsetFaq');
const ClearBrowserDataPage = () => import('@/components/static/clearBrowserData');
const CommunityGuidelinesPage = () => import('@/components/static/communityGuidelines');
const ContentScheduleFaq = () => import('@/components/static/contentScheduleFaq');
const ContactPage = () => import('@/components/static/contact');
const FAQPage = () => import('@/components/static/faq');
const ChatSunsetFaq = () => import('@/components/static/chatSunsetFaq');
const ContentScheduleFaq = () => import('@/components/static/contentScheduleFaq');
const SubscriptionBenefitsFaq = () => import('@/components/static/subscriptionBenefitsFaq');
const FeaturesPage = () => import('@/components/static/features');
const GroupPlansPage = () => import('@/components/static/groupPlans');
// Commenting out merch page see
@@ -22,6 +21,9 @@ const NewsPage = () => import('@/components/static/newStuff');
const OverviewPage = () => import('@/components/static/overview');
const PressKitPage = () => import('@/components/static/pressKit');
const PrivacyPage = () => import('@/components/static/privacy');
const RegisterLoginReset = () => import(/* webpackChunkName: "auth" */'@/components/auth/registerLoginReset');
const RegisterUsername = () => import(/* webpackChunkName: "auth" */'@/components/auth/registerUsername');
const SubscriptionBenefitsFaq = () => import('@/components/static/subscriptionBenefitsFaq');
const TermsPage = () => import('@/components/static/terms');
export const STATIC_ROUTES = {
@@ -55,6 +57,9 @@ export const STATIC_ROUTES = {
{
name: 'features', path: 'features', component: FeaturesPage, meta: { requiresLogin: false },
},
{
name: 'front', path: 'front', component: HomePage, meta: { requiresLogin: false },
},
{
name: 'groupPlans', path: 'group-plans', component: GroupPlansPage, meta: { requiresLogin: false },
},
@@ -62,7 +67,7 @@ export const STATIC_ROUTES = {
name: 'home', path: 'home', component: HomePage, meta: { requiresLogin: false },
},
{
name: 'front', path: 'front', component: HomePage, meta: { requiresLogin: false },
name: 'login', path: '/login', component: RegisterLoginReset, meta: { requiresLogin: false },
},
{
name: 'news', path: 'new-stuff', component: NewsPage, meta: { requiresLogin: false },
@@ -79,9 +84,21 @@ export const STATIC_ROUTES = {
{
name: 'privacy', path: 'privacy', component: PrivacyPage, meta: { requiresLogin: false },
},
{
name: 'privacyReview', path: 'privacy-review', component: PrivacyPage, meta: { requiresLogin: false },
},
{
name: 'register', path: '/register', component: RegisterLoginReset, meta: { requiresLogin: false },
},
{
name: 'terms', path: 'terms', component: TermsPage, meta: { requiresLogin: false },
},
{
name: 'termsReview', path: 'terms-review', component: TermsPage, meta: { requiresLogin: false },
},
{
name: 'username', path: '/username', component: RegisterUsername, meta: { requiresLogin: false },
},
{
name: 'notFound', path: 'not-found', component: NotFoundPage, meta: { requiresLogin: false },
},

View File

@@ -1,6 +1,8 @@
import axios from 'axios';
import { authAsCredentialsState, LOCALSTORAGE_AUTH_KEY } from '@/libs/auth';
const GA_ID = import.meta.env.GA_ID;
function saveLocalDataAuth (store, apiId, apiToken) {
const credentialsObj = {
auth: {
@@ -64,34 +66,66 @@ export async function verifyDisplayName (store, params) {
return result.data.data;
}
export async function checkEmail (store, params) {
const url = '/api/v4/user/auth/check-email';
const result = await axios.post(url, {
email: params.email,
});
return result.data.data;
}
export async function socialAuth (store, params) {
const url = '/api/v4/user/auth/social';
const result = await axios.post(url, {
allowRegister: params.allowRegister,
username: params.username,
network: params.auth.network,
authResponse: params.auth.authResponse,
});
if (!result.data) {
return null;
}
const user = result.data.data;
saveLocalDataAuth(store, user.id, user.apiToken);
return user.id;
}
export async function appleAuth (store, params) {
const url = '/api/v4/user/auth/apple';
const result = await axios.get(url, {
params: {
allowRegister: params.allowRegister,
code: params.code,
id_token: params.idToken,
name: params.name,
username: params.username,
},
});
if (!result.data) {
return null;
}
if (result.data.message && result.data.id_token) {
return { idToken: result.data.id_token };
}
const user = result.data.data;
saveLocalDataAuth(store, user.id, user.apiToken);
return { id: user.id };
}
export function logout (store, options = {}) {
localStorage.clear();
sessionStorage.clear();
if (window.gtag) {
window.gtag('config', GA_ID, { user_id: null });
}
const query = options.redirectToLogin === true ? '?redirectToLogin=true' : '';
window.location.href = `/logout-server${query}`;
}

View File

@@ -149,6 +149,7 @@ export default function clientStore () {
question: false,
},
postLoadModal: '',
registrationOptions: {},
},
});

View File

@@ -1,117 +0,0 @@
import {
describe, expect, test, beforeEach, afterEach,
} from 'vitest';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import sinon from 'sinon';
import Home from '@/components/static/home.vue';
import Store from '@/libs/store';
import * as Analytics from '@/libs/analytics';
const sandbox = sinon.createSandbox();
const localVue = createLocalVue();
localVue.use(Store);
describe('Home', () => {
let registerStub;
let socialAuthStub;
let store;
let wrapper;
function mountWrapper (query) {
return shallowMount(Home, {
store,
localVue,
mocks: {
$t: string => string,
$route: { query: query || {} },
},
});
}
async function fillOutUserForm (username, email, password) {
await wrapper.find('#usernameInput').setValue(username);
await wrapper.find('input[type=email]').setValue(email);
await wrapper.findAll('input[type=password]').setValue(password);
}
beforeEach(() => {
registerStub = sinon.stub();
socialAuthStub = sinon.stub();
store = new Store({
state: {},
getters: {},
actions: {
'auth:register': registerStub,
'auth:socialAuth': socialAuthStub,
'auth:verifyUsername': () => async () => ({}),
'common:setTitle': () => {},
},
});
sinon.stub(Analytics, 'track');
wrapper = mountWrapper();
});
afterEach(() => {
sandbox.restore();
});
test('has a visible title', () => {
expect(wrapper.find('h1').text()).to.equal('motivateYourself');
});
describe('signup form', () => {
test('registers a user from the form', async () => {
const username = 'newUser';
const email = 'rookie@habitica.com';
const password = 'ImmaG3tProductive!';
await fillOutUserForm(username, email, password);
await wrapper.find('form').trigger('submit');
expect(registerStub.calledOnce).to.be.true;
expect(registerStub.getCall(0).args[1]).to.deep.equal({
username,
email,
password,
passwordConfirm: password,
groupInvite: '',
});
});
test('registers a user with group invite if groupInvite in the query', async () => {
const groupInvite = 'TheBestGroup';
wrapper = mountWrapper({ groupInvite });
await fillOutUserForm('invitedUser', 'invited@habitica.com', '1veGotFri3ndsHooray!');
await wrapper.find('form').trigger('submit');
expect(registerStub.calledOnce).to.be.true;
expect(registerStub.getCall(0).args[1].groupInvite).to.equal(groupInvite);
});
test('registers a user with group invite if p in the query', async () => {
const p = 'ThePiGroup';
wrapper = mountWrapper({ p });
await fillOutUserForm('alsoInvitedUser', 'invited2@habitica.com', '1veGotFri3nds2!');
await wrapper.find('form').trigger('submit');
expect(registerStub.calledOnce).to.be.true;
expect(registerStub.getCall(0).args[1].groupInvite).to.equal(p);
});
test('registers a user with group invite invite if both p and groupInvite are in the query', async () => {
const groupInvite = 'StillTheBestGroup';
wrapper = mountWrapper({ p: 'LesserGroup', groupInvite });
await fillOutUserForm('doublyInvitedUser', 'invited3@habitica.com', '1veGotSm4rtFri3nds!');
await wrapper.find('form').trigger('submit');
expect(registerStub.calledOnce).to.be.true;
expect(registerStub.getCall(0).args[1].groupInvite).to.equal(groupInvite);
});
});
});

View File

@@ -1,6 +1,5 @@
{
"FAQ": "ЧЗВ",
"termsAndAgreement": "Натискайки бутона по-долу, Вие заявявате, че сте прочули и се съгласявате с <a href='/static/terms'>Условията за ползване</a> и <a href='/static/privacy'>Политиката за поверителност</a>.",
"chores": "Домакинска работа",
"clearBrowserData": "Изчистване на данните на браузъра",
"communityExtensions": "Добавки и разширения",

View File

@@ -7,8 +7,6 @@
"justin": "Джъстин",
"justinIntroMessage1": "Здравейте! Не съм Ви виждал досега. Името ми е <strong>Джъстин</strong> и аз ще Ви помогна да се ориентирате в Хабитика.",
"justinIntroMessage3": "Чудесно! А сега, върху какво искате да работите по време на пътешествието си?",
"justinIntroMessageUsername": "Преди да започнем, да решим как да Ви наричам. По-долу може да видите екранно име и потребителско име, които аз създадох за Вас. След като си изберете екранно име и потребителско име, ще преминем към създаването на герой!",
"justinIntroMessageAppearance": "Е, как искате да изглеждате? Не се притеснявайте, можете да промените това по всяко време.",
"introTour": "Готово! Аз попълних някои задачи с оглед на интересите Ви, така че можете да започнете веднага. Щракнете върху задача, за да я редактирате, или добавете нови задачи според желанията си!",
"prev": "Назад",
"next": "Напред",

View File

@@ -1,6 +1,5 @@
{
"FAQ": "ČKD",
"termsAndAgreement": "Kliknutím na tlačítko níže dáváš najevo, že jsi četl/a a souhlasíš s <a href='/static/terms'>Podmínkami užívání služby</a> a <a href='/static/privacy'>Ochranou soukromí</a>.",
"chores": "Domácí práce",
"clearBrowserData": "Vyčistit data v prohlížeči",
"communityExtensions": "Doplňky & Rozšírení",

View File

@@ -7,8 +7,6 @@
"justin": "Justin",
"justinIntroMessage1": "Ahoj, ty musíš být nový/á. Jmenuji se <strong>Justin</strong>, a budu tě provázet po světě Habitica.",
"justinIntroMessage3": "Skvěle! Teď - na čem by jsi rád pracoval na tvé výpravě?",
"justinIntroMessageUsername": "Než začneme, musíme vymyslet, jak Ti budeme říkat. Dole uvidíš veřejné a uživatelské jméno, které jsem pro tebe vygeneroval. Poté, co si vybereš své veřejné a uživatelské jméno, začneme s tvorbou avatara!",
"justinIntroMessageAppearance": "Jak bys chtěl/a vypadat? Neboj se, můžeš svůj vzhled později změnit.",
"introTour": "A jsme tu! Vyplnil jsem ti pár úkolů na základě tvých zájmů, takže můžeš ihned začít. Klikni na úkol pro jeho úpravu. nebo přidej nový úkol, který by odpovídal tvé rutině!",
"prev": "Předch",
"next": "Další",

View File

@@ -1,6 +1,5 @@
{
"FAQ": "FAQ",
"termsAndAgreement": "Ved at klikke på knappen for neden, indikerer du at du har læst og accepterer vores <a href='/static/terms'>Vilkår og betingelser</a> og <a href='/static/privacy'>Fortrolighedspolitik</a>.",
"chores": "Pligter",
"clearBrowserData": "Ryd browserdata",
"communityExtensions": "Tilføjelser og udvidelser",

View File

@@ -7,8 +7,6 @@
"justin": "Justin",
"justinIntroMessage1": "Hejsa! Du må være ny her. Jeg hedder <strong>Justin</strong>, og jeg vil være din guide til Habitica.",
"justinIntroMessage3": "Super! Nå, hvad er du så interesseret i at arbejde på gennem denne rejse?",
"justinIntroMessageUsername": "Før vi begynder, så lad os finde ud af, hvad vi skal kalde dig. Forneden finder du et displaynavn og et brugernavn, jeg har lavet for dig. Efter du har valgt et displaynavn og brugernavn, kan vi lave din avatar!",
"justinIntroMessageAppearance": "Hvordan har du lyst til at se ud? No worries, du kan altid ændre det senere.",
"introTour": "Sådan! Jeg har lavet nogle Opgaver til dig baseret på dine interesser, så du kan komme i gang med det samme. Klik på en Opgave for at redigere den, eller tilføj nye Opgaver, som passer til din hverdag!",
"prev": "Tidl.",
"next": "Næste",

View File

@@ -912,5 +912,14 @@
"backgroundSirensLairNotes": "Wage es, in die Höhle einer Sirene zu tauchen.",
"backgrounds082025": "SET 135: Veröffentlicht im August 2025",
"backgroundSunnyStreetWithShopsText": "Sonnige Straße mit Läden",
"backgroundSunnyStreetWithShopsNotes": "Genieße den Anblick und die Geräusche einer sonnigen Straße mit Läden."
"backgroundSunnyStreetWithShopsNotes": "Genieße den Anblick und die Geräusche einer sonnigen Straße mit Läden.",
"backgroundAutumnSwampText": "Herbstsumpf",
"backgroundAutumnSwampNotes": "Nimm die eindringliche Atmosphäre eines Herbstsumpfes in dich auf.",
"backgrounds102025": "SET 137: Veröffentlicht im Oktober 2025",
"backgroundInsideForestWitchsCottageText": "Hütte der Waldhexe",
"backgrounds092025": "SET 136: Veröffentlicht im September 2025",
"backgroundInsideForestWitchsCottageNotes": "Webe Zauber in der Hütte der Waldhexe.",
"backgroundCastleKeepWithBannersText": "Burghalle mit Bannern",
"backgroundCastleKeepWithBannersNotes": "Singe Geschichten von Heldentaten in einer Burghalle mit Bannern.",
"backgrounds112025": "SET 138: Veröffentlicht im November 2025"
}

View File

@@ -1,6 +1,5 @@
{
"FAQ": "FAQ",
"termsAndAgreement": "Durch Anklicken der nachfolgenden Schaltfläche erklärst Du Dich mit den <a href='/static/terms'>Nutzungsbedingungen</a> und <a href='/static/privacy'>Datenschutzbestimmungen</a>einverstanden.",
"chores": "Hausarbeiten",
"clearBrowserData": "Browserdaten löschen",
"communityExtensions": "Add-ons & Erweiterungen",
@@ -87,14 +86,14 @@
"sync": "Synchronisieren",
"tasks": "Aufgaben",
"teams": "Teams",
"terms": "AGB",
"terms": "Nutzungsbedingungen",
"tumblr": "Tumblr",
"localStorageTryFirst": "Wenn Du Probleme mit Habitica hast, drücke den untenstehenden Knopf um lokale Browserdaten und die meisten Cookies zu löschen (andere Internetseiten sind davon nicht betroffen). Du wirst Dich danach neu einloggen müssen, damit das funktioniert, also halte Deine Anmeldedaten bereit. Du kannst sie unter Einstellungen -> <%= linkStart %>Seite<%= linkEnd %> einsehen.",
"localStorageTryNext": "Wenn das Problem weiterhin besteht, <%= linkStart %>melde bitte einen Fehler<%= linkEnd %>, falls Du das noch nicht getan hast.",
"localStorageClear": "Lokale Daten löschen",
"localStorageClearExplanation": "Diese Schaltfläche löscht Deine lokalen Daten, sowie die meisten Cookies und loggt Dich aus.",
"username": "Benutzername",
"emailOrUsername": "E-Mail-Adresse oder Benutzername (Groß- und Kleinschreibung beachten)",
"emailOrUsername": "Benutzername oder E-Mail-Adresse (Groß- und Kleinschreibung beachten)",
"work": "Arbeit",
"reportAccountProblems": "Melde Probleme mit Deinem Konto",
"reportCommunityIssues": "Melde Community-Probleme",
@@ -123,7 +122,7 @@
"passwordConfirmationMatch": "Die Passwörter stimmen nicht überein.",
"passwordResetPage": "Passwort zurücksetzen",
"passwordReset": "Wenn wir Deine E-Mail-Adresse oder Deinen Benutzernamen kennen, wurden Anweisungen zum Passwort-Zurücksetzen dorthin verschickt.",
"invalidLoginCredentialsLong": "Hoppla - Deine E-Mail-Adresse / Dein Benutzername oder Passwort ist nicht korrekt.\n- überprüfe die korrekte Schreibweise und beachte die Groß-/Kleinschreibung Deines Benutzernamens und Deiner E-Mail-Adresse.\n- Es ist möglich, dass Du Dich mit Facebook oder Google-sign-in statt mit Deiner E-Mail registriert hast. Probiere Dich damit anzumelden.\n- Wenn Du Dein Passwort vergessen hast, klicke auf \"Passwort vergessen\".",
"invalidLoginCredentialsLong": "Deine E-Mail-Adresse, deine Benutzername oder Passwort sind nicht korrekt. Bitte versuche es erneut oder wähle \"Passwort vergessen.\"",
"invalidCredentials": "Es gibt kein Konto, das diese Anmeldedaten verwendet.",
"accountSuspended": "Dieser Account, Benutzer-ID \"<%= userId %>\", wurde gesperrt wegen Verletzung der Community-Richtlinien (https://habitica.com/static/community-guidelines) oder der Allgemeinen Geschäftsbedingungen (https://habitica.com/static/terms). Für genauere Angaben oder um die Aufgebung der Sperre zu erbitten, kontaktiere bitte unseren Community Manager unter <%= communityManagerEmail %> oder bitte Deine Eltern oder Erziehungsberechtigten ihm zu schreiben. Bitte nenne Deine @Benutzer-ID in der E-Mail.",
"accountSuspendedTitle": "Dieser Account wurde suspendiert",
@@ -133,12 +132,12 @@
"invalidReqParams": "Ungültige Anfrageparameter.",
"memberIdRequired": "\"member\" muss eine gültige UUID sein.",
"heroIdRequired": "\"herold\" muss eine gültige UUID sein.",
"cannotFulfillReq": "Deine Anfrage kann nicht erfüllt werden. Schreibe eine E-Mail an admin@habitica.com, falls dieser Fehler weiterhin auftritt.",
"cannotFulfillReq": "Bitte gib eine gültige E-Mail-Adresse ein. Schreibe eine E-Mail an admin@habitica.com, falls dieser Fehler weiterhin auftritt.",
"modelNotFound": "Diese Vorlage existiert nicht.",
"signUpWithSocial": "Mit <%= social %> registrieren",
"signUpWithSocial": "Mit <%= social %> fortfahren",
"loginWithSocial": "Mit <%= social %> anmelden",
"confirmPassword": "Passwort bestätigen",
"usernameLimitations": "Der Benutzername muss zwischen 1 und 20 Buchstaben lang sein und darf nur die Buchstaben von A bis Z, Nummern von 0 bis 9, Bindestriche und Unterstriche beinhalten und darf keine unangemessenen Begriffe enthalten.",
"usernameLimitations": "Benutzernamen können jederzeit geändert werden. Sie müssen zwischen 1 und 20 Zeichen lang sein und dürfen nur Buchstaben von A bis Z, Zahlen von 0 bis 9, Bindestriche und Unterstriche beinhalten.",
"usernamePlaceholder": "z.B., HabitRabbit",
"emailPlaceholder": "z.B., gryphon@beispiel.com",
"passwordPlaceholder": "z.B., ******************",
@@ -183,5 +182,10 @@
"translateHabitica": "Habitica übersetzen",
"marketing3Lead1Title": "Android & iOS Apps",
"marketing4Lead3Button": "Starte noch heute",
"emailBlockedRegistration": "Diese E-Mail ist für die Registrierung blockiert. Wenn du denkst, dass das ein Fehler ist, kontaktiere uns bitte unter admin@habitica.com."
"emailBlockedRegistration": "Diese E-Mail ist für die Registrierung blockiert. Wenn du denkst, dass das ein Fehler ist, kontaktiere uns bitte unter admin@habitica.com.",
"missingClientHeader": "Fehlende X-Client Header.",
"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"
}

View File

@@ -2861,7 +2861,7 @@
"weaponSpecialSummer2024MageText": "Seeanemonen Zauberstab",
"weaponSpecialSummer2024MageNotes": "Diese grandiosen Tentakel können Magie gleichzeitig abhalten, ablenken und steuern. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
"weaponSpecialSummer2024HealerNotes": "Du wirst erstaunt sein zu entdecken, wie hart die Muschel am Ende des Stabs ist. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
"weaponArmoireCorsairsBladeNotes": "Ob du sie zum Plündern oder zum Schutz trägst - du kannst froh sein, daß du diese grimmige Klinge mit dir zur See gebracht hast. Achte nur darauf, daß sie sicher verstaut ist, wenn nicht in Benutzung. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Korsaren Set (Gegenstand 3 von 3)",
"weaponArmoireCorsairsBladeNotes": "Ob du sie zum Plündern oder zum Schutz trägst - du kannst froh sein, daß du diese scharfe Klinge mit dir zur See gebracht hast. Achte nur darauf, dass sie sicher verstaut ist, wenn nicht in Benutzung. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Piraten Set (Gegenstand 3 von 3).",
"weaponArmoireCorsairsBladeText": "Korsarenklinge",
"armorSpecialFall2023MageText": "Scharlachrote Hexenmeister Robe",
"armorSpecialFall2023MageNotes": "Mit scharlachrotem Garn und goldenen Akzenten ist dieses Outfit ein Wunder für die Sinne. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2023 Herbstausrüstung.",
@@ -2891,7 +2891,7 @@
"weaponMystery202408Text": "Arkanes Aegis",
"weaponMystery202408Notes": "Ein magisches Bläschen-Schild, das dich vor gegnerischen Zaubersprüchen schützt, oder dir hilft, im Wasser oder in der Luft zu schweben. Gewährt keinen Attributbonus. August 2024 Abonnentengegenstand.",
"weaponArmoireDragonKnightsLanceText": "Drachenritter Lanze",
"weaponArmoireDragonKnightsLanceNotes": "Diese rot-silberne Lanze hat so manchen Gegner aus dem Sattel seines Reittiers gehoben. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Drachenritter Set (Gegenstand 3 von 3)",
"weaponArmoireDragonKnightsLanceNotes": "Diese rot-silberne Lanze hat so manchen Gegner aus dem Sattel seines Reittiers gehoben. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Drachenritter Set (Gegenstand 3 von 3).",
"armorSpecialSummer2024WarriorText": "Walhai Schwanzflosse",
"armorSpecialSummer2024WarriorNotes": "Nachdem du dich in einen echten Walhai Krieger verwandelt hast, schwimm kühn auf deine Aufgaben zu! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2024 Sommerausrüstung.",
"armorSpecialSummer2024MageText": "Seeanemonen Flosse",
@@ -2925,14 +2925,14 @@
"armorSpecialFall2024HealerNotes": "Sei eins mit der Galaxis und hypnotisiere Zuschauer mit dieser Rüstung. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2024 Herbstausrüstung.",
"armorSpecialFall2024MageText": "Unterwelt Hexer Rüstung",
"armorSpecialFall2024MageNotes": "Sei eins mit der Unterwelt und umarme die Macht der Magier, die vor dir diese Rüstung trugen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2024 Herbstausrüstung.",
"weaponArmoireFunnyFoolBatonNotes": "Du kannst mit einem Schwung Deines Stabes eine Pointe vortragen, die Aufmerksamkeit erregen oder Beifall ernten. Erhöht Ausdauer und Stärke jeweils um <%= attrs %>. Verzauberter Schrank: Lustiges Narren-Set (Gegenstand 3 von 3)",
"weaponArmoireFunnyFoolBatonNotes": "Du kannst mit einem Schwung deines Stabes eine Pointe vortragen, Aufmerksamkeit erregen oder Beifall ernten. Erhöht Ausdauer und Stärke jeweils um <%= attrs %>. Verzauberter Schrank: Lustiges Narren-Set (Gegenstand 3 von 3).",
"armorArmoireTeaGownText": "Teekränzchen Kleid",
"armorArmoireTeaGownNotes": "Du bist zäh, kreativ, brilliant und so modisch! Erhöht Stärke und Intelligenz um jeweils <%= attrs %>. Verzauberter Schrank: Teekränzchen Set (Gegenstand 1 von 3).",
"armorMystery202401Text": "Verschneite Zauberer Roben",
"armorMystery202401Notes": "Diese Roben erscheinen filigran wie Schneeflocken, aber werden dich reichlich warm halten, während du deine winterliche Magie wirkst. Gewährt keinen Attributbonus. Januar 2024 Abonnentengegenstand.",
"armorMystery202406Notes": "Suche deine Feinde heim mit Stil und Flair! Gewährt keinen Attributbonus. Juni 2024 Abonnentengegenstand.",
"armorMystery202407Text": "Liebenswerter Axolotl Anzug",
"weaponArmoireSpookyCandyBucketNotes": "Mit einem epischen Kostüm wie diesem wirst du derart viel Süßigkeiten bekommen! Gut, dass du diesen bodenlosen Eimer hast, um das alles aufzunehmen. Versuch, nicht zu naschen, bevor du nach Hause kommst. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Süßes oder Saures Set (Gegenstand 2 von 2)",
"weaponArmoireSpookyCandyBucketNotes": "Mit einem epischen Kostüm wie diesem wirst du so viele Süßigkeiten bekommen! Gut, dass du diesen Eimer ohne Boden hast, um das alles aufzunehmen. Versuch, nicht zu naschen, bevor du nach Hause kommst. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Süßes oder Saures Set (Gegenstand 2 von 2).",
"weaponArmoireSpookyCandyBucketText": "Grusliger Süßigkeiten Eimer",
"armorMystery202407Notes": "Gleite durch Seen und Kanäle mit deinem hin und her fegenden rosa Schwanz! Gewährt keinen Attributbonus. Juli 2024 Abonnentengegenstand.",
"armorArmoireJewelersApronText": "Juweliers-Schürze",
@@ -2957,7 +2957,7 @@
"armorArmoireKarateGiText": "Karategi",
"armorArmoireKarateGiNotes": "Diese leichte Karate-Uniform ist perfekt für Training oder Wettbewerbe. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Karate-Set (Gegenstand 1 von 10).",
"weaponArmoireStormKnightAxeText": "Axt des Sturmritters",
"weaponArmoireStormKnightAxeNotes": "Sammle deine Wut und schlage wie ein Donnerschlag zu! Erhöht Stärke um <%= str %>. Verzauberter Schrank: Sturmritter-Set (Gegenstand 3 von 3)",
"weaponArmoireStormKnightAxeNotes": "Sammle deine Wut und schlage wie ein Donnerschlag zu! Erhöht Stärke um <%= str %>. Verzauberter Schrank: Sturmritter-Set (Gegenstand 3 von 3).",
"armorArmoireDiagonalRainbowShirtNotes": "Ein Klecks Farbe mit einem Schuss Stil. Sei fröhlich! Erhöht Ausdauer und Wahrnehmung um jeweils <%= attrs %> . Verzauberter Schrank: Regenbogen-Set (Gegenstand 2 von 2).",
"armorArmoireAdmiralsUniformText": "Admirals-Uniform",
"armorArmoireAdmiralsUniformNotes": "Wir salutieren dir! Diese Marineuniform signalisiert, dass du bereit bist, das Kommando sowohl von deinen Aufgaben als auch von einem Schiff zu übernehmen. Erhöht Ausdauer und Stärke um jeweils <%= attrs %> . Verzauberter Schrank: Admirals-Set (Gegenstand 2 von 2).",
@@ -3315,7 +3315,7 @@
"headMystery202504Notes": "Trage diese mysteriöse Visage, um unentdeckt unter den oskursten Fabelwesen der Welt zu verweilen. Gewährt keinen Attributbonus. April 2025 Abonnentengegenstand.",
"headArmoireSillierBlueTophatNotes": "Etwas Klasse, etwas Raffinesse. Erhöht Stärke und Ausdauer um jeweils <%= attrs %>. Verzauberter Schrank: Noch Lächerlicherer Smoking Set (Gegenstand 2 von 2).",
"weaponArmoireGildedKnightsSpearText": "Vergoldeter Ritter Speer",
"weaponArmoireGildedKnightsSpearNotes": "Mit dieser Waffe kannst du sicherstellen, dass jeder immer seine Schulden bezahlt. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Vergoldeter Ritter Set (Gegenstand 3 von 3)",
"weaponArmoireGildedKnightsSpearNotes": "Mit dieser Waffe kannst du sicherstellen, dass jeder immer seine Schulden bezahlt. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Vergoldeter Ritter Set (Gegenstand 3 von 3).",
"armorArmoireGildedKnightsPlateNotes": "In dieser Rüstung bist du fast unbesiegbar. Deine Feinde werden dich sicher dröhnen hören! Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Vergoldeter Ritter Set (Gegenstand 2 von 3)",
"armorArmoireGildedKnightsPlateText": "Vergoldeter Ritter Rüstung",
"headArmoireGildedKnightsHelmText": "Vergoldeter Ritter Helm",
@@ -3330,7 +3330,7 @@
"weaponSpecialSummer2025RogueNotes": "Dieser Tentakel wird deine Ziele eng umklammern, so dass du den Schwung nicht verlierst, wenn du deine Aufgaben erledigst. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Sommerausrüstung 2025.",
"weaponSpecialSummer2025HealerText": "Ruderschnecken Flügelpaddel",
"weaponSpecialSummer2025HealerNotes": "Beschreibe rudernd einen Doppelkreis, während du dich vorwärts bewegst, und bei deinen Aufgaben tolle Fortschritte machst. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Sommerausrüstung 2025.",
"weaponArmoireBeekeepersSmokerNotes": "Benutze dies, um deine Bienen zu beruhigen, damit du den Honig besser holen kannst. Die Bienen wird es nicht stören. Ehrlich, wir alle könnten von Zeit zu Zeit ein paar extra Minuten Ruhe gebrauchen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Imker Set (Gegenstand 3 von 4)",
"weaponArmoireBeekeepersSmokerNotes": "Benutze dies, um deine Bienen zu beruhigen, damit du den Honig besser holen kannst. Die Bienen wird es nicht stören. Um ehrlich zu sein, wir alle könnten von Zeit zu Zeit ein paar extra Minuten Ruhe gebrauchen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Imker Set (Gegenstand 3 von 4).",
"weaponArmoireBeekeepersSmokerText": "Smoker",
"armorSpecialSummer2025WarriorText": "Kammmuschel Rüstung",
"armorSpecialSummer2025WarriorNotes": "Diese Rüstung macht dich nicht nur robust, sondern auch schnell. Kampf oder Flucht - es ist deine Wahl! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe Sommerausrüstung 2025.",
@@ -3344,7 +3344,7 @@
"armorArmoireBeekeepersSuitNotes": "Schütze dich, während du nach deinen fleißigen Hummeln schaust. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Imker Set (Gegenstand 2 von 4)",
"headSpecialSummer2025RogueNotes": "Deine Sehkraft wird sich verbessern sobald Du diese Maske aufsetzt. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe Sommer 2025 Ausrüstung.",
"weaponSpecialSummer2025MageText": "Zweigkoralle",
"weaponSpecialSummer2025MageNotes": "Verzweige dich mit deinen Talenten und Fähigkeiten, um eine Reihe von verschiedenen Aufgaben anzugreifen. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe Sommerausrüstung 2025",
"weaponSpecialSummer2025MageNotes": "Verzweige dich mit deinen Talenten und Fähigkeiten, um eine Reihe von verschiedenen Aufgaben anzugreifen. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe Sommerausrüstung 2025.",
"headSpecialSummer2025WarriorText": "Kammmuschelhelm",
"headSpecialSummer2025WarriorNotes": "Undurchdringlich und perfekt zugespitzt wird dich dieser Helm sogar vor Seesternen beschützen. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Sommerausrüstung 2025.",
"headSpecialSummer2025RogueText": "Tintenfischmaske",
@@ -3364,7 +3364,6 @@
"headArmoireFlyFishingHatNotes": "Mit breiter Krempe und Platz für einen Ersatzköder. Du solltest nicht ohne diese Schönheit zum Fliegenfischen gehen. Erhöht Stärke und Wahrnehmung jeweils um <%= attrs %>. Verzauberter Schrank: Fliegenfischer-Set (Gegenstand 1 von 3)",
"shieldArmoireFlyFishingRodNotes": "Hänge einen Köder an diese lange, flexible Rute und Fische werden ihn jedes Mal mit einem Insekt verwechseln. Erhöht Stärke und Intelligenz um jeweils <%= attrs %>. Verzauberter Schrank: Fliegenfischer-Set (Gegenstand 3 von 3)",
"backMystery202506Text": "Sonnenschein-Aureole",
"shieldSpecialSummer2025RogueText": "Tintenfisch-Tentakel",
"shieldSpecialSummer2025RogueNotes": "Dieser Tentakel sieht biegsam aus, aber seine Saugnäpfe greifen fest zu. Feinde, passt auf! Erhöht die Stärke um <%= str %>. Limitierte Edition Sommer 2025 Ausrüstung.",
"shieldSpecialSummer2025HealerText": "Ruderschnecken-Schild",
"shieldSpecialSummer2025HealerNotes": "Dieser Schild sieht einfach aus, aber er hat gesundheitsschädliche Eigenschaften. Feinde, passt auf! Erhöht die Konstitution um <%= con %>. Limitierte Edition Sommer 2025 Ausrüstung.",
@@ -3375,5 +3374,44 @@
"backMystery202507Notes": "Dein Ross für Bürgersteige und Halfpipes. Gewährt keinen Attributbonus. Juli 2025 Abonnentengegenstand.",
"shieldMystery202506Text": "Sonnenschein-Schild",
"shieldMystery202506Notes": "Vertreibe die Dunkelheit und lasse deiner Umgebung warme und herzliche Strahlen zuteilwerden wo immer du auch bist. Gewährt keinen Attributbonus. Juni 2025 Abonnentengegenstand.",
"backMystery202506Notes": "Trage ein warmes Leuchten mit dir, wenn du deinen täglichen Aufgaben nachgehst. Gewährt keinen Attributbonus. Juni 2025 Abonnentengegenstand."
"backMystery202506Notes": "Trage ein warmes Leuchten mit dir, wenn du deinen täglichen Aufgaben nachgehst. Gewährt keinen Attributbonus. Juni 2025 Abonnentengegenstand.",
"weaponSpecialFall2025WarriorText": "Bigfoot Axt",
"weaponSpecialFall2025WarriorNotes": "Eine mächtige Waffe, um einen sicheren Pfad durch einen Herbstwald voller Komplikationen zu schlagen. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Herbstausrüstung 2025.",
"weaponSpecialFall2025RogueText": "Skelettklinge",
"weaponSpecialFall2025RogueNotes": "Eine mächtige Waffe, um einen sicheren Pfad durch einen Herbstwald voller Hindernisse zu schlagen. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Herbstausrüstung 2025.",
"weaponSpecialFall2025HealerText": "Kobold Axt",
"weaponSpecialFall2025HealerNotes": "Eine mächtige Waffe, um einen sicheren Pfad durch einen Herbstwald voller Erschwernisse zu schlagen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Herbstausrüstung 2025.",
"weaponSpecialFall2025MageText": "Geist-mit-Maske Axt",
"weaponSpecialFall2025MageNotes": "Eine mächtige Waffe, um einen sicheren Pfad durch einen Herbstwald voller Schrecken zu schlagen. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe Herbstausrüstung 2025.",
"weaponMystery202508Text": "Funkelnde Blutrote klinge",
"weaponMystery202508Notes": "Diese wirbelnde Klinge wird jedes Monster oder rote Tagesaufgabe, die deinen Weg kreuzen, in Schrecken versetzen! Gewährt keinen Attributbonus. August 2025 Abonnentengegenstand.",
"weaponMystery202511Text": "Frostschwert",
"weaponMystery202511Notes": "Der eisige Glanz dieses Schwertes wird selbst mit dunkelroten Aufgaben kurzen Prozess machen. Gewährt keinen Attributbonus. Novermber 2025 Abonnentengegenstand.",
"weaponArmoireBlacksmithsHammerText": "Schmiedehammer",
"weaponArmoireBlacksmithsHammerNotes": "Dieser Hammer ist für Metallarbeiten, er ist aber auch ideal geeignet inmitten von rotglühenden Kohlen und rotglühenden Tagesaufgaben. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Schmiedeset (Gegenstand 3 von 3).",
"armorSpecialFall2025WarriorText": "Sasquatch Rüstung",
"armorSpecialFall2025WarriorNotes": "Weder deine großen Füße, noch dein großer Körper wird zu groß sein um in diese saisonale Rüstung zu passen. Erhöht Ausdauer um <%= con %>. Limitierte Herbstausrüstung 2025.",
"armorSpecialFall2025RogueText": "Skelett Rüstung",
"armorSpecialFall2025HealerText": "Kobold Rüstung",
"armorSpecialFall2025HealerNotes": "Diese saisonale Rüstung lässt dich mit den dunklen Wäldern verschmelzen um einen strategischen Rückzug anzutreten. Erhöht Ausdauer um <%= con %>. Limitierte Herbstausrüstung 2025.",
"armorSpecialFall2025MageText": "Maskierter Geist Rüstung",
"armorSpecialFall2025MageNotes": "Diese saisonale Rüstung wird körperlos sobald du sie anziehst. Erhöht Intelligenz um <%= int %>. Limitierte Herbstausrüstung 2025.",
"armorMystery202509Text": "Robe des Windgepeitschten Wanderers",
"armorMystery202509Notes": "Helle Seide schützt dich vor dem Wetter - sowohl heiß als auch kalt. Gewährt keinen Attributbonus. September 2025 Abonnentengegenstand.",
"armorArmoireRedWaistcoatText": "Rote Weste",
"armorArmoireSoftOrangeSuitText": "Weicher Orangener Anzug",
"armorArmoireBlacksmithsApronText": "Schmiedeschürze",
"armorArmoireBlacksmithsApronNotes": "Diese Schürze fühlt sich nicht so schwer an, wie sie aussieht, sobald du sie trägst. Sie wird dich vor Funken schützen und dir gleichzeitig ermöglichen, dich frei zu bewegen. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Schmied Set (Gegenstand 2 von 3).",
"armorArmoireBlackPartyDressText": "Schwarzes Party Kleid",
"armorArmoireBlackPartyDressNotes": "Du bist stark, schlau, tüchtig und so modisch! Erhöht Stärke, Intelligenz und Ausdauer um jeweils <%= attrs %>. Verzauberter Schrank: Schwarzes Haarschleifen-Set (Gegenstand 2 von 2).",
"headSpecialFall2025WarriorText": "Sasquatch Maske",
"headSpecialFall2025WarriorNotes": "Rund und haarig - diese Maske bedeckt deinen Kopf, während du alle deine wichtigen Aufgaben abdeckst. Erhöht Stärke um <%= str %>. Limitierte Herbstausrüstung 2025.",
"headSpecialFall2025RogueText": "Skelett Maske",
"headSpecialFall2025RogueNotes": "Blass und vermummt - diese Maske bedeckt deinen Kopf, während du alle deine wichtigen Aufgaben abdeckst. Erhöht Wahrnehmung um <%= per %>. Limitierte Herbstausrüstung 2025.",
"headSpecialFall2025HealerText": "Kobold Maske",
"headSpecialFall2025MageText": "Maskierter Geist Maske",
"headSpecialFall2025MageNotes": "Ätherisch und glühend - diese Maske bedeckt deinen Kopf, während du alle deine wichtigen Aufgaben abdeckst. Erhöht Wahrnehmung um <%= per %>. Limitierte Herbstausrüstung 2025.",
"armorArmoireRedWaistcoatNotes": "Sieh elegant und umwerfend aus, während du deine Aufgaben bewältigst. In der Westentasche ist etwas geheimes versteckt — was denkst du, könnte es sein? Erhöht Ausdauer und Stärke um jeweils <%= attrs %>. Verzauberter Schrank: Rote Weste Set (Gegenstand 2 von 2)",
"armorArmoireSoftOrangeSuitNotes": "Orange ist eine lebhafte Farbe. Zieh dies an, wenn du zu Bett gehst und in allen Abenteuern, denen du in deinen Träumen begegnest, wirst du sicher Erfolg haben. Erhöht Ausdauer und Stärke um jeweils <%= attrs %> . Verzauberter Schrank: Oranges Loungewear-Set (Gegenstand 2 von 3).",
"headSpecialFall2025HealerNotes": "Markant und gehörnt - diese Maske bedeckt deinen Kopf, während du alle deine wichtigen Aufgaben abdeckst. Erhöht Intelligenz um <%= int %>. Limitierte Herbstausrüstung 2025."
}

View File

@@ -278,5 +278,9 @@
"summer2025ScallopWarriorSet": "Jakobsmuschel Krieger Set",
"summer2025SquidRogueSet": "Tintenfisch Schurken Set",
"summer2025SeaAngelHealerSet": "Ruderschnecken Heiler Set",
"summer2025FairyWrasseMageSet": "Feenlippfisch Magier Set"
"summer2025FairyWrasseMageSet": "Feenlippfisch Magier Set",
"fall2025SasquatchWarriorSet": "Sasquatch Krieger Set",
"fall2025SkeletonRogueSet": "Skelett Schurken Set",
"fall2025KoboldHealerSet": "Kobold Heiler Set",
"fall2025MaskedGhostMageSet": "Maskengeist Magier Set"
}

View File

@@ -5,10 +5,8 @@
"welcomeTo": "Willkommen in",
"welcomeBack": "Willkommen zurück!",
"justin": "Justin",
"justinIntroMessage1": "Hallo! Du musst neu hier sein. Mein Name ist <strong>Justin</strong>, und ich werde Dein Reiseleiter in Habitica sein.",
"justinIntroMessage1": "Hallo! Du musst neu hier sein. Ich bin <strong>Justin</strong>, ich werde dein Reiseleiter in Habitica sein. Also wie würdest du gerne aussehen? Keine Sorge, du kannst das später ändern.",
"justinIntroMessage3": "Großartig! Woran möchtest Du auf dieser Reise arbeiten?",
"justinIntroMessageUsername": "Bevor wir beginnen, sollten wir herausfinden, wie wir Dich nennen sollen. Unterhalb findest Du einen Anzeigenamen und einen Benutzernamen, den ich für Dich erzeugt habe. Nachdem Du einen Anzeigenamen und einen Benutzernamen gewählt hast, fangen wir mit Deinem Avatar an!",
"justinIntroMessageAppearance": "Und wie möchtest Du aussehen? Keine Angst, Du kannst das auch später noch ändern.",
"introTour": "Los geht's! Basierend auf Deinen Interessen habe ich Dir ein paar Aufgaben erstellt, damit Du gleich loslegen kannst. Klicke auf eine Aufgabe um sie zu bearbeiten oder erstelle neue Aufgaben, wie Du sie brauchst!",
"prev": "Zurück",
"next": "Vor",

View File

@@ -257,5 +257,19 @@
"changeClassDisclaimer": "Bei Änderung deiner Klasse bekommst du alle deine vorhandenen Attributspunkte erstattet. Passe deine Attributspunkte im Attributwerte-Abschnitt deines Profils an, sobald du eine neue Klasse gewählt hast.",
"APITokenDisclaimer": "<b>Dein API-Schlüssel ist wie ein Passwort. Teile ihn niemals öffentlich.</b> Du wirst ggf. nach deiner Benutzer-ID gefragt, aber schreibe deinen API-Schlüssel niemals dort, wo andere ihn sehen könnten bspw. Github.<br><br><b>Hinweis:</b> Falls du ein neues API-Schlüssel brauchst (z.B., weil du ihn versehentlich geteilt hast), kannst du dein Passwort ändern, um ihn zurückzusetzen. Einmal zurückgesetzt, musst du dich auf all deinen Geräten, auf denen du Habitica verwendest, erneut anmelden und deinen neuen API-Schlüssel in Drittanbieter-Anwendungen angeben, die du verwendest.",
"thirdPartyTools": "Drittanbieter Apps, Erweiterungen, und alle möglichen anderen Tools, die du mit deinem Account nutzen kannst, findest du im <a href='https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Habitica Wiki</a>.",
"transaction_subscription_bonus": "<b>Abonnement</b>-Bonus"
"transaction_subscription_bonus": "<b>Abonnement</b>-Bonus",
"acceptAllCookies": "Alle Cookies akzeptieren",
"denyNonEssentialCookies": "Nicht-erforderliche Cookies ablehnen",
"managePrivacyPreferences": "Privatsphäre-Einstellungen anpassen",
"yourPrivacyPreferences": "Deine Privatsphäre-Einstellungen",
"learnMorePrivacy": "Um mehr zu erfahren schau dir unsere <a href='/static/privacy' target='_blank'>Datenschutz-Bestimmungen</a> an.",
"strictlyNecessary": "Technisch notwendig",
"alwaysActive": "Immer aktiv",
"requiredToRun": "Diese werden von unseren Apps und Websites benötigt um bestmöglich zu funktionieren.",
"savePreferences": "Einstellungen speichern",
"habiticaPrivacyPolicy": "Habiticas Datenschutz-Bestimmungen",
"privacyOverview": "Heutzutage scheint jedes Unternehmen von deinen Daten profitieren zu wollen. Das kann es schwierig machen, die richtige App zur Verbesserung deiner Gewohnheiten zu finden. Habitica verwendet Cookies, die Daten nur zur Leistungsanalyse, zur Bearbeitung von Supportanfragen und zur Bereitstellung des bestmöglichen gamifizierten Erlebnisses speichern. Du kannst dies jederzeit in deinen Kontoeinstellungen ändern.",
"privacySettingsOverview": "Habitica verwendet Cookies zur Leistungsanalyse, Bearbeitung von Supportanfragen und Bereitstellung des bestmöglichen gamifizierten Erlebnisses. Hierfür benötigen wir die folgenden Berechtigungen. Du kannst dies jederzeit in deinen Kontoeinstellungen ändern.",
"performanceAnalytics": "Leistung und Analyse",
"usedForSupport": "Diese werden verwendet, um Benutzererfahrung, Leistung und Dienste unserer Websites und Apps zu verbessern. Diese Daten werden von unserem Support-Team für die Bearbeitung von Anfragen und Fehlermeldungen verwendet."
}

View File

@@ -266,5 +266,8 @@
"mysterySet202505": "Hochfliegender Schwalbenschwanz Set",
"mysterySet202506": "Sonnenschein Set",
"mysterySet202507": "Draufgängerisches Skater Set",
"mysterySet202508": "Strahlendes Klingen Set"
"mysterySet202508": "Strahlendes Klingen Set",
"mysterySet202510": "Gleitender Ghul Set",
"mysterySet202511": "Frost Krieger Set",
"mysterySet202509": "Windgepeitschter Wanderer Set"
}

View File

@@ -1039,6 +1039,18 @@
"backgroundSunnyStreetWithShopsText": "Sunny Street with Shops",
"backgroundSunnyStreetWithShopsNotes": "Enjoy the sights and sounds of a Sunny Street with Shops.",
"backgrounds092025": "SET 136: Released September 2025",
"backgroundAutumnSwampText": "Autumn Swamp",
"backgroundAutumnSwampNotes": "Take in the haunting vibes of an Autumn Swamp.",
"backgrounds102025": "SET 137: Released October 2025",
"backgroundInsideForestWitchsCottageText": "Forest Witch's Cottage",
"backgroundInsideForestWitchsCottageNotes": "Weave spells inside a Forest Witch's Cottage.",
"backgrounds112025": "SET 138: Released November 2025",
"backgroundCastleKeepWithBannersText": "Castle Hall with Banners",
"backgroundCastleKeepWithBannersNotes": "Sing tales of heroic deeds in a Castle Hall with Banners.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",

View File

@@ -1,6 +1,5 @@
{
"FAQ": "FAQ",
"termsAndAgreement": "By clicking the button below, you are indicating that you have read and agree to the <a href='/static/terms'>Terms of Service</a> and <a href='/static/privacy'>Privacy Policy</a>.",
"chores": "Chores",
"clearBrowserData": "Clear Browser Data",
"communityExtensions": "Add-ons & Extensions",
@@ -24,7 +23,7 @@
"guidanceForBlacksmiths": "Guidance for Blacksmiths",
"history": "History",
"invalidEmail": "A valid email address is required in order to perform a password reset.",
"login": "Login",
"login": "Log In",
"logout": "Log Out",
"marketing1Header": "Build better habits one level at a time!",
"marketing1Lead1Title": "Gamify your life",
@@ -91,14 +90,14 @@
"sync": "Sync",
"tasks": "Tasks",
"teams": "Teams",
"terms": "Terms and Conditions",
"terms": "Terms of Service",
"tumblr": "Tumblr",
"localStorageTryFirst": "If you are experiencing problems with Habitica, click the button below to clear local storage and most cookies for this website (other websites will not be affected). You will need to log in again after doing this, so first be sure that you know your log-in details, which can be found at Settings -> <%= linkStart %>Site<%= linkEnd %>.",
"localStorageTryNext": "If the problem persists, please <%= linkStart %>Report a Bug<%= linkEnd %> if you haven't already.",
"localStorageClear": "Clear Data",
"localStorageClearExplanation": "This button will clear local storage and most cookies, and log you out.",
"username": "Username",
"emailOrUsername": "Email or Username (case-sensitive)",
"emailOrUsername": "Username or Email (case-sensitive)",
"work": "Work",
"reportAccountProblems": "Report Account Problems",
"reportCommunityIssues": "Report Community Issues",
@@ -129,9 +128,10 @@
"usernameTaken": "Username already taken.",
"passwordConfirmationMatch": "Password confirmation doesn't match password.",
"minPasswordLength": "Password must be 8 characters or more.",
"minPasswordLengthLogin": "Your password is at least 8 characters long.",
"passwordResetPage": "Reset Password",
"passwordReset": "If we have your email or username on file, instructions for setting a new password have been sent to your email.",
"invalidLoginCredentialsLong": "Uh-oh - your email address / username or password is incorrect.\n- Make sure they are typed correctly. Your username and password are case-sensitive.\n- You may have signed up with Facebook or Google-sign-in, not email so double-check by trying them.\n- If you forgot your password, click \"Forgot Password\".",
"invalidLoginCredentialsLong": "Your email, username, or password are incorrect. Please try again or use \"Forgot Password.\"",
"invalidCredentials": "There is no account that uses those credentials.",
"accountSuspended": "This account, User ID \"<%= userId %>\", has been blocked for breaking the Community Guidelines (https://habitica.com/static/community-guidelines) or Terms of Service (https://habitica.com/static/terms). For details or to ask to be unblocked, please email our Community Manager at <%= communityManagerEmail %> or ask your parent or guardian to email them. Please include your @Username in the email.",
"accountSuspendedTitle": "Account has been suspended",
@@ -142,12 +142,13 @@
"invalidReqParams": "Invalid request parameters.",
"memberIdRequired": "\"member\" must be a valid UUID.",
"heroIdRequired": "\"heroId\" must be a valid UUID.",
"cannotFulfillReq":"Your request cannot be fulfilled. Email admin@habitica.com if this error persists.",
"modelNotFound":"This model does not exist.",
"signUpWithSocial": "Sign up with <%= social %>",
"cannotFulfillReq": "Please enter a valid email address. Email admin@habitica.com if this error persists.",
"enterValidEmail": "Please enter a valid email address.",
"modelNotFound": "This model does not exist.",
"signUpWithSocial": "Continue with <%= social %>",
"loginWithSocial": "Log in with <%= social %>",
"confirmPassword": "Confirm Password",
"usernameLimitations": "Username must be 1 to 20 characters, containing only letters a to z, numbers 0 to 9, hyphens, or underscores, and cannot include any inappropriate terms.",
"usernameLimitations": "Usernames can be changed at any time. They must be 1 to 20 characters, containing only letters a to z, numbers 0 to 9, hyphens, or underscores.",
"usernamePlaceholder": "e.g., HabitRabbit",
"emailPlaceholder": "e.g., gryphon@example.com",
"emailUsernamePlaceholder": "e.g., habitrabbit or gryphon@example.com",
@@ -184,5 +185,7 @@
"getStarted": "Get Started",
"mobileApps": "Mobile Apps",
"learnMore": "Learn More",
"translateHabitica": "Translate Habitica"
"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>"
}

View File

@@ -558,7 +558,16 @@
"weaponSpecialSummer2025HealerText": "Sea Angel Wing Paddle",
"weaponSpecialSummer2025HealerNotes": "Draw a figure eight as you move forward, making great progress on your tasks. Increases Intelligence by <%= int %>. Limited Edition Summer 2025 Gear.",
"weaponSpecialSummer2025MageText": "Branch Coral",
"weaponSpecialSummer2025MageNotes": "Branch out with your talents and skills to tackle a variety of tasks. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Summer 2025 Gear",
"weaponSpecialSummer2025MageNotes": "Branch out with your talents and skills to tackle a variety of tasks. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Summer 2025 Gear.",
"weaponSpecialFall2025WarriorText": "Sasquatch Axe",
"weaponSpecialFall2025WarriorNotes": "A mighty weapon to cut a safe path through an autumn forest full of complications. Increases Strength by <%= str %>. Limited Edition Fall 2025 Gear.",
"weaponSpecialFall2025RogueText": "Skeleton Blade",
"weaponSpecialFall2025RogueNotes": "A mighty weapon to cut a safe path through an autumn forest full of obstacles. Increases Strength by <%= str %>. Limited Edition Fall 2025 Gear.",
"weaponSpecialFall2025HealerText": "Kobold Axe",
"weaponSpecialFall2025HealerNotes": "A mighty weapon to cut a safe path through an autumn forest full of impediments. Increases Intelligence by <%= int %>. Limited Edition Fall 2025 Gear.",
"weaponSpecialFall2025MageText": "Masked Ghost Axe",
"weaponSpecialFall2025MageNotes": "A mighty weapon to cut a safe path through an autumn forest full of frights. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Fall 2025 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.",
@@ -602,6 +611,8 @@
"weaponMystery202408Notes": "A magic bubble shield that protects you from enemy spells or helps you float in the air or water. Confers no benefit. August 2024 Subscriber Item.",
"weaponMystery202508Text": "Brilliant Crimson Blade",
"weaponMystery202508Notes": "This spinning blade will terrify any monster or red Daily that crosses your path! Confers no benefit. August 2025 Subscriber Item.",
"weaponMystery202511Text": "Frost Sword",
"weaponMystery202511Notes": "The icy glow of this sword will make quick work of even dark red tasks. Confers no benefit. November 2025 Subscriber Item.",
"weaponMystery301404Text": "Steampunk Cane",
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
@@ -811,19 +822,21 @@
"weaponArmoireShadyBeachUmbrellaText": "Beach Umbrella",
"weaponArmoireShadyBeachUmbrellaNotes": "The shade of this rainbow-colored umbrella conceals you briefly from the day star and any unwanted bothers. Increases Perception by <%= per %>. Enchanted Armoire: Beachside Set (Item 3 of 4).",
"weaponArmoireCorsairsBladeText": "Corsairs Blade",
"weaponArmoireCorsairsBladeNotes": "Whether you wield it to plunder or to protect, you can be glad you brought this fierce blade to sea with you. Just be sure to stow it safely when not in use. Increases Strength by <%= str %>. Enchanted Armoire: Corsair Set (Item 3 of 3)",
"weaponArmoireCorsairsBladeNotes": "Whether you wield it to plunder or to protect, you can be glad you brought this fierce blade to sea with you. Just be sure to stow it safely when not in use. Increases Strength by <%= str %>. Enchanted Armoire: Corsair Set (Item 3 of 3).",
"weaponArmoireDragonKnightsLanceText": "Dragon Knight Lance",
"weaponArmoireDragonKnightsLanceNotes": "This red and silver lance has unseated many opponents from their mounts. Increases Constitution by <%= con %>. Enchanted Armoire: Dragon Knight Set (Item 3 of 3)",
"weaponArmoireDragonKnightsLanceNotes": "This red and silver lance has unseated many opponents from their mounts. Increases Constitution by <%= con %>. Enchanted Armoire: Dragon Knight Set (Item 3 of 3).",
"weaponArmoireFunnyFoolBatonText": "Funny Fool Baton",
"weaponArmoireFunnyFoolBatonNotes": "With a wave of your baton you can deliver a punchline, redirect attention, or summon applause. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Funny Fool Set (Item 3 of 3)",
"weaponArmoireFunnyFoolBatonNotes": "With a wave of your baton you can deliver a punchline, redirect attention, or summon applause. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Funny Fool Set (Item 3 of 3).",
"weaponArmoireSpookyCandyBucketText": "Spooky Candy Bucket",
"weaponArmoireSpookyCandyBucketNotes": "With an epic costume like that, youre going to get so much candy! Good thing youve got this bottomless bucket to hold it all. Try not to snack on any until you get home. Increases Intelligence by <%= int %>. Enchanted Armoire: Fright Night Set (Item 2 of 2)",
"weaponArmoireSpookyCandyBucketNotes": "With an epic costume like that, youre going to get so much candy! Good thing youve got this bottomless bucket to hold it all. Try not to snack on any until you get home. Increases Intelligence by <%= int %>. Enchanted Armoire: Fright Night Set (Item 2 of 2).",
"weaponArmoireStormKnightAxeText": "Storm Knight Axe",
"weaponArmoireStormKnightAxeNotes": "Gather your fury and strike a blow like thunder! Increases Strength by <%= str %>. Enchanted Armoire: Storm Knight Set (Item 3 of 3)",
"weaponArmoireStormKnightAxeNotes": "Gather your fury and strike a blow like thunder! Increases Strength by <%= str %>. Enchanted Armoire: Storm Knight Set (Item 3 of 3).",
"weaponArmoireGildedKnightsSpearText": "Gilded Knight Spear",
"weaponArmoireGildedKnightsSpearNotes": "With this weapon, you can make sure everybody always pays their debts. Increases Strength by <%= str %>. Enchanted Armoire: Gilded Knight Set (Item 3 of 3)",
"weaponArmoireGildedKnightsSpearNotes": "With this weapon, you can make sure everybody always pays their debts. Increases Strength by <%= str %>. Enchanted Armoire: Gilded Knight Set (Item 3 of 3).",
"weaponArmoireBeekeepersSmokerText": "Smoker",
"weaponArmoireBeekeepersSmokerNotes": "Use this to calm your bees so you can retrieve some honey. The bees wont mind. Honestly, we could all use a few extra minutes of calm from time to time. Increases Intelligence by <%= int %>. Enchanted Armoire: Beekeeper Set (Item 3 of 4)",
"weaponArmoireBeekeepersSmokerNotes": "Use this to calm your bees so you can retrieve some honey. The bees wont mind. Honestly, we could all use a few extra minutes of calm from time to time. Increases Intelligence by <%= int %>. Enchanted Armoire: Beekeeper Set (Item 3 of 4).",
"weaponArmoireBlacksmithsHammerText": "Blacksmith's Hammer",
"weaponArmoireBlacksmithsHammerNotes": "This hammer is for metalworking, but it is perfectly adept amidst hot red coals and hot red Daily tasks, as well. Increases Strength by <%= str %>. Enchanted Armoire: Blacksmith Set (Item 3 of 3).",
"armor": "armor",
"armorCapitalized": "Armor",
@@ -1364,6 +1377,15 @@
"armorSpecialSummer2025MageText": "Fairy Wrasse Suit",
"armorSpecialSummer2025MageNotes": "Not only does this suit have stunning colors, but it allows you to glide beautifully through the water. Swim or dance—the choice is yours! Increases Intelligence by <%= int %>. Limited Edition Summer 2025 Gear.",
"armorSpecialFall2025WarriorText": "Sasquatch Armor",
"armorSpecialFall2025WarriorNotes": "Neither your big feet nor your big body will be too large to fit into this seasonal armor. Increases Constitution by <%= con %>. Limited Edition Fall 2025 Gear.",
"armorSpecialFall2025RogueText": "Skeleton Armor",
"armorSpecialFall2025RogueNotes": "A hard and narrow target in this seasonal armor is hardest to hit. Increases Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
"armorSpecialFall2025HealerText": "Kobold Armor",
"armorSpecialFall2025HealerNotes": "This seasonal armor lets you blend into the dark woods to make a strategic retreat. Increases Constitution by <%= con %>. Limited Edition Fall 2025 Gear.",
"armorSpecialFall2025MageText": "Masked Ghost Armor",
"armorSpecialFall2025MageNotes": "This seasonal armor becomes noncorporeal only after you put it on. Increases Intelligence by <%= int %>. Limited Edition Fall 2025 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",
@@ -1498,6 +1520,8 @@
"armorMystery202502Notes": "Youre full of kind-hearted jokes and japes from your ruffled collar to your gigantic shoes! Confers no benefit. February 2025 Subscriber Item.",
"armorMystery202504Text": "Elusive Yeti Armor",
"armorMystery202504Notes": "Abominable? More like adorable! Confers no benefit. April 2025 Subscriber Item.",
"armorMystery202509Text": "Windswept Wanderer's Robe",
"armorMystery202509Notes": "Bright silks protect you from the weather, hot or cold. Confers no benefit. September 2025 Subscriber Item.",
"armorMystery301404Text": "Steampunk Suit",
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
@@ -1740,6 +1764,12 @@
"armorArmoireFlyFishingWadersNotes": "Stay perfectly warm and dry when you wade into a stream, pond, lake, or river. Increases Strength and Constitution by <%= attrs %> each. Enchanted Armoire: Fly Fishing Set (Item 2 of 3)",
"armorArmoireRedWaistcoatText": "Red Waistcoat",
"armorArmoireRedWaistcoatNotes": "Look smart and stunning as you tackle your tasks. Theres something secret hidden in the vest pocket—what do you think it could be? Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Red Waistcoat Set (Item 2 of 2)",
"armorArmoireSoftOrangeSuitText": "Soft Orange Suit",
"armorArmoireSoftOrangeSuitNotes": "Orange is a vibrant color. Wear this to bed, and youre sure to succeed in whatever adventures you come across in your dreams. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Orange Loungewear Set (Item 2 of 3).",
"armorArmoireBlacksmithsApronText": "Blacksmith's Apron",
"armorArmoireBlacksmithsApronNotes": "This apron doesnt feel as heavy as it looks once youve got it on. It will shield you from stray sparks while allowing you to maneuver freely. Increases Constitution by <%= con %>. Enchanted Armoire: Blacksmith Set (Item 2 of 3).",
"armorArmoireBlackPartyDressText": "Black Party Dress",
"armorArmoireBlackPartyDressNotes": "Youre strong, smart, hearty, and so fashionable! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 2 of 2).",
"headgear": "helm",
"headgearCapitalized": "Headgear",
@@ -2274,6 +2304,15 @@
"headSpecialSummer2025MageText": "Fairy Wrasse Headdress",
"headSpecialSummer2025MageNotes": "All will be mesmerized by the way your fins move with the currents. Increases Perception by <%= per %>. Limited Edition Summer 2025 Gear.",
"headSpecialFall2025WarriorText": "Sasquatch Mask",
"headSpecialFall2025WarriorNotes": "Round and hairy, this mask covers your head while you cover all your important tasks. Increases Strength by <%= str %>. Limited Edition Fall 2025 Gear.",
"headSpecialFall2025RogueText": "Skeleton Mask",
"headSpecialFall2025RogueNotes": "Pale and hooded, this mask covers your head while you cover all your important tasks. Increases Perception by <%= per %>. Limited Edition Fall 2025 Gear.",
"headSpecialFall2025HealerText": "Kobold Mask",
"headSpecialFall2025HealerNotes": "Striking and horned, this mask covers your head while you cover all your important tasks. Increases Intelligence by <%= int %>. Limited Edition Fall 2025 Gear.",
"headSpecialFall2025MageText": "Masked Ghost Mask",
"headSpecialFall2025MageNotes": "Ethereal and glowy, this mask covers your head while you cover all your important tasks. Increases Perception by <%= per %>. Limited Edition Fall 2025 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.",
@@ -2679,6 +2718,12 @@
"headArmoireFlyFishingHatNotes": "With a wide brim and spot to hold a spare lure, dont go fly fishing without this beauty. Increases Strength and Perception by <%= attrs %> each. Enchanted Armoire: Fly Fishing Set (Item 1 of 3)",
"headArmoireRedNewsieHatText": "Red Newsie Cap",
"headArmoireRedNewsieHatNotes": "Extra! Extra! Read all about it: this cap is comfortable, fashionable, and practical. Increases Perception and Intelligence by <%= attrs %> each. Enchanted Armoire: Red Waistcoat Set (Item 1 of 2)",
"headArmoireFloppyOrangeHatText": "Orange Floppy Hat",
"headArmoireFloppyOrangeHatNotes": "Many spells have been sewn into this simple hat, giving it an outrageous orange color. Increases all stats by <%= attrs %> each. Enchanted Armoire: Orange Loungewear Set (Item 1 of 3).",
"headArmoireBlackHairbowText": "Black Hairbow",
"headArmoireBlackHairbowNotes": "Become strong, smart, and hearty while wearing this beautiful Black Hairbow! Increases Strength, Intelligence, and Constitution by <%= attrs %> each. Enchanted Armoire: Black Hairbow Set (Item 1 of 2).",
"headArmoireBlacksmithsGogglesText": "Blacksmith's Goggles",
"headArmoireBlacksmithsGogglesNotes": "Shatter and heat-resistant ocular protection is yours when youre working in a forge. Increases Perception by <%= per %>. Enchanted Armoire: Blacksmith Set (Item 1 of 3).",
"offhand": "off-hand item",
"offHandCapitalized": "Off-Hand Item",
@@ -2981,11 +3026,16 @@
"shieldSpecialSummer2025WarriorText": "Scallop Shell Shield",
"shieldSpecialSummer2025WarriorNotes": "The colors are beautiful, but the ridges are dangerous. Foes, look out! Increases Constitution by <%= con %>. Limited Edition Summer 2025 Gear.",
"shieldSpecialSummer2025RogueText": "Squid Tentacle",
"shieldSpecialSummer2025RogueNotes": "This tentacle looks willowy, but its suckers grip tight. Foes, look out! Increases Strength by <%= str %>. Limited Edition Summer 2025 Gear.",
"shieldSpecialSummer2025HealerText": "Sea Angel Shield",
"shieldSpecialSummer2025HealerNotes": "This shield looks simple, but it has noxious properties. Foes, look out! Increases Constitution by <%= con %>. Limited Edition Summer 2025 Gear.",
"shieldSpecialFall2025WarriorText": "Sasquatch Shield",
"shieldSpecialFall2025WarriorNotes": "Buy yourself some extra time to think and plan by shielding yourself from your next Dailies. Increases Constitution by <%= con %>. Limited Edition Fall 2025 Gear.",
"shieldSpecialFall2025RogueNotes": "A mighty weapon to cut your To Dos right in half. Increases Strength by <%= str %>. Limited Edition Fall 2025 Gear.",
"shieldSpecialFall2025HealerText": "Kobold Shield",
"shieldSpecialFall2025HealerNotes": "Buy yourself some extra time to gather supplies by shielding yourself from your chores. Increases Constitution by <%= con %>. Limited Edition Fall 2025 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",
@@ -3013,7 +3063,9 @@
"shieldMystery202506Text": "Solar Shine Shield",
"shieldMystery202506Notes": "Dispel darkness and bestow warm and cheerful rays wherever you are. Confers no benefit. June 2025 Subscriber Item.",
"shieldMystery202508Text": "Brilliant Cyan Blade",
"shieldMystery202508Notes": "If you thought one spinning blade was cool looking, try two! Confers no benefit. August 2025 Subscriber Item.",
"shieldMystery202508Notes": "If you thought one spinning blade was cool looking, try two! Confers no benefit. August 2025 Subscriber Item.",
"shieldMystery202511Text": "Frost Shield",
"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.",
"shieldMystery301405Text": "Clock Shield",
"shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.",
@@ -3190,6 +3242,8 @@
"shieldArmoireBeekeepersHiveNotes": "Beehives serve as both homes and worksites. You might need to talk to your bees about a good work-life balance. Increases Strength by <%= str %>. Enchanted Armoire: Beekeeper Set (Item 4 of 4)",
"shieldArmoireFlyFishingRodText": "Fly Fishing Rod",
"shieldArmoireFlyFishingRodNotes": "Put a lure on this long and flexible rod and fish will mistake it for an insect every single time. Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Fly Fishing Set (Item 3 of 3)",
"shieldArmoireSoftOrangePillowText": "Soft Orange Pillow",
"shieldArmoireSoftOrangePillowNotes": "The ready warrior packs a pillow for any expedition. Get ready to take on new obligations… even while you nap. Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Orange Loungewear Set (Item 3 of 3).",
"back": "Back Accessory",
"backBase0Text": "No Back Accessory",
@@ -3278,6 +3332,8 @@
"backMystery202506Notes": "Bring a warm glow with you as you go about your daily tasks. Confers no benefit. June 2025 Subscriber Item.",
"backMystery202507Text": "Spunky Skateboard",
"backMystery202507Notes": "Your steed for the sidewalks and halfpipes. Confers no benefit. July 2025 Subscriber Item.",
"backMystery202510Text": "Gliding Ghoul Wings",
"backMystery202510Notes": "Fly silently across the haunted skies with these giant wings. Confers no benefit. October 2025 Subscriber Item.",
"backSpecialWonderconRedText": "Mighty Cape",
"backSpecialWonderconRedNotes": "Swishes with strength and beauty. Confers no benefit. Special Edition Convention Item.",
@@ -3369,6 +3425,8 @@
"bodyMystery202107Notes": "This trusty companion will never let you down and will always keep your spirits buoyant! Confers no benefit. July 2021 Subscriber Item.",
"bodyMystery202411Text": "Bristled Pauldrons",
"bodyMystery202411Notes": "The formidable spikes on these pauldrons are perfect for charging ahead with your to-do list. Confers no benefit. November 2024 Subscriber Item.",
"bodyMystery202509Text": "Windswept Wanderer's Scarf",
"bodyMystery202509Notes": "This scarf shields your face from the wind and also - looks pretty darn cool. Confers no benefit. September 2025 Subscriber Item.",
"bodyArmoireCozyScarfText": "Cozy Scarf",
"bodyArmoireCozyScarfNotes": "This fine scarf will keep you warm as you go about your wintry business. Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Lamplighter's Set (Item 4 of 4).",
@@ -3626,7 +3684,8 @@
"eyewearMystery202406Notes": "Try to avoid having this pulled off by a gang of meddling kids and their talking dog. Confers no benefit. June 2024 Subscriber Item.",
"eyewearMystery202503Text": "Jade Juggernaut Eyes",
"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.",
"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.",

View File

@@ -235,6 +235,10 @@
"summer2025SquidRogueSet": "Squid Rogue Set",
"summer2025SeaAngelHealerSet": "Sea Angel Healer Set",
"summer2025FairyWrasseMageSet": "Fairy Wrasse Mage Set",
"fall2025SasquatchWarriorSet": "Sasquatch Warrior Set",
"fall2025SkeletonRogueSet": "Skeleton Rogue Set",
"fall2025KoboldHealerSet": "Kobold Healer Set",
"fall2025MaskedGhostMageSet": "Masked Ghost Mage Set",
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION, GET ONE FREE!",
"winterPromoGiftDetails1": "Until January 6th only, when you gift somebody a subscription, you get the same subscription for yourself for free!",
"winterPromoGiftDetails2": "Please note that if you or your gift recipient already have a recurring subscription, the gifted subscription will only start after that subscription is cancelled or has expired. Thanks so much for your support! <3",

View File

@@ -5,10 +5,8 @@
"welcomeTo": "Welcome to",
"welcomeBack": "Welcome back!",
"justin": "Justin",
"justinIntroMessage1": "Hello there! You must be new here. My name is <strong>Justin</strong>, and I'll be your guide in Habitica.",
"justinIntroMessage1": "Hello there! You must be new here. I'm <strong>Justin</strong>, I'll be your guide in Habitica. So how would you like to look? Don't worry, you can change this later.",
"justinIntroMessage3": "Great! Now, what are you interested in working on throughout this journey?",
"justinIntroMessageUsername": "Before we begin, lets figure out what to call you. Below youll find a display name and username Ive generated for you. After youve picked a display name and username, well get started by creating an avatar!",
"justinIntroMessageAppearance": "So how would you like to look? Dont worry, you can change this later.",
"introTour": "Here we are! I've filled out some Tasks for you based on your interests, so you can get started right away. Click a Task to edit or add new Tasks to fit your routine!",
"prev": "Prev",
"next": "Next",

View File

@@ -257,5 +257,19 @@
"transaction_admin_update_hourglasses": "<b>Admin</b> updated",
"connected": "Connected",
"connect": "Connect",
"remove": "Remove"
"remove": "Remove",
"privacyOverview": "In today's world, it feels like every company is looking to profit from your data. This can make it difficult to find the right app to improve your habits. Habitica uses cookies that store data only to analyze performance, handle support requests, and provide you with the best possible gamified experience. You can change this at any time from your account settings.",
"acceptAllCookies": "Accept All Cookies",
"denyNonEssentialCookies": "Deny Non-Essential Cookies",
"managePrivacyPreferences": "Manage Your Privacy Preferences",
"yourPrivacyPreferences": "Your Privacy Preferences",
"privacySettingsOverview": "Habitica uses cookies to analyze performance, handle support requests, and provide you with the best possible gamified experience. To do that, we need to request the following permissions. You can change these at any time from your account settings.",
"learnMorePrivacy": "To learn more, review our <a href='/static/privacy' target='_blank'>Privacy Policy</a>.",
"strictlyNecessary": "Strictly Necessary",
"alwaysActive": "Always Active",
"requiredToRun": "These are required by our website and apps to run at their best.",
"performanceAnalytics": "Performance and Analytics",
"usedForSupport": "These are used to improve the user experience, performance, and services of our website and apps. This data is used by our support team when handling requests and bug reports.",
"savePreferences": "Save Preferences",
"habiticaPrivacyPolicy": "Habitica's Privacy Policy"
}

View File

@@ -177,6 +177,9 @@
"mysterySet202506": "Solar Shine Set",
"mysterySet202507": "Spunky Skater Set",
"mysterySet202508": "Brilliant Blade Set",
"mysterySet202509": "Windswept Wanderer Set",
"mysterySet202510": "Gliding Ghoul Set",
"mysterySet202511": "Frost Warrior Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",

View File

@@ -1,6 +1,5 @@
{
"FAQ": "FAQ",
"termsAndAgreement": "By clicking the button below, you are indicating that you have read and agree to the <a href='/static/terms'>Terms of Service</a> and <a href='/static/privacy'>Privacy Policy</a>.",
"chores": "Chores",
"clearBrowserData": "Clear Browser Data",
"communityExtensions": "Add-ons & Extensions",
@@ -183,5 +182,6 @@
"translateHabitica": "Translate Habitica",
"marketing3Lead1Title": "Android & iOS apps",
"marketing4Lead3Button": "Get Started Today",
"missingClientHeader": "Missing x-client headers."
"missingClientHeader": "Missing x-client headers.",
"emailBlockedRegistration": "This E-Mail is blocked from registration. If you think this is a mistake, please contact us at admin@habitica.com."
}

View File

@@ -1174,7 +1174,7 @@
"headArmoireRedHairbowText": "Red Hairbow",
"headArmoireRedHairbowNotes": "Become strong, tough, and smart while wearing this beautiful Red Hairbow! Increases Strength by <%= str %>, Constitution by <%= con %>, and Intelligence by <%= int %>. Enchanted Armoire: Red Hairbow Set (Item 1 of 2).",
"headArmoireVioletFloppyHatText": "Violet Floppy Hat",
"headArmoireVioletFloppyHatNotes": "Many spells have been sewn into this simple hat, giving it a pleasing purple colour. Increases Perception by <%= per %>, Intelligence by <%= int %>, and Constitution by <%= con %>. Enchanted Armoire: Independent Item.",
"headArmoireVioletFloppyHatNotes": "Many spells have been sewn into this simple hat, giving it a pleasing purple color. Increases Perception by <%= per %>, Intelligence by <%= int %>, and Constitution by <%= con %>. Enchanted Armoire: Violet Loungewear Set (Item 1 of 3).",
"headArmoireGladiatorHelmText": "Gladiator Helm",
"headArmoireGladiatorHelmNotes": "To be a gladiator you must be not only strong.... but cunning. Increases Intelligence by <%= int %> and Perception by <%= per %>. Enchanted Armoire: Gladiator Set (Item 1 of 3).",
"headArmoireRancherHatText": "Rancher Hat",
@@ -1575,7 +1575,7 @@
"bodyMystery201901Notes": "These shimmering pauldrons are strong, but will rest on your shoulders as weightlessly as a ray of dancing light. Confers no benefit. January 2019 Subscriber Item.",
"bodyArmoireCozyScarfText": "Cozy Scarf",
"bodyArmoireCozyScarfNotes": "This fine scarf will keep you warm as you go about your wintry business. Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Lamplighter's Set (Item 4 of 4).",
"headAccessory": "head accessory",
"headAccessory": "Head Accessory",
"accessories": "Accessories",
"animalEars": "Animal Ears",
"headAccessoryBase0Text": "No Head Accessory",
@@ -2252,12 +2252,12 @@
"armorSpecialBirthday2021Text": "Extravagant Party Robes",
"weaponMystery202102Notes": "The glowing pink gem in this wand holds the power to spread joy and friendship far and wide! Confers no benefit. February 2021 Subscriber Item.",
"weaponMystery202102Text": "Charming Wand",
"weaponSpecialSpring2024WarriorNotes": "This colorful crystal will help concentrate all your energy into an attack. Increases Strength by <%= str %>. Limited Edition Spring 2024 Gear.",
"weaponSpecialSpring2024WarriorNotes": "This colourful crystal will help concentrate all your energy into an attack. Increases Strength by <%= str %>. Limited Edition Spring 2024 Gear.",
"weaponArmoirePotionDesertNotes": "With this potion in hand, you dont have to be stranded on a deserted island to find a desert-coloured pet to share your dessert with! Increases Strength by <%= str %> and Constitution by <%= con %>. Enchanted Armoire: Potion Set (Item 3 of 10)",
"armorSpecialSummer2022HealerNotes": "Use your colourful fins to scoot about the reef and help those in need of rest and healing. Increases Constitution by <%= con %>. Limited Edition 2022 Summer Gear.",
"weaponSpecialSpring2023HealerNotes": "With a puff and a sparkle, you deploy new growth, joy, and colour. Increases Intelligence by <%= int %>. Limited Edition 2023 Spring Gear.",
"gearItemsCompleted": "You own all <%= klass %> gear! New gear is released during the seasonal Galas.",
"moreArmoireGearAvailable": "Until then, there's <%= armoireCount %> pieces of gear in the Enchanted Wardrobe to find!",
"moreArmoireGearAvailable": "Until then, there's <%= armoireCount %> pieces of gear in the Enchanted Armoire to find!",
"moreArmoireGearComing": "The Enchanted Wardrobe gets new stock every month too!",
"weaponSpecialSummer2021HealerText": "Staff of Corn",
"weaponSpecialSpring2021WarriorNotes": "Harness the power of the sun against your enemies, and let the sunstone bring you luck! Increases Strength by <%= str %>. Limited Edition 2021 Spring Gear.",
@@ -2348,5 +2348,30 @@
"weaponSpecialFall2023HealerText": "Log Great Hammer",
"weaponSpecialFall2023RogueNotes": "It takes an exceptionally strong stirrer to cook up bubbles and toiling troubles. Increases Strength by <%= str %>. Limited Edition 2023 Autumn Gear.",
"weaponSpecialFall2023WarriorText": "Tasty Popcorn",
"weaponSpecialFall2023WarriorNotes": "The most terrifying thing of all is the thought of a scary movie night with no snacks! Increases Strength by <%= str %>. Limited Edition 2023 Autumn Gear."
"weaponSpecialFall2023WarriorNotes": "The most terrifying thing of all is the thought of a scary movie night with no snacks! Increases Strength by <%= str %>. Limited Edition 2023 Autumn Gear.",
"armorSpecialSpring2021WarriorNotes": "Be careful you don't dazzle yourself as this sunstone armour catches the light! Increases Constitution by <%= con %>. Limited Edition 2021 Spring Gear.",
"weaponArmoireShadyBeachUmbrellaNotes": "The shade of this rainbow-coloured umbrella conceals you briefly from the day star and any unwanted bothers. Increases Perception by <%= per %>. Enchanted Armoire: Beachside Set (Item 3 of 4).",
"weaponSpecialWinter2025MageNotes": "This stunning, colourful show provides the perfect backdrop! Youll be unstoppable! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
"armorArmoireAdmiralsUniformNotes": "We salute you! This naval uniform signals that youre ready to take command of your tasks as well as a ship. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Admirals Set (Item 2 of 2).",
"weaponSpecialWinter2024RogueText": "Snowy Owl Bracer",
"weaponSpecialWinter2024WarriorText": "Candy Club",
"weaponSpecialWinter2024RogueNotes": "You are equipped with a flurry of feathers and talons! Hoot! Increases Strength by <%= str %>. Limited Edition Winter 2023-2024 Gear.",
"weaponSpecialWinter2024WarriorNotes": "A fine weapon, so long as you can stop yourself from eating it. Increases Strength by <%= str %>. Limited Edition Winter 2023-2024 Gear.",
"weaponSpecialWinter2024MageText": "Narwhal Wand",
"armorArmoireJewelersApronText": "Jeweller's Apron",
"armorSpecialSpring2021WarriorText": "Armour of the Sun",
"armorSpecialSpring2021MageText": "White Swan's Splendour",
"armorSpecialSpring2021MageNotes": "Your transformation is complete! Take to the sky, or to the lake, and sing for joy! Increases Intelligence by <%= int %>. Limited Edition 2021 Spring Gear.",
"weaponMystery202306Notes": "Shine proud and bring a shimmering prism of colour wherever you go! Confers no benefit. June 2023 Subscriber Item.",
"armorSpecialSummer2023MageNotes": "Feel protected and comfortable in these flowing robes, perfectly coloured for underwater adventures. Increases Intelligence by <%= int %>. Limited Edition 2023 Summer Gear.",
"weaponMystery202104Notes": "Your enemies had better look out- you've got powerful and prickly defences! Confers no benefit. April 2021 Subscriber Item.",
"weaponArmoireOrangeKiteNotes": "With colours like sunrise and sunset, lets see how high your kite can get! Increases all stats by <%= attrs %> each. Enchanted Armoire: Kite Set (Item 3 of 5)",
"armorArmoireJadeArmorText": "Jade Armour",
"armorSpecialSpring2021HealerText": "Willow Bark Coat",
"armorSpecialSpring2021HealerNotes": "This armour helps you bend instead of break when buffeted by wind or weapon. Increases Constitution by <%= con %>. Limited Edition 2021 Spring Gear.",
"armorSpecialSpring2021RogueNotes": "No one will see you waiting in amBUSH with this cunning armour; you look like a plant from every angle. Increases Perception by <%= per %>. Limited Edition 2021 Spring Gear.",
"weaponSpecialFall2023HealerNotes": "With slow, heavy attacks, this gnarled hammer deals out healing blows instead of damage. Increases Intelligence by <%= int %>. Limited Edition 2023 Autumn Gear.",
"armorArmoireJadeArmorNotes": "This jade armour is both beautiful and functional. Protect yourself, and know that you look fabulous! Increases Perception by <%= per %>. Enchanted Armoire: Jade Warrior Set (Item 2 of 3).",
"weaponSpecialWinter2024HealerText": "Torch",
"weaponSpecialSpring2024RogueText": "Silver Blade"
}

View File

@@ -7,8 +7,6 @@
"justin": "Justin",
"justinIntroMessage1": "Hello there! You must be new here. My name is <strong>Justin</strong>, and I'll be your guide in Habitica.",
"justinIntroMessage3": "Great! Now, what are you interested in working on throughout this journey?",
"justinIntroMessageUsername": "Before we begin, lets figure out what to call you. Below youll find a display name and username Ive generated for you. After youve picked a display name and username, well get started by creating an avatar!",
"justinIntroMessageAppearance": "So how would you like to look? Dont worry, you can change this later.",
"introTour": "Here we are! I've filled out some Tasks for you based on your interests, so you can get started right away. Click a Task to edit or add new Tasks to fit your routine!",
"prev": "Prev",
"next": "Next",

View File

@@ -843,5 +843,6 @@
"questAlpacaRageEffect": "The Overpacked Alpaca launches luggage at you! The boss regains 30% of its health!",
"questAlpacaDropAlpacaEgg": "Alpaca (egg)",
"questAlpacaNotes": "The sun beams down as you hike up the rocky trailheads of the Meandering Mountains. Youve been planning this expedition for your friend group for months, researching every aspect of the trip. The weight of supplies on your back is so much to bear, each step feels more like a burden than an adventure.<br><br>You hear a soft crunch of hooves on the trail behind you. A fluffy alpaca approaches with a gigantic stack of luggage on her back.<br><br>“Seems like youre dragging a bit, friend, and all youre carrying is a little backpack!” she says as she passes by.<br><br>“You make it look so easy,” you sigh. “I planned this trip for so long, but now that were here, Im not even having fun…”<br><br>“Dont get down on yourself,” the alpaca snorts. “Ill teach you a lesson I learned long ago!” She bucks, and suddenly a bundled bedroll is flying at you! How is this helping again?!",
"questAlpacaCompletion": "Luckily none of the bags the alpaca threw your way were heavy, but your hands are definitely full. “What was that about?” you ask, annoyed.<br><br>“If youre planning a trip with friends, you shouldnt be carrying your burden alone! Im sure your friends would rather you shake off a few things onto them than for you to collapse under the weight by yourself. Anyway, you can hand me those bags back. Im a seasoned pack animal and Ive made my point,” she says with a wink. “But keep that blue bundle as a reward for a hard lesson learned. Ill see you at the peak!”"
"questAlpacaCompletion": "Luckily none of the bags the alpaca threw your way were heavy, but your hands are definitely full. “What was that about?” you ask, annoyed.<br><br>“If youre planning a trip with friends, you shouldnt be carrying your burden alone! Im sure your friends would rather you shake off a few things onto them than for you to collapse under the weight by yourself. Anyway, you can hand me those bags back. Im a seasoned pack animal and Ive made my point,” she says with a wink. “But keep that blue bundle as a reward for a hard lesson learned. Ill see you at the peak!”",
"questPlatypusText": "The Perfectionist Platypus"
}

View File

@@ -169,7 +169,7 @@
"mysterySet202010": "Beguilingly Batty Set",
"mysterySet202009": "Marvellous Moth Set",
"cancelSubInfoApple": "Please follow <a href=\"https://support.apple.com/en-us/HT202039\">Apple's official instructions</a> to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
"cancelSubInfoGoogle": "Please go to the \"Account\" > \"Subscriptions\" section of the Google Play Store app to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
"cancelSubInfoGoogle": "To cancel your subscription or to view your subscription's termination date, please use the <a href='https://play.google.com/store/account/subscriptions'>Google Play Store</a>. Any leftover months of subscription credit will be added to your end date after cancellation.",
"organization": "Organisation",
"dropCapSubs": "Habitica subscribers can find twice as many random items each day and receive monthly mystery items!",
"lookingForMoreItems": "Looking for More Items?",
@@ -232,5 +232,7 @@
"mysterySet202302": "Trickster Tabby Set",
"mysterySet202304": "Tiptop Teapot Set",
"mysterySet202310": "Ghostlight Wraith Set",
"monthlyMysticHourglass": "Monthly Mystic Hourglass"
"monthlyMysticHourglass": "Monthly Mystic Hourglass",
"mysterySet202407": "Amiable Axolotl Set",
"mysterySet202408": "Arcane Aegis Set"
}

View File

@@ -912,5 +912,14 @@
"backgroundSirensLairNotes": "Atrévete a sumergirte en la Guarida de Sirena.",
"backgroundSunnyStreetWithShopsText": "Calle Soleada con Tiendas",
"backgrounds082025": "Conjunto 135: Publicado en Agosto 2025",
"backgroundSunnyStreetWithShopsNotes": "Embriaga tus sentidos con las imágenes y los sonidos de esta Calle Soleada con Tiendas."
"backgroundSunnyStreetWithShopsNotes": "Embriaga tus sentidos con las imágenes y los sonidos de esta Calle Soleada con Tiendas.",
"backgrounds092025": "Conjunto 136: Publicado en Septiembre 2025",
"backgroundAutumnSwampText": "Ciénaga Otoñal",
"backgroundAutumnSwampNotes": "Déjate arrastrar por el aura fantasmal de una Ciénaga Otoñal.",
"backgrounds102025": "Conjunto 137: Publicado en Octubre 2025",
"backgroundInsideForestWitchsCottageText": "Cabaña de una Bruja en el Bosque",
"backgroundInsideForestWitchsCottageNotes": "Teje hechizos en el interior de la Cabaña de una Bruja en el Bosque.",
"backgrounds112025": "Conjunto 138: Publicado en Noviembre 2025",
"backgroundCastleKeepWithBannersText": "Salón del Castillo con Banderas",
"backgroundCastleKeepWithBannersNotes": "Canta las gloriosas hazañas de los grandes héroes en el Salón del Castillo con Banderas."
}

View File

@@ -1,6 +1,5 @@
{
"FAQ": "Preguntas frecuentes",
"termsAndAgreement": "Pulsando el botón inferior, indicas que has leído y estás de acuerdo con los <a href='/static/terms'>Términos de Servicio</a> y la <a href='/static/privacy'>Política de Privacidad</a>.",
"chores": "Tareas de casa",
"clearBrowserData": "Eliminar datos de navegación",
"communityExtensions": "Complementos y Extensiones",
@@ -23,7 +22,7 @@
"guidanceForBlacksmiths": "Orientacion para Herreros",
"history": "Historia",
"invalidEmail": "Para restablecer la contraseña, se necesita una dirección de correo electrónico válida.",
"login": "Iniciar sesión",
"login": "Iniciar Sesión",
"logout": "Cerrar sesión",
"marketing1Header": "¡Adquiere mejores hábitos nivel a nivel!",
"marketing1Lead1Title": "Traslada tu vida al juego",
@@ -87,14 +86,14 @@
"sync": "Sincronizar",
"tasks": "Tareas",
"teams": "Equipos",
"terms": "Términos y Condiciones",
"terms": "Términos del Servicio",
"tumblr": "Tumblr",
"localStorageTryFirst": "Si tienes algún problema con Habitica, haz clic en el botón siguiente para borrar el almacenamiento local y la mayoría de cookies de este sitio web (otros sitios web no se verán afectados). Después de hacerlo, tendrás que iniciar sesión otra vez, así que primero asegúrate de tener los datos de inicio de sesión, los cuales puedes consultar en Ajustes -> <%= linkStart %>Sitio<%= linkEnd %>.",
"localStorageTryNext": "Si el problema persiste, <%= linkStart %>informa de un error<%= linkEnd %> si aún no lo has hecho.",
"localStorageClear": "Limpiar datos",
"localStorageClearExplanation": "Este botón limpiará el almacenamiento local y algunas cookies, y te sacará de sesión.",
"username": "Nombre de usuario",
"emailOrUsername": "Correo electrónico o Nombre de usuario (distingue mayúsculas y minúsculas)",
"emailOrUsername": "Nombre de usuario o Correo Electrónico (distingue mayúsculas y minúsculas)",
"work": "Trabajar",
"reportAccountProblems": "Informar de problemas de Cuenta",
"reportCommunityIssues": "Informar de problemas de la Comunidad",
@@ -123,7 +122,7 @@
"passwordConfirmationMatch": "Las contraseñas no coinciden.",
"passwordResetPage": "Restablecer Contraseña",
"passwordReset": "Si tenemos constancia de tu correo electrónico o nombre de usuario, te hemos enviado un mensaje con las instrucciones a seguir para establecer una nueva contraseña.",
"invalidLoginCredentialsLong": "Oh-oh - tu dirección de correo electrónico o contraseña son incorrectos.\n- Asegúrate de que están escritos correctamente. Tu nombre de inicio de sesión y contraseña distinguen entre mayúsculas y minúsculas.\n- Puede que te hayas registrado con tu cuenta de Google o Facebook en lugar de tu correo electrónico, intenta iniciar sesión con alguna de ellas.\n- Si has olvidado tu contraseña, pulsa sobre \"¿Has olvidado la contraseña?\".",
"invalidLoginCredentialsLong": "Tu correo electrónico o contraseña son incorrectos. Por favor intenta de nuevo o pulsa sobre \"¿Has olvidado la contraseña?\"",
"invalidCredentials": "No hay ninguna cuenta con esas credenciales.",
"accountSuspended": "Esta cuenta, con ID de usuario \"<%= userId %>\", ha sido bloqueada por incumplir las [Normas de la Comunidad](https://habitica.com/static/community-guidelines) o los [Términos de Servicio](https://habitica.com/static/terms). Para más detalles o solicitar su desbloqueo, por favor, envía un correo electrónico a nuestro Community Manager en <%= communityManagerEmail %> o pídele a tu padre o tutor que lo haga. Por favor, incluye tu @NombreDeUsuario en el mismo.",
"accountSuspendedTitle": "Esta cuenta ha sido suspendida",
@@ -133,12 +132,12 @@
"invalidReqParams": "Parámetros de solicitud no válidos.",
"memberIdRequired": "\"member\" debe ser una UUID válida.",
"heroIdRequired": "\"herold\" debe ser una UUID válida.",
"cannotFulfillReq": "Tu petición no puede ser cumplida. Mánda un email a admin@habitica.com si el error persiste.",
"cannotFulfillReq": "Por favor introduce una dirección de correo electrónico válida. Manda un email a admin@habitica.com si el error persiste.",
"modelNotFound": "Este modelo no existe.",
"signUpWithSocial": "Registrarse con <%= social %>",
"signUpWithSocial": "Continuar con <%= social %>",
"loginWithSocial": "Conectarse con <%= social %>",
"confirmPassword": "Confirmar contraseña",
"usernameLimitations": "El nombre de usuario debe tener entre 1 y 20 caracteres, que tengan solo letras entre la a y la z, números del 0 al 9, guiones o barras bajas, y no pueden incluir términos inapropiados.",
"usernameLimitations": "Los nombres de usuario se pueden modificar en cualquier momento. Deben tener entre 1 y 20 caracteres y tener solo letras entre la a y la z, números del 0 al 9, guiones o barras bajas.",
"usernamePlaceholder": "p.e., HabitRabbit",
"emailPlaceholder": "p.e., gryphon@example.com",
"passwordPlaceholder": "p.e., ******************",
@@ -184,5 +183,9 @@
"marketing3Lead1Title": "Aplicaciones para Android y iOS",
"marketing4Lead3Button": "Empieza Hoy Mismo",
"missingClientHeader": "Faltan los encabezados x-client.",
"emailBlockedRegistration": "Esta cuenta de E-Mail está bloqueada desde el registro. Si crees que es un error, por favor contacta con nosotros por medio de admin@habitica.com."
"emailBlockedRegistration": "Esta cuenta de E-Mail está bloqueada desde el registro. Si crees que es un error, por favor contacta con nosotros por medio de admin@habitica.com.",
"minPasswordLengthLogin": "Tu contraseña contiene al menos 8 caracteres.",
"enterValidEmail": "Por favor introduce una dirección de correo electrónico válida.",
"whatToCallYou": "¿Cómo debemos llamarte?",
"acceptPrivacyTOS": "Confirmas que tienes al menos 18 años y que has leído y estás de acuerdo con nuestros <a href='/static/terms' target='_blank'>Terminos de Servicio</a>y<a href='/static/privacy' target='_blank'>Política de Privacidad</a>"
}

View File

@@ -3118,7 +3118,7 @@
"weaponSpecialSummer2024HealerText": "Bastón Caracol Marino",
"weaponSpecialSummer2024WarriorText": "Rebanadora Diente de Tiburón-Ballena",
"weaponArmoireCorsairsBladeText": "Cuchilla de Corsario",
"weaponArmoireCorsairsBladeNotes": "Ya sea que uses esta poderosa cuchilla para saquear o para proteger, puedes estar satisfecho de haberla traído desde tierra contigo. Eso si, a bordo de este galeón asegúrate de guardarla en un sitio seguro mientras no la uses. Aumenta la fuerza en <%= str %>. Armario Encantado: Conjunto de Corsario (Artículo 3 de 3)",
"weaponArmoireCorsairsBladeNotes": "Ya sea que uses esta poderosa cuchilla para saquear o para proteger, puedes estar satisfecho de haberla traído desde tierra contigo. Eso si, a bordo de este galeón asegúrate de guardarla en un sitio seguro mientras no la uses. Aumenta la fuerza en <%= str %>. Armario Encantado: Conjunto de Corsario (Artículo 3 de 3).",
"armorSpecialSummer2024RogueText": "Cola de Nudibranquio",
"armorSpecialSummer2024RogueNotes": "Puede que seas un gusano marino sin caparazón, ¡pero eres un gusano con alas marinas! Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Verano 2024.",
"armorSpecialSummer2024WarriorText": "Cola de Tiburón-Ballena",
@@ -3144,7 +3144,7 @@
"shieldSpecialSummer2024HealerNotes": "Este escudo pulido es más duro aún que tu bastón de Caracol Marino así que tela. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Verano 2024.",
"weaponMystery202408Text": "Égida Arcana",
"weaponArmoireDragonKnightsLanceText": "Lanza de Caballero Dragón",
"weaponArmoireDragonKnightsLanceNotes": "Esta lanza roja y plateada ha arrojado de sus monturas a innumerables oponentes. Aumenta la Constitución en <%= con %>. Armario Encantado: Conjunto de Caballero Dragón (Artículo 3 de 3)",
"weaponArmoireDragonKnightsLanceNotes": "Esta lanza roja y plateada ha arrojado de sus monturas a innumerables oponentes. Aumenta la Constitución en <%= con %>. Armario Encantado: Conjunto de Caballero Dragón (Artículo 3 de 3).",
"armorArmoireDragonKnightsArmorText": "Armadura de placas Caballero de Dragón",
"armorArmoireDragonKnightsArmorNotes": "Hecha con escamas de dragón unidas con presillas de mithril esta armadura te permite canalizar la fuerza y el poder de un dragón. Aumenta la Fuerza en <%= str %>. Armario Encantado: Conjunto de Caballero Dragón (Artículo 2 de 3)",
"headArmoireDragonKnightsHelmText": "Yelmo Caballero Dragón",
@@ -3165,7 +3165,7 @@
"weaponSpecialFall2024MageText": "Bastón del Inframundo",
"weaponSpecialFall2024MageNotes": "Los pasos etéreos que te llevan a cumplir tus tareas se volverán ridículamente fáciles con solo un toque de esta resplandeciente arma. Aumenta la inteligencia en <%= int %> y la percepción en <%= per %>. Equipamiento de edición limitada Otoño 2024.",
"weaponArmoireFunnyFoolBatonText": "Bastón Tonto y a la vez Divertido",
"weaponArmoireFunnyFoolBatonNotes": "Con una cabriola de tu bastón puedes rematar un chiste, redirigir la atención o provocar un aplauso. Aumenta la constitucion y la fuerza en <%= attrs %>. Armario Encantado: Conjunto de Tonto y a la vez Divertido (Artículo 3 de 3)",
"weaponArmoireFunnyFoolBatonNotes": "Con una cabriola de tu bastón puedes rematar un chiste, redirigir la atención o provocar un aplauso. Aumenta la constitucion y la fuerza en <%= attrs %>. Armario Encantado: Conjunto de Tonto y a la vez Divertido (Artículo 3 de 3).",
"armorSpecialFall2024WarriorText": "Armadura de Balrog Menor",
"armorSpecialFall2024RogueText": "Armadura de Gato Negro",
"armorSpecialFall2024RogueNotes": "Hazte uno con la oscuridad de las tinieblas y incrementa tu agilidad y sigilo dentro de esta armadura. Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Otoño 2024.",
@@ -3185,7 +3185,7 @@
"shieldMystery202409Text": "Vara de Mago Heliotropo de Jardín",
"shieldMystery202409Notes": "El rubí que remata esta vara obtiene su poder del tardío sol veraniego. No otorga ningún beneficio. Artículo de Suscriptor Septiembre 2024.",
"weaponArmoireSpookyCandyBucketText": "Cubo de Caramelos Espeluznante",
"weaponArmoireSpookyCandyBucketNotes": "¡Con un disfraz tan épico como este, vas a ser el que más caramelos reciba! Buena cosa has conseguido al encontrar este cubo teleportador transdimensional para guardarlos todos. Intenta no mordisquear ninguno hasta que llegues a casa. Armario Encantado: Conjunto Noche de Terror (Artículo 2 de 2)",
"weaponArmoireSpookyCandyBucketNotes": "¡Con un disfraz tan épico como este, vas a ser el que más caramelos reciba! Buena cosa has conseguido al encontrar este cubo teleportador transdimensional para guardarlos todos. Intenta no mordisquear ninguno hasta que llegues a casa. Armario Encantado: Conjunto Noche de Terror (Artículo 2 de 2).",
"armorSpecialFall2024WarriorNotes": "Envuelve tu cuerpo en llamas y hazte inmune a su destructivo poder con esta armadura. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Otoño 2024.",
"headSpecialFall2024HealerNotes": "Ya sea que estés defendiendo tu planeta natal de la invasión de los Trífidos o en misión de explorar y exterminar en otro planeta, nadie podrá ignorarte cuando lleves puesta esta máscara. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Otoño 2024.",
"headSpecialFall2024MageNotes": "Ya sea que decidas reflejar un aura de misterio o los caprichos del más allá, ¡te aseguro que nadie va a poder dejar de mirarte con fascinación al lucir esta máscara! Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Otoño 2024.",
@@ -3203,7 +3203,7 @@
"headArmoireStormKnightHelmText": "Yelmo de Caballero Llamatormentas",
"bodyMystery202411Notes": "Los devastadores pinchos de estas hombreras son perfectos para salir adelante con tu lista de tareas pendientes. No otorga ningún beneficio. Artículo de Suscriptor Noviembre 2024.",
"weaponArmoireStormKnightAxeText": "Hacha de Caballeros Llamatormentas",
"weaponArmoireStormKnightAxeNotes": "¡Reúne toda tu furia y lanza un golpe atronador! Aumenta la fuerza en <%= str %>. Armario Encantado: Conjunto Caballero Llamatormentas (Artículo 3 de 3)",
"weaponArmoireStormKnightAxeNotes": "¡Reúne toda tu furia y lanza un golpe atronador! Aumenta la fuerza en <%= str %>. Armario Encantado: Conjunto Caballero Llamatormentas (Artículo 3 de 3).",
"armorArmoireStormKnightArmorText": "Armadura de Caballero Llamatormentas",
"armorArmoireStormKnightArmorNotes": "Con esta armadura, serás casi invencible. Tus enemigos nunca verán el fin a la furiosa tormenta que arremeterá contra ellos. Aumenta la percepcion en <%= per %>. Armario Encantado: Conjunto Caballero Llamatormentas (Artista 2 de 3)",
"headMystery202411Text": "Yelmo Erizado",
@@ -3315,7 +3315,7 @@
"headArmoireSillierBlueTophatNotes": "Un poco de clase, un gran abismo en tus cotas de sofisticación. Aumenta la fuerza y la constitución en <%= attrs %> cada uno. Armario Encantado: Conjunto Esmoquin MasTonto (Artículo 2 de 2).",
"armorArmoireSillyOrangeTuxedoNotes": "Un traje adecuado para tus labores diarias. Aumenta la Constitución en <%= con %>. Armario Encantado: Conjunto Esmoquin Tonto (Artículo 1 de 2).",
"weaponArmoireGildedKnightsSpearText": "Lanza de Caballero Dorado",
"weaponArmoireGildedKnightsSpearNotes": "Con este arma, vas a poder asegurarte el pago de cualquier deuda con toda la contundencia y el peso de la ley. Aumenta la Fuerza en <%= str %>. Armario Encantado: Conjunto Caballero Dorado (Artículo 3 de 3)",
"weaponArmoireGildedKnightsSpearNotes": "Con este arma, vas a poder asegurarte el pago de cualquier deuda con toda la contundencia y el peso de la ley. Aumenta la Fuerza en <%= str %>. Armario Encantado: Conjunto Caballero Dorado (Artículo 3 de 3).",
"backMystery202505Text": "Alas de Mariposa Macaón Masiva",
"armorArmoireGildedKnightsPlateNotes": "En esta armadura, eres prácticamente invencible. ¡Tus enemigos seguramente te oirán rugir! Aumenta la Percepción en un <%= per %>. Armario encantado: Conjunto Caballero Dorado (Artículo 2 de 3)",
"armorArmoireGildedKnightsPlateText": "Armadura de Caballero Dorado",
@@ -3326,8 +3326,8 @@
"headAccessoryMystery202505Notes": "Detecta las mejores áreas de flores silvestres con estas sensibles antenas. No otorga ningún beneficio. Artículo de Suscriptor Mayo 2025.",
"weaponSpecialSummer2025WarriorNotes": "No hay manera de establecer la antigüedad de este arma, pero parecerá pegada a tus manos al cargar contra las tareas más pesadas. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada Verano 2025.",
"weaponSpecialSummer2025RogueNotes": "Este tentáculo, imbuido con el hechizo pensamiento único, te ofrece adherencia total y estricta a tus objetivos para que no pierdas ímpetu en completar tus tareas. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada Verano 2025.",
"weaponSpecialSummer2025MageNotes": "Ramifica tus talentos y tus habilidades diversificándolos y ampliándolos por todo el espectro de tus tareas, proporciona mente amplificada nivel tres. Aumenta la Inteligencia en <%= int %> y la Percepción en <%= per %>. Equipamiento de edición limitada Verano 2025",
"weaponArmoireBeekeepersSmokerNotes": "Usa el extraño humo que sale de este objeto para calmar a tus abejas y obtener algo de miel. A las abejas parece no importarles, viajan tío. Siendo honestos, todos deberíamos estar más tranquilos y ser más felices, paz y amor. Aumenta la Inteligencia en <%= int %>. Armario Encantado: Conjunto de Apicultor (Artículo 3 de 4)",
"weaponSpecialSummer2025MageNotes": "Ramifica tus talentos y tus habilidades diversificándolos y ampliándolos por todo el espectro de tus tareas, proporciona mente amplificada nivel tres. Aumenta la Inteligencia en <%= int %> y la Percepción en <%= per %>. Equipamiento de edición limitada Verano 2025.",
"weaponArmoireBeekeepersSmokerNotes": "Usa el extraño humo que sale de este objeto para calmar a tus abejas y obtener algo de miel. A las abejas parece no importarles, viajan tío. Siendo honestos, todos deberíamos estar más tranquilos y ser más felices, paz y amor. Aumenta la Inteligencia en <%= int %>. Armario Encantado: Conjunto de Apicultor (Artículo 3 de 4).",
"armorSpecialSummer2025WarriorNotes": "Esta armadura no solo te hace duro sino que también te vuelve veloz. Lucha como un carcayú o pon los pies en polvorosa cuál ave galliforme—¡la decisión es tuya! Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Verano 2025.",
"armorSpecialSummer2025RogueNotes": "Este traje cambia de color a voluntad, también eyecta una nube de tinta opaca. Distrae cuál manada lupina atacando o escóndete cuál ave galliforme —¡la decisión es tuya! Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada Verano 2025.",
"armorSpecialSummer2025MageNotes": "Estas hermosas telas no solo tienen colores impresionantes, sino que también te permiten deslizarte maravillosamente por el agua. Nada cuál orca protectora o baila cuál ave galliforme, cloooc— ¡la decisión es tuya! Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Verano 2025.",
@@ -3360,7 +3360,6 @@
"headArmoireBeekeepersHatText": "Yelmo y Velo de Apicultor",
"headArmoireBeekeepersHatNotes": "Protege tu cara mientras atiendes a tus coleguitas zumbadoras. Aumenta la Percepción en <%= per %>. Armario Encantado: Conjunto de Apicultor (Artículo 1 de 4)",
"shieldSpecialSummer2025WarriorText": "Escudo Caparazón Vieira",
"shieldSpecialSummer2025RogueText": "Tentáculo de Calamar",
"shieldSpecialSummer2025RogueNotes": "Este tentáculo parece escuálido, pero no veas como estrangula mortalmente. ¡Oh no! ¡No me gustaría ser tu enemigo! Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada Verano 2025.",
"shieldSpecialSummer2025HealerText": "Escudo Ángel de Mar",
"shieldArmoireBeekeepersHiveText": "Panal",
@@ -3383,5 +3382,62 @@
"shieldMystery202508Text": "Cuchilla Brillante Cian",
"shieldMystery202508Notes": "Si una cuchilla giratoria ya te había volado el cerebro ¡Imagínate dos! Un auténtico disparate no apto para todas las mentes. No otorga ningún beneficio. Artículo de Suscriptor Agosto 2025.",
"armorArmoireRedWaistcoatText": "Chaleco Rojo",
"armorArmoireRedWaistcoatNotes": "Viste elegante y con clase mientras cumples con tus tareas. Hay algo secreto escondido en el bolsillo interior, pero, quién no tiene uno o dos cadáveres escondidos en el armario—¿qué crees que será, precioso mío? Aumenta la Constitución y la Fuerza en <%= attrs %>. Armario Encantado: Conjunto Chaleco Rojo (Artículo 2 de 2)"
"armorArmoireRedWaistcoatNotes": "Viste elegante y con clase mientras cumples con tus tareas. Hay algo secreto escondido en el bolsillo interior, pero, quién no tiene uno o dos cadáveres escondidos en el armario—¿qué crees que será, precioso mío? Aumenta la Constitución y la Fuerza en <%= attrs %>. Armario Encantado: Conjunto Chaleco Rojo (Artículo 2 de 2)",
"weaponSpecialFall2025WarriorNotes": "Una poderosa arma capaz de trazar una senda segura a través de los peligros del Bosque Negro. Aumenta la Fuerza en <%= str %>. Equipamiento de Edición Limitada Otoño 2025.",
"weaponSpecialFall2025RogueNotes": "Una poderosa arma capaz de trazar una senda segura a través de los peligros del Bosque Negro. Aumenta la Fuerza en <%= str %>. Equipamiento de Edición Limitada Otoño 2025.",
"weaponSpecialFall2025RogueText": "Espada Esqueleto",
"weaponSpecialFall2025MageNotes": "Una poderosa arma capaz de trazar una senda segura a través de los terrores del Bosque Negro. Aumenta la Inteligencia en <%= int %> y la Percepción en <%= per %>. Equipamiento de Edición Limitada Otoño 2025.",
"weaponSpecialFall2025WarriorText": "Hacha de Bigfoot",
"weaponSpecialFall2025HealerText": "Hacha Kobold",
"weaponSpecialFall2025HealerNotes": "Una poderosa arma capaz de trazar una senda segura a través de los obstáculos del Bosque Negro. Aumenta la Fuerza en <%= str %>. Equipamiento de Edición Limitada Otoño 2025.",
"weaponSpecialFall2025MageText": "Hacha de Fantasma Enmascarado",
"weaponMystery202511Text": "Espada Escarcha",
"weaponMystery202511Notes": "El halo helado de esta espada te permitirá realizar con rapidez incluso las tareas rojas más oscuras. No otorga ningún beneficio. Artículo de Suscriptor Noviembre 2025.",
"weaponArmoireBlacksmithsHammerText": "Martillo de Herrero",
"weaponArmoireBlacksmithsHammerNotes": "Este martillo enano es para trabajar la nobleza del Mithril arrancado de las entrañas de Khazad-dûm, completamente adaptado a las brasas al rojo vivo y a las tareas Diarias al rojo vivo también. Aumenta la fuerza en <%= str %>. Armario Encantado: Conjunto de Herrero (Artículo 3 de 3).",
"armorSpecialFall2025WarriorText": "Armadura de Bigfoot",
"armorSpecialFall2025WarriorNotes": "No te preocupes, ni tus enormes pies ni tu magnífico cuerpo serán demasiado grandes para caber dentro de esta armadura de temporada. Aumenta la Constitución en <%= con %>. Equipamiento de Edición Limitada Otoño 2025.",
"armorSpecialFall2025RogueText": "Armadura Esqueleto",
"armorSpecialFall2025RogueNotes": "Una armadura de temporada dura y estrecha, como objetivo, es la más difícil de acertar. Aumenta la Percepción en <%= per %>. Equipamiento de Edición Limitada Otoño 2025.",
"armorSpecialFall2025HealerText": "Armadura Kobold",
"armorSpecialFall2025HealerNotes": "Esta armadura de temporada te permite mimetizarte con el bosque negro para realizar una retirada estratégica. Aumenta la Constitución en <%= con %>. Equipamiento de Edición Limitada Otoño 2025.",
"armorArmoireSoftOrangeSuitNotes": "El naranja es un color vibrante y de camuflaje. Viste de esta forma para irte a la cama y puedes estar seguro de que triunfarás en cualquiera de las aventuras que tengas en tus sueños y también en cualquier competición de picaduras de mosquitos, ¡para ellos vas a estar irresistible! Aumenta la Constitución y la Fuerza en <%= attrs %>. Armario Encantado: Conjunto Ropa de Casa Naranja (Artículo 2 de 3).",
"armorSpecialFall2025MageText": "Armadura de Fantasma Enmascarado",
"armorSpecialFall2025MageNotes": "Esta armadura estacional se vuelve incorpórea solo cuando la llevas puesta. Aumenta la Inteligencia en <%= int %>. Equipamiento de Edición Limitada Otoño 2025.",
"armorMystery202509Text": "Manto de Errante Enmarañado",
"armorMystery202509Notes": "Brillantes sedas de Cachemira protegen a vuecencia de la meteorología sea esta cálida o fresca. No otorga ningún beneficio. Artículo de Suscriptor Septiembre 2025.",
"armorArmoireSoftOrangeSuitText": "Traje Naranja Claro",
"armorArmoireBlacksmithsApronText": "Mandil de Herrero",
"armorArmoireBlacksmithsApronNotes": "Este mandil no es tan pesado como parece una vez lo llevas puesto. Te protegerá de las chispas que salten desperdigadas cuando estés forjando Mithril mientras te permite libertad de movimientos. Aumenta la Constitución en <%= con %>. Armario Encantado: Conjunto de Herrero (Artículo 2 de 3).",
"armorArmoireBlackPartyDressText": "Vestido de Fiesta Negro",
"armorArmoireBlackPartyDressNotes": "¡Eres fuerte, inteligente, electrizante y estás a la moda! ¿Qué más se puede pedir? Aumenta la fuerza, la Inteligencia y la Constitución en <%= attrs %> cada uno. Armario Encantado: Conjunto Lazo Negro (Artículo 2 de 2).",
"headSpecialFall2025WarriorText": "Máscara de Bigfoot",
"headSpecialFall2025WarriorNotes": "Redondeada y peluda, esta máscara corona tu cabeza de la misma manera que tu coronas todas tus tareas importantes. Aumenta la Fuerza en <%= str %>. Equipamiento de Edición Limitada Otoño 2025.",
"headSpecialFall2025RogueText": "Máscara Esqueleto",
"headSpecialFall2025RogueNotes": "Pálido y bien pertrechado, esta máscara corona tu cabeza de la misma manera que tu coronas todas tus tareas importantes. Aumenta la Percepción en <%= per %>. Equipamiento de Edición Limitada Otoño 2025.",
"headSpecialFall2025HealerText": "Máscara Kobold",
"headSpecialFall2025HealerNotes": "Sorprendente y cornudo, esta máscara corona tu cabeza de la misma manera que tu coronas todas tus tareas importantes. Aumenta la Inteligencia en <%= int %>. Equipamiento de Edición Limitada Otoño 2025.",
"headSpecialFall2025MageText": "Máscara de Fantasma Enmascarado",
"headSpecialFall2025MageNotes": "Resplandecientemente Etéreo, esta máscara corona tu cabeza de la misma manera que tu coronas todas tus tareas importantes. Aumenta la Percepción en <%= per %>. Equipamiento de Edición Limitada Otoño 2025.",
"headArmoireFloppyOrangeHatText": "Gorro Caído Naranja",
"headArmoireFloppyOrangeHatNotes": "Han hecho falta entretejer muchos y poderosos hechizos y encantamientos entre los filamentos de este gorro para darle este maravilloso color naranja. Aumenta todas las estadisticas en <%= attrs %>. Armario Encantado: Conjunto Ropa de Casa Naranja (Artículo 1 de 3).",
"headArmoireBlackHairbowText": "Lazo Negro",
"headArmoireBlackHairbowNotes": "¡Llega a ser más fuerte, inteligente y electrizante al llevar puesto este hermoso Lazo Negro! Aumenta la Fuerza, la Inteligencia y la Constitución en <%= attrs %> cada uno. Armario Encantado: Conjunto Lazo Negro (Artículo 1 de 2).",
"headArmoireBlacksmithsGogglesText": "Gafas de Herrero",
"shieldSpecialFall2025WarriorText": "Escudo Bigfoot",
"shieldSpecialFall2025RogueNotes": "Una poderosa arma para rebanar tus Tareas Pendientes en dos mitades. Aumenta la Fuerza en <%= str %>. Equipamiento de Edición Limitada Otoño 2025.",
"shieldSpecialFall2025HealerText": "Escudo Kobold",
"shieldSpecialFall2025WarriorNotes": "Obtén algo de tiempo para pensar y organizar un plan mientras te escudas de los golpes procedentes de tus Tareas Diarias. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Otoño 2025.",
"shieldSpecialFall2025HealerNotes": "Obtén algo de tiempo para organizar tus pertrechos mientras te escudas de los golpes procedentes de tus tareas, cuál ave galliforme…jeje. Aumenta la Constitución en <%= con %>. Equipamiento de Edición Limitada Otoño 2025.",
"shieldMystery202511Text": "Escudo Escarcha",
"shieldMystery202511Notes": "Este resistente cúbito de hielo escudo te protege de los malos hábitos pero no congela tus manos. No otorga ningún beneficio. Artículo de Suscriptor Noviembre 2025.",
"shieldArmoireSoftOrangePillowText": "Almohada Naranja Mullidita",
"shieldArmoireSoftOrangePillowNotes": "Un guerrero bien dispuesto y preparado siempre lleva consigo una almohada a sus aventuras. Siempre listo para cumplir con tus obligaciones…mientras te echas una siestecita. Aumenta la Inteligencia y la Percepción en <%= attrs %> cada uno. Armario Encantado: Conjunto Ropa de Casa Naranja (Artículo 3 de 3).",
"backMystery202510Text": "Alas de Necrófago Levitando",
"backMystery202510Notes": "Elévate sigilosamente sobre los cielos fantasmales con estas alas gigantes. No otorga ningún beneficio. Artículo de Suscriptor Octubre 2025.",
"bodyMystery202509Text": "Bufanda de Errante Enmarañado",
"bodyMystery202509Notes": "Esta bufanda le protege a vuecencia del gélido viento y además le hace vestir a la altura de su alta alcurnia. No otorga ningún beneficio. Artículo de Suscriptor Septiembre 2025.",
"eyewearMystery202510Text": "Ojos de Necrófago Levitando",
"eyewearMystery202510Notes": "Estos ojos espeluznantes brillan como la Luna en su máximo apogeo. No otorga ningún beneficio. Artículo de Suscriptor Octubre 2025.",
"headArmoireBlacksmithsGogglesNotes": "Suficiente protección ocular y resistencia tanto a roturas como al calor cuando trabajas en una forja enana, incluso en las más famosas de Khazad-dûm. Aumenta la Percepción en <%= per %>. Armario Encantado: Conjunto de Herrero (Artículo 1 de 3)."
}

View File

@@ -278,5 +278,9 @@
"summer2025ScallopWarriorSet": "Conjunto Guerrero Vieira",
"summer2025SquidRogueSet": "Conjunto Pícaro Calamar",
"summer2025SeaAngelHealerSet": "Conjunto Sanador Ángel de Mar",
"summer2025FairyWrasseMageSet": "Conjunto Mago Pez Lábrido Hada"
"summer2025FairyWrasseMageSet": "Conjunto Mago Pez Lábrido Hada",
"fall2025SasquatchWarriorSet": "Conjunto de Guerrero Bigfoot",
"fall2025SkeletonRogueSet": "Conjunto de Esqueleto Pícaro",
"fall2025KoboldHealerSet": "Conjunto de Sanador Kobold",
"fall2025MaskedGhostMageSet": "Conjunto de Mago Fantasma Enmascarado"
}

View File

@@ -5,10 +5,8 @@
"welcomeTo": "Bienvenido a",
"welcomeBack": "¡Bienvenido de nuevo!",
"justin": "Justin",
"justinIntroMessage1": "¡Hola! Debes ser nuevo por aquí. Mi nombre es <strong>Justin</strong>, y voy a ser tu guía en Habitica.",
"justinIntroMessage1": "¡Hola! Debes ser nuevo por aquí. Soy <strong>Justin</strong>, voy a ser tu guía en Habitica. Así que, ¿qué apariencia te gustaría tener? No te preocupes, puedes cambiarla más tarde.",
"justinIntroMessage3": "¡Genial! Ahora, ¿en qué te gustaría centrarte a lo largo de este viaje?",
"justinIntroMessageUsername": "Antes de empezar, decidamos cómo llamarte. Abajo verás un nombre público y un nombre de usuario que he generado para tí. En cuanto hayas elegido tu nombre público y tu nombre de usuario, ¡empezaremos a crear tu avatar!",
"justinIntroMessageAppearance": "Entonces, ¿cómo te gustaría verte? No te preocupes, podrás cambiar tu look más adelante.",
"introTour": "¡Vamos allá! He incluido algunas tareas para ti basándome en tus intereses para que puedas empezar inmediatamente. ¡Pulsa una tarea para editarla, o añade otras que se ajusten a tu rutina!",
"prev": "Anterior",
"next": "Siguiente",

View File

@@ -257,5 +257,19 @@
"resetTextLocal": "Si estás completamente seguro, escribe tu contraseña en el siguiente cuadro de texto.",
"resetTextSocial": "Si estás completamente seguro, escribe<b>\"<%= magicWord %>\"</b> en el siguiente cuadro de texto.",
"contentRelease": "Nuevos Contenidos + Eventos",
"transaction_subscription_bonus": "<b>Bono de Suscripción</b>"
"transaction_subscription_bonus": "<b>Bono de Suscripción</b>",
"denyNonEssentialCookies": "Rechazar las Cookies No Esenciales",
"managePrivacyPreferences": "Administrar Tus Preferencias de Privacidad",
"learnMorePrivacy": "Para saber más, por favor revisa nuestra <a href='/static/privacy' target='_blank'>Política de Privacidad</a>.",
"strictlyNecessary": "Estrictamente Necesarias",
"alwaysActive": "Siempre Activas",
"performanceAnalytics": "Rendimiento y Analíticas",
"savePreferences": "Guardar Preferencias",
"habiticaPrivacyPolicy": "Política de Privacidad de Habitica",
"yourPrivacyPreferences": "Tus Preferencias de Privacidad",
"requiredToRun": "Estás se requieren para que nuestra página web y nuestras aplicaciones funcionen de la mejor manera.",
"privacySettingsOverview": "Habitica usa las cookies para analizar el rendimiento, gestionar solicitudes de soporte y brindarle la mejor experiencia de juego posible. Para eso, necesitamos pedirte los siguientes permisos. Puedes cambiar tus preferencias en cualquier momento desde los ajustes de tu cuenta.",
"usedForSupport": "Estás se usan para mejorar la experiencia del usuario, el rendimiento, y los servicios de nuestra página web y nuestras aplicaciones. Estos datos se usan para ayudar a nuestro equipo de soporte cuando tienen que gestionar tanto solicitudes como informes de error.",
"privacyOverview": "En el mundo en el que vivimos, parece que todas las compañías buscan obtener beneficios de los datos que recopilan acerca de nosotros. Esto nos dificulta la búsqueda de una aplicación que nos ayude a mejorar nuestros hábitos y estilo de vida. Habitica usa cookies que almacenan nuestros datos solo para analizar el rendimiento, gestionar solicitudes de soporte y brindarnos la mejor experiencia de juego posible. Aún así puedes cambiar tus preferencias en cualquier momento desde los ajustes de tu cuenta.",
"acceptAllCookies": "Aceptar Todas las Cookies"
}

View File

@@ -266,5 +266,8 @@
"mysterySet202505": "Conjunto Mariposa Macaón Masiva",
"mysterySet202506": "Conjunto Brillo Solar",
"mysterySet202507": "Conjunto de Patinador Audaz",
"mysterySet202508": "Conjunto Cuchilla Brillante"
"mysterySet202508": "Conjunto Cuchilla Brillante",
"mysterySet202509": "Conjunto de Errante Enmarañado",
"mysterySet202510": "Conjunto de Necrófago Levitando",
"mysterySet202511": "Conjunto Guerrero de Escarcha"
}

View File

@@ -424,7 +424,7 @@
"backgroundParkWithStatueNotes": "Sigue un camino florido por un parque con una estatua.",
"backgroundParkWithStatueText": "Parque con estatua",
"backgroundDojoNotes": "Aprende nuevos movimientos en un dojo.",
"backgroundDojoText": "Dojo",
"backgroundDojoText": "Espacio de práctica marcial",
"backgrounds052019": "CONJUNTO 60: Lanzado en Mayo 2019",
"backgroundBlossomingDesertNotes": "Observa una extraordinario desierto florido.",
"backgroundBlossomingDesertText": "Desierto floreciente",
@@ -776,16 +776,120 @@
"backgroundFlyingOverHedgeMazeText": "Volando sobre un laberinto de setos",
"backgroundCretaceousForestText": "Bosque Cretácico",
"backgroundCretaceousForestNotes": "Disfruta de la vegetación del Bosque Cretácico.",
"backgroundUnderWisteriaText": "Bajo la glicinia",
"backgroundUnderWisteriaText": "Bajo la Glicinia",
"backgroundUnderWisteriaNotes": "Relájate bajo la glicina.",
"backgroundFlyingOverHedgeMazeNotes": "Maravíllate mientras vuelas sobre un laberinto de setos.",
"backgrounds062023": "CONJUNTO 109: Publicado en junio de 2023",
"backgrounds062023": "Conjunto 109: Publicado en junio de 2023",
"backgroundInAnAquariumText": "En el acuario",
"backgroundInAnAquariumNotes": "Date un baño tranquilo con los peces En el acuario.",
"backgroundInsideAdventurersHideoutText": "En la guarida de un aventurero",
"backgroundInsideAdventurersHideoutNotes": "Planea tu travesía en la Guarida de un Aventurero.",
"backgrounds042023": "CONJUNTO 107: Publicado en abril de 2023",
"backgroundCraterLakeText": "Lago del Cráter",
"backgroundCraterLakeNotes": "Admira un Lago del Cráter hermoso.",
"backgrounds072023": "CONJUNTO 110: Publicado en Julio de 2023"
"backgroundCraterLakeNotes": "Admira un encantador Lago del Cráter.",
"backgrounds072023": "CONJUNTO 110: Publicado en Julio de 2023",
"backgrounds112023": "Conjunto 114: Lanzado en noviembre de 2023",
"backgroundGiantCatText": "Gato Gigante",
"backgroundGiantCatNotes": "Toma una siesta con un Gato Gigante.",
"backgroundBarrelCellarText": "Bodega de vinos",
"backgrounds082023": "Conjunto 111: Estrenado en agosto de 2023",
"backgroundBonsaiCollectionText": "Colección Bonsai",
"backgroundBonsaiCollectionNotes": "Admire una linda colección Bonsai.",
"backgroundDreamyIslandText": "Isla de los Sueños",
"backgroundDreamyIslandNotes": "Disfruta el paisaje en una Isla Mágica.",
"backgroundRockGardenText": "Jardín de Piedras",
"backgroundRockGardenNotes": "Relájate en un Jardín de Piedras.",
"backgrounds092023": "Conjunto 112: Lanzado en Septiembre de 2023",
"backgroundMovingDayText": "Día de Mudanza",
"backgroundMovingDayNotes": "Empaca para el día de mudanza.",
"backgroundCoveredBridgeInAutumnText": "Puente cubierto en Otoño",
"backgroundCoveredBridgeInAutumnNotes": "Cruzá un Puente cubierto en Otoño.",
"backgroundBaobabForestText": "Bósque de Adansonia",
"backgroundBaobabForestNotes": "Admirá el increíble bosque de Adansonia.",
"backgroundOnAPaddlewheelBoatText": "En un barco de ruedas de paletas",
"backgroundOnAPaddlewheelBoatNotes": "Pasea en un barco de ruedas de paletas.",
"backgroundColorfulCoralText": "Coral Colorido",
"backgroundColorfulCoralNotes": "Bucea entre corales coloridos.",
"backgroundBoardwalkIntoSunsetText": "Paseo marítimo al atardecer",
"backgroundBoardwalkIntoSunsetNotes": "Caminá por la rambla hasta la puesta de sol.",
"backgrounds102023": "Conjunto 113: Lanzado en octubre de 2023",
"backgroundSpectralCandleRoomText": "Sala de Velas Espectrales",
"backgroundSpectralCandleRoomNotes": "Conversá con Espíritus en una Sala de Velas Espectrales.",
"backgroundMonstrousCaveText": "Caverna Monstruosa",
"backgroundMonstrousCaveNotes": "Contemple la boca de la Caverna Monstruosa.",
"backgroundJackOLanternStacksText": "Linternas de Halloween",
"backgroundJackOLanternStacksNotes": "Admire un campo con Linternas de Halloween.",
"backgroundBarrelCellarNotes": "Buscá delicias culinarias en una Bodega de Vino.",
"backgrounds062024": "Conjunto 121: Lanzado en Junio de 2024",
"backgroundShellGateText": "Portal de Conchas",
"backgroundShellGateNotes": "Marche a través del Portal de Conchas Decorado.",
"backgroundRiverBottomText": "Fondo del Río",
"backgroundRiverBottomNotes": "Explore el Fondo del Río.",
"backgrounds092024": "Conjunto 124: Lanzado en Septiembre de 2024",
"backgroundMagicDoorInForestText": "Puerta Mágina en el Bósque",
"backgroundMagicDoorInForestNotes": "Atrévete a pasar por la Puerta Mágica en el Bósque.",
"backgrounds102024": "Conjunto 125: Lanzado en Octubre de 2024",
"backgroundSurroundedByGhostsText": "Rodeado de Fantasmas",
"backgroundSurroundedByGhostsNotes": "Pase una noche espeluznante rodeado de fantasmas.",
"backgroundFloweringForestText": "Bósque Florido",
"backgroundRainyRainforestText": "Bósque Lluvioso",
"backgroundRainyRainforestNotes": "Disfrute una lluvia refrescante en el Bósque Lluvioso.",
"backgroundDogParkNotes": "Salta en el Parque de Perros.",
"backgrounds022024": "Conjunto 117: Lanzado en Febrero de 2024",
"backgroundColorfulStreetText": "Calle Colorida",
"backgroundColorfulStreetNotes": "Mirando una Calle Colorida.",
"backgroundSwanBoatText": "Barco del Cisne",
"backgroundSwanBoatNotes": "Haga un paseo en un Barco del Cisne.",
"backgroundHeartTreeTunnelText": "Túnel del Árbol de Corazón",
"backgroundAutumnTreeTunnelText": "Túnel de Árboles de Otoño",
"backgroundAutumnTreeTunnelNotes": "Contempla la belleza de un Túnel de árboles de otoño.",
"backgrounds042024": "Conjunto 119: Lanzado en Abril de 2024",
"backgroundForestSunsetText": "Atardecer en el bosque",
"backgroundForestSunsetNotes": "Disfrutá del resplandor de un atardecer en el bosque.",
"backgroundWallFloweringVinesNotes": "Quedate cerca de un muro cubierto de plantas floridas.",
"backgroundContainerGardenText": "Jardín de Contenedores",
"backgroundContainerGardenNotes": "Ensuciate las manos en el Jardín de Contenedores.",
"backgrounds022025": "Conjunto 129: Lanzado en Febrero de 2025",
"backgroundOldFashionedTeaShopText": "Casa de té a la antigua",
"backgroundOldFashionedTeaShopNotes": "Disfrutá de una infusión calentita en una casa de té a la antigua.",
"backgrounds082024": "Conjunto 123: Lanzado en Agosto de 2024",
"backgroundSavannaText": "Campos Nebulosos",
"backgroundSavannaNotes": "Camina a través de los Campos Nebulosos.",
"backgrounds122024": "Conjunto 127: Lanzado en Diciembre de 2024",
"backgroundFirstSnowForestText": "Primera Nieve en el Bosque",
"backgroundFirstSnowForestNotes": "Caminá entre la primera nieve del bosque.",
"backgrounds122023": "Conjunto 115: Lanzado en diciembre de 2023",
"backgroundHolidayTreeForestText": "Bósque de árboles navideños",
"backgroundHolidayTreeForestNotes": "Decore un árbol de navidad en el bósque.",
"backgroundIceSculptureFestivalText": "Festival de Esculturas de Hielo",
"backgroundIceSculptureFestivalNotes": "Realice un tour en un Festival de Esculturas de Hielo.",
"backgroundWinterFullMoonText": "Luna llena de invierno",
"backgroundWinterFullMoonNotes": "Contemple la Luna llena de invierno.",
"backgrounds012024": "Conjunto 116: Lanzado en Enero de 2024",
"backgroundWinterMountainRangeText": "Cordillera invernal",
"backgroundWinterMountainRangeNotes": "Suba a una Cordillera invernal.",
"backgroundFrozenBluePondText": "Lago Azul Congelado",
"backgroundFrozenBluePondNotes": "Relájese en el Lago Azul Congelado.",
"backgroundIceBubbleLakeText": "Lago de Burbujas de Hielo",
"backgroundIceBubbleLakeNotes": "Parate con cuidado en el Lago de Burbujas de Hielo.",
"backgrounds012025": "Conjunto 128: Lanzado en Enero de 2025",
"backgroundWinterLandscapeWithCabinText": "Paisaje invernal con Cabaña",
"backgroundWinterLandscapeWithCabinNotes": "Mantenete cómodo en un paisaje nevado con cabaña.",
"backgrounds052024": "Conjunto 120: Lanzado en Mayo de 2024",
"backgroundDragonsBackText": "Espalda de dragón",
"backgroundDragonsBackNotes": "Navegá el cielo sobre el lomo de un dragón.",
"backgroundMaypoleText": "Poste festivo",
"backgroundMaypoleNotes": "Baile alrededor de un Poste festivo.",
"backgroundPottersStudioText": "Taller de Alfarero",
"backgroundPottersStudioNotes": "Haz arte en el Taller de Alfarero.",
"backgroundHeartTreeTunnelNotes": "Camine por el Túnel del Árbol de Corazón.",
"backgrounds032024": "Conjunto 118: Lanzado en Marzo de 2024",
"backgroundFloweringForestNotes": "Respira en el perfume del Bósque Florido.",
"backgroundDogParkText": "Parque de Perros",
"backgroundWallFloweringVinesText": "Pared con enredaderas florecidas",
"backgrounds072024": "Conjunto 122: Lanzado en Julio de 2024",
"backgrounds032025": "Conjunto 130: Lanzado en Marzo de 2025",
"backgrounds112024": "Conjunto 126: Lanzado en Noviembre de 2024",
"backgroundCastleHallWithHearthText": "Salón de Castillo con Chimenea",
"backgroundCastleHallWithHearthNotes": "Deléitate de la calidez de este salón del castillo con chimenea."
}

View File

@@ -98,5 +98,15 @@
"yourReward": "Tu Recompensa",
"removeTasks": "Eliminar Tareas",
"messageChallengeFlagOfficial": "Los desafíos oficiales no se pueden reportar.",
"messageChallengeFlagAlreadyReported": "Ya has reportado este Desafío."
"messageChallengeFlagAlreadyReported": "Ya has reportado este Desafío.",
"whyReportingChallengePlaceholder": "Motivo de reporte",
"cannotClose": "Este Desafío no puede ser cerrado porque uno o más jugadores lo reportaron como inapropiado. Un miembro del staff te contactará pronto con instrucciones. Si pasan más de 48 horas y no te contactamos, por favor envía un email a admin@habitica.com para ayudarte.",
"cannotClone": "Este Desafío no puede ser clonado porque uno o más jugadores lo han reportado como inapropiado. Un miembro del Equipo te contactará próximamente con instrucciones. Si pasan más de 48 horas sin ser contactado, por favor envía un email a admin@habitica.com por más ayuda.",
"flaggedAndHidden": "Desafío marcado y oculto",
"resetFlagCount": "Reiniciar mis marcadores",
"cannotMakeChallenge": "No puedes crear un Desafío público porque tu cuenta no tiene los privilegios de chat necesarios. Por favor ponte en contacto con admin@habitica.com para más información.",
"flaggedNotHidden": "Desafío marcado una vez, No esta oculto",
"whyReportingChallenge": "Por qué estas reportando este Desafío?",
"abuseFlagModalBodyChallenge": "Deberías solo reportar un Desafío que viola las <%= firstLinkStart %>Directrices de la Comunidad<%= linkEnd %> y/o los <%= secondLinkStart %>Términos de Servicio<%= linkEnd %>. Envíar un reporte falso es una violación a las Directrices de la Comunidad.",
"resetFlags": "Reiniciar marcadores"
}

View File

@@ -2,7 +2,7 @@
"communityGuidelinesWarning": "Ten en cuenta que tu nombre para mostrar, foto de perfil y sección \"Sobre mí\" deben cumplir con las <a href='https://habitica.com/static/community-guidelines' target='_blank'>Normas de la Comunidad</a> (por ejemplo, nada de comentarios obscenos, temas inapropiados para menores de edad, insultos, etc.). Si tienes preguntas sobre si algo es apropiado o no, por favor comunícate al correo electrónico <%= hrefBlankCommunityManagerEmail %>!",
"profile": "Perfil",
"avatar": "Personalizar avatar",
"editAvatar": "Editar Avatar",
"editAvatar": "Personalizar Personaje",
"noDescription": "Este Habiticano no ha añadido una descripción.",
"noPhoto": "Este Habiticano no ha añadido una foto.",
"other": "Otro",
@@ -83,7 +83,7 @@
"allocatePerPop": "Añadir un punto a Percepción",
"allocateInt": "Puntos asignados a Inteligencia:",
"allocateIntPop": "Añadir un punto a Inteligencia",
"noMoreAllocate": "Ahora que has alcanzado el nivel 100, ya no ganarás más Puntos de Atributo. Puedes seguir subiendo de nivel, o empezar una nueva aventura desde el nivel 1 utilizando la <a href='https://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Esfera de Renacimiento</a>!",
"noMoreAllocate": "Ahora que has alcanzado el nivel 100, ya no ganarás más Puntos de Atributo. Puedes seguir subiendo de nivel, o empezar una nueva aventura desde el nivel 1 utilizando la <a href='/shops/market'>Esfera de Renacimiento</a>!",
"stats": "Atributos",
"strength": "Fuerza",
"strText": "La Fuerza aumenta la probabilidad de conseguir \"golpes críticos\" aleatorios y el Oro, la Experiencia y la probabilidad de conseguir botín al asestarlos. También ayuda a hacer daño a los monstruos jefe.",
@@ -129,8 +129,8 @@
"healerText": "Los Sanadores son inmunes al daño y extienden esa protección a otros. El no cumplir Diarias y los malos Hábitos no les afectan demasiado y tienen maneras de recuperar la Salud tras un fallo. ¡Juega como un Sanador si disfrutas de ayudar a otros en tu grupo o si la idea de engañar a la muerte a través del trabajo duro te inspira!",
"optOutOfClasses": "No usar",
"chooseClass": "Elige tu clase",
"chooseClassLearnMarkdown": "[Aprende más sobre el sistema de clases de Habitica](https://habitica.fandom.com/es/wiki/Sistema_de_Clases)",
"optOutOfClassesText": "No quieres tomarte la molestia de las clases? Quieres elegir luego? No tienes que hacerlo en este momento - serás un guerrero sin habilidades especiales. Puedes leer acerca del sistema de clases más tarde en la wiki y habilitar las clases en cualquier momento en Icono del Usuario > Configuraciones.",
"chooseClassLearnMarkdown": "[Aprende más sobre el sistema de clases de Habitica](/static/faq#what-classes)",
"optOutOfClassesText": "No quieres tomarte la molestia de las clases? Si Quieres elegir luego puedes leer <a href='/static/faq#what-classes' target='_blank'>our FAQ</a> y elegir en tu Configuración para habilitar el sistema de clases.",
"selectClass": "Seleccionar <%= heroClass %>",
"select": "Seleccionar",
"stealth": "Sigilo",
@@ -167,12 +167,12 @@
"photo": "Foto",
"info": "Información",
"joined": "Se unió",
"totalLogins": "Total de días en linea",
"totalLogins": "Total de check-ins",
"latestCheckin": "Último día en linea",
"editProfile": "Editar Perfil",
"challengesWon": "Desafíos Ganados",
"questsCompleted": "Misiones Completadas",
"headAccess": "Acces. para la Cabeza.",
"headAccess": "Accesorío para la Cabeza.",
"backAccess": "Accesorio para la Espalda.",
"bodyAccess": "Accesorio para el Cuerpo.",
"mainHand": "Mano Principal",
@@ -185,5 +185,11 @@
"purchasePetItemConfirm": "Este pago va a exceder el numero de artículos que necesitas para incubar todas las <%= itemText %> mascotas. ¿Estas seguro?",
"notEnoughGold": "Oro insuficiente.",
"chatCastSpellPartyTimes": "<%= username %> lanza <%= spell %> para el grupo <%= times %> veces.",
"chatCastSpellUserTimes": "<%= username %> lanza <%= spell %> sobre <%= target %> <%= times %> veces."
"chatCastSpellUserTimes": "<%= username %> lanza <%= spell %> sobre <%= target %> <%= times %> veces.",
"titleFacialHair": "Pelo Facial",
"titleHaircolor": "Colores de Pelo",
"titleHairbase": "Estilos de Pelo",
"customizations": "Personalizaciónes",
"nextReward": "Próxima Recompensa de Log in",
"skins": "Pieles"
}

View File

@@ -1,6 +1,5 @@
{
"FAQ": "Preguntas Frecuentes",
"termsAndAgreement": "Al hacer clic en el botón de abajo, estás indicando que has leído y estás de acuerdo con los <a href='/static/terms'>Términos de Servicio</a> y la <a href='/static/privacy'>Política de Privacidad</a>.",
"chores": "Quehaceres",
"clearBrowserData": "Borrar Datos de Navegación",
"communityExtensions": "Complementos y Extensiones",

View File

@@ -7,8 +7,6 @@
"justin": "Justin",
"justinIntroMessage1": "¡Hola! Debes ser nuevo por aquí. Mi nombre es <strong>Justin</strong>, y seré tu guía en Habitica.",
"justinIntroMessage3": "¡Genial! Ahora, ¿en qué te interesa trabajar durante este viaje?",
"justinIntroMessageUsername": "Antes de empezar, decidamos cómo te llamarás. Abajo verás un nombre público y un nombre de usuario que he generado para ti. Cuando hayas elegido un nombre público y un nombre de usuario, ¡empezaremos creando tu avatar!",
"justinIntroMessageAppearance": "Entonces, ¿cómo te gustaría verte? No te preocupes, puedes cambiar esto más adelante.",
"introTour": "¡Aquí estamos! He llenado algunas Tareas para ti según tus intereses, así que podrás comenzar en seguida. ¡Haz clic en una Tarea para editarla o agrega nuevas Tareas que encajen en tu rutina!",
"prev": "Ant",
"next": "Sig",

View File

@@ -912,5 +912,14 @@
"backgroundSirensLairNotes": "Osez nager au cœur de l'Antre des Sirènes.",
"backgrounds082025": "Ensemble 135 : Sortie Août 2025",
"backgroundSunnyStreetWithShopsText": "Allée Marchande Ensoleillée",
"backgroundSunnyStreetWithShopsNotes": "Profitez de l'ambiance lumineuse et sonore d'une Allée Marchande Ensoleillée."
"backgroundSunnyStreetWithShopsNotes": "Profitez de l'ambiance lumineuse et sonore d'une Allée Marchande Ensoleillée.",
"backgrounds092025": "Ensemble 136 : Sortie Septembre 2025",
"backgroundAutumnSwampText": "Marais Automnal",
"backgroundAutumnSwampNotes": "Ressentez l'ambiance envoûtante d'un Marais Automnal.",
"backgrounds102025": "Ensemble 137 : Sortie Octobre 2025",
"backgroundInsideForestWitchsCottageText": "Cottage de la Sorcière de la Forêt",
"backgroundInsideForestWitchsCottageNotes": "Concotez des sorts dans le Cottage de la Sorcière de la Forêt.",
"backgrounds112025": "Ensemble 138 : Sortie en Novembre 2025",
"backgroundCastleKeepWithBannersText": "Hall de Château avec Bannières",
"backgroundCastleKeepWithBannersNotes": "Contez des épopées fantastiques dans ce Hall de Château avec des Bannières."
}

View File

@@ -1,6 +1,5 @@
{
"FAQ": "FAQ",
"termsAndAgreement": "En cliquant sur le bouton ci-dessous, vous indiquez que vous avez lu et approuvé les <a href='/static/terms'>conditions générales d'utilisation</a> et la <a href='/static/privacy'>charte de confidentialité</a>.",
"chores": "Tâches ménagères",
"clearBrowserData": "Effacer les données du navigateur",
"communityExtensions": "Modules complémentaires et extensions",
@@ -94,7 +93,7 @@
"localStorageClear": "Effacer les données",
"localStorageClearExplanation": "Ce bouton va effacer les données locales et les cookies, puis vous déconnectera.",
"username": "Nom d'utilisateur",
"emailOrUsername": "Adresse courriel ou nom d'utilisateur (sensible à la casse)",
"emailOrUsername": "Pseudo ou Email (sensible à la casse)",
"work": "Travailler",
"reportAccountProblems": "Signaler un problème sur votre compte",
"reportCommunityIssues": "Signaler un problème concernant la communauté",
@@ -123,7 +122,7 @@
"passwordConfirmationMatch": "La confirmation du mot de passe ne correspond pas au mot de passe.",
"passwordResetPage": "Réinitialiser le mot de passe",
"passwordReset": "Si nous avons votre courriel ou votre identifiant dans nos fichiers, un nouveau mot de passe vous a été envoyé.",
"invalidLoginCredentialsLong": "Oups ! Votre adresse courriel / identifiant ou votre mot de passe est incorrect.\n- Assurez-vous que vous avez tout bien orthographié. L'identifiant et le mot de passe sont sensibles à la casse.\n- Vous vous êtes peut-être enregistré avec Facebook ou Google-sign-in, et non avec votre adresse courriel. Vérifiez en essayant de vous connecter avec ces services.\n- Si vous avez oublié votre mot de passe, cliquez sur « Mot de passe oublié ».",
"invalidLoginCredentialsLong": "Votre email, identifiant ou mot de passe est incorrect. Merci de réessayer ou de faire \"Mot de passe oublié\".",
"invalidCredentials": "Aucun compte n'utilise cet identifiant.",
"accountSuspended": "Ce compte, identifiant “<%= userId %>”, a été bloqué pour avoir enfreint les règles de vie en communauté (https://habitica.com/static/community-guidelines) ou les conditions dutilisation (https://habitica.com/static/terms). Pour plus dinformations, ou pour demander un déblocage, merci denvoyer un courriel à notre gestionnaire de la communauté : <%= communityManagerEmail %>, ou demandez à un parent ou à un tuteur de leur envoyer un courriel. Merci d'y inclure votre @identifiant.",
"accountSuspendedTitle": "Le compte a été suspendu",
@@ -133,12 +132,12 @@
"invalidReqParams": "Paramètres de la requête invalides.",
"memberIdRequired": "\"member\" doit être un UUID valide.",
"heroIdRequired": "\"heroId\" doit être un UUID valide.",
"cannotFulfillReq": "Votre requête ne peut pas être complétée. Envoyez un courriel à admin@habitica.com si l'erreur persiste.",
"cannotFulfillReq": "Merci d'entrer une adresse email valide. Contactez admin@habitica.com si cette erreur persiste",
"modelNotFound": "Ce modèle n'existe pas.",
"signUpWithSocial": "Inscription via <%= social %>",
"signUpWithSocial": "Continuer via <%= social %>",
"loginWithSocial": "Connexion via <%= social %>",
"confirmPassword": "Confirmer le mot de passe",
"usernameLimitations": "L'identifiant doit faire de 1 à 20 caractères, contenir des lettres de a à z, des chiffres de 0 à 9, des traits d'union et/ou des tirets bas, et ne peut contenir de mot grossier.",
"usernameLimitations": "Le pseudonyme peut être changé à tout moment. Il doit faire de 1 à 20 caractères, contenir des lettres de a à z, des chiffres de 0 à 9, des traits d'union et/ou des tirets bas.",
"usernamePlaceholder": "par exemple Wasabitica",
"emailPlaceholder": "par exemple gryphon@exemple.com",
"passwordPlaceholder": "par exemple ******************",
@@ -183,5 +182,10 @@
"incorrectResetPhrase": "Merci de taper <%= magicWord %> en lettres capitales pour réinitialiser votre compte.",
"marketing3Lead1Title": "Applications Android et iOS",
"marketing4Lead3Button": "Commencez dès Aujourd'hui",
"missingClientHeader": "En-têtes x-client manquants."
"missingClientHeader": "En-têtes x-client manquants introuvables.",
"emailBlockedRegistration": "Cette adresse mail a été bloquée par la modération. Si vous pensez qu'il s'agit d'une erreur, merci de nous contacter à admin@habitica.com.",
"minPasswordLengthLogin": "Votre mot de passe contient au moins 8 caractères.",
"enterValidEmail": "Merci d'entrer une adresse email valide.",
"whatToCallYou": "Comment souhaitez-vous que nous vous appelions ?",
"acceptPrivacyTOS": "Vous confirmez avoir au moins 18 ans, et avoir lu et approuvé nos <a href='/static/terms' target='_blank'>Conditions de Service</a> ainsi que notre <a href='/static/privacy' target='_blank'>Politique de confidentialité</a>"
}

View File

@@ -3114,7 +3114,7 @@
"weaponSpecialSummer2024HealerNotes": "Vous serez impressioné·e de découvrir à quel point la coquille au bout de ce bâton est dure. Augmente l'Intelligence de <%= int %>. Édition Limitée Équipement Été 2024.",
"weaponArmoireCorsairsBladeText": "Lame de Corsaire",
"armorSpecialSummer2024RogueNotes": "Vous êtes peut-être une limace des mers sans coquille, mais vous êtes quand même une limace des mers avec des ailes marines ! Augmente la Perception de <%= per %>. Édition Limitée Équipement Été 2024.",
"weaponArmoireCorsairsBladeNotes": "Que vous la portiez pour piller ou pour protéger, vous pouvez être content·e d'avoir amené cette fière lame pour parcourir les mers à vos côtés. Assurez-vous juste de la rengainer prudemment quand vous ne l'utilisez pas. Augmente la Force de <%= str %>. Armoire Enchantée : Ensemble Corsaire (Objet 3 sur 3)",
"weaponArmoireCorsairsBladeNotes": "Que vous la portiez pour piller ou pour protéger, vous pouvez être satisfait·e d'avoir amené cette fière lame pour parcourir les mers à vos côtés. Assurez-vous juste de la rengainer prudemment quand vous ne l'utilisez pas. Augmente la Force de <%= str %>. Armoire Enchantée : Ensemble Corsaire (Objet 3 sur 3).",
"armorSpecialSummer2024MageNotes": "Dites à vos ennemi·e·s de faire gaffe à l'anémone ! (Et maintenant dites-leur de le répéter cinq fois d'affilée.) Augmente l'Intelligence de <%= int %>. Édition Limitée Équipement Été 2024.",
"armorMystery202407Notes": "Glissez à travers les lacs et les canaux avec votre véloce queue rose ! Ne confère aucun bonus. Équipement d'Abonnement Juillet 2024.",
"armorSpecialSummer2024RogueText": "Queue de Nudibranche",
@@ -3148,7 +3148,7 @@
"headArmoireDragonKnightsHelmText": "Heaume du Chevalier Dragon",
"shieldMystery202408Text": "Scintillements des Arcanes",
"weaponMystery202408Notes": "Une bulle de protection magique qui vous protège des sorts ennemis et vous permet de flotter dans sur l'eau comme dans les airs. Ne confère aucun bonus. Équipement d'Abonnement Août 2024.",
"weaponArmoireDragonKnightsLanceNotes": "Cette lance rouge et argent a désarçonner de nombreux opposant·e·s de leur montures. Augmente la Constitution de <%= con %>. Armoire Enchantée : Ensemble Chevalier Dragon (Objet 3 sur 3)",
"weaponArmoireDragonKnightsLanceNotes": "Cette lance rouge et argent a désarçonné de nombreux opposant·e·s de leurs montures. Augmente la Constitution de <%= con %>. Armoire Enchantée : Ensemble Chevalier Dragon (Objet 3 sur 3).",
"armorArmoireDragonKnightsArmorNotes": "Canalisez la force et le pouvoir d'un dragon avec cette armure faite d'argent et d'écailles. Augmente la Force de <%= str %>. Armoire Enchantée : Ensemble Chevalier Dragon (Objet 2 sur 3)",
"headArmoireDragonKnightsHelmNotes": "Avec ces apparats ardents ornant ce casque, les dragons pourraient vous prendre pour l'un·e des leurs. Augmente l'Intelligence de <%= int %>. Armoire Enchantée : Ensemble Chevalier Dragon (Objet 1 sur 3)",
"shieldMystery202408Notes": "De la lumière magique illuminera l'intérieur de votre cachette-bulle, ou dans quel qu'autre endroit nécessitant un peu de lumière ! Ne confère aucun bonus. Équipement d'Abonnement Août 2024.",
@@ -3183,7 +3183,7 @@
"armorSpecialFall2024WarriorNotes": "Faites un·e avec les flammes et devenez immunisé·e à leurs pouvoirs destructeurs dans cette armure. Augmente la Constitution de <%= con %>. Édition Limitée Équipement Automne 2024.",
"armorSpecialFall2024HealerNotes": "Faites un·e avec la galaxie et éblouissez vos admirat·eur·rice·s dans cette armure. Augmente la Constitution de <%= con %>. Édition Limitée Équipement Automne 2024.",
"armorSpecialFall2024MageNotes": "Faites un·e avec l'outre-monde et emparez-vous du pouvoir des mages qui vous ont précédé·e·s dans cette armure. Augmente l'Intelligence de <%= int %>. Édition Limitée Équipement Automne 2024.",
"weaponArmoireFunnyFoolBatonNotes": "Avec un mouvement de votre marotte, vous pouvez sortir une réplique cinglante, rediriger l'attention ou invoquer des applaudissments. Augmente la Constitution et la Force de <%= attrs %> chacune. Armoire Enchantée : Ensemble du Fou Fanfaron (Objet 3 sur 3)",
"weaponArmoireFunnyFoolBatonNotes": "Avec un mouvement de votre marotte, vous pouvez sortir une réplique cinglante, rediriger l'attention ou invoquer des applaudissments. Augmente la Constitution et la Force de <%= attrs %> chacune. Armoire Enchantée : Ensemble du Fou Fanfaron (Objet 3 sur 3).",
"headSpecialFall2024RogueNotes": "Que vous soyez câlin·e ou mali·n·gne, vous ne passerez pas inaperçu·e en portant ceci ! Augmente la Perception de <%= per %>. Édition Limitée Équipement Automne 2024.",
"headSpecialFall2024HealerNotes": "Que vous défendiez un planète ou en exploriez une nouvelle, vous ne passerez pas inaperçu·e en portant ceci ! Augmente l'Intelligence de <%= int %>. Édition Limitée Équipement Automne 2024.",
"shieldSpecialFall2024WarriorNotes": "Les difficultés liées à vos tâches sont absorbées pour votre bouclier et vous rend plus déterminé·e. Augmente la Constitution de <%= con %>. Édition Limitée Équipement Automne 2024.",
@@ -3194,7 +3194,7 @@
"shieldSpecialFall2024HealerNotes": "Les nouvelles tâches cherchant à attirer votre attention sont déviées tant que vous n'avez pas complété votre mission en cours. Augmente la Constitution de <%= con %>. Édition Limitée Équipement Automne 2024.",
"shieldArmoireSafetyFlashlightNotes": "Euh, vous avez entendu ce bruit? Vite! Éclairez les ombre de ce côté. Hmm, on dirait que ce n'était que le vent. Ou pas..? Augmente la Constitution de <%= con %> Armoire Enchantée: Ensemble Nuit du Frisson (Objet 1 sur 2)",
"weaponArmoireSpookyCandyBucketText": "Seau de Friandises Effrayant",
"weaponArmoireSpookyCandyBucketNotes": "Avec un costume aussi impressionnant, vous allez pouvoir obtenir énormément de friandises ! Heureusement que vous avez ce seau sans fond pour tout contenir. Essayez de ne pas trop en grignoter en avant de rentrer à la maison. Augmente l'Intelligence de <%= int %>. Armoire Enchantée : Ensemble Nuit du Frisson (Objet 2 sur 2)",
"weaponArmoireSpookyCandyBucketNotes": "Avec un costume aussi impressionnant, vous allez pouvoir obtenir énormément de friandises ! Heureusement que vous avez ce seau sans fond pour tout contenir. Essayez de ne pas tout grignoter avant d'arriver chez vous. Augmente l'Intelligence de <%= int %>. Armoire Enchantée : Ensemble Nuit du Frisson (Objet 2 sur 2).",
"shieldArmoireSafetyFlashlightText": "Lampe Torche de Sécurité",
"backMystery202410Text": "Queue Candy Corn",
"backMystery202410Notes": "Cette queue se redresse en entendant parler de friandises effrayantes. Ne confère aucun bonus. Équipement d'Abonnement Octobre 2024.",
@@ -3203,7 +3203,7 @@
"weaponArmoireStormKnightAxeText": "Hache du Chevalier de la Tempête",
"armorArmoireStormKnightArmorText": "Armure du Chevalier de la Tempête",
"armorArmoireStormKnightArmorNotes": "Dans cette armure, vous êtes quasi invincible. Vos ennemi·e·s ne verront jamais la fin de la tempête. Augmente la Perception de <%= per %>. Armoire Enchantée : Ensemble Chevalier de la Tempête (Objet 3 sur 3)",
"weaponArmoireStormKnightAxeNotes": "Accumulez votre furie et faites éclater votre coup comme du tonnerre ! Augmente la Force de <%= str %>. Armoire Enchantée : Ensemble Chevalier de la Tempête. (Objet 3 sur 3)",
"weaponArmoireStormKnightAxeNotes": "Accumulez votre furie et faites éclater votre coup comme du tonnerre ! Augmente la Force de <%= str %>. Armoire Enchantée : Ensemble Chevalier de la Tempête. (Objet 3 sur 3).",
"headMystery202411Notes": "Ce heaume va sacrément intimider vos tâches quand vous foncerez dedans la tête la première ! Ne confère aucun bonus. Équipement d'Abonnement Novembre 2024.",
"headArmoireStormKnightHelmNotes": "Domptez les éclairs grâce à ces ramures électrisantes. Augmente la Constitution de <%= con %>. Armoire Enchantée : Ensemble Chevalier de la Tempête (Objet 1 sur 3)",
"bodyMystery202411Notes": "Les piquants impressionnants de ces épaulières sont parfaits pour foncer tête baissée dans votre liste de choses à faires. Ne confère aucun bonus. Équipement d'abonnement Novembre 2024.",
@@ -3315,7 +3315,7 @@
"headArmoireSillierBlueTophatText": "Haut-de-Forme Bleu encore plus Rigolodicule",
"headArmoireSillierBlueTophatNotes": "Un peu de classe, un peu de sophistication. Augmente la Force et la Constitution de <%= attrs %> chacune. Armoire Enchantée : Ensemble Smoking encore plus Rigolodicule (Objet 2 sur 2).",
"weaponArmoireGildedKnightsSpearText": "Lance d·u·e la Chevali·er·ère Doré·e",
"weaponArmoireGildedKnightsSpearNotes": "Avec cette arme, vous êtes assuré·e que chacun·e payera toujours ses dettes. Augmente la Force de <%= str %>. Armoire enchantée : Ensemble Chevali·er·ère Doré·e (Objet 3 sur 3)",
"weaponArmoireGildedKnightsSpearNotes": "Avec cette arme, vous êtes assuré·e que chacun·e payera toujours ses dettes. Augmente la Force de <%= str %>. Armoire enchantée : Ensemble Chevali·er·ère Doré·e (Objet 3 sur 3).",
"armorArmoireGildedKnightsPlateNotes": "Dans cette armure, vous êtes quasiment invincible. Vous ennemi·e·s vont certainement vous entendre rugir ! Augmente la Perception de <%= per %>. Armoire Enchantée : Ensemble Chevali·er·ère Doré·e (Objet 2 sur 3)",
"backMystery202505Notes": "Obtenez vos galons en virevoltant et batifolant avec ces ailes aérodynamiques. Ne confère aucun bonus. Équipement d'abonnement Mai 2025.",
"headAccessoryMystery202505Text": "Antennes de Machaon Majestueux",
@@ -3338,11 +3338,11 @@
"weaponSpecialSummer2025WarriorNotes": "Impossible de savoir l'âge de cet artefact, mais il vous accompagnera à travers de grandes épreuves. Augmente la Force de <%= str %>. Équipement Édition Limitée Été 2025.",
"weaponSpecialSummer2025WarriorText": "Lance Pétoncle",
"weaponSpecialSummer2025HealerNotes": "Faites en mouvement en huit pour avancer et faire de grands progrès en accomplissant vos tâches. Augmente l'Intelligence de <%= int %>. Équipement Édition Limitée Été 2025.",
"weaponSpecialSummer2025MageNotes": "Restez branché·e grâce à vos talents et vos compétences pour aborder différentes tâches. Augmente l'Intelligence de <%= int %> et la Perception de <%= per %>. Équipement Édition Limitée Été 2025",
"weaponSpecialSummer2025MageNotes": "Restez branché·e grâce à vos talents et vos compétences pour aborder différentes tâches. Augmente l'Intelligence de <%= int %> et la Perception de <%= per %>. Équipement Édition Limitée Été 2025.",
"armorSpecialSummer2025WarriorNotes": "Cette armure vous rend non seulement résistant·e, mais également agile. L'attaque ou la fuite, le choix vous appartient ! Augmente la Constitution de <%= con %>. Équipement Édition Limitée Été 2025.",
"armorSpecialSummer2025RogueNotes": "Non seulement ce costume changera de couleurs selon votre volonté, mais il peut en plus d'expulser un nuage d'encre. Faites diversion ou cachez-vous, le choix vous appartient ! Augmente la Perception de <%= per %>. Équipement Édition Limitée Été 2025.",
"armorArmoireBeekeepersSuitNotes": "Restez en sécurité tandis que vous observez vos dures travailleuses. Augmente la Constitution de <%= con %>. Armoire Enchantée : Ensemble Apicult·eur·rice (Objet 2 sur 4)",
"weaponArmoireBeekeepersSmokerNotes": "Utilisez cet objet pour apaiser vos abeilles et récolter leur miel. Elles ne le vivront pas mal. En vrai, on pourrait tou·te·s bénéficier des quelques minutes de calme de temps en temps. Augmente l'Intelligence de <%= int %>. Armoire Enchantée : Ensemble Apicult·eur·rice (Objet 3 sur 4)",
"weaponArmoireBeekeepersSmokerNotes": "Utilisez cet objet pour apaiser vos abeilles et récolter leur miel. Elles ne le vivront pas mal. En vrai, on pourrait tou·te·s bénéficier des quelques minutes de calme de temps en temps. Augmente l'Intelligence de <%= int %>. Armoire Enchantée : Ensemble Apicult·eur·rice (Objet 3 sur 4).",
"weaponArmoireBeekeepersSmokerText": "Enfumoir",
"armorSpecialSummer2025WarriorText": "Armure Pétoncle",
"armorSpecialSummer2025RogueText": "Costume Calamar",
@@ -3356,7 +3356,6 @@
"weaponSpecialSummer2025MageText": "Branche de Corail",
"shieldSpecialSummer2025WarriorText": "Bouclier en coquille de pétoncle",
"shieldSpecialSummer2025WarriorNotes": "Les couleurs sont magnifiques, mais les crêtes sont dangereuses. Ennemi·e·s, gare à vous ! Augmente la Constitution de <%= con %>. Équipement Édition Limitée Été 2025.",
"shieldSpecialSummer2025RogueText": "Tentacule de Calamar",
"shieldSpecialSummer2025HealerText": "Bouclier Clione",
"shieldSpecialSummer2025HealerNotes": "Ce bouclier parait simple, mais il possède des propriétés nocives. Ennemi·e·s, gare à vous ! Augmente la Constitution de <%= con %>. Équipement Édition Limitée Été 2025.",
"shieldMystery202506Text": "Bouclier Rayonnement Solaire",
@@ -3383,5 +3382,62 @@
"headArmoireRedNewsieHatText": "Casquette Rouge d·u·e la Crieu·r·se Publi·c·que",
"headArmoireRedNewsieHatNotes": "Extra ! Extra ! Toutes les dernières infos : cette casquette est confortable, à la mode, et pratique. Augmente la Perception et l'Intelligence de <%= attrs %> chacune. Armoire Enchantée : Ensemble Gilet Rouge (Objet 1 sur 2)",
"shieldMystery202508Text": "Lame Lumineuse Cyan",
"shieldMystery202508Notes": "Si vous pensiez que c'était classe de faire tournoyer une lame, essayez avec deux ! Ne confère aucun bonus. Équipement d'Abonnement Août 2025."
"shieldMystery202508Notes": "Si vous pensiez que c'était classe de faire tournoyer une lame, essayez avec deux ! Ne confère aucun bonus. Équipement d'Abonnement Août 2025.",
"weaponSpecialFall2025WarriorText": "Hache de Bigfoot",
"weaponSpecialFall2025RogueText": "Lame de Squelette",
"weaponSpecialFall2025WarriorNotes": "Une arme redoutable pour vous frayer un chemin à travers une forêt d'automne pleine de complications. Augmente la Force de <%= str %>. Équipement Édition Limitée Automne 2025.",
"weaponSpecialFall2025RogueNotes": "Une arme redoutable pour vous frayer un chemin à travers une forêt d'automne pleine d'obstacles. Augmente la Force de <%= str %>. Équipement Édition Limitée Automne 2025.",
"weaponSpecialFall2025HealerText": "Hache du Kobold",
"weaponSpecialFall2025MageText": "Hache du Fantôme Masqué·e",
"weaponSpecialFall2025MageNotes": "Une arme redoutable pour vous frayer un chemin à travers une forêt d'automne pleine de choses effrayantes. Augmente l'Intelligence de <%= int %> et la Perception de <%= per %>. Équipement Édition Limitée Automne 2025.",
"weaponMystery202511Text": "Épée de Givre",
"weaponMystery202511Notes": "La lueur glacée de cette épée vous débarassera de toutes les tâches, même les rouges foncées. Ne confère aucun bonus. Équipement d'Abonnement Novembre 2025.",
"weaponSpecialFall2025HealerNotes": "Une arme redoutable pour vous frayer un chemin à travers une forêt d'automne pleine d'obstacles. Augmente l'Intelligence de <%= int %>. Équipement Édition Limitée Automne 2025.",
"weaponArmoireBlacksmithsHammerText": "Marteau de Forgeron·ne",
"weaponArmoireBlacksmithsHammerNotes": "Ce marteau sert à la ferronerie, mais s'adapte très bien au cœur des charbons rouges ardents et aux tâches Quotidiennes rouges ardentes également. Augmente la Force de <%= str %>. Armoire Enchantée : Ensemble Forgeron·ne (Objet 3 sur 3).",
"armorSpecialFall2025WarriorText": "Armure de Bigfoot",
"armorSpecialFall2025WarriorNotes": "Ni vos grands pieds ni votre grand corps ne seront trop larges pour passer dans cette armure saisonnière. Augmente la Constitution de <%= con %>. Équipement Édition Limitée Automne 2025.",
"armorSpecialFall2025RogueText": "Armure du Squelette",
"armorSpecialFall2025RogueNotes": "Une cible étroite et dure est dans cette armure saisonnière et difficile à atteindre. Augmente la Perception de <%= per %>. Équipement Édition Limitée Automne 2025.",
"armorSpecialFall2025HealerText": "Armure du Kobold",
"armorSpecialFall2025HealerNotes": "Cette armure saisionnière vous permet de vous dissimuler dans les forêts sombres pour opérer une retraite stratégique. Augmente la Constitution de <%= con %>. Équipement Édition Limitée Automne 2025.",
"armorSpecialFall2025MageText": "Armure de Fantôme Masqué·e",
"armorSpecialFall2025MageNotes": "Cette armure saisonnière devient incorporelle après que vous l'ayez enfilée. Augmente l'Intelligence de <%= int %>. Équipement Édition Limitée Automne 2025.",
"armorArmoireBlacksmithsApronText": "Tablier de Forgeron·ne",
"armorArmoireBlacksmithsApronNotes": "Ce tablier n'est pas aussi lourd qu'il en a l'air. Une fois que vous le porterez, il vous protègera des étincelles incandescentes sans entraver vos mouvements. Augmente la Constitution de <%= con %>. Armoire Enchantée : Ensemble Forgeron·ne (Objet 2 sur 3).",
"armorArmoireBlackPartyDressText": "Robe de Soirée Noire",
"headSpecialFall2025WarriorText": "Masque de Bigfoot",
"headSpecialFall2025WarriorNotes": "Rond et poilu, ce masque protège votre tête pendant que vous vous attaquez à toutes vos tâches importantes. Augmente la Force de <%= str %>. Équipement Édition Limitée Automne 2025.",
"headSpecialFall2025RogueText": "Masque de Squelette",
"headSpecialFall2025HealerText": "Masque de Kobold",
"headSpecialFall2025MageText": "Masque de Fantôme Masqué·e",
"headArmoireFloppyOrangeHatText": "Chapeau Mou Orange",
"headArmoireBlackHairbowText": "Chouchou Noir",
"headArmoireBlacksmithsGogglesText": "Lunettes de Forgeron·ne",
"shieldSpecialFall2025WarriorText": "Bouclier de Bigfoot",
"shieldSpecialFall2025HealerText": "Bouclier de Kobold",
"shieldMystery202511Text": "Bouclier de Givre",
"shieldArmoireSoftOrangePillowText": "Oreiller Orange Doux",
"bodyMystery202509Text": "Écharpe d·u·e la Vagabond·e Volant·e",
"armorMystery202509Text": "Robe d·u·e la Vagabond·e Volant·e",
"armorMystery202509Notes": "De la soie brillante qui vous protègera de tous les temps, chauds comme froids. Ne confère aucun bonus. Équipement d'abonnement Septembre 2025.",
"armorArmoireSoftOrangeSuitText": "Pyjama Doux Orange",
"armorArmoireSoftOrangeSuitNotes": "Orange est une couleur vive. En portant cette tenue au lit, vous êtes certain·e de triompher dans toutes les aventures que vous vivrez en rêve. Augmente la Constitution et la Force de <%= attrs %> chacune. Armoire Enchantée : Ensemble Vêtements d'Intérieur Oranges (Objet 3 sur 3).",
"armorArmoireBlackPartyDressNotes": "Vous êtes fort·e, intelligent·e, généreu·x·se, et tellement à la mode ! Augmente la Force, l'Intelligence et la Constitution de <%= attrs %> chacune. Armoire Enchantée : Ensemble Chouchou Noir (Objet 2 sur 2).",
"headSpecialFall2025RogueNotes": "Pâle et encapuchonné, ce masque protège votre tête pendant que vous vous attaquez à toutes vos tâches importantes. Augmente la Perception de <%= per %>. Équipement Édition Limitée Automne 2025.",
"headSpecialFall2025HealerNotes": "Impressionant et cornu, ce masque protège votre tête pendant que vous vous attaquez à toutes vos tâches importantes. Augmente l'Intelligence de <%= int %>. Équipement Édition Limitée Automne 2025.",
"headSpecialFall2025MageNotes": "Éthéré et brillant, ce masque protège votre tête pendant que vous vous attaquez à toutes vos tâches importantes. Augmente la Perception de <%= per %>. Équipement Édition Limitée Automne 2025.",
"headArmoireBlackHairbowNotes": "Devenez fort·e, intelligent·e et généreu·x·se en portant ce magnifique Chouchou noir ! Augmente la Force, l'Intelligence et la Constitution de <%= attrs %> chacune. Armoire Enchantée : Ensemble Chouchou Noir.",
"headArmoireBlacksmithsGogglesNotes": "Une protection occulaire contre les éclats et la chaleur qui vous sera essentiel en travaillant à la forge. Augmente la Perception de <%= per %>. Armoire Enchantée : Ensemble Forgeron·ne (Objet 1 sur 3).",
"shieldSpecialFall2025WarriorNotes": "Accordez-vous un peu plus de temps pour réfléchir et planifier en vous protégeant de vos prochaines Tâches Quotidiennes. Augmente la Constitution de <%= con %>. Équipement Édition Limitée Automne 2025.",
"shieldSpecialFall2025HealerNotes": "Accordez-vous un peu plus de temps pour rassembler votre matériel en vous protégeant de vos corvées. Augmente la Constitution de <%= con %>. Équipement Édition Limitée Automne 2025.",
"shieldArmoireSoftOrangePillowNotes": "L·e·a guerri·er·ère toujours prêt·e emporte un oreiller pour n'importe quelle quête. Préparez-vous à prendre de nouvelles responsabilités... Même quand vous faites la sieste. Augmente l'Intelligence et la Perception de <%= attrs %> chacune. Armoire Enchantée : Ensemble Vêtements d'Intérieur Oranges (Objet 3 sur 3).",
"backMystery202510Notes": "Volez sans faire de bruit à travers les cieux hantés grâce à ces ailes géantes. Ne confère aucun bonus. Équipement d'Abonnement Octobre 2025.",
"backMystery202510Text": "Ailes de la Ghoule Glissante",
"bodyMystery202509Notes": "Cette écharpe protège votre visage du vent et en plus, elle a sacrément la classe. Ne confère aucun bonus. Équipement d'Abonnement Septembre 2025.",
"eyewearMystery202510Text": "Yeux de la Ghoule Glissante",
"eyewearMystery202510Notes": "Ces yeux effrayants brillent comme la Lune de la Moisson. Ne confère aucun bonus. Équipement d'Abonnement Octobre 2025.",
"headArmoireFloppyOrangeHatNotes": "De nombreux sorts ont été cousus dans ce chapeau d'apparence simple, ce qui lui donne cette couleur orange flashy. Augmente toutes les caractéristiques de <%= attrs %> chacun. Armoire Enchantée : Ensemble Vêtements d'Intérieur Oranges (Objet 1 sur 3).",
"shieldSpecialFall2025RogueNotes": "Une arme redoutable pour couper vos tâches À Faire en deux. Augmente la Force de <%= str %>. Équipement Édition Limitée Automne 2025.",
"shieldMystery202511Notes": "Ce rude bouclier de rocs glacés vous protègents de vos mauvaises habitudes sans vous geler les mains. Ne confère aucun bonus. Équipement d'Abonnement Novembre 2025."
}

View File

@@ -278,5 +278,9 @@
"summer2025SquidRogueSet": "Ensemble Voleu·r·se Calamar",
"summer2025SeaAngelHealerSet": "Ensemble Guérisseu·r·se Clione",
"summer2025FairyWrasseMageSet": "Ensemble Mage Labre Exquis",
"summer2025ScallopWarriorSet": "Ensemble Guerri·er·ère Pétoncle"
"summer2025ScallopWarriorSet": "Ensemble Guerri·er·ère Pétoncle",
"fall2025MaskedGhostMageSet": "Ensemble Mage Fantôme Masqué·e",
"fall2025SasquatchWarriorSet": "Ensemble Guerri·er·ère Big Foot",
"fall2025SkeletonRogueSet": "Ensemble Voleu·r·se Squelette",
"fall2025KoboldHealerSet": "Ensemble Guérisseu·r·se Kobold"
}

View File

@@ -5,10 +5,8 @@
"welcomeTo": "Bienvenue à",
"welcomeBack": "Heureux de vous revoir !",
"justin": "Justin",
"justinIntroMessage1": "Bonjour bonjour ! On dirait que vous venez tout juste d'arriver. Je m'appelle <strong>Justin</strong>, je serai votre guide dans Habitica.",
"justinIntroMessage1": "Bonjour bonjour ! On dirait que vous venez tout juste d'arriver. Je suis <strong>Justin</strong>, je serai votre guide dans Habitica. Alors, à quoi souhaitez-vous ressembler ? Ne vous en faites pas, vous pourrez modifier votre apparence plus tard.",
"justinIntroMessage3": "Bravo ! Maintenant, que souhaiteriez-vous travailler pendant cette aventure ?",
"justinIntroMessageUsername": "Avant de commencer, choisissons comment vous appeler. Vous trouverez ci-dessous un pseudo et un identifiant que j'ai généré pour vous. Après avoir choisi votre pseudo et votre identifiant personnels, nous commencerons à vous créer un avatar !",
"justinIntroMessageAppearance": "A quoi voudriez-vous ressembler ? Ne vous en faites pas, vous pourrez le changer plus tard.",
"introTour": "Et voilà ! Pour que vous puissiez commencer, j'ai créé quelques tâches à partir de vos centres d'intérêts. Cliquez sur une tâche pour l'éditer, ou créez-en de nouvelles pour perfectionner votre routine !",
"prev": "Précédent",
"next": "Suivant",

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