Compare commits

..

26 Commits

Author SHA1 Message Date
Kalista Payne cef8a34c06 5.34.2 2025-03-12 09:01:14 -05:00
Weblate 6432823eec Translated using Weblate (Hungarian)
Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 17.1% (42 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (German)

Currently translated at 99.5% (3288 of 3303 strings)

Co-authored-by: Eddy Nottingham <habitica.com.scone566@simplelogin.com>
Co-authored-by: Sujay Thomas <mail.sujaythomas@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/character/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/character/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/content/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hu/
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Questscontent
2025-03-12 09:49:58 +01:00
Phillip Thelen 563b780d85 fix system messages not being translated (#15405) 2025-03-11 16:58:39 -05:00
Phillip Thelen aa9b1b2cac More Sprites (#15400)
* remove need for quest_ notif_ and inventory_quest_ in css

* fix test
2025-03-11 16:48:19 -05:00
Kalista Payne 401e541b86 5.34.1 2025-03-11 09:56:21 -05:00
Weblate c13bed3bad Translated using Weblate (Hungarian)
Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (German)

Currently translated at 99.4% (3286 of 3303 strings)

Translated using Weblate (Indonesian)

Currently translated at 95.6% (109 of 114 strings)

Translated using Weblate (Indonesian)

Currently translated at 98.2% (57 of 58 strings)

Translated using Weblate (Indonesian)

Currently translated at 88.1% (379 of 430 strings)

Translated using Weblate (Indonesian)

Currently translated at 73.3% (2424 of 3303 strings)

Translated using Weblate (Indonesian)

Currently translated at 89.3% (217 of 243 strings)

Translated using Weblate (Indonesian)

Currently translated at 74.2% (182 of 245 strings)

Translated using Weblate (Indonesian)

Currently translated at 83.5% (76 of 91 strings)

Translated using Weblate (Indonesian)

Currently translated at 89.0% (98 of 110 strings)

Translated using Weblate (Indonesian)

Currently translated at 96.3% (866 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Turkish)

Currently translated at 31.0% (76 of 245 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Turkish)

Currently translated at 82.3% (214 of 260 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Italian)

Currently translated at 10.6% (26 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (German)

Currently translated at 99.4% (3284 of 3303 strings)

Translated using Weblate (Italian)

Currently translated at 10.2% (25 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Japanese)

Currently translated at 91.5% (765 of 836 strings)

Translated using Weblate (German)

Currently translated at 99.5% (242 of 243 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.4% (419 of 430 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.7% (240 of 243 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (German)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (260 of 260 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 (Hungarian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (French)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (French)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (58 of 58 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (430 of 430 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (243 of 243 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (47 of 47 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 (Hungarian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (German)

Currently translated at 99.3% (3280 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Russian)

Currently translated at 91.3% (764 of 836 strings)

Translated using Weblate (Korean)

Currently translated at 98.8% (165 of 167 strings)

Translated using Weblate (Korean)

Currently translated at 54.1% (1788 of 3303 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Hebrew)

Currently translated at 55.7% (241 of 432 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (German)

Currently translated at 99.2% (3278 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hebrew)

Currently translated at 66.7% (558 of 836 strings)

Translated using Weblate (Hebrew)

Currently translated at 87.2% (96 of 110 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (263 of 263 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (Hebrew)

Currently translated at 88.7% (213 of 240 strings)

Translated using Weblate (Hebrew)

Currently translated at 83.7% (201 of 240 strings)

Translated using Weblate (Italian)

Currently translated at 9.7% (24 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.1% (3276 of 3303 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Italian)

Currently translated at 9.3% (23 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.1% (3274 of 3303 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.2% (258 of 260 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.6% (3187 of 3265 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 91.3% (764 of 836 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 84.7% (223 of 263 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.5% (3089 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3272 of 3303 strings)

Translated using Weblate (German)

Currently translated at 99.0% (3271 of 3303 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.5% (399 of 401 strings)

Translated using Weblate (Italian)

Currently translated at 8.9% (22 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hebrew)

Currently translated at 24.2% (67 of 276 strings)

Translated using Weblate (Hebrew)

Currently translated at 80.0% (192 of 240 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 15.5% (38 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.5% (244 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.4% (3087 of 3303 strings)

Translated using Weblate (German)

Currently translated at 99.6% (833 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (Bulgarian)

Currently translated at 98.4% (190 of 193 strings)

Translated using Weblate (German)

Currently translated at 98.9% (3268 of 3303 strings)

Translated using Weblate (Hebrew)

Currently translated at 39.3% (1301 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (8 of 8 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hebrew)

Currently translated at 39.3% (1301 of 3303 strings)

Translated using Weblate (Hebrew)

Currently translated at 83.3% (45 of 54 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.5% (379 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Hebrew)

Currently translated at 78.9% (90 of 114 strings)

Translated using Weblate (Hebrew)

Currently translated at 62.5% (5 of 8 strings)

Translated using Weblate (Hebrew)

Currently translated at 55.7% (241 of 432 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Hebrew)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Hebrew)

Currently translated at 50.3% (131 of 260 strings)

Translated using Weblate (German)

Currently translated at 99.4% (831 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (French)

Currently translated at 100.0% (263 of 263 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Hebrew)

Currently translated at 61.4% (70 of 114 strings)

Translated using Weblate (Hebrew)

Currently translated at 50.0% (4 of 8 strings)

Translated using Weblate (French)

Currently translated at 100.0% (276 of 276 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hebrew)

Currently translated at 1.2% (3 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Hebrew)

Currently translated at 99.7% (400 of 401 strings)

Translated using Weblate (French)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hebrew)

Currently translated at 50.3% (131 of 260 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (263 of 263 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (276 of 276 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (54 of 54 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (German)

Currently translated at 100.0% (263 of 263 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (German)

Currently translated at 100.0% (276 of 276 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 99.1% (113 of 114 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Hungarian)

Currently translated at 96.4% (3185 of 3303 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Hungarian)

Currently translated at 63.7% (2106 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (German)

Currently translated at 100.0% (401 of 401 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Portuguese)

Currently translated at 97.0% (130 of 134 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 95.1% (233 of 245 strings)

Translated using Weblate (Portuguese)

Currently translated at 94.5% (86 of 91 strings)

Translated using Weblate (Portuguese)

Currently translated at 98.7% (392 of 397 strings)

Translated using Weblate (Portuguese)

Currently translated at 98.9% (191 of 193 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.0% (109 of 110 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.3% (3084 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 63.4% (2096 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 93.1% (3078 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 63.2% (2089 of 3303 strings)

Translated using Weblate (German)

Currently translated at 98.8% (3266 of 3303 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 92.6% (227 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 92.6% (227 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 62.6% (2068 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Co-authored-by: Annika Nuding <annikanuding@gmail.com>
Co-authored-by: Chen Shaham <chenshaham@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Deleted User <noreply+1293@weblate.org>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Filip Kober <koberfilip2@gmail.com>
Co-authored-by: ForbiddenFigs <sorautai@outlook.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Kacchan <h.mrena97@gmail.com>
Co-authored-by: Kovács Máté <kovacsur10@gmail.com>
Co-authored-by: Miya <baddybadges@gmail.com>
Co-authored-by: Muhammad Naufal Ramadhan <naufalramadhan281004@gmail.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Nell Chant <doubletailor@gmail.com>
Co-authored-by: Pasquale Bosso <protagora87@gmail.com>
Co-authored-by: Siying Li <lsy68653654@qq.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Sujay Thomas <mail.sujaythomas@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Wyatt <1697570085@qq.com>
Co-authored-by: XiaoWan <2558968618@qq.com>
Co-authored-by: Yaşar Efe Çelik <yasar.123.sevda@gmail.com>
Co-authored-by: 沧浪 <963505255@qq.com>
Co-authored-by: 海岛钓鱼佬 <963505255@qq.com>
Co-authored-by: 박제균 <parkjekyun@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/he/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/id/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pl/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/he/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/id/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/character/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/character/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/character/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/character/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/id/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/content/de/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es/
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/he/
Translate-URL: https://translate.habitica.com/projects/habitica/content/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/content/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/death/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/he/
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/he/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/id/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/it/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/front/hu/
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/he/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/id/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/es/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/he/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/id/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/es/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/he/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/id/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/inventory/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/de/
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/he/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/id/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/he/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/he/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/id/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/he/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/he/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/he/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
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/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/hu/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Death
Translation: Habitica/Defaulttasks
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Inventory
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Overview
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2025-03-11 15:54:34 +01:00
negue b3c4817fb4 Private Messages: improve "scrollToBottom" logic 2025-03-05 22:18:38 +01:00
negue 7c9c45ac5f combined messages restyling - next round (#15386)
* split component prepare new views / states

* extract empty and disabled state as components

* fix empty state mail icon

* first logic switching between modes, move page to /private-messages/index.vue

* extract autoCompleteHelper.js

* style header + start new message input

* style plus button + focus input

* state logic, types for sanity

* WIP PM new Message started

* add /members/username test

* first design changes to messageCard

* delete private message or chat - based on the mode

* copy as todo

* mention links to modal

* report chat or private message

* WIP likeButton

* likeButton styling

* hide like on private message cards

* fix unit test

* replace copy as todo - to just a copy to clipboard

* style changes

* menu position + like button width

* dropdown items background + like font

* fix like button padding

* move api endpoints and tests around to group inbox methods  + like for inbox private messages

* restyle system messages

* Dropdown Radius and Padding

* WIP system messages

* fix lint

* copy delta commit of allowing liking own private messages

* enable liking private messages

* fix menu non hovered item icon color

* fix import path

* ignore background on system messages

* requested changes + migration

* update migration to update the unique id to some messages and delete the duplicates

* migration based on users pagination

* fix(migration): use Promise.all

* change to bulkWrites per User, and all messages in one run (of a user)

* check for array

* use rest operator ...

* skip sorting to get the users

* remove migration, disable like for private messages without uniqueMessageId

* lean+bulkWrite for likes, add time checks for like and auth for further debugging

* add a limit 2 get the messages by uniqueId

* Adding a simple server start script

* remove pinned nodemon dep

* fix inbox controller/tests

* fix / requested style changes

* fix empty state padding /

* hide avatar weapons on messages - fix avatar spacing on messages

* Hourglass Simplification (#15323)

* begin removing obsolete tests

* begin refactoring

* update cron tests

* cleanup

* finish basic implementation of new logic

* add more subscription tests

* subscription test improvements

* return nextHourglassDate again

* fix gem limit

* fix(test): short circuit this.

* fix(admin): correct logic and style for shrimple subs

* WIP(frontend): draft of main subs page view

* fix hourglass count

* Fix hourglass logic for upgrades

* fix admin panel display

* WIP(subs): extant Stripe state

* fix admin panel strings

* fix missing transaction type

* add new field for cumulative subscription count

* show date for hourglass bonus if it was received

* fix test

* feat(subscription): max Gems progress readout

* fix(css): correct and refactor heights and selection states

* fix(subs): correct border-radius and redirect

* fix(stripe): correct redirect after success

* Admin panel display fixes

* don’t give additional HG for new sub if they already got one this month

* fix issue with promo hourglasses

* fix(subscription): update layout when gifting

* fix(subscriptions): more gift layout revisions

* fix(subscriptions): minor visual updates

* fix(subs): pass autoRenews through Stripe

* fix(subs): gifts DON't renew

* fix(lint): unnecessary ternary

* fix(lint): do negate object ig

* fix(subs): try again on gifts

* fix(subs): unhovery and un-12-monthy

* fix bug with incorrectly giving HG bonus

* remove only

* fix test

* fix test

* fix(subs): also redirect to subs after gift sub

* fix(subs): fix typeError

* fix(g1g1): don't try to find Gems promo during bogo

---------

Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: Kalista Payne <sabe@habitica.com>

* chore(sprites): update subproject

* fix(layout): tighten cancellation note

* fix(subs): Google wording and HG escape

* chore(testing): fake g1g1 dates

* fix(subs): don't hide HG preview entirely

* fix(subs): center next hourglass message

* working validatedTextInput.vue within start-new-conversation-input-header.vue 🎉

* fix(git): remove changes from old develop

* Revert "fix(git): remove changes from old develop"

This reverts commit 0e30f7df00.

* fix(git): no actually just this file i guesss

* adding an empty loading state, hiding

* fought the avatar arch nemesis again

* fix chatMessages (party chat) message spacing

* move disabled text back to above the input area - re-enable input area

* show disabled private messages top panel

* fix font color

* fixing uiStates - removing disabled - moving the own user check to the last

* fix(lint): add missing prop defaults

* fix(lint): object default should be fn

* fix(chat): correct grammar in error

* remove weapon position relative

* revert most of avatar.vue changes, add back weapons in chat message UI

* show date tooltip above system / skill messages

* fix toggle disable icon position

* trivial CSS cleanup

* fix(typo): English syntax in test

* chore(test): small style cleanup

* chore(logging): revert debug function

* chore(debug): remove timers from inbox like

---------

Co-authored-by: SabreCat <sabe@habitica.com>
Co-authored-by: Kalista Payne <sabrecat@gmail.com>
Co-authored-by: Phillip Thelen <phillip@habitica.com>
2025-03-04 17:00:24 -06:00
Phillip Thelen 95142e3684 Update test.yml (#15397) 2025-03-04 16:19:44 -06:00
Kalista Payne dc1cce6ddb 5.34.0 2025-02-20 15:29:15 -06:00
Weblate 43cf77f33c Translated using Weblate (Spanish)
Currently translated at 99.5% (3288 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (832 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (German)

Currently translated at 98.8% (826 of 836 strings)

Translated using Weblate (Russian)

Currently translated at 40.8% (100 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (French)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Russian)

Currently translated at 40.4% (99 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 40.0% (98 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 40.0% (98 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 39.1% (96 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 91.2% (219 of 240 strings)

Translated using Weblate (Russian)

Currently translated at 38.7% (95 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 38.7% (95 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 38.7% (95 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 37.5% (92 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 37.1% (91 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 36.7% (90 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Russian)

Currently translated at 90.8% (218 of 240 strings)

Translated using Weblate (Russian)

Currently translated at 90.8% (218 of 240 strings)

Translated using Weblate (Russian)

Currently translated at 36.3% (89 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 36.3% (89 of 245 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Russian)

Currently translated at 99.3% (893 of 899 strings)

Translated using Weblate (Russian)

Currently translated at 99.2% (892 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 99.4% (831 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 62.6% (2068 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.9% (804 of 821 strings)

Translated using Weblate (Portuguese)

Currently translated at 72.0% (602 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 99.1% (829 of 836 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.4% (885 of 899 strings)

Translated using Weblate (Portuguese)

Currently translated at 99.6% (896 of 899 strings)

Translated using Weblate (Hungarian)

Currently translated at 57.9% (1915 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (800 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 57.6% (1903 of 3303 strings)

Translated using Weblate (Hungarian)

Currently translated at 57.5% (1900 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.0% (797 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (836 of 836 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Bulgarian)

Currently translated at 84.0% (79 of 94 strings)

Translated using Weblate (Bulgarian)

Currently translated at 84.0% (79 of 94 strings)

Translated using Weblate (Spanish)

Currently translated at 98.4% (823 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 98.7% (3263 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.8% (795 of 821 strings)

Translated using Weblate (Spanish)

Currently translated at 98.3% (822 of 836 strings)

Translated using Weblate (Spanish)

Currently translated at 98.5% (3256 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.8% (795 of 821 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.8% (795 of 821 strings)

Translated using Weblate (French)

Currently translated at 98.4% (823 of 836 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3303 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.5% (793 of 821 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (French)

Currently translated at 99.8% (3297 of 3303 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.4% (792 of 821 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (French)

Currently translated at 99.3% (3280 of 3303 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (897 of 899 strings)

Translated using Weblate (French)

Currently translated at 99.1% (3275 of 3303 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (897 of 899 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (897 of 899 strings)

Translated using Weblate (German)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (897 of 899 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 97.6% (3187 of 3265 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 99.7% (897 of 899 strings)

Translated using Weblate (French)

Currently translated at 100.0% (899 of 899 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Hungarian)

Currently translated at 58.1% (1898 of 3265 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 62.8% (154 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.4% (792 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.2% (378 of 397 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (397 of 397 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (896 of 896 strings)

Co-authored-by: Anna <shiloanna007@gmail.com>
Co-authored-by: Besogon <victoria_murka@mail.ru>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: ForbiddenFigs <sorautai@outlook.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Nell Chant <doubletailor@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: razil <boss.razmarin@gmail.com>
Co-authored-by: 小王 <963505255@qq.com>
Co-authored-by: 海岛钓鱼佬 <963505255@qq.com>
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/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/content/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/death/hu/
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/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/bg/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/hu/
Translation: Habitica/Backgrounds
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Limited
Translation: Habitica/Messages
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Subscriber
2025-02-20 22:28:02 +01:00
Natalie 93780d7056 March 2025 Content Build (#15392)
* build: March 2025 css, backgrounds, subscriber gear, armoire

* build: March 2025 quests, seasonal gear, various fixes

* fix: fix string

* fix: fixes to string errors

* fix: string fixes
2025-02-18 15:48:08 -06:00
Kalista Payne 2ad17d408e 5.33.3 2025-02-18 15:05:44 -06:00
Weblate b0f7567367 Translated using Weblate (Japanese)
Currently translated at 93.0% (764 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 54.8% (1790 of 3265 strings)

Translated using Weblate (Hungarian)

Currently translated at 53.5% (1748 of 3265 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Hungarian)

Currently translated at 52.1% (1704 of 3265 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 59.3% (532 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 79.3% (208 of 262 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 77.4% (2528 of 3265 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 93.0% (764 of 821 strings)

Translated using Weblate (French)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (French)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 94.8% (258 of 272 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.2% (378 of 397 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 82.8% (203 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (821 of 821 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.9% (377 of 397 strings)

Translated using Weblate (Hungarian)

Currently translated at 52.1% (1704 of 3265 strings)

Translated using Weblate (Hungarian)

Currently translated at 49.7% (122 of 245 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.1% (789 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (821 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 48.5% (119 of 245 strings)

Translated using Weblate (Hungarian)

Currently translated at 26.1% (64 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2 of 2 strings)

Translated using Weblate (Hungarian)

Currently translated at 8.9% (22 of 245 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (15 of 15 strings)

Translated using Weblate (Hungarian)

Currently translated at 96.2% (790 of 821 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.4% (784 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 91.5% (752 of 821 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (397 of 397 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (397 of 397 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Hungarian)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (German)

Currently translated at 99.2% (133 of 134 strings)

Translated using Weblate (German)

Currently translated at 99.2% (133 of 134 strings)

Translated using Weblate (Czech)

Currently translated at 95.2% (159 of 167 strings)

Translated using Weblate (Russian)

Currently translated at 91.2% (2978 of 3265 strings)

Translated using Weblate (Russian)

Currently translated at 99.3% (890 of 896 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3265 of 3265 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3265 of 3265 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (French)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (French)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Korean)

Currently translated at 98.5% (132 of 134 strings)

Translated using Weblate (Korean)

Currently translated at 6.9% (17 of 245 strings)

Translated using Weblate (Korean)

Currently translated at 71.9% (645 of 896 strings)

Translated using Weblate (Korean)

Currently translated at 49.2% (129 of 262 strings)

Translated using Weblate (Korean)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Korean)

Currently translated at 81.9% (77 of 94 strings)

Translated using Weblate (Korean)

Currently translated at 91.6% (153 of 167 strings)

Translated using Weblate (Korean)

Currently translated at 67.3% (291 of 432 strings)

Translated using Weblate (Korean)

Currently translated at 79.5% (191 of 240 strings)

Translated using Weblate (Korean)

Currently translated at 54.6% (1785 of 3265 strings)

Translated using Weblate (Korean)

Currently translated at 88.8% (48 of 54 strings)

Translated using Weblate (Korean)

Currently translated at 89.3% (42 of 47 strings)

Translated using Weblate (Korean)

Currently translated at 93.9% (373 of 397 strings)

Translated using Weblate (Korean)

Currently translated at 54.9% (50 of 91 strings)

Translated using Weblate (German)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (German)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 73.0% (179 of 245 strings)

Translated using Weblate (French)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (German)

Currently translated at 99.1% (243 of 245 strings)

Translated using Weblate (French)

Currently translated at 99.5% (244 of 245 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 62.0% (152 of 245 strings)

Translated using Weblate (Indonesian)

Currently translated at 73.4% (180 of 245 strings)

Translated using Weblate (Indonesian)

Currently translated at 96.0% (861 of 896 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 62.0% (152 of 245 strings)

Translated using Weblate (German)

Currently translated at 98.7% (242 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (245 of 245 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (244 of 245 strings)

Translated using Weblate (Portuguese)

Currently translated at 33.7% (82 of 243 strings)

Translated using Weblate (Portuguese)

Currently translated at 73.3% (602 of 821 strings)

Translated using Weblate (Portuguese)

Currently translated at 56.0% (51 of 91 strings)

Translated using Weblate (German)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (German)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese)

Currently translated at 97.2% (107 of 110 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (896 of 896 strings)

Co-authored-by: César Orlando Pallares Delgado <copdeb@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Diego Benitez <diego.benitez@bigpond.com>
Co-authored-by: Finrod <963505255@qq.com>
Co-authored-by: ForbiddenFigs <sorautai@outlook.com>
Co-authored-by: Hexe des Windes (she/her) <krausanna1@gmail.com>
Co-authored-by: Icaro <icaro.mascarenhas@outlook.com>
Co-authored-by: Ikmal <ikmal.s.16@gmail.com>
Co-authored-by: Jackal <qwerty70244@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
Co-authored-by: Leslie Munguía <moongeeuh@gmail.com>
Co-authored-by: Lio Zam <zerofux@web.de>
Co-authored-by: Marius <mariusschmid11@gmail.com>
Co-authored-by: Miya <baddybadges@gmail.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Raul Ernesto Ceron Lara <raztreuzz1234@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Viktor Révész <rviktor@ivankapal.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: 小王 <963505255@qq.com>
Co-authored-by: 이채린 <cofls1256@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/cs/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/de/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/id/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/character/es/
Translate-URL: https://translate.habitica.com/projects/habitica/character/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/character/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/content/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/content/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/es/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/death/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/defaulttasks/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/de/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/es/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/id/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/ko/
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/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/noscript/zh_Hans/
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/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/ko/
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/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/ko/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/hu/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/ko/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Death
Translation: Habitica/Defaulttasks
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Messages
Translation: Habitica/Noscript
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Settings
Translation: Habitica/Spells
Translation: Habitica/Subscriber
2025-02-18 22:03:17 +01:00
Phillip Thelen 3f2b1d3f79 Update .eslintrc.js (#15388)
Add `require-await` to eslint config
2025-02-11 12:05:28 -06:00
Phillip Thelen 29eb8ca10b log slow requests to loggly (#15364) 2025-02-11 12:05:06 -06:00
Phillip Thelen 8c71ca12b8 Support sprite version of armoire icon (#15354)
* Use sprite component for armoire sprite

* use gif version of armoire sprite

* fix(import): sprite component path

---------

Co-authored-by: Kalista Payne <sabrecat@gmail.com>
2025-02-11 12:04:28 -06:00
Phillip Thelen 72a753626f Fix news related permission issues (#15287) 2025-02-11 12:04:00 -06:00
Phillip Thelen 35ebb12bf2 Fix achievement display in admin panel (#15326) 2025-02-11 12:02:50 -06:00
Kalista Payne 1ff418f62d 5.33.2 2025-02-06 13:53:00 -06:00
Weblate e1aa437ea5 Translated using Weblate (German)
Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Portuguese)

Currently translated at 96.4% (864 of 896 strings)

Co-authored-by: Miya <baddybadges@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt/
Translation: Habitica/Backgrounds
2025-02-06 20:48:32 +01:00
Kalista Payne 2a4239bf3c fix(links): next round of wiki revisions 2025-02-05 09:18:22 -06:00
Kalista Payne 399563435b 5.33.1 2025-02-05 09:08:26 -06:00
Weblate 59f7e25c85 Translated using Weblate (Spanish)
Currently translated at 100.0% (821 of 821 strings)

Translated using Weblate (German)

Currently translated at 100.0% (821 of 821 strings)

Translated using Weblate (Japanese)

Currently translated at 87.0% (228 of 262 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 93.8% (107 of 114 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 18.1% (44 of 243 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 11.9% (29 of 243 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 88.1% (724 of 821 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 91.2% (104 of 114 strings)

Translated using Weblate (Spanish (Latin America))

Currently translated at 7.4% (18 of 243 strings)

Translated using Weblate (Spanish)

Currently translated at 99.5% (817 of 821 strings)

Translated using Weblate (German)

Currently translated at 99.3% (816 of 821 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3265 of 3265 strings)

Translated using Weblate (German)

Currently translated at 100.0% (3265 of 3265 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 98.2% (112 of 114 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 97.7% (131 of 134 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 69.1% (2257 of 3265 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 99.5% (239 of 240 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 16.4% (40 of 243 strings)

Translated using Weblate (German)

Currently translated at 99.9% (3264 of 3265 strings)

Translated using Weblate (Japanese)

Currently translated at 86.6% (227 of 262 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (272 of 272 strings)

Translated using Weblate (Japanese)

Currently translated at 97.9% (423 of 432 strings)

Translated using Weblate (German)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (German)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (German)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 14.8% (36 of 243 strings)

Translated using Weblate (German)

Currently translated at 99.1% (814 of 821 strings)

Translated using Weblate (German)

Currently translated at 100.0% (397 of 397 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 84.7% (222 of 262 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 84.3% (221 of 262 strings)

Translated using Weblate (German)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.0% (415 of 432 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.2% (3077 of 3265 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 63.7% (155 of 243 strings)

Translated using Weblate (German)

Currently translated at 99.0% (813 of 821 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 99.7% (396 of 397 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.7% (885 of 896 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (German)

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Japanese)

Currently translated at 97.4% (265 of 272 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (134 of 134 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (260 of 260 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (397 of 397 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (60 of 60 strings)

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translated using Weblate (Japanese)

Currently translated at 98.7% (392 of 397 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Spanish)

Currently translated at 99.0% (813 of 821 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (397 of 397 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (French)

Currently translated at 100.0% (262 of 262 strings)

Translated using Weblate (French)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (French)

Currently translated at 100.0% (432 of 432 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3265 of 3265 strings)

Translated using Weblate (French)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (French)

Currently translated at 100.0% (821 of 821 strings)

Translated using Weblate (French)

Currently translated at 100.0% (397 of 397 strings)

Translated using Weblate (French)

Currently translated at 100.0% (896 of 896 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3265 of 3265 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 (French)

Currently translated at 100.0% (3265 of 3265 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3255 of 3255 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (15 of 15 strings)

Co-authored-by: Asier Gallego <agr2367789@gmail.com>
Co-authored-by: Asier Gallego Roca <asiernoide@users.noreply.translate.habitica.com>
Co-authored-by: Henrique Ferreira <pedroferreira217.ph@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: John Doe (Anonymous) <shyamjayeshduck@duck.com>
Co-authored-by: Katharina <katharinaanna.wilding@gmail.com>
Co-authored-by: Marie Blosse--Gilbin <mbgil@hotmail.fr>
Co-authored-by: Mauricio Pérez <mauriciodavidperez@gmail.com>
Co-authored-by: Raul Ernesto Ceron Lara <raztreuzz1234@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: Willhelm Winter <carapax@posteo.de>
Co-authored-by: mattya 226 <worldworld1114@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/de/
Translate-URL: https://translate.habitica.com/projects/habitica/content/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/content/es/
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/content/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/death/es/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/de/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/es/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/es/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/fr/
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/limited/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/de/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/es/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/es/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es_419/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/ja/
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/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translation: Habitica/Backgrounds
Translation: Habitica/Content
Translation: Habitica/Death
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Messages
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Subscriber
2025-02-05 04:34:26 +01:00
Kalista Payne ad845dff43 fix(test): nudge expected no-promo date 2025-01-29 17:17:28 -06:00
Kalista Payne fd1eb2d900 feat(events): revise dates of promos 2025-01-29 16:59:14 -06:00
287 changed files with 10677 additions and 6837 deletions
+9
View File
@@ -7,5 +7,14 @@ module.exports = {
rules: {
'prefer-regex-literals': 'warn',
'import/no-extraneous-dependencies': 'off',
'require-await': 'error',
},
overrides: [
{
files: ['migrations/**', 'gulp/**'], // Or *.test.js
rules: {
'require-await': 'off',
},
},
],
};
+8 -1
View File
@@ -1,6 +1,13 @@
name: Test
on: [push, pull_request]
on:
push:
branches-ignore:
- 'phillip/**'
- 'sabrecat/**'
- 'kalista/**'
- 'natalie/**'
pull_request:
permissions:
contents: read
+1 -1
View File
@@ -47,5 +47,5 @@ webpack.webstorm.config
# mongodb replica set for local dev
mongodb-*.tgz
/mongodb-data
/mongodb-data*
/.nyc_output
+2 -1
View File
@@ -93,5 +93,6 @@
"TRUSTED_DOMAINS": "localhost,https://habitica.com",
"TIME_TRAVEL_ENABLED": "false",
"DEBUG_ENABLED": "false",
"CONTENT_SWITCHOVER_TIME_OFFSET": 8
"CONTENT_SWITCHOVER_TIME_OFFSET": 8,
"SLOW_REQUEST_THRESHOLD": 1000
}
+9
View File
@@ -64,6 +64,15 @@ function filterFile (file) {
if (file.relative.indexOf('icon_background') === 0) {
return false;
}
if (file.relative.indexOf('notif_') === 0) {
return false;
}
if (file.relative.indexOf('quest_') === 0) {
return false;
}
if (file.relative.indexOf('inventory_quest_') === 0) {
return false;
}
return true;
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "habitica",
"version": "5.33.0",
"version": "5.34.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "habitica",
"version": "5.33.0",
"version": "5.34.2",
"hasInstallScript": true,
"dependencies": {
"@babel/core": "^7.22.10",
+2 -1
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.33.0",
"version": "5.34.2",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.22.10",
@@ -110,6 +110,7 @@
"start:simple": "node ./website/server/index.js",
"debug": "gulp nodemon --inspect",
"mongo:dev": "run-rs -v 5.0.23 -l ubuntu1804 --keep --dbpath mongodb-data --number 1 --quiet",
"mongo:test": "run-rs -v 5.0.23 -l ubuntu1804 --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"
@@ -0,0 +1,56 @@
import {
generateUser,
translate as t,
} from '../../../../helpers/api-integration/v3';
import common from '../../../../../website/common';
describe('GET /members/username/:username', () => {
let user;
before(async () => {
user = await generateUser();
});
it('validates req.params.username', async () => {
await expect(user.get('/members/username/')).to.eventually.be.rejected.and.eql({
code: 400,
error: 'BadRequest',
message: t('invalidReqParams'),
});
});
it('returns a member\'s public data only', async () => {
// make sure user has all the fields that can be returned by the getMember call
const member = await generateUser({
contributor: { level: 1 },
backer: { tier: 3 },
preferences: {
costume: false,
background: 'volcano',
},
secret: {
text: 'Clark Kent',
},
});
const memberRes = await user.get(`/members/username/${member.auth.local.username}`);
expect(memberRes).to.have.all.keys([ // works as: object has all and only these keys
'_id', 'id', 'preferences', 'profile', 'stats', 'achievements', 'party',
'backer', 'contributor', 'auth', 'items', 'inbox', 'loginIncentives', 'flags',
]);
expect(Object.keys(memberRes.auth)).to.eql(['local', 'timestamps']);
expect(Object.keys(memberRes.preferences).sort()).to.eql([
'size', 'hair', 'skin', 'shirt',
'chair', 'costume', 'sleep', 'background', 'tasks', 'disableClasses',
].sort());
expect(memberRes.stats.maxMP).to.exist;
expect(memberRes.stats.maxHealth).to.equal(common.maxHealth);
expect(memberRes.stats.toNextLevel).to.equal(common.tnl(memberRes.stats.lvl));
expect(memberRes.inbox.optOut).to.exist;
expect(memberRes.inbox.canReceive).to.exist;
expect(memberRes.inbox.messages).to.not.exist;
expect(memberRes.secret).to.not.exist;
expect(memberRes.blocks).to.not.exist;
});
});
@@ -0,0 +1,104 @@
import find from 'lodash/find';
import {
generateUser,
translate as t,
} from '../../../helpers/api-integration/v4';
/**
* Checks the messages array if the uniqueMessageId has the like flag
* @param {InboxMessage[]} messages
* @param {String} uniqueMessageId
* @param {String} userId
* @param {Boolean} likeStatus
*/
function expectMessagesLikeStatus (messages, uniqueMessageId, userId, likeStatus) {
const messageToCheck = find(messages, { uniqueMessageId });
expect(messageToCheck.likes[userId]).to.equal(likeStatus);
}
// eslint-disable-next-line mocha/no-exclusive-tests
describe('POST /inbox/like-private-message/:messageId', () => {
let userToSendMessage;
const getLikeUrl = messageId => `/inbox/like-private-message/${messageId}`;
before(async () => {
userToSendMessage = await generateUser();
});
it('returns an error when private message is not found', async () => {
await expect(userToSendMessage.post(getLikeUrl('some-unknown-id')))
.to.eventually.be.rejected.and.eql({
code: 404,
error: 'NotFound',
message: t('messageGroupChatNotFound'),
});
});
it('likes a message', async () => {
const receiver = await generateUser();
const sentMessageResult = await userToSendMessage.post('/members/send-private-message', {
message: 'some message :)',
toUserId: receiver._id,
});
const { uniqueMessageId } = sentMessageResult.message;
const likeResult = await receiver.post(getLikeUrl(uniqueMessageId));
expect(likeResult.likes[receiver._id]).to.equal(true);
const senderMessages = await userToSendMessage.get('/inbox/messages');
expectMessagesLikeStatus(senderMessages, uniqueMessageId, receiver._id, true);
const receiversMessages = await receiver.get('/inbox/messages');
expectMessagesLikeStatus(receiversMessages, uniqueMessageId, receiver._id, true);
});
it('allows a user to like their own private message', async () => {
const receiver = await generateUser();
const sentMessageResult = await userToSendMessage.post('/members/send-private-message', {
message: 'some message :)',
toUserId: receiver._id,
});
const { uniqueMessageId } = sentMessageResult.message;
const likeResult = await userToSendMessage.post(getLikeUrl(uniqueMessageId));
expect(likeResult.likes[userToSendMessage._id]).to.equal(true);
const messages = await userToSendMessage.get('/inbox/messages');
expectMessagesLikeStatus(messages, uniqueMessageId, userToSendMessage._id, true);
const receiversMessages = await receiver.get('/inbox/messages');
expectMessagesLikeStatus(receiversMessages, uniqueMessageId, userToSendMessage._id, true);
});
it('unlikes a message', async () => {
const receiver = await generateUser();
const sentMessageResult = await userToSendMessage.post('/members/send-private-message', {
message: 'some message :)',
toUserId: receiver._id,
});
const { uniqueMessageId } = sentMessageResult.message;
const likeResult = await receiver.post(getLikeUrl(uniqueMessageId));
expect(likeResult.likes[receiver._id]).to.equal(true);
const unlikeResult = await receiver.post(getLikeUrl(uniqueMessageId));
expect(unlikeResult.likes[receiver._id]).to.equal(false);
const messages = await userToSendMessage.get('/inbox/messages');
const messageToCheck = find(messages, { id: sentMessageResult.message.id });
expect(messageToCheck.likes[receiver._id]).to.equal(false);
});
});
+1 -1
View File
@@ -10,7 +10,7 @@ describe('events', () => {
});
it('returns empty array when no events are active', () => {
clock = sinon.useFakeTimers(new Date('2024-01-08'));
clock = sinon.useFakeTimers(new Date('2024-01-11'));
const events = getRepeatingEvents();
expect(events).to.be.empty;
});
+1 -1
View File
@@ -7,7 +7,7 @@ module.exports = {
extends: [
'habitrpg/lib/vue',
],
ignorePatterns: ['dist/', 'node_modules/'],
ignorePatterns: ['dist/', 'node_modules/', '*.d.ts'],
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
File diff suppressed because it is too large Load Diff
+11 -2
View File
@@ -101,8 +101,7 @@
.btn-secondary,
.dropdown > .btn-secondary.dropdown-toggle:not(.btn-success),
.show > .btn-secondary.dropdown-toggle:not(.btn-success)
{
.show > .btn-secondary.dropdown-toggle:not(.btn-success) {
background: $white;
border: 2px solid transparent;
color: $gray-50;
@@ -298,6 +297,16 @@
box-shadow: none;
}
.btn-flat,
.dropdown > .btn-flat.dropdown-toggle:not(.btn-success),
.show > .btn-flat.dropdown-toggle:not(.btn-success) {
&.with-icon {
.svg-icon.color {
color: var(--icon-color);
}
}
}
.btn-cancel {
color: $blue-10;
}
+9 -2
View File
@@ -38,7 +38,12 @@
border-radius: 2px;
box-shadow: 0 3px 6px 0 rgba($black, 0.16), 0 3px 6px 0 rgba($black, 0.24);
padding: 0;
}
.no-min-width {
.dropdown-menu {
min-width: 0 !important;
}
}
// shared dropdown-item styles
@@ -54,6 +59,8 @@
color: $gray-50 !important;
cursor: pointer;
--dropdown-item-hover-icon-color: #{$gray-200};
&:focus {
outline: none;
background-color: inherit;
@@ -88,7 +95,7 @@
&:not(:hover) {
.with-icon .svg-icon {
color: $gray-200;
color: var(dropdown-item-hover-icon-color);
}
}
}
@@ -151,7 +158,7 @@
// selectList.vue items sizing
.selectListItem .dropdown-item {
padding: 0.25rem 0.75rem;
padding: 0.25rem 1rem 0.25rem 0.75rem;
height: 32px;
&:active, &:hover, &:focus, &.active {
@@ -8,7 +8,7 @@
<div class="modal-body">
<div class="row">
<div class="col-6 offset-3">
<div class="shop_armoire"></div>
<Sprite image-name="shop_armoire" />
<p>{{ $t('armoireLastItem') }}</p>
<p>{{ $t('armoireNotesEmpty') }}</p>
</div>
@@ -34,7 +34,12 @@
</style>
<script>
import Sprite from '@/components/ui/sprite';
export default {
components: {
Sprite,
},
methods: {
close () {
this.$root.$emit('bv::hide::modal', 'armoire-empty');
@@ -95,7 +95,11 @@
@click="clickDisableClasses(); close();"
>{{ $t('optOutOfClasses') }}</span>
</div>
<span class="opt-out-description">{{ $t('optOutOfClassesText') }}</span>
<div
v-once
class="opt-out-description"
v-html="$t('optOutOfClassesText')"
></div>
</div>
</div>
</div>
@@ -48,7 +48,7 @@
></span>
</div>
<div :class="questClass"></div>
<Sprite :image-name="questClass" />
</section>
<!-- @TODO: Keep this? .checkboxinput(type='checkbox', v-model=
'user.preferences.suppressModals.levelUp', @change='changeLevelupSuppress()')
@@ -150,15 +150,12 @@ label(style='display:inline-block') {{ $t('dontShowAgain') }}
section.greyed {
padding-bottom: 17px
}
.scroll {
margin: -11px auto 0;
}
}
</style>
<script>
import Avatar from '../avatar';
import Sprite from '@/components/ui/sprite';
import { mapState } from '@/libs/store';
import starGroup from '@/assets/svg/star-group.svg';
import sparkles from '@/assets/svg/sparkles-left.svg';
@@ -173,6 +170,7 @@ const levelQuests = {
export default {
components: {
Avatar,
Sprite,
},
data () {
return {
@@ -191,7 +189,9 @@ export default {
return this.user.stats.lvl in levelQuests;
},
questClass () {
return `scroll inventory_quest_scroll_${levelQuests[this.user.stats.lvl]}`;
const questKey = levelQuests[this.user.stats.lvl];
if (questKey) return `inventory_quest_scroll_${questKey}`;
return '';
},
},
methods: {
@@ -55,7 +55,7 @@
<p v-html="$t('moreGearAchievements')"></p>
<br>
</div>
<div class="shop_armoire"></div>
<Sprite image-name="shop_armoire" />
<p v-html="$t('armoireUnlocked')"></p>
<br>
<button
@@ -87,11 +87,13 @@
import achievementFooter from './achievementFooter';
import achievementAvatar from './achievementAvatar';
import { mapState } from '@/libs/store';
import Sprite from '@/components/ui/sprite.vue';
export default {
components: {
achievementFooter,
achievementAvatar,
Sprite,
},
computed: {
...mapState({ user: 'user.data' }),
@@ -27,7 +27,7 @@
{{ item.value }}
</span>
:
{{ item.text || item.key }}
{{ itemText(item) }}
</span>
<div
@@ -78,7 +78,7 @@
{{ item.value }}
</span>
:
{{ item.text || item.key }}
{{ itemText(item) }}
</span>
<div
@@ -270,6 +270,15 @@ export default {
item.value = !item.value;
}
},
itemText (item) {
if (item.key === 'npc') {
return this.$t('npcAchievementName', { key: this.hero.backer && this.hero.backer.npc });
}
if (item.key === 'kickstarter') {
return this.$t('kickstartName', { key: this.hero.backer && this.hero.backer.tier });
}
return item.text || item.key;
},
},
};
</script>
+8 -13
View File
@@ -55,9 +55,9 @@
</li>
<li>
<a
href="https://habitica.fandom.com/wiki/Whats_New"
target="_blank"
>{{ $t('oldNews') }}
@click="showBailey()"
>
{{ $t('oldNews') }}
</a>
</li>
</ul>
@@ -80,7 +80,7 @@
</li>
<li>
<a
href="https://habitica.fandom.com/wiki/Contributing_to_Habitica"
href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica"
target="_blank"
>{{ $t('companyContribute') }}
</a>
@@ -158,13 +158,6 @@
>{{ $t('guidanceForBlacksmiths') }}
</a>
</li>
<li>
<a
href="https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations"
target="_blank"
>{{ $t('communityExtensions') }}
</a>
</li>
</ul>
</div>
@@ -518,7 +511,7 @@ footer {
background-color: $gray-500;
color: $gray-50;
padding: 32px 142px 40px;
a {
a, a:not([href]) {
color: $gray-50;
}
a:hover {
@@ -996,7 +989,6 @@ export default {
async bossRage () {
await axios.post('/api/v4/debug/boss-rage');
},
async makeAdmin () {
await axios.post('/api/v4/debug/make-admin');
// @TODO: Notification.text('You are now an admin!
@@ -1006,6 +998,9 @@ export default {
donate () {
this.$root.$emit('bv::show::modal', 'buy-gems', { alreadyTracked: true });
},
showBailey () {
this.$root.$emit('bv::show::modal', 'new-stuff');
},
},
};
</script>
+77 -7
View File
@@ -3,7 +3,7 @@
v-if="member.preferences"
class="avatar"
:style="{width, height, paddingTop}"
:class="backgroundClass"
:class="topLevelClassList"
@click.prevent="castEnd()"
>
<div
@@ -55,7 +55,11 @@
<span :class="[getGearClass('eyewear'), specialMountClass]"></span>
<span :class="[getGearClass('head'), specialMountClass]"></span>
<span :class="[getGearClass('headAccessory'), specialMountClass]"></span>
<span :class="['hair_flower_' + member.preferences.hair.flower, specialMountClass]"></span>
<span
:class="[
'hair_flower_' + member.preferences.hair.flower, specialMountClass
]"
></span>
<span
v-if="!hideGear('shield')"
:class="[getGearClass('shield'), specialMountClass]"
@@ -63,6 +67,7 @@
<span
v-if="!hideGear('weapon')"
:class="[getGearClass('weapon'), specialMountClass]"
class="weapon"
></span>
</template>
<!-- Resting-->
@@ -96,15 +101,23 @@
.avatar {
width: 141px;
height: 147px;
image-rendering: pixelated;
position: relative;
cursor: pointer;
&.centered-avatar {
margin: 0 auto;
}
// resetting the additional padding
margin-bottom: -0.5rem !important;
}
.character-sprites {
width: 90px;
height: 90px;
display: inline-flex;
}
.character-sprites span {
@@ -123,6 +136,22 @@
.invert {
filter: invert(100%);
}
.debug {
border: 1px solid red;
.character-sprites {
border: 1px solid blue;
}
.weapon {
border: 1px solid green;
}
span {
border: 1px solid yellow;
}
}
</style>
<script>
@@ -133,12 +162,24 @@ import foolPet from '../mixins/foolPet';
import ClassBadge from '@/components/members/classBadge';
/**
* TODO replace avatarOnly with multiple options like
* - showMount
* - showPet
* - showBackground
* - showWeapons
*/
export default {
components: {
ClassBadge,
},
mixins: [foolPet],
props: {
debugMode: {
type: Boolean,
default: false,
},
member: {
type: Object,
required: true,
@@ -156,14 +197,21 @@ export default {
},
overrideAvatarGear: {
type: Object,
default (data) {
return data;
},
},
width: {
type: Number,
default: 140,
type: String,
default: '140px',
},
height: {
type: Number,
default: 147,
type: String,
default: undefined,
},
centerAvatar: {
type: Boolean,
default: false,
},
spritesMargin: {
type: String,
@@ -171,11 +219,16 @@ export default {
},
overrideTopPadding: {
type: String,
default: null,
},
showVisualBuffs: {
type: Boolean,
default: true,
},
showWeapon: {
type: Boolean,
default: true,
},
},
computed: {
...mapState({
@@ -204,6 +257,19 @@ export default {
return val;
},
topLevelClassList () {
const classes = [this.backgroundClass];
if (this.debugMode) {
classes.push('debug');
}
if (this.centerAvatar) {
classes.push('centered-avatar');
}
return classes.join(' ');
},
backgroundClass () {
if (this.member) {
const { background } = this.member.preferences;
@@ -290,6 +356,10 @@ export default {
},
hideGear (gearType) {
if (!this.member) return true;
if (!this.showWeapon) {
return true;
}
if (gearType === 'weapon') {
const equippedWeapon = this.member.items.gear[this.costumeClass][gearType];
@@ -1,352 +0,0 @@
<template>
<div>
<div
v-if="isUserMentioned"
class="mentioned-icon"
></div>
<div
v-if="hasPermission(user, 'moderator') && msg.flagCount"
class="message-hidden"
>
{{ flagCountDescription }}
</div>
<div class="card-body">
<user-link
:user-id="msg.uuid"
:name="msg.user"
:backer="msg.backer"
:contributor="msg.contributor"
/>
<p class="time">
<span
v-if="msg.username"
class="mr-1"
>@{{ msg.username }}</span>
<span
v-if="msg.username"
class="mr-1"
></span>
<span
v-b-tooltip.hover="messageDate"
>{{ msg.timestamp | timeAgo }}&nbsp;</span>
<span v-if="msg.client && user.contributor.level >= 4">({{ msg.client }})</span>
</p>
<div
ref="markdownContainer"
class="text markdown"
dir="auto"
v-html="parseMarkdown(msg.text)"
></div>
<hr>
<div
v-if="msg.id"
class="d-flex"
>
<div
class="action d-flex align-items-center"
@click="copyAsTodo(msg)"
>
<div
class="svg-icon"
v-html="icons.copy"
></div>
<div>{{ $t('copyAsTodo') }}</div>
</div>
<div
v-if="(user.flags.communityGuidelinesAccepted && msg.uuid !== 'system')
&& (!isMessageReported || hasPermission(user, 'moderator'))"
class="action d-flex align-items-center"
@click="report(msg)"
>
<div
v-once
class="svg-icon"
v-html="icons.report"
></div>
<div v-once>
{{ $t('report') }}
</div>
</div>
<div
v-if="msg.uuid === user._id || hasPermission(user, 'moderator')"
class="action d-flex align-items-center"
@click="remove()"
>
<div
v-once
class="svg-icon"
v-html="icons.delete"
></div>
<div v-once>
{{ $t('delete') }}
</div>
</div>
<div
v-b-tooltip="{title: likeTooltip(msg.likes[user._id])}"
class="ml-auto d-flex"
>
<div
v-if="likeCount > 0"
class="action d-flex align-items-center mr-0"
:class="{activeLike: msg.likes[user._id]}"
@click="like()"
>
<div
class="svg-icon"
:title="$t('liked')"
v-html="icons.liked"
></div>
+{{ likeCount }}
</div>
<div
v-if="likeCount === 0"
class="action d-flex align-items-center mr-0"
:class="{activeLike: msg.likes[user._id]}"
@click="like()"
>
<div
class="svg-icon"
:title="$t('like')"
v-html="icons.like"
></div>
</div>
</div>
<span v-if="!msg.likes[user._id]">{{ $t('like') }}</span>
</div>
</div>
</div>
</template>
<style lang="scss">
.at-highlight {
background-color: rgba(213, 200, 255, 0.32);
padding: 0.1rem;
}
.at-text {
color: #6133b4;
}
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
.mentioned-icon {
width: 16px;
height: 16px;
border-radius: 50%;
background-color: #bda8ff;
box-shadow: 0 1px 1px 0 rgba(26, 24, 29, 0.12);
position: absolute;
right: -.5em;
top: -.5em;
}
.message-hidden {
margin-left: 1.5em;
margin-top: 1em;
color: red;
}
hr {
margin-bottom: 0.5rem;
margin-top: 0.5rem;
}
.card-body {
padding: 0.75rem 1.25rem 0.75rem 1.25rem;
.time {
font-size: 12px;
color: #878190;
margin-bottom: 0.5rem;
}
.text {
font-size: 14px;
color: #4e4a57;
text-align: initial;
min-height: 0rem;
}
}
.action {
display: inline-block;
color: #878190;
margin-right: 1em;
font-size: 12px;
:hover {
cursor: pointer;
}
.svg-icon {
color: #A5A1AC;
margin-right: .2em;
width: 16px;
}
}
.activeLike {
color: $purple-300;
.svg-icon {
color: $purple-400;
}
}
</style>
<script>
import moment from 'moment';
import cloneDeep from 'lodash/cloneDeep';
import escapeRegExp from 'lodash/escapeRegExp';
import { CHAT_FLAG_LIMIT_FOR_HIDING, CHAT_FLAG_FROM_SHADOW_MUTE } from '@/../../common/script/constants';
import renderWithMentions from '@/libs/renderWithMentions';
import { userStateMixin } from '../../mixins/userState';
import userLink from '../userLink';
import deleteIcon from '@/assets/svg/delete.svg';
import copyIcon from '@/assets/svg/copy.svg';
import likeIcon from '@/assets/svg/like.svg';
import likedIcon from '@/assets/svg/liked.svg';
import reportIcon from '@/assets/svg/report.svg';
export default {
components: { userLink },
filters: {
timeAgo (value) {
return moment(value).fromNow();
},
date (value) {
// @TODO: Vue doesn't support this so we cant user preference
return moment(value).toDate().toString();
},
},
mixins: [userStateMixin],
props: {
msg: {},
groupId: {},
},
data () {
return {
icons: Object.freeze({
like: likeIcon,
copy: copyIcon,
report: reportIcon,
delete: deleteIcon,
liked: likedIcon,
}),
reported: false,
};
},
computed: {
isUserMentioned () {
const message = this.msg;
if (message.highlight) return true;
const { user } = this;
const displayName = user.profile.name;
const { username } = user.auth.local;
const pattern = `@(${escapeRegExp(displayName)}|${escapeRegExp(username)})(\\b)`;
message.highlight = new RegExp(pattern, 'i').test(message.text);
return message.highlight;
},
likeCount () {
const message = this.msg;
if (!message.likes) return 0;
let likeCount = 0;
for (const key of Object.keys(message.likes)) {
const like = message.likes[key];
if (like) likeCount += 1;
}
return likeCount;
},
isMessageReported () {
return (this.msg.flags && this.msg.flags[this.user.id]) || this.reported;
},
flagCountDescription () {
if (!this.msg.flagCount) return '';
if (this.msg.flagCount < CHAT_FLAG_LIMIT_FOR_HIDING) return 'Message flagged once, not hidden';
if (this.msg.flagCount < CHAT_FLAG_FROM_SHADOW_MUTE) return 'Message hidden';
return 'Message hidden (shadow-muted)';
},
messageDate () {
const date = moment(this.msg.timestamp).toDate();
return date.toString();
},
},
mounted () {
const links = this.$refs.markdownContainer.getElementsByTagName('a');
for (let i = 0; i < links.length; i += 1) {
let link = links[i].pathname;
// Internet Explorer does not provide the leading slash character in the pathname
link = link.charAt(0) === '/' ? link : `/${link}`;
if (link.startsWith('/profile/')) {
links[i].onclick = ev => {
ev.preventDefault();
this.$router.push({ path: link });
};
}
}
this.CHAT_FLAG_LIMIT_FOR_HIDING = CHAT_FLAG_LIMIT_FOR_HIDING;
this.CHAT_FLAG_FROM_SHADOW_MUTE = CHAT_FLAG_FROM_SHADOW_MUTE;
this.$emit('chat-card-mounted', this.msg.id);
},
methods: {
async like () {
const message = cloneDeep(this.msg);
await this.$store.dispatch('chat:like', {
groupId: this.groupId,
chatId: message.id,
});
message.likes[this.user._id] = !message.likes[this.user._id];
this.$emit('message-liked', message);
this.$root.$emit('bv::hide::tooltip');
},
likeTooltip (likedStatus) {
if (!likedStatus) return this.$t('like');
return null;
},
copyAsTodo (message) {
this.$root.$emit('habitica::copy-as-todo', message);
},
report () {
this.$root.$on('habitica:report-result', data => {
if (data.ok) {
this.reported = true;
}
this.$root.$off('habitica:report-result');
});
this.$root.$emit('habitica::report-chat', {
message: this.msg,
groupId: this.groupId || 'privateMessage',
});
},
async remove () {
if (!window.confirm(this.$t('areYouSureDeleteMessage'))) return; // eslint-disable-line no-alert
const message = this.msg;
this.$emit('message-removed', message);
await this.$store.dispatch('chat:deleteChat', {
groupId: this.groupId,
chatId: message.id,
});
},
parseMarkdown (text) {
return renderWithMentions(text, this.user);
},
},
};
</script>
@@ -3,15 +3,6 @@
ref="container"
class="container-fluid"
>
<div class="row">
<div class="col-12">
<copy-as-todo-modal
:group-type="groupType"
:group-name="groupName"
:group-id="groupId"
/>
</div>
</div>
<div class="row loadmore">
<div v-if="canLoadMore">
<div class="loadmore-divider"></div>
@@ -33,6 +24,8 @@
<div
v-for="msg in messages.filter(m => chat && canViewFlag(m))"
:key="msg.id"
class="message-row"
:class="{ 'margin-right': user._id !== msg.uuid}"
>
<div class="d-flex">
<avatar
@@ -45,16 +38,14 @@
:override-top-padding="'14px'"
@click.native="showMemberModal(msg.uuid)"
/>
<div class="card">
<chat-card
:msg="msg"
:group-id="groupId"
@message-liked="messageLiked"
@message-removed="messageRemoved"
@show-member-modal="showMemberModal"
@chat-card-mounted="itemWasMounted"
/>
</div>
<message-card
:msg="msg"
:group-id="groupId"
:user-sent-message="user._id === msg.uuid"
@message-liked="messageLiked"
@message-removed="messageRemoved"
@message-card-mounted="itemWasMounted"
/>
<avatar
v-if="user._id === msg.uuid"
:class="{ invisible: avatarUnavailable(msg) }"
@@ -105,11 +96,6 @@
}
}
.avatar-left {
margin-left: -1.5rem;
margin-right: 2rem;
}
.hr {
width: 100%;
height: 20px;
@@ -137,11 +123,27 @@
margin-bottom: .5em;
padding: 0rem;
width: 90%;
&.system-message {
width: 100%;
}
}
.message-scroll .d-flex {
min-width: 1px;
}
.message-row {
margin-left: 12px;
margin-right: 0;
margin-bottom: 1.2rem;
&:not(.margin-right) {
.d-flex {
justify-content: flex-end;
}
}
}
</style>
<script>
@@ -152,13 +154,13 @@ import findIndex from 'lodash/findIndex';
import { userStateMixin } from '../../mixins/userState';
import Avatar from '../avatar';
import copyAsTodoModal from './copyAsTodoModal';
import chatCard from './chatCard';
import MessageCard from '@/components/messages/messageCard.vue';
// TODO merge chatMessages.vue (party message list) with messageList.vue (private message list)
export default {
components: {
copyAsTodoModal,
chatCard,
MessageCard,
Avatar,
},
mixins: [userStateMixin],
@@ -1,105 +0,0 @@
<template>
<b-modal
id="copyAsTodo"
:title="$t('copyMessageAsToDo')"
:hide-footer="true"
size="md"
>
<div class="form-group">
<input
v-model="task.text"
class="form-control"
type="text"
>
</div>
<div class="form-group">
<textarea
v-model="task.notes"
class="form-control"
rows="5"
focus-element="true"
></textarea>
</div>
<hr>
<task
v-if="task._id"
:is-user="isUser"
:task="task"
/>
<div class="modal-footer">
<button
class="btn btn-secondary"
@click="close()"
>
{{ $t('close') }}
</button>
<button
class="btn btn-primary"
@click="saveTodo()"
>
{{ $t('submit') }}
</button>
</div>
</b-modal>
</template>
<script>
import taskDefaults from '@/../../common/script/libs/taskDefaults';
import { mapActions } from '@/libs/store';
import markdownDirective from '@/directives/markdown';
import notificationsMixin from '@/mixins/notifications';
import Task from '@/components/tasks/task';
const baseUrl = 'https://habitica.com';
export default {
directives: {
markdown: markdownDirective,
},
components: {
Task,
},
mixins: [notificationsMixin],
props: ['copyingMessage', 'groupType', 'groupName', 'groupId'],
data () {
return {
isUser: true,
task: {},
};
},
mounted () {
this.$root.$on('habitica::copy-as-todo', message => {
const notes = `${message.user || 'system message'}${message.user ? ' wrote' : ''} in [${this.groupName}](${this.groupPath()})`;
const newTask = {
text: message.text,
type: 'todo',
notes,
};
this.task = taskDefaults(newTask, this.$store.state.user.data);
this.$root.$emit('bv::show::modal', 'copyAsTodo');
});
},
beforeDestroy () {
this.$root.$off('habitica::copy-as-todo');
},
methods: {
...mapActions({
createTask: 'tasks:create',
}),
groupPath () {
if (this.groupType === 'party') {
return `${baseUrl}/party`;
}
return `${baseUrl}/groups/guild/${this.groupId}`;
},
close () {
this.$root.$emit('bv::hide::modal', 'copyAsTodo');
},
saveTodo () {
this.createTask(this.task);
this.text(this.$t('messageAddedAsToDo'));
this.$root.$emit('bv::hide::modal', 'copyAsTodo');
},
},
};
</script>
+14 -97
View File
@@ -22,13 +22,13 @@
:placeholder="placeholder"
:class="{'user-entry': newMessage}"
:maxlength="MAX_MESSAGE_LENGTH"
@keydown="updateCarretPosition"
@keydown="autoCompleteMixinUpdateCarretPosition"
@keyup.ctrl.enter="sendMessageShortcut()"
@keydown.tab="handleTab($event)"
@keydown.up="selectPreviousAutocomplete($event)"
@keydown.down="selectNextAutocomplete($event)"
@keypress.enter="selectAutocomplete($event)"
@keydown.esc="handleEscape($event)"
@keydown.tab="autoCompleteMixinHandleTab($event)"
@keydown.up="autoCompleteMixinSelectPreviousAutocomplete($event)"
@keydown.down="autoCompleteMixinSelectNextAutocomplete($event)"
@keypress.enter="autoCompleteMixinSelectAutocomplete($event)"
@keydown.esc="autoCompleteMixinHandleEscape($event)"
@paste="disableMessageSendShortcut()"
></textarea>
<span>{{ currentLength }} / {{ MAX_MESSAGE_LENGTH }}</span>
@@ -36,8 +36,8 @@
ref="autocomplete"
:text="newMessage"
:textbox="textbox"
:coords="coords"
:caret-position="caretPosition"
:coords="mixinData.autoComplete.coords"
:caret-position="mixinData.autoComplete.caretPosition"
:chat="group.chat"
@select="selectedAutocomplete"
/>
@@ -74,7 +74,7 @@
<slot name="additionRow"></slot>
<div class="row">
<div class="hr col-12"></div>
<chat-message
<chat-messages
:chat.sync="group.chat"
:group-type="group.type"
:group-id="group._id"
@@ -86,16 +86,15 @@
</template>
<script>
import debounce from 'lodash/debounce';
import { MAX_MESSAGE_LENGTH } from '@/../../common/script/constants';
import externalLinks from '../../mixins/externalLinks';
import autocomplete from '../chat/autoComplete';
import communityGuidelines from './communityGuidelines';
import chatMessage from '../chat/chatMessages';
import chatMessages from '../chat/chatMessages';
import { mapState } from '@/libs/store';
import markdownDirective from '@/directives/markdown';
import { autoCompleteHelperMixin } from '@/mixins/autoCompleteHelper';
export default {
directives: {
@@ -104,23 +103,18 @@ export default {
components: {
autocomplete,
communityGuidelines,
chatMessage,
chatMessages,
},
mixins: [externalLinks],
mixins: [externalLinks, autoCompleteHelperMixin],
props: ['label', 'group', 'placeholder'],
data () {
return {
newMessage: '',
sending: false,
caretPosition: 0,
chat: {
submitDisable: false,
submitTimeout: null,
},
coords: {
TOP: 0,
LEFT: 0,
},
textbox: null,
MAX_MESSAGE_LENGTH: MAX_MESSAGE_LENGTH.toString(),
};
@@ -142,35 +136,6 @@ export default {
this.handleExternalLinks();
},
methods: {
// https://medium.com/@_jh3y/how-to-where-s-the-caret-getting-the-xy-position-of-the-caret-a24ba372990a
getCoord (e, text) {
this.caretPosition = text.selectionEnd;
const div = document.createElement('div');
const span = document.createElement('span');
const copyStyle = getComputedStyle(text);
[].forEach.call(copyStyle, prop => {
div.style[prop] = copyStyle[prop];
});
div.style.position = 'absolute';
document.body.appendChild(div);
div.textContent = text.value.substr(0, this.caretPosition);
span.textContent = text.value.substr(this.caretPosition) || '.';
div.appendChild(span);
this.coords = {
TOP: span.offsetTop,
LEFT: span.offsetLeft,
};
document.body.removeChild(div);
},
updateCarretPosition: debounce(function updateCarretPosition (eventUpdate) {
this._updateCarretPosition(eventUpdate);
}, 250),
_updateCarretPosition (eventUpdate) {
const text = eventUpdate.target;
this.getCoord(eventUpdate, text);
},
async sendMessageShortcut () {
// If the user recently pasted in the text field, don't submit
if (!this.chat.submitDisable) {
@@ -221,50 +186,6 @@ export default {
}, 500);
},
handleTab (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
if (e.shiftKey) {
this.$refs.autocomplete.selectPrevious();
} else {
this.$refs.autocomplete.selectNext();
}
}
},
handleEscape (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
this.$refs.autocomplete.cancel();
}
},
selectNextAutocomplete (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
this.$refs.autocomplete.selectNext();
}
},
selectPreviousAutocomplete (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
this.$refs.autocomplete.selectPrevious();
}
},
selectAutocomplete (e) {
if (this.$refs.autocomplete.searchActive) {
if (this.$refs.autocomplete.selected !== null) {
e.preventDefault();
this.$refs.autocomplete.makeSelection();
} else {
// no autocomplete selected, newline instead
this.$refs.autocomplete.cancel();
}
}
},
selectedAutocomplete (newText, newCaret) {
this.newMessage = newText;
// Wait for v-modal to update
@@ -273,7 +194,6 @@ export default {
this.textbox.focus();
});
},
fetchRecentMessages () {
this.$emit('fetchRecentMessages');
},
@@ -284,10 +204,7 @@ export default {
beforeRouteUpdate (to, from, next) {
// Reset chat
this.newMessage = '';
this.coords = {
TOP: 0,
LEFT: 0,
};
this.autoCompleteMixinResetCoordsPosition();
next();
},
@@ -225,10 +225,9 @@
</a>
</div>
<div class="quest-icon">
<div
<Sprite
class="quest"
:class="`inventory_quest_scroll_${questData.key}`"
></div>
:image-name="`inventory_quest_scroll_${questData.key}`" />
</div>
</div>
<div
@@ -297,7 +297,7 @@
<div class="topbar-dropdown">
<router-link
v-if="user.permissions.fullAccess ||
user.permissions.userSupport || user.permissions.newsPoster"
user.permissions.userSupport"
class="topbar-dropdown-item dropdown-item"
:to="{name: 'adminPanel'}"
>
@@ -12,20 +12,21 @@
<strong> {{ notification.data.title }} </strong>
<span> {{ notification.data.text }} </span>
</div>
<div
<Sprite
slot="icon"
class="mt-3"
:class="notification.data.icon"
></div>
:image-name="notification.data.icon" />
</base-notification>
</template>
<script>
import BaseNotification from './base';
import Sprite from '@/components/ui/sprite.vue';
export default {
components: {
BaseNotification,
Sprite,
},
props: {
notification: {
@@ -10,20 +10,21 @@
slot="content"
v-html="$t('newSubscriberItem')"
></div>
<div
<Sprite
slot="icon"
:class="mysteryClass"
></div>
:image-name="mysteryClass" />
</base-notification>
</template>
<script>
import moment from 'moment';
import BaseNotification from './base';
import Sprite from '@/components/ui/sprite.vue';
export default {
components: {
BaseNotification,
Sprite,
},
props: ['notification', 'canRemove'],
computed: {
@@ -28,7 +28,6 @@
:name="member.profile.name"
:backer="member.backer"
:contributor="member.contributor"
:smaller-style="true"
/>
<inline-class-badge
v-if="member.stats"
@@ -0,0 +1,110 @@
<template>
<div
class="d-inline-flex like-button"
@click="like()"
>
<div
v-b-tooltip="{title: likeTooltip(likeCount)}"
class="d-flex"
>
<div
v-if="likeCount > 0"
class="action d-flex align-items-center mr-0"
:class="{isLiked: true, currentUserLiked: likedByCurrentUser}"
>
<div
class="svg-icon mr-1"
:title="$t('liked')"
v-html="icons.liked"
></div>
+{{ likeCount }}
</div>
<div
v-if="likeCount === 0"
class="action d-flex align-items-center mr-1"
>
<div
class="svg-icon"
:title="$t('like')"
v-html="icons.like"
></div>
</div>
</div>
<span v-if="likeCount === 0">{{ $t('like') }}</span>
</div>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/tiers.scss';
.action {
display: inline-block;
margin-right: 1em;
.svg-icon {
color: $gray-100;
width: 16px;
}
&.isLiked {
color: $purple-200;
font-weight: bold;
.svg-icon {
color: $purple-300;
}
}
}
.like-button {
color: $gray-100;
font-size: 12px;
line-height: 16px;
&:hover {
cursor: pointer;
color: $purple-200;
.svg-icon {
color: $purple-300;
}
}
}
</style>
<script>
import likeIcon from '@/assets/svg/like.svg';
import likedIcon from '@/assets/svg/liked.svg';
export default {
props: {
likeCount: {
type: Number,
},
likedByCurrentUser: {
type: Boolean,
},
},
data () {
return {
icons: Object.freeze({
like: likeIcon,
liked: likedIcon,
}),
};
},
methods: {
async like () {
this.$emit('toggle-like');
},
likeTooltip (likedStatus) {
if (!likedStatus) return this.$t('like');
return null;
},
},
};
</script>
@@ -1,73 +1,157 @@
<template>
<div class="card-body">
<user-link
:user-id="msg.uuid"
:name="msg.user"
:backer="msg.backer"
:contributor="msg.contributor"
/>
<p class="time">
<span
v-if="msg.username"
class="mr-1"
>@{{ msg.username }}</span><span
v-if="msg.username"
class="mr-1"
></span>
<span
v-b-tooltip.hover="messageDate"
>{{ msg.timestamp | timeAgo }}&nbsp;</span>
<span v-if="msg.client && user.contributor.level >= 4"> ({{ msg.client }})</span>
</p>
<div
class="card"
:class="{
'system-message': isSystemMessage
}"
>
<div
class="text markdown"
dir="auto"
v-html="parseMarkdown(msg.text)"
></div>
<div
v-if="isMessageReported"
class="reported"
>
<span v-once>{{ $t('reportedMessage') }}</span><br>
<span v-once>{{ $t('canDeleteNow') }}</span>
</div>
<hr>
<div
v-if="msg.id"
class="d-flex"
v-b-tooltip.hover="messageDateForSystemMessage"
class="message-card"
:class="{
'user-sent-message': userSentMessage,
'user-received-message': !userSentMessage && !isSystemMessage,
'system-message': isSystemMessage
}"
>
<div
v-if="!isMessageReported"
class="action d-flex align-items-center"
@click="report(msg)"
v-if="isUserMentioned"
class="mentioned-icon"
></div>
<div
v-if="userIsModerator && msg.flagCount"
class="message-hidden"
>
<div
v-once
class="svg-icon"
v-html="icons.report"
></div>
<div v-once>
{{ $t('report') }}
</div>
{{ flagCountDescription }}
</div>
<div
class="action d-flex align-items-center"
@click="remove()"
class="card-body"
>
<user-link
v-if="!isSystemMessage"
:user-id="msg.uuid"
:name="msg.user"
:backer="msg.backer"
:contributor="msg.contributor"
/>
<p
v-if="!isSystemMessage"
class="time"
>
<span
v-if="msg.username"
class="mr-1"
>@{{ msg.username }}</span><span
v-if="msg.username"
class="mr-1"
></span>
<span v-b-tooltip.hover="messageDate">{{ msg.timestamp | timeAgo }}&nbsp;</span>
<span v-if="msg.client && user.contributor.level >= 4">
({{ msg.client }})
</span>
</p>
<b-dropdown
v-if="!isSystemMessage"
right="right"
variant="flat"
toggle-class="with-icon"
class="card-menu no-min-width"
:no-caret="true"
>
<template #button-content>
<span
v-once
class="svg-icon inline menuIcon color"
v-html="icons.menuIcon"
>
</span>
</template>
<b-dropdown-item
class="selectListItem"
@click="copy(msg)"
>
<span class="with-icon">
<span
v-once
class="svg-icon icon-16 color"
v-html="icons.copy"
></span>
<span v-once>
{{ $t('copy') }}
</span>
</span>
</b-dropdown-item>
<b-dropdown-item
v-if="canReportMessage"
class="selectListItem custom-hover--red"
@click="report(msg)"
>
<span class="with-icon">
<span
v-once
class="svg-icon icon-16 color"
v-html="icons.report"
></span>
<span v-once>
{{ $t('report') }}
</span>
</span>
</b-dropdown-item>
<b-dropdown-item
v-if="canDeleteMessage"
class="selectListItem custom-hover--red"
@click="remove()"
>
<span class="with-icon">
<span
v-once
class="svg-icon icon-16 color"
v-html="icons.delete"
></span>
<span v-once>
{{ $t('delete') }}
</span>
</span>
</b-dropdown-item>
</b-dropdown>
<div
v-once
class="svg-icon"
v-html="icons.delete"
></div>
<div v-once>
{{ $t('delete') }}
v-if="isSystemMessage"
class="system-message-body"
>
{{ msg.unformattedText }}
</div>
<div
v-else
ref="markdownContainer"
class="text markdown"
dir="auto"
v-html="parseMarkdown(msg.text)"
></div>
<div
v-if="isMessageReported"
class="reported"
>
<span v-once>{{ $t('reportedMessage') }}</span><br>
<span v-once>{{ $t('canDeleteNow') }}</span>
</div>
<like-button
v-if="canLikeMessage"
class="mt-75"
:liked-by-current-user="msg.likes[user._id]"
:like-count="likeCount"
@toggle-like="like()"
/>
</div>
</div>
</div>
</template>
<style lang="scss">
.message-card {
.at-highlight {
background-color: rgba(213, 200, 255, 0.32);
padding: 0.1rem;
@@ -76,43 +160,76 @@
.at-text {
color: #6133b4;
}
.card-menu button {
justify-content: center;
margin: 0;
padding: 0;
height: 1rem;
width: 1rem;
}
.markdown p:last-of-type {
margin-bottom: 0;
}
}
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/tiers.scss';
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/tiers.scss';
.action {
display: inline-block;
color: $gray-200;
margin-right: 1em;
font-size: 12px;
.card {
background: transparent !important;
margin-bottom: 0 !important;
}
:hover {
cursor: pointer;
}
.message-card:not(.system-message) {
background: white;
}
.svg-icon {
color: $gray-300;
margin-right: .2em;
width: 16px;
}
.mentioned-icon {
width: 16px;
height: 16px;
border-radius: 50%;
background-color: $purple-500;
box-shadow: 0 1px 1px 0 rgba(26, 24, 29, 0.12);
position: absolute;
right: -.5em;
top: -.5em;
}
.message-hidden {
margin-left: 1.5em;
margin-top: 1em;
color: red;
}
.active {
color: $purple-300;
.svg-icon {
color: $purple-400;
}
}
.active {
color: $purple-300;
.message-card {
border-radius: 7px;
margin: 0;
padding: 1rem 0.75rem 0.5rem 1rem;
.svg-icon {
color: $purple-400;
}
&.system-message {
padding-top: 0.5rem;
}
.card-body {
padding: 0.75rem 1.25rem 0.75rem 1.25rem;
position: relative;
padding: 0;
.time {
font-size: 12px;
color: $gray-200;
color: $gray-100;
margin-bottom: 0.5rem;
}
@@ -123,49 +240,173 @@
min-height: 0rem;
}
}
}
hr {
margin-bottom: 0.5rem;
margin-top: 0.5rem;
}
.card-menu {
position: absolute;
top: 0;
right: 0;
.reported {
margin-top: 18px;
color: $red-50;
&:not(.show) {
display: none;
}
}
.card-body:hover {
.card-menu {
display: block;
}
}
hr {
margin-bottom: 0.5rem;
margin-top: 0.5rem;
}
.reported {
margin-top: 18px;
color: $red-50;
}
.selectListItem:not(:hover) .svg-icon.icon-16.color {
color: #{$gray-100}
}
.custom-hover--red {
--hover-color: #{$maroon-50};
--hover-background: #{rgba($red-500, 0.25)};
}
.user-sent-message {
border: 1px solid $purple-400;
}
.system-message {
border: 1px solid $purple-400;
}
.user-received-message {
border: 1px solid $gray-500;
}
.card-menu {
// icon-color is the menu icon itself
--icon-color: #{$gray-100};
--dropdown-item-hover-icon-color: #{$gray-100};
&:hover {
--icon-color: #{$purple-300};
}
}
.menuIcon {
width: 4px;
height: 1rem;
object-fit: contain;
}
.system-message-body {
line-height: 1.71;
text-align: center;
color: $purple-300;
}
</style>
<script>
import axios from 'axios';
import moment from 'moment';
import cloneDeep from 'lodash/cloneDeep';
import escapeRegExp from 'lodash/escapeRegExp';
import { CHAT_FLAG_FROM_SHADOW_MUTE, CHAT_FLAG_LIMIT_FOR_HIDING } from '@/../../common/script/constants';
import externalLinks from '../../mixins/externalLinks';
import { CopyToClipboardMixin } from '@/mixins/copyToClipboard';
import renderWithMentions from '@/libs/renderWithMentions';
import { mapState } from '@/libs/store';
import userLink from '../userLink';
import deleteIcon from '@/assets/svg/delete.svg';
import reportIcon from '@/assets/svg/report.svg';
import menuIcon from '@/assets/svg/menu.svg';
import { userStateMixin } from '@/mixins/userState';
import copyIcon from '@/assets/svg/copy.svg';
import LikeButton from '@/components/messages/likeButton.vue';
const LikeLogicMixin = {
computed: {
likeCount () {
const message = this.msg;
if (!message.likes) return 0;
let likeCount = 0;
for (const key of Object.keys(message.likes)) {
const like = message.likes[key];
if (like) likeCount += 1;
}
return likeCount;
},
},
methods: {
async like () {
const message = cloneDeep(this.msg);
await this.$store.dispatch('chat:like', {
groupId: this.groupId,
chatMessageId: this.privateMessageMode ? message.uniqueMessageId : message.id,
});
message.likes[this.user._id] = !message.likes[this.user._id];
this.$emit('message-liked', message);
this.$root.$emit('bv::hide::tooltip');
},
},
};
export default {
components: {
LikeButton,
userLink,
},
filters: {
timeAgo (value) {
return moment(value).fromNow();
},
date (value) {
// @TODO: Vue doesn't support this so we cant user preference
return moment(value).toDate().toString();
},
},
mixins: [externalLinks],
mixins: [
externalLinks, userStateMixin, LikeLogicMixin,
CopyToClipboardMixin,
],
props: {
msg: {},
msg: {
type: Object,
},
groupId: {
type: String,
},
privateMessageMode: {
type: Boolean,
},
userSentMessage: {
type: Boolean,
},
},
data () {
return {
icons: Object.freeze({
delete: deleteIcon,
report: reportIcon,
copy: copyIcon,
menuIcon,
}),
reported: false,
};
@@ -175,19 +416,100 @@ export default {
isMessageReported () {
return (this.msg.flags && this.msg.flags[this.user.id]) || this.reported;
},
messageDateForSystemMessage () {
return this.isSystemMessage ? this.messageDate : '';
},
messageDate () {
const date = moment(this.msg.timestamp).toDate();
return date.toString();
},
userIsModerator () {
return this.hasPermission(this.user, 'moderator');
},
isSystemMessage () {
return this.msg.uuid === 'system';
},
canLikeMessage () {
if (this.isSystemMessage) {
return false;
}
if (this.privateMessageMode) {
return Boolean(this.msg.uniqueMessageId);
}
return this.msg.id;
},
canDeleteMessage () {
return this.privateMessageMode
|| this.msg.uuid === this.user._id
|| this.userIsModerator;
},
canReportMessage () {
if (this.privateMessageMode) {
return !this.isMessageReported;
}
return (this.user.flags.communityGuidelinesAccepted && this.msg.uuid !== 'system')
&& (!this.isMessageReported || this.userIsModerator);
},
isUserMentioned () {
const message = this.msg;
if (message.highlight) {
return true;
}
const { user } = this;
const displayName = user.profile.name;
const { username } = user.auth.local;
const pattern = `@(${escapeRegExp(displayName)}|${escapeRegExp(username)})(\\b)`;
message.highlight = new RegExp(pattern, 'i').test(message.text);
return message.highlight;
},
flagCountDescription () {
if (!this.msg.flagCount) {
return '';
}
if (this.msg.flagCount < CHAT_FLAG_LIMIT_FOR_HIDING) {
return 'Message flagged once, not hidden';
}
if (this.msg.flagCount < CHAT_FLAG_FROM_SHADOW_MUTE) {
return 'Message hidden';
}
return 'Message hidden (shadow-muted)';
},
},
mounted () {
this.$emit('message-card-mounted');
this.handleExternalLinks();
this.mapProfileLinksToModal();
},
updated () {
this.handleExternalLinks();
this.mapProfileLinksToModal();
},
methods: {
mapProfileLinksToModal () {
const links = this.$refs.markdownContainer.getElementsByTagName('a');
for (let i = 0; i < links.length; i += 1) {
let link = links[i].pathname;
// Internet Explorer does not provide the leading slash character in the pathname
link = link.charAt(0) === '/' ? link : `/${link}`;
if (link.startsWith('/profile/')) {
links[i].onclick = ev => {
ev.preventDefault();
this.$router.push({ path: link });
};
}
}
},
report () {
this.$root.$on('habitica:report-result', data => {
if (data.ok) {
@@ -199,16 +521,29 @@ export default {
this.$root.$emit('habitica::report-chat', {
message: this.msg,
groupId: 'privateMessage',
groupId: this.groupId,
});
},
async remove () {
if (!window.confirm(this.$t('areYouSureDeleteMessage'))) return; // eslint-disable-line no-alert
// eslint-disable-next-line no-alert
if (!window.confirm(this.$t('areYouSureDeleteMessage'))) {
return;
}
const message = this.msg;
this.$emit('message-removed', message);
await axios.delete(`/api/v4/inbox/messages/${message.id}`);
if (this.privateMessageMode) {
await axios.delete(`/api/v4/inbox/messages/${message.id}`);
} else {
await this.$store.dispatch('chat:deleteChat', {
groupId: this.groupId,
chatId: message.id,
});
}
},
copy (message) {
this.mixinCopyToClipboard(message.text, this.$t('messageCopiedToClipboard'));
},
parseMarkdown (text) {
return renderWithMentions(text, this.user);
@@ -1,9 +1,9 @@
<template>
<div
ref="container"
class="container-fluid"
class="message-list"
>
<div class="row loadmore">
<div class="loadmore">
<div v-if="canLoadMore && !isLoading">
<div class="loadmore-divider-holder">
<div class="loadmore-divider"></div>
@@ -28,7 +28,7 @@
<div
v-for="(msg) in messages"
:key="msg.id"
class="row message-row"
class="message-row"
:class="{ 'margin-right': user._id !== msg.uuid}"
>
<div
@@ -39,28 +39,31 @@
class="avatar-left"
:member="conversationOpponentUser"
:avatar-only="true"
:override-top-padding="'14px'"
:show-weapon="true"
:debug-mode="false"
:override-top-padding="'0'"
:hide-class-badge="true"
@click.native="showMemberModal(msg.uuid)"
/>
<div
class="card"
:class="{'card-right': user._id !== msg.uuid, 'card-left': user._id === msg.uuid}"
>
<message-card
:msg="msg"
@message-removed="messageRemoved"
@show-member-modal="showMemberModal"
@message-card-mounted="itemWasMounted"
/>
</div>
<message-card
:msg="msg"
:user-sent-message="user._id === msg.uuid"
:group-id="'privateMessage'"
:private-message-mode="true"
@message-liked="messageLiked"
@message-removed="messageRemoved"
@show-member-modal="showMemberModal"
@message-card-mounted="itemWasMounted"
/>
<avatar
v-if="user && user._id === msg.uuid"
class="avatar-right"
:member="user"
:avatar-only="true"
:show-weapon="true"
:debug-mode="false"
:hide-class-badge="true"
:override-top-padding="'14px'"
:override-top-padding="'0'"
@click.native="showMemberModal(msg.uuid)"
/>
</div>
@@ -69,121 +72,110 @@
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/colors.scss';
.avatar {
width: 170px;
min-width: 8rem;
height: 120px;
padding-top: 0 !important;
.avatar-left, .avatar-right {
align-self: center;
::v-deep .character-sprites {
margin-bottom: -5px !important;
padding-bottom: 0 !important;
margin-top: -1px !important;
}
.avatar-right {
margin-left: -1rem;
::v-deep .avatar {
margin-left: -1.75rem;
margin-right: -0.5rem;
}
}
::v-deep .character-sprites {
margin-right: 1rem !important;
.card {
border: 0px;
margin-bottom: 1rem;
padding: 0rem;
width: 684px;
}
.message-list {
width: 100%;
padding-right: 10px;
margin-right: 0 !important;
}
.message-row {
margin-left: 12px;
margin-right: 0;
margin-bottom: 1.2rem;
&:not(.margin-right) {
.d-flex {
justify-content: flex-end;
}
}
}
.card {
border: 0px;
margin-bottom: 1rem;
padding: 0rem;
width: 684px;
}
.message-row {
margin-left: 12px;
margin-right: 12px;
.hr {
width: 100%;
height: 20px;
border-bottom: 1px solid $gray-500;
text-align: center;
margin: 2em 0;
}
&:not(.margin-right) {
.d-flex {
justify-content: flex-end;
}
}
}
@media only screen and (max-width: 1200px) {
.card {
width: 100%;
}
}
.hr-middle {
font-size: 16px;
font-weight: bold;
font-family: 'Roboto Condensed';
line-height: 1.5;
text-align: center;
color: $gray-200;
background-color: $gray-700;
padding: .2em;
margin-top: .2em;
display: inline-block;
width: 100px;
}
@media only screen and (min-width: 1400px) {
.message-row {
margin-left: -15px;
margin-right: -30px;
}
}
.loadmore {
justify-content: center;
margin-right: 12px;
margin-top: 12px;
margin-bottom: 24px;
.card-left {
border: 1px solid $purple-500;
}
.card-right {
border: 1px solid $gray-500;
}
.hr {
> div {
display: flex;
width: 100%;
height: 20px;
border-bottom: 1px solid $gray-500;
text-align: center;
margin: 2em 0;
}
align-items: center;
.hr-middle {
font-size: 16px;
font-weight: bold;
font-family: 'Roboto Condensed';
line-height: 1.5;
text-align: center;
color: $gray-200;
background-color: $gray-700;
padding: .2em;
margin-top: .2em;
display: inline-block;
width: 100px;
}
.loadmore {
justify-content: center;
margin-right: 12px;
margin-top: 12px;
margin-bottom: 24px;
> div {
display: flex;
width: 100%;
align-items: center;
button {
text-align: center;
color: $gray-50;
}
button {
text-align: center;
color: $gray-50;
}
}
}
.loadmore-divider-holder {
flex: 1;
margin-left: 24px;
margin-right: 24px;
.loadmore-divider-holder {
flex: 1;
margin-left: 24px;
margin-right: 24px;
&:last-of-type {
margin-right: 0;
}
&:last-of-type {
margin-right: 0;
}
}
.loadmore-divider {
height: 1px;
border-top: 1px $gray-500 solid;
width: 100%;
.loadmore-divider {
height: 1px;
border-top: 1px $gray-500 solid;
width: 100%;
}
}
.loading {
padding-left: 1.5rem;
margin-bottom: 1rem;
}
.loading {
padding-left: 1.5rem;
margin-bottom: 1rem;
}
</style>
@@ -280,6 +272,9 @@ export default {
// container.style.overflowY = 'scroll';
}
}, 50),
messageLiked (message) {
this.$emit('message-liked', message);
},
messageRemoved (message) {
this.$emit('message-removed', message);
},
@@ -692,7 +692,7 @@
<div class="form-inline clearfix">
<Sprite
class="pull-left"
:class="'inventory_quest_scroll_' + item.key"
:image-name="'inventory_quest_scroll_' + item.key"
style="margin-right: 10px"
/>
<p>{{ item.text() }}</p>
@@ -107,7 +107,7 @@ export default {
if (lastPublishedPost) this.posts.push(lastPublishedPost);
// If the user is authorized, show any draft
if (this.user && this.user.contributor.newsPoster) {
if (this.user && (this.user.permissions.news || this.user.permissions.fullAccess)) {
this.posts.unshift(
...postsFromServer
.filter(p => !p.published || moment().isBefore(p.publishDate)),
@@ -20,6 +20,7 @@
}"
>
<input
ref="textInput"
:value="value"
class="form-control"
:type="inputType"
@@ -29,19 +30,23 @@
}"
:readonly="readonly"
:aria-readonly="readonly"
autocomplete="off"
:placeholder="placeholder"
@keyup="handleChange"
@keyup.enter="$emit('enter')"
@blur="$emit('blur')"
>
</div>
<div
v-for="issue in invalidIssues"
:key="issue"
class="input-error"
>
{{ issue }} &nbsp;
</div>
<template v-if="!hideErrorLine">
<div
v-for="issue in invalidIssues"
:key="issue"
class="input-error"
>
{{ issue }} &nbsp;
</div>
</template>
</div>
</div>
</template>
@@ -85,6 +90,10 @@ export default {
type: Array,
default: () => [],
},
hideErrorLine: {
type: Boolean,
default: false,
},
},
data () {
return {
@@ -107,6 +116,9 @@ export default {
this.wasChanged = true;
this.$emit('update:value', value);
},
focus () {
this.$refs.textInput.focus();
},
},
};
</script>
@@ -128,4 +140,12 @@ export default {
margin-bottom: 0;
}
/* this removes safari "save username" UI, we only search for one, we dont want to save it */
input::-webkit-contacts-auto-fill-button,
input::-webkit-credentials-auto-fill-button {
visibility: hidden;
position: absolute;
right: 0;
}
</style>
+4 -13
View File
@@ -29,20 +29,12 @@
@import '~@/assets/scss/colors.scss';
.user-link { // this is the user name
font-family: 'Roboto Condensed', sans-serif;
font-weight: bold;
margin-bottom: 0;
cursor: pointer;
display: inline-block;
font-size: 16px;
// currently used in the member-details-new.vue
&.smaller {
font-family: Roboto;
font-size: 14px;
font-weight: bold;
line-height: 1.71;
}
font-size: 14px;
line-height: 1.71;
display: inline-flex !important;
&.no-tier {
color: $gray-50;
@@ -111,7 +103,6 @@ export default {
'backer',
'contributor',
'hideTooltip',
'smallerStyle',
'showBuffed',
'context',
],
@@ -173,7 +164,7 @@ export default {
return this.hideTooltip ? '' : achievementsLib.getContribText(this.contributor, this.isNPC) || '';
},
levelStyle () {
return `${this.userLevelStyleFromLevel(this.level, this.isNPC)} ${this.smallerStyle ? 'smaller' : ''}`;
return `${this.userLevelStyleFromLevel(this.level, this.isNPC)}`;
},
},
};
@@ -0,0 +1,102 @@
import debounce from 'lodash/debounce';
export const autoCompleteHelperMixin = {
data () {
return {
mixinData: {
autoComplete: {
caretPosition: 0,
coords: {
TOP: 0,
LEFT: 0,
},
},
},
};
},
methods: {
autoCompleteMixinHandleTab (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
if (e.shiftKey) {
this.$refs.autocomplete.selectPrevious();
} else {
this.$refs.autocomplete.selectNext();
}
}
},
autoCompleteMixinHandleEscape (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
this.$refs.autocomplete.cancel();
}
},
autoCompleteMixinSelectNextAutocomplete (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
this.$refs.autocomplete.selectNext();
}
},
autoCompleteMixinSelectPreviousAutocomplete (e) {
if (this.$refs.autocomplete.searchActive) {
e.preventDefault();
this.$refs.autocomplete.selectPrevious();
}
},
autoCompleteMixinSelectAutocomplete (e) {
if (this.$refs.autocomplete.searchActive) {
if (this.$refs.autocomplete.selected !== null) {
e.preventDefault();
this.$refs.autocomplete.makeSelection();
} else {
// no autocomplete selected, newline instead
this.$refs.autocomplete.cancel();
}
}
},
autoCompleteMixinUpdateCarretPosition: debounce(function updateCarretPosition (eventUpdate) {
this._updateCarretPosition(eventUpdate);
}, 250),
autoCompleteMixinResetCoordsPosition () {
this.mixinData.autoComplete.coords = {
TOP: 0,
LEFT: 0,
};
},
// https://medium.com/@_jh3y/how-to-where-s-the-caret-getting-the-xy-position-of-the-caret-a24ba372990a
_getCoord (e, text) {
const caretPosition = text.selectionEnd;
this.mixinData.autoComplete.caretPosition = caretPosition;
const div = document.createElement('div');
const span = document.createElement('span');
const copyStyle = getComputedStyle(text);
[].forEach.call(copyStyle, prop => {
div.style[prop] = copyStyle[prop];
});
div.style.position = 'absolute';
document.body.appendChild(div);
div.textContent = text.value.substr(0, caretPosition);
span.textContent = text.value.substr(caretPosition) || '.';
div.appendChild(span);
this.mixinData.autoComplete.coords = {
TOP: span.offsetTop,
LEFT: span.offsetLeft,
};
document.body.removeChild(div);
},
_updateCarretPosition (eventUpdate) {
const text = eventUpdate.target;
this._getCoord(eventUpdate, text);
},
},
};
+5 -3
View File
@@ -1,7 +1,7 @@
import notifications from './notifications';
import { NotificationMixins } from './notifications';
export default {
mixins: [notifications],
export const CopyToClipboardMixin = {
mixins: [NotificationMixins],
methods: {
async mixinCopyToClipboard (valueToCopy, notificationToShow = null) {
if (navigator.clipboard) {
@@ -21,3 +21,5 @@ export default {
},
},
};
export default CopyToClipboardMixin;
@@ -62,7 +62,7 @@
<script>
import moment from 'moment';
import userLabel from '../userLabel';
import userLabel from '../../components/userLabel.vue';
import dots from '@/assets/svg/dots.svg';
import block from '@/assets/svg/block.svg';
@@ -117,7 +117,7 @@ export default {
</script>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/colors';
.action-padding {
height: 24px !important;
@@ -153,7 +153,7 @@ export default {
</style>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
@import '~@/assets/scss/colors';
.conversation {
padding: 1rem 1.5rem;
@@ -0,0 +1,64 @@
<template>
<div
v-if="filtersConversations.length > 0"
class="conversations"
>
<conversation-item
v-for="conversation in filtersConversations"
:key="conversation.key"
:active-key="selectedConversation?.key"
:contributor="conversation.contributor"
:backer="conversation.backer"
:uuid="conversation.key"
:display-name="conversation.name"
:username="conversation.username"
:last-message-date="conversation.date"
:last-message-text="conversation.lastMessageText
? removeTags(parseMarkdown(conversation.lastMessageText)) : ''"
@click="selectConversation(conversation.key)"
/>
</div>
</template>
<style scoped lang="scss">
.conversations {
overflow-x: hidden;
overflow-y: auto;
height: 100%;
}
</style>
<script>
import { defineComponent } from 'vue';
import habiticaMarkdown from 'habitica-markdown';
import conversationItem from '@/pages/private-messages/pm-conversation-item.vue';
export default defineComponent({
components: { conversationItem },
props: {
filtersConversations: {
type: Array,
default: () => [],
},
selectedConversation: {
type: Object,
default: null,
},
},
methods: {
removeTags (html) {
const tmp = document.createElement('DIV');
tmp.innerHTML = html;
return tmp.textContent || tmp.innerText || '';
},
parseMarkdown (text) {
if (!text) return null;
return habiticaMarkdown.render(String(text));
},
selectConversation (conversationKey) {
this.$emit('selectConversation', conversationKey);
},
},
});
</script>
@@ -0,0 +1,37 @@
<template>
<div
class="pm-disabled-caption text-center"
>
<h4>{{ disabledTexts.title }}</h4>
<p>{{ disabledTexts.description }}</p>
</div>
</template>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
.pm-disabled-caption {
padding-top: 1.5em;
z-index: 2;
h4, p {
color: $gray-200;
}
h4 {
margin-top: 0;
margin-bottom: 0.4em;
}
p {
font-size: 12px;
margin-bottom: 0;
}
}
</style>
<script>
export default {
props: ['disabledTexts'],
};
</script>
@@ -0,0 +1,71 @@
<template>
<div
class="empty-messages m-auto text-center empty-sidebar"
>
<div class="no-messages-box">
<div
v-once
class="svg-icon envelope mb-4"
v-html="icons.mailIcon"
></div>
<strong
v-once
class="mb-1"
>
{{ $t('emptyMessagesLine1') }}
</strong>
<p v-if="!chatRevoked">
{{ $t('emptyMessagesLine2') }}
</p>
</div>
<button
class="btn btn-primary mt-4 d-flex align-items-center"
@click="$emit('newMessageClicked')"
>
<div
class="svg-icon icon-10 color mr-2"
v-html="icons.positive"
></div>
{{ $t('newMessage') }}
</button>
</div>
</template>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
strong {
line-height: 1.71;
color: $gray-100;
}
.svg-icon.icon-10 {
margin: 3px;
}
p {
font-size: 14px;
font-weight: 400;
line-height: 24px;
}
</style>
<script>
import mailIcon from '@/assets/svg/mail.svg';
import positiveIcon from '@/assets/svg/positive.svg';
export default {
props: {
chatRevoked: Boolean,
},
data () {
return {
icons: Object.freeze({
mailIcon,
positive: positiveIcon,
}),
};
},
};
</script>
@@ -0,0 +1,69 @@
<template>
<div
v-once
class="centered empty-messages m-auto text-center"
>
<avatar
v-if="memberObj"
:member="memberObj"
:avatar-only="true"
:show-weapon="false"
:hide-class-badge="true"
:override-top-padding="'0px'"
:sprites-margin="'0 0 0 -30px'"
:debug-mode="false"
:center-avatar="true"
class="mb-3"
/>
<strong>{{ memberObj.profile.name }}</strong>
<div class="username mb-3">
@{{ memberObj.auth.local.username }}
</div>
<div
class="kind-text"
v-html="$t('rememberToBeKind')"
></div>
</div>
</template>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
.centered {
align-content: center;
}
.center-avatar {
margin: 0 auto;
}
strong {
line-height: 1.71;
}
.username {
font-size: 12px;
line-height: 1.33;
color: $gray-100;
margin-top: -4px;
}
.kind-text {
width: 330px;
line-height: 1.71;
color: $gray-100;
}
</style>
<script>
import Avatar from '@/components/avatar.vue';
export default {
components: { Avatar },
props: {
memberObj: null,
},
};
</script>
@@ -0,0 +1,44 @@
export namespace PrivateMessages {
// Shared properties between message types
interface SharedMessageProps {
username: string;
contributor: Record<string, unknown>;
userStyles: Record<string, unknown>;
canReceive: boolean;
}
/**
* This is the Type we get from our API
*/
interface ConversationSummaryMessageEntry extends SharedMessageProps {
uuid: string;
user: string;
timestamp: string;
text: string;
count: number;
}
/**
* The Visual (Sidebar) Entry
*/
interface ConversationEntry extends SharedMessageProps {
/**
* UUID
*/
key: string;
name: string;
lastMessageText: '',
canLoadMore: boolean;
page: 0
}
/**
* Loaded Private Messages, partial type
*/
interface PrivateMessageEntry extends SharedMessageProps {
text: string;
}
}
@@ -0,0 +1,165 @@
<template>
<div class="ml-4">
<strong
v-once
v-html="$t('to')"
></strong>
<validated-text-input
id="selectUser"
ref="targetUserInput"
v-model="targetUserInputValue"
class="mx-2"
:is-valid="foundUser._id"
:only-show-invalid-state="foundUser._id === undefined"
:hide-error-line="true"
:placeholder="$t('usernameOrUserId')"
:invalid-issues="userInputInvalidIssues"
@enter="triggerNewConversation"
/>
<button
class="btn btn-primary"
:disabled="preventTrigger"
@click="triggerNewConversation()"
>
{{ $t('confirm') }}
</button>
<button
class="ml-2 btn btn-secondary"
@click="$emit('cancelNewConversation')"
>
{{ $t('cancel') }}
</button>
</div>
</template>
<style scoped lang="scss">
@import '~@/assets/scss/colors.scss';
div {
display: flex;
align-items: center;
}
div > * {
height: 32px;
}
strong {
line-height: 1.71;
align-content: center;
}
input {
border-radius: 2px;
border-width: 2px;
width: 420px;
}
#selectUser {
/* changing the style of validate-text-input to the same as others */
::v-deep {
.input-group {
border-width: 2px;
input {
width: 420px;
height: 100%;
color: $gray-50;
}
}
.input-group {
&:focus, &:active, &:focus-within {
border: solid 2px $purple-400;
}
}
}
}
</style>
<script>
import debounce from 'lodash/debounce';
import isUUID from 'validator/es/lib/isUUID';
import ValidatedTextInput from '@/components/ui/validatedTextInput.vue';
export default {
components: {
ValidatedTextInput,
},
mixins: [],
data () {
return {
targetUserInputValue: '',
userNotFound: false,
foundUser: {},
};
},
computed: {
preventTrigger () {
return this.targetUserInputValue.length < 2;
},
userInputInvalidIssues () {
return this.targetUserInputValue.length > 0 && this.userNotFound
? [this.$t('userWithUsernameOrUserIdNotFound')]
: [''];
},
},
watch: {
targetUserInputValue: {
handler () {
this.searchUser(this.targetUserInputValue.replace('@', ''));
},
},
},
mounted () {
this.$refs.targetUserInput.focus();
},
methods: {
close () {
this.$root.$emit('bv::hide::modal', 'select-user-modal');
},
searchUser: debounce(async function userSearch (searchTerm = '') {
this.foundUser = {};
if (searchTerm.length < 1) {
this.userNotFound = false;
return;
}
let result;
if (isUUID(searchTerm)) {
try {
result = await this.$store.dispatch('members:fetchMember', {
memberId: searchTerm,
});
} catch {
result = null;
}
} else {
try {
result = await this.$store.dispatch('members:fetchMemberByUsername', {
username: searchTerm,
});
} catch {
result = null;
}
}
if (!result) {
this.userNotFound = true;
return;
}
this.userNotFound = false;
this.foundUser = result;
}, 500),
triggerNewConversation () {
const userWithoutAt = this.$refs.targetUserInput.value.replace('@', '');
this.$emit('startNewConversation', userWithoutAt);
},
},
};
</script>
+1 -2
View File
@@ -49,7 +49,7 @@ const GroupPlanIndex = () => import(/* webpackChunkName: "group-plans" */ '@/com
const GroupPlanTaskInformation = () => import(/* webpackChunkName: "group-plans" */ '@/components/group-plans/taskInformation');
const GroupPlanBilling = () => import(/* webpackChunkName: "group-plans" */ '@/components/group-plans/billing');
const MessagesIndex = () => import(/* webpackChunkName: "private-messages" */ '@/pages/private-messages');
const MessagesIndex = () => import(/* webpackChunkName: "private-messages" */ '@/pages/private-messages/index.vue');
// Challenges
const ChallengeIndex = () => import(/* webpackChunkName: "challenges" */ '@/components/challenges/index');
@@ -190,7 +190,6 @@ const router = new VueRouter({
meta: {
privilegeNeeded: [ // any one of these is enough to give access
'userSupport',
'newsPoster',
],
},
children: [
+8 -1
View File
@@ -43,7 +43,14 @@ export async function deleteChat (store, payload) {
}
export async function like (store, payload) {
const url = `/api/v4/groups/${payload.groupId}/chat/${payload.chatId}/like`;
let url = '';
if (payload.groupId === 'privateMessage') {
url = `/api/v4/inbox/like-private-message/${payload.chatMessageId}`;
} else {
url = `/api/v4/groups/${payload.groupId}/chat/${payload.chatMessageId}/like`;
}
const response = await axios.post(url);
return response.data.data;
}
@@ -72,7 +72,11 @@ describe('LevelUp', () => {
it('generates the right test class for level 15', () => {
const questClass = testFunction('questClass', 15);
expect(questClass()).to.equal('inventory_quest_scroll_atom1');
});
expect(questClass()).to.equal('scroll inventory_quest_scroll_atom1');
it('generates empty test class for level 14', () => {
const questClass = testFunction('questClass', 14);
expect(questClass()).to.equal('');
});
});
@@ -1,14 +1,16 @@
import Vue from 'vue';
import { shallowMount, createLocalVue } from '@vue/test-utils';
import ChatCard from '@/components/chat/chatCard.vue';
import BootstrapVue from 'bootstrap-vue';
import MessageCard from '@/components/messages/messageCard.vue';
import Store from '@/libs/store';
const localVue = createLocalVue();
localVue.use(Store);
localVue.use(Vue.directive('b-tooltip', {}));
localVue.use(BootstrapVue);
describe('ChatCard', () => {
describe('MessageCard', () => {
function createMessage (text) {
return { text, likes: {} };
}
@@ -26,7 +28,7 @@ describe('ChatCard', () => {
let wrapper;
beforeEach(() => {
wrapper = shallowMount(ChatCard, {
wrapper = shallowMount(MessageCard, {
propsData: { msg: message },
store: new Store({
state: {
+1 -1
View File
@@ -91,7 +91,7 @@
"conText": "Якостта намалява щетите от отрицателни навици и пропуснати ежедневни задачи.",
"perception": "Усет",
"perText": "Усетът увеличава спечеленото злато, а след отключването на пазара увеличава вероятността за намиране на предмети след приключване на задачи.",
"intelligence": "Интелигентност",
"intelligence": "Интелект",
"intText": "Интелигентността увеличава спечеления опит, а след отключването на класовете определя максималната мана за използване за класовите умения.",
"levelBonus": "Бонус за ниво",
"allocatedPoints": "Разпределени точки",
+6 -3
View File
@@ -1,7 +1,7 @@
{
"quests": "Мисии",
"quest": "мисия",
"petQuests": "Мисии за любимци и превози",
"petQuests": "Мисии за домашни любимци и ездитни животни",
"unlockableQuests": "Мисии, които могат да бъдат отключени",
"goldQuests": "Последователности от мисии на класовите повелители",
"questDetails": "Подробности за мисията",
@@ -29,7 +29,7 @@
"collected": "Събрани",
"abort": "Прекратяване",
"leaveQuest": "Напускане на мисията",
"sureLeave": "Наистина ли искате да се откажете от текущата мисия? Ще загубите целия си напредък.",
"sureLeave": "Сигурни ли сте, че искате да се откажете от мисията? Ще загубите целия си напредък.",
"mustComplete": "Трябва първо да завършите <%= quest %>.",
"mustLvlQuest": "Трябва да бъдете ниво <%= level %>, за да купите тази мисия!",
"unlockByQuesting": "За да отключите тази мисия, първо завършете <%= title %>.",
@@ -78,5 +78,8 @@
"questAlreadyStartedFriendly": "Мисията вече е започнала, но винаги може да хванете следващата!",
"questAlreadyStarted": "Мисията вече е започнала.",
"questInvitationNotificationInfo": "Получихте покана за присъединяване към мисия",
"hatchingPotionQuests": "Мисии за Магическа Излюпваща Отвара"
"hatchingPotionQuests": "Мисии за Магическа Излюпваща Отвара",
"bossDamage": "Нанесохте вреда на главатаря!",
"questItemsPending": "<%= amount %> предмета ще бъдат събрани",
"sureLeaveInactive": "Сигурни ли сте, че искате да се откажете от мисията? Няма да можете да участвате в нея."
}
+2 -2
View File
@@ -58,11 +58,11 @@
"foundNewItemsCTA": "Podívej se do tvého Inventáře a zkus zkombinovat tvůj nový líhnoucí lektvar a vajíčko!",
"foundNewItemsExplanation": "Splnění úkolů ti dá šanci najít předměty jako vajíčka, líhnoucí lektvary a jídlo pro mazlíčky.",
"foundNewItems": "Nové předměty nalezeny!",
"hideAchievements": "Schovat <%= kategorie %>",
"hideAchievements": "Schovat <%= category %>",
"onboardingCompleteDesc": "Získáváš <strong>5 úspěchů</strong> a <strong class=\"gold-amount\">100 zlaťáků</strong> za dokončení seznamu.",
"onboardingProgress": "<%= percentage %>% postup",
"gettingStartedDesc": "Splň tyto základní úkoly a získej <strong>5 úspěchů</strong> a <strong class=\"gold-amount\">100 zlaťáků</strong>, jakmile budeš hotový/á!",
"showAllAchievements": "Zobrazit všechny <%= kategorie %>",
"showAllAchievements": "Zobrazit všechny <%= category %>",
"yourProgress": "Tvůj postup",
"achievementBareNecessitiesModalText": "Splnil/a jsi výpravy za opicí, lenochodem a stromečkem!",
"achievementBareNecessitiesText": "Splnil/a výpravy za opicí, lenochodem a stromečkem.",
+1 -1
View File
@@ -152,7 +152,7 @@
"achievementDinosaurDynastyModalText": "Du hast alle Vogel- und Dinosaurier-Haustiere gesammelt!",
"achievementDinosaurDynasty": "Dinosaurier Dynastie",
"achievementBonelessBoss": "Knochenloser Boss",
"achievementBonelessBossText": "Hat alle wirbellosen Tiere ausgebrütet: Käfer, Schmetterling, Tintenfisch, Nacktschnecke, Oktopus, Schnecke und Spinnen!",
"achievementBonelessBossText": "Hat alle wirbellosen Tiere ausgebrütet: Käfer, Schmetterling, Tintenfisch, Nacktschnecke, Oktopus, Schnecke und Spinne!",
"achievementBonelessBossModalText": "Du hast alle wirbellosen Tiere gesammelt!",
"achievementDuneBuddyText": "Hat alle Standardfarben der Wüstenbewohnern ausgebrütet: Gürteltier, Kaktus, Fuchs, Frosch, Schlange und Spinne!",
"achievementRoughRider": "Harter Reiter",
+8 -2
View File
@@ -789,7 +789,7 @@
"backgroundBirthdayBashNotes": "Habitica feiert eine Geburtstagsparty und alle sind eingeladen!",
"eventBackgrounds": "Ereignis-Hintergründe",
"backgroundBirthdayBashText": "Geburtstagsparty",
"backgroundInsideACrystalNotes": "Schau aus dem Inneren eines Kristalls heraus.",
"backgroundInsideACrystalNotes": "Schau aus dem Inneren eines Kristalls hinaus.",
"backgrounds072023": "SET 110: Veröffentlicht im Juli 2023",
"backgroundOnAPaddlewheelBoatText": "Auf einem Schaufelradboot",
"backgroundOnAPaddlewheelBoatNotes": "Fahre mit einem Schaufelradboot.",
@@ -891,5 +891,11 @@
"backgroundFirstSnowForestNotes": "Tritt in den ersten Schnee im Wald.",
"backgrounds012025": "Set 128: Veröffentlicht im Januar 2025",
"backgroundWinterLandscapeWithCabinText": "Winterlandschaft mit Hütte",
"backgroundWinterLandscapeWithCabinNotes": "Macht es dir in einer Winterlandschaft mit einer Hütte gemütlich."
"backgroundWinterLandscapeWithCabinNotes": "Macht es dir in einer Winterlandschaft mit einer Hütte gemütlich.",
"backgroundOldFashionedTeaShopText": "Altmodischer Teeladen",
"backgroundOldFashionedTeaShopNotes": "Genieße ein Getränk in einem Altmodischen Teeladen.",
"backgrounds022025": "Set 129: Veröffentlicht im Februar 2025",
"backgrounds032025": "SET 130: Veröffentlicht im März 2025",
"backgroundMountainSceneWithBlossomsText": "Bergszene mit Blüten",
"backgroundMountainSceneWithBlossomsNotes": "Erlebe den entzückenden Anblick und Geruch einer Bergszene mit Blüten."
}
+8 -1
View File
@@ -392,5 +392,12 @@
"questEggDogText": "Welpe",
"questEggDogMountText": "Hund",
"questEggDogAdjective": "ein freundlicher",
"hatchingPotionGingerbread": "Lebkuchen"
"hatchingPotionGingerbread": "Lebkuchen",
"questEggCatText": "Kätzchen",
"questEggCatMountText": "Katze",
"questEggCatAdjective": "ein schelmisches",
"questEggOtterText": "Otter",
"questEggOtterMountText": "Otter",
"hatchingPotionJade": "Jade",
"questEggOtterAdjective": "Ein perfider"
}
+5 -3
View File
@@ -11,7 +11,7 @@
"webFaqAnswer31": "Wenn du eine Aufgabe erfüllst und HP verlierst, obwohl du das nicht hättest tun sollen, kam es zu einer Verzögerung, während der Server die auf anderen Plattformen vorgenommenen Änderungen synchronisiert hat. Wenn du zum Beispiel Gold oder Mana verwendest oder HP in der mobilen App verlierst und dann eine Aufgabe auf der Website erledigst, bestätigt der Server lediglich, dass alles synchronisiert ist.",
"webFaqAnswer49": "Wenn Du Habitica mit anderen erleben möchtest, aber keine anderen Spieler kennst, ist die Suche nach einer Party die beste Option! Wenn Du bereits andere Spieler kennst, die eine Party haben, kannst Du deinen @Benutzernamen mit ihnen teilen, um eingeladen zu werden. Alternativ kannst Du auch eine neue Gruppe erstellen und sie mit ihrem @Nutzernamen oder ihrer E-Mail-Adresse einladen.\n\nUm eine Party zu erstellen oder zu suchen, wähle \"Party\" im Navigationsmenü und wähle dann die Option, die Dir am besten gefällt.",
"webFaqAnswer62": "Gruppenpläne bieten dir die einzigartige Möglichkeit, anderen Mitgliedern deines Gruppenplans gemeinsame Aufgaben zuzuweisen. Wenn eine gemeinsame Aufgabe einem Mitglied zugewiesen wird, können andere Mitglieder sie nicht mehr erledigen.\n\nDu kannst eine Aufgabe auch mehreren Mitgliedern zuweisen. Wenn sich zum Beispiel alle Mitglieder die Zähne putzen müssen, erstellst du eine Aufgabe und weist sie jedem Mitglied zu. Jedes Mitglied kann die Aufgabe erledigen und sich seine individuelle Belohnung verdienen. Die Hauptaufgabe wird als erledigt angezeigt, sobald alle Mitglieder sie erledigt haben.",
"webFaqAnswer32": "In Habitica gibt es vier Klassen: Krieger, Magier, Schurke und Heiler. Alle Spieler beginnen in der Klasse des Kriegers, bis du Stufe 10 erreicht hast. Sobald du Stufe 10 erreichst, hast du die Wahl, eine neue Klasse zu wählen oder als Krieger weiterzuspielen.\n\nJede Klasse verfügt über unterschiedliche Ausrüstungen und Fertigkeiten. Wenn du dich nicht für eine Klasse entscheiden möchtest, kannst du \"Aussteigen\" wählen. Wenn du dich dafür entscheidest, kannst du das Klassensystem später in den Einstellungen wieder aktivieren.",
"webFaqAnswer32": "Alle Spieler beginnen in der Klasse des Kriegers, bis sie Stufe 10 erreicht haben. Sobald du Stufe 10 erreichst, hast du die Wahl, eine neue Klasse zu wählen oder als Krieger weiterzuspielen.\n\nJede Klasse verfügt über unterschiedliche Ausrüstungen und Fertigkeiten. Wenn du dich nicht für eine Klasse entscheiden möchtest, kannst du \"Abbrechen\" wählen. Wenn du dich später doch entscheidest, kannst du das Klassensystem in den Einstellungen wieder aktivieren.\n\nWenn Du Deine Klasse nach Level 10 noch einmal ändern möchtest, kannst Du die Sphäre der Wiedergeburt hierfür nutzen. Die Sphäre der Wiedergeburt ist mit Level 50 auf demMarktplatz für 6 Edelsteine verfügbar und mit Level 100 bekommst Du sie umsonst.\n\nAlternativ kannst Du Deine Klasse jederzeit in den Einstellungen für 3 Edelsteine ändern. Dies wird Dein Level nicht wie die Sphäre der Wiedergeburt zurücksetzen, aber es erlaubt Dir, die Fertigkeits-Punkte, die Du beim Leveln gesammelt hast, Deiner neuen Klasse zuzuordnen.",
"sunsetFaqPara14": "<strong>Linguists</strong><br />Wir freuen uns auch weiterhin über Hilfe bei der Übersetzung der Apps und der Website und werden für qualifizierte Beiträge nach wie vor Beitragsstufen vergeben. Die Methode, mit der wir Übersetzungen annehmen, wird sich jedoch ändern. Wir möchten unsere Ressourcen auf die Unterstützung einer bestimmten Auswahl von Sprachen für alle Plattformen konzentrieren. Um dies zu erreichen, werden wir die Anzahl der für Übersetzungen verfügbaren Sprachen reduzieren. Zuvor nicht fertiggestellte Sprachen werden in Github archiviert. Wir hoffen, dass diese Änderung das plattformübergreifende Habitica-Erlebnis konsistenter macht. Sie können unsere aktuellsten Richtlinien für das Übersetzungsverfahren auf unserer Website lesen <a href='https://translate.habitica.com/projects/habitica/#information'>Übersetzungswebsite</a>.",
"webFaqAnswer34": "Haustiere mögen Futter, das zu ihrer Farbe passt. Basis-Tiere sind die Ausnahme, aber alle Basis-Tiere mögen den gleichen Gegenstand. Im Folgenden siehst du, welche Nahrungsmittel jedes Haustier mag:\n\n * Basistiere mögen Fleisch\n * Weiße Haustiere mögen Milch\n * Wüstenhaustiere mögen Kartoffeln\n * Rote Haustiere mögen Erdbeeren\n * Schattentiere mögen Schokolade\n * Skelett-Tiere mögen Fisch\n * Zombie-Tiere mögen verdorbenes Fleisch\n * Zuckerwatte rosa Haustiere mögen rosa Zuckerwatte\n * Zuckerwatte blaue Haustiere mögen blaue Zuckerwatte\n * Goldene Haustiere mögen Honig",
"webFaqAnswer35": "Sobald du dein Haustier genug gefüttert hast, um es zu einem Reittier zu machen, musst du diese Art von Haustier erneut ausbrüten, um es in deinem Stall zu haben.\n\nUm Reittiere in den mobilen Apps zu sehen:\n\n * Wähle im Menü \"Haustiere & Reittiere\" und wechseln zur Registerkarte \"Reittiere\".\n\nSo zeigst du Reittiere auf der Website an:\n\n * Wähle im Menü \"Inventar\" die Option \"Haustiere und Reittiere\" und scrollen nach unten zum Abschnitt \"Reittiere\"",
@@ -36,7 +36,7 @@
"faqQuestion30": "Was passiert, wenn ich keine HP mehr habe?",
"webFaqAnswer30": "Wenn deine HP Null erreichen, verlierst du eine Stufe, dein gesamtes Gold und ein Ausrüstungsstück, das du wieder kaufen kannst.",
"faqQuestion31": "Warum habe ich HP verloren, wenn ich mit einer nicht-negativen Aufgabe interagiere?",
"faqQuestion32": "Wann kann ich eine Klasse wählen?",
"faqQuestion32": "Wie kann ich eine Klasse wählen?",
"faqQuestion33": "Was ist der blaue Balken, der nach Level 10 erscheint?",
"webFaqAnswer33": "Nachdem du das Klassensystem freigeschaltet hast, schaltest du auch Fertigkeiten frei, die Mana benötigen, um genutzt werden zu können. Mana wird durch deinen INT-Wert bestimmt und kann durch Fertigkeiten und Ausrüstung angepasst werden.",
"faqQuestion34": "Welches Futter mag mein Haustier?",
@@ -241,5 +241,7 @@
"subscriptionDetail430": "Die Kündigung eines aktiven Abonnements wird ein Enddatum für deine Vorteile festsetzen, bis zu dem du vollen Zugang zu allen Abo-Vorteilen hast. Das bedeutet, dass du weiterhin am Start jedes Monats Mystische Sanduhren und Erhöhungen der Edelsteinobergrenze erhältst, solange du Zugang zu diesen Vorteilen hast.",
"subscriptionDetail440": "Am Tag, an dem diese Änderungen in Kraft treten, erhalten aktive Abonnenten mit einer ungeraden Anzahl an Edelsteinen pro Monat folgende Anpassungen ihrer Edelsteinobergrenze:",
"subscriptionDetail470": "Gruppenabonnentenvorteile verhalten sich genauso wie die eines wiederkehrenden 1-Monats-Abonnements. Du erhältst eine Mystische Sanduhr am Anfang jedes Monats und die Anzahl an Edelsteinen, die du jeden Monat auf dem Marktplatz kaufen kannst, wird sich erhöhen bis zu einem Limit von 50.",
"subscriptionPara3": "Wir hoffen, dass dieser neue Rhythmus besser vorhersagbar ist, mehr Zugang zur fantastischen Gegenstandauswahl im Laden des Zeitreisenden ermöglicht und noch mehr Motivation bietet, jeden Monat Fortschritte an deinen Aufgaben zu machen!"
"subscriptionPara3": "Wir hoffen, dass dieser neue Rhythmus besser vorhersagbar ist, mehr Zugang zur fantastischen Gegenstandauswahl im Laden des Zeitreisenden ermöglicht und noch mehr Motivation bietet, jeden Monat Fortschritte an deinen Aufgaben zu machen!",
"faqQuestion67": "Was sind die Klassen in Habitica?",
"webFaqAnswer67": "Klassen sind verschiedene Rollen, die dein Charakter spielen kann. Jede Klasse bietet ihre eigene Reihe von einzigartigen Vorteilen und Fähigkeiten beim Aufsteigen auf höhere Level. Diese Fähigkeiten können das Bearbeiten deiner Aufgaben ergänzen oder dabei helfen, deine Party beim Abschließen von Quests zu unterstützen.\n\nDeine Klasse bestimmt auch, welche Ausrüstung für dich in den Belohnungen, im Marktplatz und im Jahreszeitenmarkt zum Kauf erhältlich ist.\n\nHier ist eine Zusammenfassung jeder Klasse, um dir dabei zu helfen, diejenige zu wählen, welche am besten zu deinem Spielstil passt:\n#### **Krieger**\n* Krieger verursachen hohen Schaden bei Bossen und haben eine hohe Chance für kritische Treffer beim Abschließen von Aufgaben, was dich mit extra Erfahrung und Gold belohnt.\n* Stärke ist ihr primäres Attribut, welches den Schaden erhöht, den sie verursachen.\n* Ausdauer ist ihr sekundäres Attribut, welches den Schaden verringert, den sie erhalten.\n* Die Fähigkeiten der Krieger erhöhen die Ausdauer und Stärke der Party Kameraden.\n* Erwäge, einen Krieger zu spielen, wenn du es liebst, Bosse zu bekämpfen und auch ein wenig Schutz möchtest, wenn du gelegentlich Aufgaben versäumst.\n#### **Heiler**\n* Heiler haben eine starke Verteidigung und können sich selbst, sowie die Party Kameraden, heilen.\n* Ausdauer ist ihr primäres Attribut, welches ihre Heilungen verstärkt und den Schaden, den sie erhalten, verringert.\n* Intelligenz ist ihr sekundäres Attribut, welches ihr Mana und ihre Erfahrung erhöht.\n* Die Fähigkeiten der Heiler bewirken, dass ihre Aufgaben weniger rot werden und erhöhen die Ausdauer der Party Kameraden.\n* Erwäge, einen Heiler zu spielen, wenn du oft Aufgaben versäumst, und die Fähigkeit benötigst, dich selbst und deine Party Kameraden zu heilen. Heiler erreichen schnell neue Level.\n#### **Magier**\n* Magier gewinnen schnell neue Level und viel Mana, und verursachen Schaden bei Bossen in Quests.\n* Intelligenz ist ihr primäres Attribut, welches ihr Mana und ihre Erfahrung erhöht.\n* Wahrnehmung ist ihr sekundäres Attribut, welches ihr gefundenes Gold und ihre gefundenen Gegenstände vermehrt.\n* Die Fähigkeiten der Magier bewirken, dass ihre Aufgaben Strähnen eingefroren werden, stellen das Mana ihrer Party Kameraden wieder her, und erhöhen ihre Intelligenz.\n* Erwäge, einen Magier zu spielen, wenn du durch das schnelle Erreichen neuer Level und das Beisteuern von Schaden in Boss Quests motiviert wirst.\n#### **Schurke**\n* Schurken bekommen die meisten erbeuteten Gegenstände und das meiste Gold beim Erledigen von Aufgaben, und haben eine höhere Chance, kritische Treffer zu erzielen, was ihnen noch mehr Erfahrung und Gold beschert.\n* Wahrnehmung ist ihr primäres Attribut, welches ihr gefundenes Gold und ihre gefundenen Gegenstände vermehrt.\n* Stärke ist ihr sekundäres Attribut, welches den Schaden erhöht, den sie verursachen.\n* Die Fähigkeiten der Schurken helfen ihnen, versäumten Tagesaufgaben auszuweichen, Gold zu klauen, und die Wahrnehmung ihrer Party Kameraden zu erhöhen.\n* Erwäge, einen Schurken zu spielen, wenn du durch Belohnungen sehr motiviert wirst."
}
+1 -1
View File
@@ -170,7 +170,7 @@
"joinMany": "Schließe Dich über <%= userCountInMillions %> Millionen Leuten an und habe Spaß, während Du Deine Aufgaben erfüllst!",
"joinToday": "Tritt Habitica heute bei",
"signup": "Registrieren",
"getStarted": "Auf gehts",
"getStarted": "Auf geht's",
"mobileApps": "Mobile Apps",
"learnMore": "Mehr erfahren",
"communityInstagram": "Instagram",
+40 -6
View File
@@ -2800,12 +2800,12 @@
"armorMystery202406Text": "Phantom-Seeräuber Kleidung",
"headMystery202406Text": "Phantom-Seeräuber Hut",
"eyewearMystery202406Text": "Phantom-Seeräuber Maske",
"weaponArmoirePaintbrushNotes": "Ein Ruck purer Inspiration durchdringt dich, wenn du diesen Frabpinsel aufhebst, und ermöglicht dir, alles zu malen, was du dir vorstellen kannst. Erhöht Intelligenz um <%= int %>.Verzauberter Schrank: Maler Set (Gegenstand 3 von 4).",
"weaponArmoirePaintbrushNotes": "Ein Ruck purer Inspiration durchdringt dich, wenn du diesen Frabpinsel aufhebst, und ermöglicht dir, alles zu malen, was du dir vorstellen kannst. Erhöht Intelligenz um <%= int %>.Verzauberter Schrank: Malerset (Gegenstand 3 von 4).",
"weaponArmoirePaintbrushText": "Farbpinsel",
"weaponArmoireMopText": "Mopp",
"weaponArmoireCleaningClothText": "Putzlappen",
"weaponArmoireMopNotes": "Schritt 1: Tauche den Mopp in einen Eimer mit Wasser und Schaum. Schritt 2: Ziehe den Mopp über den Boden. Schritt 3: Tu so, als wäre das Ende des Mopp Stiels ein Mikrofon und singe mit voller Inbrunst. Schritt 4: Wiederhole Schritte 1-3, bis der Boden sauber ist. Erhöht Ausdauer und Wahrnehmung um jeweils <%= attrs %>. Putzausrüstungs-Set Zwei (Gegenstand 2 von 3)",
"weaponArmoireCleaningClothNotes": "Nimm dieses Putzwerkzeug auf deine Abenteuer mit und sei immer bereit, eine hübsche Gedenktafel zu polieren oder eine hölzerne Fensterbank zu wischen. Erhöht Stärke und Ausdauer um jeweils <%= attrs %>. Verzauberter Schrank: Putzausrüstung Set Zwei (Gegenstand 3 von 3)",
"weaponArmoireMopNotes": "Schritt 1: Tauche den Mopp in einen Eimer mit Wasser und Schaum. Schritt 2: Ziehe den Mopp über den Boden. Schritt 3: Tu so, als wäre das Ende des Mopp Stiels ein Mikrofon und singe mit voller Inbrunst. Schritt 4: Wiederhole Schritte 1-3, bis der Boden sauber ist. Erhöht Ausdauer und Wahrnehmung um jeweils <%= attrs %>. Reinigungs-Set Zwei (Gegenstand 2 von 3)",
"weaponArmoireCleaningClothNotes": "Nimm dieses Putzwerkzeug auf deine Abenteuer mit und sei immer bereit, eine hübsche Gedenktafel zu polieren oder eine hölzerne Fensterbank zu wischen. Erhöht Stärke und Ausdauer um jeweils <%= attrs %>. Verzauberter Schrank: Reinigungs-Set Zwei (Gegenstand 3 von 3)",
"weaponArmoireRidingBroomText": "Reitbesen",
"weaponArmoireRidingBroomNotes": "Reite auf diesem feinen Besen zu all deinen magischsten Besorgungen--oder nimm ihn für eine Spritztour durch die Nachbarschaft. Wuui! Erhöht Stärke um <%= str %> und Intelligenz um <%= int %>. Verzauberter Schrank: Spukhaftes Zauberer Set (Gegenstand 1 von 3)",
"weaponArmoireHattersShearsText": "Scharfe Scheren",
@@ -2969,7 +2969,7 @@
"armorArmoireBasketballUniformNotes": "Fragst du dich, was auf dem Rücken dieser Uniform aufgedruckt ist? Deine Glückszahl, natürlich! Erhöht Wahrnehmung um <%= per %>.Verzauberter Schrank: Altertümliches Basketballset (Gegenstand 1 von 2).",
"armorArmoireShawlCollarCoatNotes": "Ein weiser Zauberer sagte einst, dass nichts besser ist als es sowohl gemütlich zu haben als auch produktiv zu sein! Trage diesen warmen und stylischen Mantel, wenn du die diesjährigen Herausforderungen meisterst. Erhöht Ausdauer um <%= con %>.",
"armorArmoirePaintersApronText": "Schürze des Malers",
"armorArmoirePaintersApronNotes": "Diese Schürze kann deine Kleidung vor Farbe und deine kreativen Projekte vor harschen Kritiken schützen. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Maler-Set (Gegenstand 1 von 4).",
"armorArmoirePaintersApronNotes": "Diese Schürze kann deine Kleidung vor Farbe und deine kreativen Projekte vor harschen Kritiken schützen. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Malerset (Gegenstand 1 von 4).",
"weaponSpecialWinter2025WarriorText": "Axt des Elchkriegers",
"weaponSpecialWinter2025WarriorNotes": "Eine mächtige Axt für einen mächtigen Elch! Du wirst unaufhaltbar sein! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2024-2025 Winterausrüstung.",
"weaponSpecialWinter2025RogueText": "Schneeflockenausbruch",
@@ -3124,7 +3124,7 @@
"headArmoireWhiteFloppyHatNotes": "Viele Zaubersprüche wurden in diesen einfachen Hut eingenäht und verleihen ihm eine wundersame weiße Farbe. Erhöht Stärke, Intelligenz und Ausdauer um jeweils <%= attrs %>. Verzauberter Schrank: Weißes Loungewear -Set (Gegenstand 1 von 3).",
"headArmoireCorsairsBandanaNotes": "Egal, ob du deinen Kopf bedecken willst, falls eine Möwe über dich hinwegfliegt, oder ob du sicherstellen willst, dass deine Feinde dich nicht schwitzen sehen, dieses Tuch ist unverzichtbar. Füge einfach eine Zierperle für jedes Abenteuer hinzu, das du bestehst. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Korsaren-Set (Gegenstand 2 von 3)",
"headArmoireFunnyFoolCapNotes": "Die Glöckchen an diesem Hut könnten deine Gegner zum Kichern bringen, aber dir helfen sie nur, dich zu konzentrieren. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Lustiges Narren-Set (Gegenstand 1 von 3)",
"headArmoireDragonKnightsHelmNotes": "Mit den feurigen Elementen auf diesem Helm könnten Drachen dich für einen der ihren halten. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Drachenritter-Set (Gegenstand 1 von 3)",
"headArmoireDragonKnightsHelmNotes": "Mit den feurigen Elementen auf diesem Helm könnten dich Drachen für einen der ihren halten. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Drachenritter-Set (Gegenstand 1 von 3)",
"headArmoireStormKnightHelmText": "Sturmritterhelm",
"headArmoireGreenTrapperHatText": "Grüne Trappermütze",
"headArmoireGreenTrapperHatNotes": "Alle sagen, dass deine Mütze so warm aussieht! Und das ist sie tatsächlich. Achte nur darauf, dass du die Klappen von deinen Ohren ziehst, wenn die Leute mit dir reden, sonst hört sich das Ganze eher nach „dne ütze sht ss wrrm ss!“ an. Erhöht Ausdauer und Wahrnehmung um jeweils <%= attrs %> . Verzauberter Schrank: Trappermützen-Set (Gegenstand 1 von 2).",
@@ -3253,5 +3253,39 @@
"bodyArmoireKarateBlueBeltText": "Blauer Gürtel",
"bodyArmoireKaratePurpleBeltText": "Violetter Gürtel",
"eyewearMystery202303Text": "Verträumte Augen",
"eyewearSpecialAnniversaryText": "Habiticas Heldenmaske"
"eyewearSpecialAnniversaryText": "Habiticas Heldenmaske",
"shieldArmoireFancyFloralFanNotes": "Beende deinen bezaubernden Look mit diesem erstklassigen Fächer aus besonders blumiger Baumwolle. Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Bezauberndes Blumenset (Gegenstand 2 von 2).",
"armorMystery202502Notes": "Du bist voller gutmütiger Witze und Scherze, von deinem zerrupften Kragen bis zu deinen gigantischen Schuhen! Gewährt keinen Attributbonus. Februar 2025 Abonnentengegenstand.",
"armorMystery202502Text": "Herzvoller Harlekin Anzug",
"headMystery202502Text": "Herzvoller Harlekin Hut",
"headMystery202502Notes": "Dieses fröhliche Hütchen wird bei jedem, der dich sieht, für Freude sorgen! Gewährt keinen Attributbonus. Februar 2025 Abonnentengegenstand.",
"headArmoireFancyFloralHatText": "Bezaubernder Blumenhut",
"shieldMystery202502Text": "Herzvolle Harlekin Ballons",
"shieldMystery202502Notes": "Möge dein Herz an diesen Valentinstag, und auch jeden anderen Tag, so leicht sein wie diese beschwingten Luftballons. Gewährt keinen Attributbonus. Februar 2025 Abonnentengegenstand.",
"shieldArmoireFancyFloralFanText": "Bezaubernder Blumenfächer",
"headArmoireFancyFloralHatNotes": "Bestaune diesen bezaubernden Hut voller hinreißender Blumen und verschnörkelten Schnallen. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Bezauberndes Blumen Zubehör Set (Gegenstand 1 von 2).",
"weaponSpecialSpring2025WarriorNotes": "Mit einem Schnitt kannst du durch Blumenstängel säbeln, um ein Bukett zu machen, oder direkt durch Hindernisse, um deine Aufgaben zu erfüllen. Erhöht Stärke um <%= str %>. Limitierte Ausgabe Frühlingsausrüstung 2025.",
"weaponSpecialSpring2025WarriorText": "Sonnenschein-Säbel",
"weaponSpecialSpring2025RogueText": "Kristallspitzen-Morgenstern",
"weaponSpecialSpring2025RogueNotes": "Mit einem Schwinger kannst du jedes Hindernis eliminieren, das deinen Zielen im Weg steht. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"weaponSpecialSpring2025MageNotes": "Mit einem Schwinger kannst du Elementarmagie nutzen, um deine Umgebung zu kontrollieren. Nutze den Vorteil und spring vorwärts! Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe Frühlingsausrüstung 2025.",
"weaponSpecialSpring2025MageText": "Fangschrecken Stab",
"armorSpecialSpring2025WarriorText": "Sonnenschein Rüstung",
"armorSpecialSpring2025WarriorNotes": "Diese atemberaubende Rüstung hat Farben, die du inmitten eines sonnigen Frühlingstages am Himmel sehen kannst. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe Frühlingsausrüstung 2025.",
"armorSpecialSpring2025HealerText": "Plumeria Robe",
"armorSpecialSpring2025HealerNotes": "Diese atemberaubende Robe enthält Plumeria Blütenblätter, die weich und raschelig sind. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"weaponSpecialSpring2025HealerText": "Plumeria Hirtenstab",
"weaponSpecialSpring2025HealerNotes": "Mit einem Schwinger kannst du Bestäuber an deine Seite rufen, um dir bei deinen Abenteuern zu helfen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"armorSpecialSpring2025RogueText": "Kristallnadel-Umhang",
"armorSpecialSpring2025RogueNotes": "Dieser atemberaubende Umhang enthält extra Kristalle mit speziellen, geheimen Kräften, von denen nur du weißt. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"armorSpecialSpring2025MageText": "Fangschrecken Uniform",
"armorSpecialSpring2025MageNotes": "Diese atemberaubende Uniform enthält auffällige Farben, lässt dich aber trotzdem heimlich an deine schwierigsten Aufgaben anpirschen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"headSpecialSpring2025WarriorText": "Sonnenschein Helm",
"headSpecialSpring2025WarriorNotes": "Der Kamm auf diesem Helm erinnert an den Lauf der Sonne, sieht aber auch aus wie eine Bürste, die du für den Frühjahrsputz nutzen könntest. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"headSpecialSpring2025RogueText": "Kristallnadel-Hut",
"headSpecialSpring2025RogueNotes": "Die Kristalle in diesem Hut ermuntern zu produktiver Energie und leuchten außerdem hell, damit du zu jeder Tages- und Nachtzeit arbeiten kannst. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"headSpecialSpring2025HealerText": "Plumeria Kopfschmuck",
"headSpecialSpring2025HealerNotes": "Diese Blume symbolisiert Geburt, Liebe und Neubeginn! Sie verbreitet auch einen schönen Duft, den du genießen kannst, während du an deinen Aufgaben arbeitest. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2025 Frühlingsausrüstung.",
"headSpecialSpring2025MageText": "Fangschrecken Maske",
"headSpecialSpring2025MageNotes": "Die Fangschrecke ist bekannt dafür, sich zu tarnen oder sich langsam zu bewegen. Wähle eine Taktik zu Hilfe für jedes einzelne Ziel, sei aber gewiss, daß du Taktiken jederzeit ändern kannst, wenn du musst. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2025 Frühlingsausrüstung."
}
+3 -3
View File
@@ -189,7 +189,7 @@
"dismissAll": "Alle entfernen",
"messages": "Nachrichten",
"emptyMessagesLine1": "Du hast im Moment keine Nachrichten",
"emptyMessagesLine2": "Sende eine Nachricht, um eine Unterhaltung mit deinen Partymitgliedern oder anderen Habitica-Spieler*innen zu beginnen",
"emptyMessagesLine2": "Du kannst anderen eine neue Nachricht schicken, indem Du ihr Profil aufrufst und auf den \"Nachrichten\"-Knopf drückst.",
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> hat Dir eine Nachricht gesendet",
"letsgo": "Auf geht's!",
"selected": "Ausgewählt",
@@ -239,7 +239,7 @@
"skipExternalLinkModal": "Halte STRG (Windows) oder Command (Mac) beim Anklicken eines Links, um dieses Modal zu überspringen.",
"shadowMute": "Unsichtbare Stummschaltung",
"titleCustomizations": "Individualisierungen",
"targetUserNotExist": "Zielbenutzer: '<%= userName %>' existiert nicht.",
"newMessage": "Neue Nachricht",
"targetUserNotExist": "Benutzer: '<%= userName %>' existiert nicht.",
"rememberToBeKind": "Denk bitte daran, freundlich und respektvoll zu sein und die <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a> einzuhalten."
"rememberToBeKind": "Bitte sei freundlich, respektvoll, und folge den <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a>."
}
+1 -1
View File
@@ -428,5 +428,5 @@
"readyToUpgrade": "Bereit zum Aufrüsten?",
"interestedLearningMore": "Willst du mehr erfahren?",
"checkGroupPlanFAQ": "Schau in die <a href='/static/faq#what-is-group-plan'>Gruppenpläne FAQ</a> um herauszufinden, wie du deine gemeinsamen Aufgaben optimal nutzen kannst.",
"messageCopiedToClipboard": "Nachricht in Zwischenablage kopiert"
"messageCopiedToClipboard": "Nachricht in Zwischenablage kopiert."
}
+5 -1
View File
@@ -270,5 +270,9 @@
"winter2025StringLightsHealerSet": "Lichterketten Heiler Set",
"winter2025SnowRogueSet": "Schneeschurken Set",
"winter2025MooseWarriorSet": "Elchkrieger Set",
"winter2025AuroraMageSet": "Aurora Magier Set"
"winter2025AuroraMageSet": "Aurora Magier Set",
"spring2025PlumeriaHealerSet": "Plumeria Heiler Set",
"spring2025MantisMageSet": "Fangschrecken Magier Set",
"spring2025SunshineWarriorSet": "Sonnenschein Krieger Set",
"spring2025CrystalPointRogueSet": "Kristallspitzen Schurken Set"
}
+22 -1
View File
@@ -810,5 +810,26 @@
"questDogDropDogEgg": "Hund (Ei)",
"questDogUnlockText": "Schaltet den Kauf von Hundeeiern auf dem Marktplatz frei.",
"questDogNotes": "Du wurdest für eine Expedition ausgewählt, um die unterirdischen Höhlensysteme von Habitica zu kartieren! Forscher in Habit City vermuten, dass es in diesen Tiefen neue Werkzeuge für die Bewältigung von Aufgaben oder sogar unentdeckte Kreaturen geben könnte.<br><br>Während du felsige Tunnel in der Nähe der Ausläufer des Wandernden Gebirges erkundest, bemerkst du ein Leuchten, das von einem zerklüfteten Eingang vor dir ausgeht. Als du näher kommst, siehst du... Spielzeug? Plüschtiere und Gummibälle liegen auf dem Höhlenboden verstreut. Hörst du da ein Bellen?<br><br>Ein riesiger, dreiköpfiger Hund springt heraus und stürzt sich auf das Spielzeug, das du gerade aufheben wolltest! Du erstarrst und verlierst dabei fast deinen Arm! Aber... die Mäuler des Hundes scheinen zu sehr mit Spielzeug beschäftigt zu sein, um anzugreifen?<br><br>„Wuff!“, bellt eines der Hundemäuler und lässt einen zerrissenen Spielzeugwaschbären fallen. „Bist du hier, um mir beim Aufräumen zu helfen? Ich muss wirklich aufräumen, aber jedes Mal, wenn ich ein Spielzeug in die Hand nehme, spiele ich nur damit... Hier, denk schnell!!!“<br><br> Der Hund wirft dir einen Ball zu, und dann noch einen und noch einen. Diese zusätzlichen Köpfe machen das Ausweichen zu einem echten Training!",
"questDogCompletion": "Nachdem du alle Spielzeuge eingesammelt hast, denen du (zum Glück) ausgewichen bist, gibst du Shiberus einen sanften Klaps auf seinen mittleren Kopf.<br><br>„Es ist schön, sich auf eine große Aufgabe zu freuen, aber es könnte hilfreich sein, mit einem Plan vorzugehen. Vielleicht solltest du das nächste Mal am Eingang anfangen und dich rückwärts vorarbeiten? Oder 30 Minuten am Stück arbeiten und dann eine kurze Spielpause einschieben.\"<br><br>„Das ist eine gute Idee“, meldet sich der linke Kopf des Hundes zu Wort. Der rechte Kopf legt ein paar Gegenstände in deine Nähe, darunter auch etwas, das aussieht wie Eier... „Ich habe ein paar Dinge gefunden, die dir gefallen könnten, während wir gespielt haben. Danke für deine Hilfe!“"
"questDogCompletion": "Nachdem du alle Spielzeuge eingesammelt hast, denen du (zum Glück) ausgewichen bist, gibst du Shiberus einen sanften Klaps auf seinen mittleren Kopf.<br><br>„Es ist schön, sich auf eine große Aufgabe zu freuen, aber es könnte hilfreich sein, mit einem Plan vorzugehen. Vielleicht solltest du das nächste Mal am Eingang anfangen und dich rückwärts vorarbeiten? Oder 30 Minuten am Stück arbeiten und dann eine kurze Spielpause einschieben.\"<br><br>„Das ist eine gute Idee“, meldet sich der linke Kopf des Hundes zu Wort. Der rechte Kopf legt ein paar Gegenstände in deine Nähe, darunter auch etwas, das aussieht wie Eier... „Ich habe ein paar Dinge gefunden, die dir gefallen könnten, während wir gespielt haben. Danke für deine Hilfe!“",
"questCatNotes": "An diesem schönen Tag befindest du dich in der Werkstatt des im Effizienz Emporium von Habit City. Du hast eine schwierige Aufgabe: Du sollst neue magische Motivationszaubersprüche entwickeln, um allen Habiticans das Erreichen ihrer Ziele zu vereinfachen.<br><br>Auf dem Tisch vor dir liegt eine Vielzahl magischer Objekte. In all den Büchern stand, dass sie zusammen mit produktiver Energie harmonisieren sollen... Aber bisher ist da noch nicht mal einen Funken Motivation.<br><br>Das Knarren der Tür macht dich auf einen neuen Gast aufmerksam, der die Werkstatt betritt. Herumtollende Füße und ein Ball aus Flausch schnellen auf den Tisch. Eine... Katze? Bevor du überhaupt die Chance hast, ihr ein Kompliment zu machen, wie flauschig sie ist, hebt sie eine Pfote in Richtung der Kristalle, die du aufgestellt hast und... wirft einen vom Tisch!<br><br>\"Hey!\" rufst du, \"Du bist sehr süß, aber ich versuche hier zu arbeiten...\"<br><br>Sie schaut dich mit ihren schönen blauen Augen an, kippt ihren Kopf, und legt ein Bündel Kräuter auf den Tisch. \"Ich helfe doch!\" schnurrt sie.<br><br>Du siehst ihre Pfote, die sie nach den anderen Gegenständen, die du gesammelt hast, ausstreckt und springst zu Boden, um den nächsten Gegenstand aufzufangen!",
"questCatText": "Ein verwirrendes Dilemma",
"questCatDropCatEgg": "Katze (Ei)",
"questCatUnlockText": "Schaltet Katzeneier zum Kauf im Marktplatz frei.",
"questCatBoss": "Der schnurrende Verwirrer",
"questCatRageTitle": "Wütendes Klopfen",
"questCatRageDescription": "Diese Leiste füllt sich, wenn du deine Tagesaufgaben nicht erledigst. Wenn sie voll ist, nimmt der Schnurrende Verwirrer einen Teil der MP deiner Party weg!",
"questCatRageEffect": "Der Schnurrende Verwirrer stößt die magischen Gegenstände, die du gesammelt hast, vom Tisch! Die MP der Party werden reduziert!",
"questCatCompletion": "Zum Glück hast du alles aufgefangen, was die zudringliche Katze vom Tisch geworfen hat. Als du auf dem Boden sitzt, bemerkst du ein helles Leuchten, das von den Gegenständen vor dir ausgeht. Wenn du nach oben schaust, reagieren die Gegenstände auf dem Tisch auch! Sie auf verschiedene Höhen zu stellen, könnte ein Durchbruch in deinen Forschungen sein! <br><br>„Weißt du, am Ende hast du mir doch geholfen. Ich glaube, ich habe einfach einen neuen Blick auf meine Aufgabe gebraucht, um mich aus der Patsche zu befreien. Ich wünschte allerdings, du hättest mich ein bisschen vorgewarnt, bevor du anfängst, die Dinge herumzuschieben“, sagst du zu der Katze und streichelst sie sanft. <br><br>„Das ist ein sehr vernünftiges Anliegen, bitte nimm das als meine Entschuldigung“, schnurrt sie und schiebt dir ein paar lustig aussehende Eier zu. „Es freut mich, dass ich dir helfen konnte, die Dinge aus einer anderen Schnurrspektive zu sehen.“",
"questOtterText": "Der Perfide Verschwörer!",
"questOtterDropOtterEgg": "Otter (Ei)",
"questOtterUnlockText": "Schält Otter Eier zum Kauf im Marktplatz frei",
"questOtterBoss": "Der Verschwörer",
"questOtterRageEffect": "Der Verschwörer wirft Teile deiner To-Do Liste in die Luft! Der Boss erhält 30% seiner Lebenspunkte zurück!",
"questOtterRageDescription": "Dieser Balken füllt sich, wenn du deine Tagesaufgaben nicht erledigst. Wenn er voll ist, erhält Der Verschwörer einige Lebenspunkte zurück!",
"questJadeText": "Ein Matter Unglücksbringer",
"questJadeBoss": "Matter Unglücksbringer",
"questJadeDropJadePotion": "Jade Schlüpfelixier",
"questJadeUnlockText": "Schält Jade Schlüpfelixier zum Kauf im Marktplatz frei.",
"questOtterRageTitle": "To-Do Abriß!",
"questJadeNotes": "Du bist zu Hause und starrst auf den Stapel dreckigen Geschirrs in der Spüle. Auf den Haufen schmutziger Wäsche in einer wahllosen Ecke des Raums. Auf die leeren Tassen und Snackverpackungen um deinen Tisch herum...<br><br>Du seufzt. „Warum ist da immer noch mehr dreckiges Geschirr... Die Sauerei hört nie auf.“ Es ist so demotivierend. Du findest dich auf der Couch wieder, endlos durch die neuesten Trends scrollend. Wer weiß, wie lang du da warst...<br><br>Als du von deinem Telefon hochsiehst, ist alles grün. Dies ist nicht dein Wohnzimmer. Als du aufstehst, findest du dich an der Seite eines leuchtend grünen Berges wieder.<br><br>Bewegung in der Ferne erregt deine Aufmerksamkeit. Eine steinerne grüne Gestalt grunzt, während sie einen Fels das steinige Terrain hoch wälzt. Er macht einige Fortschritte, aber ein kleiner Ausrutscher seines Fußes lässt den glänzenden Fels zurück nach unten rollen, direkt auf dich zu!<br><br>Er entdeckt dich, als er zu dem Brocken Jade rennt, der auf dich zu poltert! „Du denkst also, der Abwasch ist übel?“ schreit die Gestalt, „Versuch das!“"
}
+3 -1
View File
@@ -259,5 +259,7 @@
"earn2Gems": "Verdiene <strong>+2 Edelsteine</strong> für jeden Monat, in dem du abonniert hast",
"subscribeAgainContinueHourglasses": "Erneuere Dein Abonnement, um weiterhin Mystische Sanduhren zu erhalten",
"mysterySet202411": "Borstenkämpfer Set",
"mysterySet202501": "Frostbinder-Set"
"mysterySet202501": "Frostbinder-Set",
"mysterySet202502": "Herzliches Harlekin-Set",
"mysterySet202503": "Jade Juggernaut Set"
}
@@ -1015,6 +1015,10 @@
"backgroundOldFashionedTeaShopText": "Old Fashioned Tea Shop",
"backgroundOldFashionedTeaShopNotes": "Enjoy a cozy beverage in an Old Fashioned Tea Shop.",
"backgrounds032025": "SET 130: Released March 2025",
"backgroundMountainSceneWithBlossomsText": "Mountain Scene with Blossoms",
"backgroundMountainSceneWithBlossomsNotes": "Take in the lovely sights and scents of a Mountain Scene with Blossoms.",
"timeTravelBackgrounds": "Steampunk Backgrounds",
"backgroundAirshipText": "Airship",
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
+3 -3
View File
@@ -87,7 +87,7 @@
"allocatePerPop": "Add a Point to Perception",
"allocateInt": "Points allocated to Intelligence:",
"allocateIntPop": "Add a Point to Intelligence",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <a href='https://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Orb of Rebirth</a>!",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <a href='/shops/market'>Orb of Rebirth</a>!",
"stats": "Stats",
"strength": "Strength",
"strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.",
@@ -133,8 +133,8 @@
"healerText": "Healers stand impervious against harm, and extend that protection to others. Missed Dailies and bad Habits don't faze them much, and they have ways to recover Health from failure. Play a Healer if you enjoy assisting others in your Party, or if the idea of cheating Death through hard work inspires you!",
"optOutOfClasses": "Opt Out",
"chooseClass": "Choose your Class",
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](https://habitica.fandom.com/wiki/Class_System)",
"optOutOfClassesText": "Can't be bothered with classes? Want to choose later? Opt out - you'll be a warrior with no special abilities. You can read about the class system later on the wiki and enable classes at any time under User Icon > Settings.",
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](/static/faq#what-classes)",
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <a href='/static/faq#what-classes' target='_blank'>our FAQ</a> and visit Settings to enable the Class System when you're ready.",
"selectClass": "Select <%= heroClass %>",
"select": "Select",
"stealth": "Stealth",
+5
View File
@@ -275,6 +275,10 @@
"questEggCatMountText": "Cat",
"questEggCatAdjective": "a mischievous",
"questEggOtterText": "Otter",
"questEggOtterMountText": "Otter",
"questEggOtterAdjective": "a perfidious",
"eggNotes": "Find a hatching potion to pour on this egg, and it will hatch into <%= eggAdjective(locale) %> <%= eggText(locale) %>.",
"hatchingPotionBase": "Base",
@@ -340,6 +344,7 @@
"hatchingPotionFungi": "Fungi",
"hatchingPotionKoi": "Koi",
"hatchingPotionGingerbread": "Gingerbread",
"hatchingPotionJade": "Jade",
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> Pet.",
"premiumPotionUnlimitedNotes": "Not usable on Quest Pet eggs.",
+2 -2
View File
@@ -41,9 +41,9 @@
"backerTier": "Backer Tier",
"playerTiers": "Player Tiers",
"tier": "Tier",
"conRewardsURL": "https://habitica.fandom.com/wiki/Contributor_Rewards",
"conRewardsURL": "https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards",
"surveysSingle": "Helped Habitica grow, either by filling out a survey or helping with a major testing effort. Thank you!",
"surveysMultiple": "Helped Habitica grow on <%= count %> occasions, either by filling out a survey or helping with a major testing effort. Thank you!",
"blurbHallPatrons": "This is the Hall of Patrons, where we honor the noble adventurers who backed Habitica's original Kickstarter. We thank them for helping us bring Habitica to life!",
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <a href='https://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> gems, exclusive equipment</a>, and <a href='https://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'>prestigious titles</a>. You can contribute to Habitica, too! <a href='https://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Find out more here. </a>"
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards' target='_blank'>Gems, exclusive Equipment</a>, and <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers' target='_blank'>prestigious titles</a>. You can contribute to Habitica, too! <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica' target='_blank'>Find out more here.</a>"
}
+5 -2
View File
@@ -23,8 +23,8 @@
"faqQuestion31": "Why did I lose HP when interacting with a non-negative task?",
"webFaqAnswer31": "If you complete a task and lose HP when you shouldnt have, you encountered a delay while the server is syncing changes made on other platforms. For example, if you use Gold, Mana, or lose HP on the mobile app and then complete a task on the website, the server is simply confirming everything is in sync.",
"faqQuestion32": "When can I choose a class?",
"webFaqAnswer32": "There are four classes in Habitica: Warrior, Mage, Rogue, and Healer. All players start as the Warrior class until they reach level 10. Once you reach level 10, youll be given the choice between selecting a new class or continuing as a Warrior.\n\nEach class has different Equipment and Skills. If you don't want to choose a class, you can select \"Opt Out.\" If you choose to opt out, you can always enable the Class System from Settings later.",
"faqQuestion32": "How can I choose a class?",
"webFaqAnswer32": "All players start as the Warrior class until they reach level 10. Once you reach level 10, youll be given the choice between selecting a new class or continuing as a Warrior.\n\nEach class has different Equipment and Skills. If you don't want to choose a class, you can select \"Opt Out.\" If you choose to opt out, you can always enable the Class System from Settings later.\n\nIf youd like to change your class after Level 10, you can do so by using the Orb of Rebirth. The Orb of Rebirth becomes available in the Market for 6 Gems at level 50 or for free at level 100.\n\nAlternatively, you can change class at any time from Settings for 3 Gems. This will not reset your level like Orb of Rebirth, but it will allow you to re-allocate the skill points youve accumulated as youve leveled up to match your new class.",
"faqQuestion33": "What is the blue bar that appears after level 10?",
"webFaqAnswer33": "After you unlock the Class System, you also unlock Skills that require Mana to be cast. Mana is determined by your INT stat and can be adjusted by Skills and Equipment.",
@@ -132,6 +132,9 @@
"faqQuestion66": "Whats the difference between a Group Plans shared tasks and Challenge tasks?",
"webFaqAnswer66": "Group Plan shared task boards are more dynamic than Challenges, in that they can constantly be updated and interacted with. Challenges are great if you have one set of tasks to send out to many people.\n\nGroup Plans are also a paid feature, while Challenges are available free to everyone.\n\nYou cannot assign specific tasks in Challenges, and Challenges do not have a shared day reset. In general, Challenges offer less control and direct interaction.",
"faqQuestion67": "What are the classes in Habitica?",
"webFaqAnswer67": "Classes are different roles that your character can play. Each class provides its own set of unique benefits and skills as you level up. These skills can complement the way you interact with your tasks or help you contribute to completing Quests in your Party.\n\nYour class also determines the Equipment that will be available to you for purchase in your Rewards, the Market, and the Seasonal Shop.\n\nHeres a rundown of each class to help you choose which one is best suited to your playstyle:\n#### **Warrior**\n* Warriors deal high damage to bosses and have a high chance of critical hits when completing tasks, rewarding you extra Experience and Gold.\n* Strength is their primary stat, raising the damage they do.\n* Constitution is their secondary stat, lowering the damage they take.\n* Warriors' skills buff their Party mates' Constitution and Strength.\n* Consider playing as a Warrior if you love to fight bosses but also want some protection if you miss tasks occasionally.\n#### **Healer**\n* Healers have high defense and can heal themselves as well as their Party mates.\n* Constitution is their primary stat, increasing their heals and lowering the damage they take.\n* Intelligence is their secondary stat, increasing their Mana and Experience.\n* Healers' skills make their tasks less red and buff their Party mates' Constitution.\n* Consider playing as a Healer if you miss tasks often and need the ability to heal yourself or your Party members. Healers also level up quickly.\n#### **Mage**\n* Mages level up quickly, gain lots of Mana, and damage bosses in Quests.\n* Intelligence is their primary stat, increasing their Mana and Experience.\n* Perception is their secondary stat, increasing their Gold and item drops.\n* Mages' skills freeze their task streaks, restore their Party mates' Mana, and buff their Intelligence.\n* Consider playing as a Mage if you are motivated by progressing quickly through levels and contributing damage to boss Quests.\n#### **Rogue**\n* Rogues get the most item drops and Gold from completing tasks, and have a high chance of critical hits, getting even more Experience and Gold.\n* Perception is their primary stat, increasing their Gold and item drops.\n* Strength is their secondary stat, raising the damage they do.\n* Rogues' skills help them dodge missed Dailies, pilfer Gold, and buff their Party mates Perception.\n* Consider playing as a Rogue if youre highly motivated by rewards.",
"iosFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), use the Ask a Question form [LINK NEEDED]! We're happy to help.",
+42 -1
View File
@@ -475,7 +475,7 @@
"weaponSpecialSpring2023WarriorText": "Hummingbird Foil",
"weaponSpecialSpring2023WarriorNotes": "En garde! Fend off foes from your flowers with this foil! Increases Strength by <%= str %>. Limited Edition 2023 Spring Gear.",
"weaponSpecialSpring2023MageText": "Moonstone Magic",
"weaponSpecialSpring2023MageNotes": "The greater their glow, the more potent is their power. Increases Intelligence by <%= int %>. Limited Edition 2023 Spring Gear.",
"weaponSpecialSpring2023MageNotes": "The greater their glow, the more potent is their power. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2023 Spring Gear.",
"weaponSpecialSpring2023HealerText": "Lilium Pollen",
"weaponSpecialSpring2023HealerNotes": "With a puff and a sparkle, you deploy new growth, joy, and color. Increases Intelligence by <%= int %>. Limited Edition 2023 Spring Gear.",
@@ -542,6 +542,15 @@
"weaponSpecialWinter2025MageText": "Northern Lights Display",
"weaponSpecialWinter2025MageNotes": "This stunning, colorful show provides the perfect backdrop! Youll be unstoppable! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
"weaponSpecialSpring2025WarriorText": "Sunshine Scimitar",
"weaponSpecialSpring2025WarriorNotes": "With one slice, you can cut through flower stems to make a bouquet or right through obstacles to get your tasks accomplished. Increases Strength by <%= str %>. Limited Edition Spring 2025 Gear.",
"weaponSpecialSpring2025RogueText": "Crystal Point Flail",
"weaponSpecialSpring2025RogueNotes": "With one swing, you can eliminate any obstacles standing in the way of your goals. Increases Strength by <%= str %>. Limited Edition Spring 2025 Gear.",
"weaponSpecialSpring2025HealerText": "Plumeria Crook",
"weaponSpecialSpring2025HealerNotes": "With one wave, you can summon pollinators to your side to help you in your adventures. Increases Intelligence by <%= int %>. Limited Edition Spring 2025 Gear.",
"weaponSpecialSpring2025MageText": "Mantis Staff",
"weaponSpecialSpring2025MageNotes": "With one slash, you can use elemental magic to control the environment around you. Take advantage and spring forward! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Spring 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.",
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
@@ -1322,6 +1331,14 @@
"armorSpecialWinter2025MageText": "Aurora Cloak",
"armorSpecialWinter2025MageNotes": "Wonder, whimsy, enchantment, and splendor will fill your days when you dance in this cloak. Increases Intelligence by <%= int %>. Limited Edition Winter 2024-2025 Gear.",
"armorSpecialSpring2025WarriorText": "Sunshine Armor",
"armorSpecialSpring2025WarriorNotes": "This stunning armor contains colors you might see in the sky in the middle of a sunny spring day. Increases Constitution by <%= con %>. Limited Edition Spring 2025 Gear.",
"armorSpecialSpring2025RogueText": "Crystal Point Cloak",
"armorSpecialSpring2025RogueNotes": "This stunning cloak contains extra crystals with special, secret powers only you know about. Increases Perception by <%= per %>. Limited Edition Spring 2025 Gear.",
"armorSpecialSpring2025HealerText": "Plumeria Robes",
"armorSpecialSpring2025HealerNotes": "This stunning robe contains plumeria petals that are soft and swishy. Increases Constitution by <%= con %>. Limited Edition Spring 2025 Gear.",
"armorSpecialSpring2025MageText": "Mantis Uniform",
"armorSpecialSpring2025MageNotes": "This stunning uniform contains flashy colors but also lets you stalk your hardest tasks with stealth. Increases Intelligence by <%= int %>. Limited Edition Spring 2025 Gear.",
"armorMystery201402Text": "Messenger Robes",
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
@@ -1683,6 +1700,8 @@
"armorArmoireFestiveHelperOverallsNotes": "Durable and comfortable, these overalls are great for working, playing, and assisting others. Plus, it has pockets! Increases Constitution by <%= con %>. Enchanted Armoire: Festive Helper Set (Item 2 of 2)",
"armorArmoireSnowyFluffTrimmedCoatText": "Snowy Fluff-Trimmed Coat",
"armorArmoireSnowyFluffTrimmedCoatNotes": "As the first flakes fall around you, this coat will not only keep you toasty but also help you blend in perfectly with your snowy surroundings. Glide along the ice in style! Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Snowy Trapper Hat Set (Item 2 of 2).",
"armorArmoireSpringPetalYukataText": "Spring Petal Yukata",
"armorArmoireSpringPetalYukataNotes": "This yukata is perfect to wear to celebrate the coming of spring. Be sure to pose by cherry blossoms for a photo. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Spring Petal Set (Item 1 of 2).",
"headgear": "helm",
"headgearCapitalized": "Headgear",
@@ -2199,6 +2218,15 @@
"headSpecialWinter2025MageText": "Aurora Hat",
"headSpecialWinter2025MageNotes": "More than just a fancy fascinator, this hat makes you look like the aurora borealis itself. Increases Perception by <%= per %>. Limited Edition Winter 2024-2025 Gear.",
"headSpecialSpring2025WarriorText": "Sunshine Helmet",
"headSpecialSpring2025WarriorNotes": "The crest atop this shiny helmet resembles the path of the sun but also looks like a brush you could use for spring cleaning. Increases Strength by <%= str %>. Limited Edition Spring 2025 Gear.",
"headSpecialSpring2025RogueText": "Crystal Point Hat",
"headSpecialSpring2025RogueNotes": "The crystals in this hat encourage productive energy but also shine bright so you can work any time of day or night. Increases Perception by <%= per %>. Limited Edition Spring 2025 Gear.",
"headSpecialSpring2025HealerText": "Plumeria Headdress",
"headSpecialSpring2025HealerNotes": "This flower symbolizes birth, love, and new beginnings! It also provides a beautiful scent you can enjoy as you work on your tasks. Increases Intelligence by <%= int %>. Limited Edition Spring 2025 Gear.",
"headSpecialSpring2025MageText": "Mantis Mask",
"headSpecialSpring2025MageNotes": "The mantis is known for camouflaging or moving slowly. Choose one tactic to help with each goal but know you can always change tactics if you need to. Increases Perception by <%= per %>. Limited Edition Spring 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.",
@@ -2376,6 +2404,8 @@
"headMystery202501Notes": "This sparkling hat generates a light and festive flurry around you at all times. Confers no benefit. January 2025 Subscriber Item.",
"headMystery202502Text": "Heartfelt Harlequin Hat",
"headMystery202502Notes": "This jaunty little hat is sure to inspire joy in anyone who sees you! Confers no benefit. February 2025 Subscriber Item.",
"headMystery202503Text": "Jade Juggernaut Hair",
"headMystery202503Notes": "This verdant hairdo perfectly suits a brave warrior and defender of the planet. Confers no benefit. March 2025 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
@@ -2879,6 +2909,13 @@
"shieldSpecialWinter2025HealerText": "The Perfect Gift",
"shieldSpecialWinter2025HealerNotes": "The perfect gift is just waiting to be opened. What could be inside? Increases Constitution by <%= con %>. Limited Edition Winter 2024-2025 Gear.",
"shieldSpecialSpring2025WarriorText": "Sunburst Shield",
"shieldSpecialSpring2025WarriorNotes": "You can momentarily blind your enemies when sun hits this shield just right. Take advantage and spring forward! Increases Constitution by <%= con %>. Limited Edition Spring 2025 Gear.",
"shieldSpecialSpring2025RogueText": "Crystal Point Flail",
"shieldSpecialSpring2025RogueNotes": "You can use the crystal to divine a productive future for yourself. Take advantage and spring forward! Increases Strength by <%= str %>. Limited Edition Spring 2025 Gear.",
"shieldSpecialSpring2025HealerText": "Plumeria Shield",
"shieldSpecialSpring2025HealerNotes": "You can use this special petal to gather goodness or flick negative thoughts away. Take advantage and spring forward! Increases Constitution by <%= con %>. Limited Edition 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",
@@ -3073,6 +3110,8 @@
"shieldArmoireSafetyFlashlightNotes": "Wait, did you hear that noise? Quick! Shine your flashlight into the shadows over there. Hmmm. Looks like it was just the wind. Or was it…? Increases Constitution by <%= con %>. Enchanted Armoire: Fright Night Set (Item 1 of 2)",
"shieldArmoireFancyFloralFanText": "Fancy Floral Fan",
"shieldArmoireFancyFloralFanNotes": "Finish your fancy look with this first-rate fan made of fabulous floral fabric. Increases Perception by <%= per %>. Enchanted Armoire: Fancy Floral Accessories Set (Item 2 of 2).",
"shieldArmoireSpringPetalUchiwaText": "Spring Petal Uchiwa",
"shieldArmoireSpringPetalUchiwaNotes": "This handheld fan featuring a beautiful petal pattern creates a small breeze just for you as the weather warms. Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Spring Petal Set (Item 2 of 2).",
"back": "Back Accessory",
"backBase0Text": "No Back Accessory",
@@ -3499,6 +3538,8 @@
"eyewearMystery202312Notes": "No need to worry, these icy blues will help you see through the cold and dark season to the warmth of months ahead. Confers no benefit. December 2023 Subscriber Item.",
"eyewearMystery202406Text": "Phantom Buccaneers Mask",
"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.",
"eyewearMystery301404Text": "Eyewear Goggles",
+5 -2
View File
@@ -207,7 +207,8 @@
"dismissAll": "Dismiss All",
"messages": "Messages",
"emptyMessagesLine1": "You don't have any messages",
"emptyMessagesLine2": "You can send a new message to a user by visiting their profile and clicking the \"Message\" button.",
"emptyMessagesLine2": "Send a message to start a conversation with your Party members or another Habitica player",
"newMessage": "New Message",
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> sent you a message",
"letsgo": "Let's Go!",
"selected": "Selected",
@@ -238,5 +239,7 @@
"submitQuestion": "Submit Question",
"whyReportingPlayer": "Why are you reporting this player?",
"whyReportingPlayerPlaceholder": "Reason for report",
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habiticas Community Guidelines."
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habiticas Community Guidelines.",
"targetUserNotExist": "Target User: '<%= userName %>' does not exist.",
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>."
}
+1 -3
View File
@@ -114,9 +114,7 @@
"whyReportingPostPlaceholder": "Reason for report",
"optional": "Optional",
"needsTextPlaceholder": "Type your message here.",
"copyMessageAsToDo": "Copy message as To Do",
"copyAsTodo": "Copy as To Do",
"messageAddedAsToDo": "Message copied as To Do.",
"messageCopiedToClipboard": "Message copied to clipboard.",
"leaderOnlyChallenges": "Only group leader can create challenges",
"sendGift": "Send a Gift",
"selectGift": "Select Gift",
+5 -1
View File
@@ -226,7 +226,11 @@
"winter2025MooseWarriorSet": "Moose Warrior Set",
"winter2025AuroraMageSet": "Aurora Mage Set",
"winter2025StringLightsHealerSet": "String Lights Healer Set",
"winter2025SnowRogueSet": "Snow Rogue Set",
"winter2025SnowRogueSet": "Snow Rogue Set",
"spring2025SunshineWarriorSet": "Sunshine Warrior Set",
"spring2025CrystalPointRogueSet": "Crystal Point Rogue Set",
"spring2025PlumeriaHealerSet": "Plumeria Healer Set",
"spring2025MantisMageSet": "Mantis 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",
-2
View File
@@ -51,8 +51,6 @@
"messageNotAbleToBuyInBulk": "This item cannot be purchased in quantities above 1.",
"notificationsRequired": "Notification ids are required.",
"unallocatedStatsPoints": "You have <span class=\"notification-bold-blue\"><%= points %> unallocated Stat Points</span>",
"beginningOfConversation": "This is the beginning of your conversation with <%= userName %>.",
"beginningOfConversationReminder": "Remember to be kind, respectful, and follow the Community Guidelines!",
"messageDeletedUser": "Sorry, this user has deleted their account.",
"messageMissingDisplayName": "Missing display name.",
"reportedMessage": "You have reported this message to moderators.",
+1 -1
View File
@@ -115,7 +115,7 @@
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <a href='/static/faq#parties'>FAQ</a> from the Help dropdown to learn more about how Parties work.",
"tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win Gem prizes!",
"tourMarketPage": "Every time you complete a task, you'll have a random chance at receiving an Egg, a Hatching Potion, or a piece of Pet Food. You can also buy these items here.",
"tourHallPage": "Welcome to the Hall of Heroes, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned Gems, exclusive equipment, and prestigious titles. You can contribute to Habitica, too!",
"tourHallPage": "Welcome to the Hall of Heroes, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned Gems, exclusive Equipment, and prestigious titles. You can contribute to Habitica, too!",
"tourPetsPage": "Welcome to the stable! Every time you complete a task, you'll have a random chance at receiving an Egg or a Hatching Potion to hatch Pets. When you hatch a Pet, it will appear here! Click a Pet's image to add it to your Avatar. Feed them with the Pet Food you find and they'll grow into hardy Mounts.",
"tourMountsPage": "Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!",
"tourEquipmentPage": "This is where your Equipment is stored! Your Battle Gear affects your Stats. If you want to show different Equipment on your avatar without changing your Stats, click \"Enable Costume.\"",
@@ -943,6 +943,23 @@
"questCatDropCatEgg": "Cat (Egg)",
"questCatUnlockText": "Unlocks Cat Eggs for Purchase in the Market.",
"questOtterText": "The Perfidious Plotter!",
"questOtterNotes": "To-do lists are great! You can spend hours meticulously documenting each step you need to take and feel productive without actually doing those things. Your three-page list gets stuffed into your pocket. Time for a refreshing walk!<br><br>You depart towards the Routine River to take a stroll along the banks. This is exactly what you needed to finally get started! Time to take out your to-do list andah! A gust of wind has your list flying out of your hand and headed right for the water!<br><br>Right before the paper hits the water, an otter head pops up to the surface intercepting the sheets sure demise. Phew! He grasps the list in his paws and a mischievous grin spreads across his face… uh-oh.<br><br>“Hmmm,” he hums, flipping the paper around to read your list. “Looks like you need some help prioritizing.” Riiiip.<br><br>The otter just ripped your carefully crafted list into pieces! “If you want to get these done, youre going to have to decide whats the most important first!” he says, tossing your list items into the breeze one at a time.",
"questOtterCompletion": "As you caught the pieces of your list you started sorting them by which tasks were the most important and ended up with quite a manageable place to start!<br><br>“I see!” you tell the otter, “that goofy stunt really did help me think about what tasks I needed to prioritize.”<br><br>The otter splashes about, rubbing its cheeks with glee, “Im glad my little plot got you thinking about your tasks in a different way.” He dives under the water, resurfacing nearby, “Remember to keep your lists achievable. Rewards help too, so take these!”",
"questOtterBoss": "The Plotter",
"questOtterRageTitle": "To-do Tear-Up!",
"questOtterRageDescription": "This bar fills when you don't complete your Dailies. When it's full, The Plotter will regain some of its health!",
"questOtterRageEffect": "The Plotter throws pieces of your to-do list into the air! The boss regains 30% of its health!",
"questOtterDropOtterEgg": "Otter (egg)",
"questOtterUnlockText": "Unlocks Otter Eggs for Purchase in the Market",
"questJadeText": "A Jaded Jinx",
"questJadeNotes": "Youre in your home staring at the stack of dirty dishes in the sink. The pile of dirty laundry in a random corner of the room. The empty cups and snack wrappers around your desk...<br><br>You sigh. “Why are there always more dishes…The mess is neverending.” Its so demotivating. You find yourself dazing on the couch, mindlessly scrolling the latest trends. Who knows how long youve been there...<br><br>When you look up from your phone, everything is green. This isnt your living room. Standing up, you find yourself on the side of a shiny verdant mountain.<br><br>Movement in the distance draws your attention. A stony green figure grunts, pushing a boulder up the rocky terrain. He makes some progress, but a small slip of his foot has the shiny boulder rolling back down, right towards you!<br><br>He spots you as he runs towards the chunk of jade hurdling your way! “So you think the dishes are bad?” the figure shouts, “Try this!”",
"questJadeCompletion": "After countless setbacks, you somehow managed to roll the jade boulder up to the top of the mountain! The stony figure catches up to you and smiles. He gives the boulder a gentle push and you watch in horror as it rolls all the way back to the bottom.<br><br>“Why would you do that? Someone will have to do it all over again now!” you balk.<br><br>“Just because you have to do something more than once doesnt mean your accomplishments are meaningless,” the stone figure says. “For now, focus on what you achieved and enjoy a reward!”<br><br>You jolt awake back on your couch, phone fallen to the floor. In its place are three bottles filled with flowing jade! Maybe its time to clean todays dishes and then take a break to see how these potions work on some pet eggs...",
"questJadeBoss": "Jaded Jinx",
"questJadeDropJadePotion": "Jade Hatching Potion",
"questJadeUnlockText": "Unlocks Jade Hatching Potion for Purchase in the Market.",
"questFungiText": "The Moody Mushroom",
"questFungiNotes": "Its been a rainy spring in Habitica and the ground around the stables is spongy and damp. You notice quite a few mushrooms have appeared along the wooden stable walls and fences. Theres a fog hanging about, not quite letting the sun peek through, and its a bit dispiriting.<br><br>Out of the mist you see the outline of the April Fool, not at all his usual bouncy self.<br><br>”Id hoped to bring you all some delightful Fungi Magic Hatching Potions so that you can keep your mushroom friends from my special day forever,” he says, his expression alarmingly unsmiling. “But this cold fog is really getting to me, its making me feel too tired and dismal to work my usual magic.”<br><br>“Oh no, sorry to hear that,” you say, noticing your own increasingly somber mood. “This fog is really making the day gloomy. I wonder where it came from…”<br><br>A low rumble sounds across the fields, and you see an outline emerging from the mist. Youre alarmed to see a gigantic and unhappy looking mushroom creature, and the mist appears to be emanating from it.<br><br>“Aha,” says the Fool, “I think this fungal fellow may be the source of our blues. Lets see if we can summon a little cheer for our friend here and ourselves.”",
+1 -1
View File
@@ -164,7 +164,7 @@
"generate": "Generate",
"getCodes": "Get Codes",
"webhooks": "Webhooks",
"webhooksInfo": "Webhooks provide a way for developers to receive notifications when a particular action is performed, such as scoring or updating a Task, or sending a message in a Group. By creating a webhook, you will be able to listen to changes in Habitica and build apps that respond to these changes.<br><br>For additional information and examples on webhooks, please visit our <a target=\"_blank\" href=\"https://habitica.fandom.com/wiki/Webhooks\">API Docs</a>",
"webhooksInfo": "Webhooks provide a way for developers to receive notifications when a particular action is performed, such as scoring or updating a Task, or sending a message in a Group. By creating a webhook, you will be able to listen to changes in Habitica and build apps that respond to these changes.<br><br>For additional information and examples on webhooks, please visit our <a target=\"_blank\" href=\"https://habitica.com/apidoc/#api-Webhook-AddWebhook\">API Docs</a>.",
"enabled": "Enabled",
"webhookURL": "Webhook URL",
"addWebhook": "Add Webhook",
@@ -171,6 +171,7 @@
"mysterySet202412": "Candy Cane Cottontail Set",
"mysterySet202501": "Frostbinder Set",
"mysterySet202502": "Heartfelt Harlequin Set",
"mysterySet202503": "Jade Juggernaut Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",
+17 -2
View File
@@ -876,11 +876,26 @@
"backgrounds092024": "SET 124: Released September 2024",
"backgroundMagicDoorInForestText": "Magic Door in the Forest",
"backgroundMagicDoorInForestNotes": "Dare to step through the Magic Door in the Forest.",
"backgrounds102024": "SET 124: Released September 2024",
"backgrounds102024": "SET 125: Released October 2024",
"backgroundSurroundedByGhostsText": "Surrounded by Ghosts",
"backgroundSurroundedByGhostsNotes": "Spend a spooky evening Surrounded by Ghosts.",
"monthlyBackgrounds": "Monthly Backgrounds",
"backgrounds082024": "SET 123: Released August 2024",
"backgroundSavannaText": "Hazy Grasslands",
"backgroundSavannaNotes": "Hike through Hazy Grasslands."
"backgroundSavannaNotes": "Hike through Hazy Grasslands.",
"backgroundOldFashionedTeaShopText": "Old Fashioned Tea Shop",
"backgroundOldFashionedTeaShopNotes": "Enjoy a cozy beverage in an Old Fashioned Tea Shop.",
"backgrounds122024": "SET 127: Released December 2024",
"backgroundFirstSnowForestText": "First Snow in the Forest",
"backgroundFirstSnowForestNotes": "Step into the First Snow in the Forest.",
"backgrounds012025": "SET 128: Released January 2025",
"backgroundWinterLandscapeWithCabinText": "Winter Landscape with Cabin",
"backgroundWinterLandscapeWithCabinNotes": "Stay cozy in a Winter Landscape with a Cabin.",
"backgrounds022025": "SET 129: Released February 2025",
"backgroundCastleHallWithHearthNotes": "Bask in the warmth of a Castle Hall with a Hearth.",
"backgrounds112024": "SET 126: Released November 2024",
"backgroundCastleHallWithHearthText": "Castle Hall with Hearth",
"backgrounds032025": "SET 130: Released March 2025",
"backgroundMountainSceneWithBlossomsText": "Mountain Scene with Blossoms",
"backgroundMountainSceneWithBlossomsNotes": "Take in the lovely sights and scents of a Mountain Scene with Blossoms."
}
+3 -3
View File
@@ -83,7 +83,7 @@
"allocatePerPop": "Add a Point to Perception",
"allocateInt": "Points allocated to Intelligence:",
"allocateIntPop": "Add a Point to Intelligence",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue levelling up, or start a new adventure at level 1 by using the <a href='https://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Orb of Rebirth</a>!",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue levelling up, or start a new adventure at level 1 by using the <<a href='/shops/market'>>Orb of Rebirth</a>!",
"stats": "Stats",
"strength": "Strength",
"strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.",
@@ -129,8 +129,8 @@
"healerText": "Healers stand impervious against harm, and extend that protection to others. Missed Dailies and bad Habits don't faze them much, and they have ways to recover Health from failure. Play a Healer if you enjoy assisting others in your Party, or if the idea of cheating Death through hard work inspires you!",
"optOutOfClasses": "Opt Out",
"chooseClass": "Choose your Class",
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](https://habitica.fandom.com/wiki/Class_System)",
"optOutOfClassesText": "Can't be bothered with classes? Want to choose later? Opt out - you'll be a warrior with no special abilities. You can read about the class system later on the wiki and enable classes at any time under User Icon > Settings.",
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](/static/faq#what-classes)",
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <a href='/static/faq#what-classes' target='_blank'>our FAQ</a> and visit Settings to enable the Class System when you're ready.",
"selectClass": "Select <%= heroClass %>",
"select": "Select",
"stealth": "Stealth",
+9 -1
View File
@@ -391,5 +391,13 @@
"hatchingPotionKoi": "Koi",
"questEggCrabText": "Crab",
"questEggCrabMountText": "Crab",
"questEggCrabAdjective": "a fiddling"
"questEggCrabAdjective": "a fiddling",
"questEggCatText": "Kitten",
"questEggCatMountText": "Cat",
"questEggCatAdjective": "a mischievous",
"hatchingPotionGingerbread": "Gingerbread",
"questEggOtterText": "Otter",
"questEggOtterMountText": "Otter",
"questEggOtterAdjective": "a perfidious",
"hatchingPotionJade": "Jade"
}
+2 -2
View File
@@ -40,10 +40,10 @@
"backerTier": "Backer Tier",
"playerTiers": "Player Tiers",
"tier": "Tier",
"conRewardsURL": "https://habitica.fandom.com/wiki/Contributor_Rewards",
"conRewardsURL": "https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards",
"surveysSingle": "Helped Habitica grow, either by filling out a survey or helping with a major testing effort. Thank you!",
"surveysMultiple": "Helped Habitica grow on <%= count %> occasions, either by filling out a survey or helping with a major testing effort. Thank you!",
"blurbHallPatrons": "This is the Hall of Patrons, where we honour the noble adventurers who backed Habitica's original Kickstarter. We thank them for helping us bring Habitica to life!",
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <a href='https://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> gems, exclusive equipment</a>, and <a href='https://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'>prestigious titles</a>. You can contribute to Habitica, too! <a href='https://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Find out more here. </a>",
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honoured. Whether through code, art, music, writing, or even just helpfulness, they have earned <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards' target='_blank'>Gems, exclusive Equipment</a>, and <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers' target='_blank'>prestigious titles</a>. You can contribute to Habitica, too! <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica' target='_blank'>Find out more here.</a>",
"noPrivAccess": "You don't have the required privileges."
}
+24 -5
View File
@@ -17,16 +17,35 @@
"faqQuestion65": "Are Group Plans supported on the mobile apps?",
"parties": "Parties",
"faqQuestion28": "Can I pause my Dailies if I need a break?",
"webFaqAnswer26": "Positive Habits (Behaviours you want to encourage; should have a plus button)\n\n * Take vitamins\n * Floss teeth\n * One hour of studying\n\nNegative Habits (Behaviours you want to limit or avoid; should have a minus button)\n\n * Smoking\n * Doom scrolling\n * Biting nails\n\nDual Habits (Habits that involve a positive vs. negative option; should have both plus and minus buttons)\n\n * Drink water vs. drink soda\n * Study vs. procrastinate\n\nSample Dailies (Tasks you want to repeat on a regular schedule)\n\n * Wash dishes\n * Water plants\n * 30 minutes of physical activity\n\nSample To Dos (Tasks you only need to do once)\n\n * Schedule appointment\n * Organise closet\n * Finish essay",
"webFaqAnswer26": "Positive Habits (Behaviors you want to encourage; should have a plus button)\n\n * Take vitamins\n * Floss teeth\n * One hour of studying\n\nNegative Habits (Behaviors you want to limit or avoid; should have a minus button)\n\n * Smoking\n * Doom scrolling\n * Biting nails\n\nDual Habits (Habits that involve a positive vs. negative option; should have both plus and minus buttons)\n\n * Drink water vs. drink soda\n * Study vs. procrastinate\n\nSample Dailies (Tasks you want to repeat on a regular schedule)\n * Wash dishes\n * Water plants\n * 30 minutes of physical activity\n\nSample To Dos (Tasks you only need to do once)\n\n * Schedule appointment\n * Organise closet\n * Finish essay",
"webFaqAnswer27": "The colour of a task is a visual representation of the tasks value. All tasks start as yellow for neutral. Blue is better, and red is worse. Heres how each task type determines the tasks value:\n\nHabits become more blue or red based on whether you tap the plus or minus button. Positive and negative Habits degrade to yellow over time if you dont complete them. Dual Habits only change colour based on your inputs.\n\nDailies change colour based on how often they are completed, becoming more blue as theyre completed or more red if theyre missed.\n\nTo Dos gradually get more red the longer they stay incomplete.\n\nThe more red the task, the more Gold and Experience youll earn for completing it, so be sure to take on even your toughest tasks!",
"webFaqAnswer28": "Yes! The “Pause Damage” button can be found in Settings. It will prevent you from losing HP for missed Dailies. This is helpful if you are on vacation, need a rest, or for any other reason you might need a break. If you are participating in a Quest, your own pending progress will be paused, but you will still take damage from your Party members missed Dailies.\n\nTo pause specific Dailies, you can edit the scheduling to make it due every 0 days until youre ready to restart it.",
"webFaqAnswer28": "Yes! The “Pause Damage” button can be found in Settings. It will prevent you from losing HP for missed Dailies. This is helpful if you are on holiday, need a rest, or for any other reason you might need a break. If you are participating in a Quest, your own pending progress will be paused, but you will still take damage from your Party members missed Dailies.\n\nTo pause specific Dailies, you can edit the scheduling to make it due every 0 days until youre ready to restart it.",
"webFaqAnswer29": "You can recover 15 HP by purchasing a Health Potion from your Rewards column for 25 Gold. Additionally, you will always recover full HP when you level up!",
"faqQuestion30": "What happens when I run out of HP?",
"webFaqAnswer30": "If your HP reaches zero, youll lose one level, all of your Gold, and a piece of Equipment that can be repurchased.",
"faqQuestion31": "Why did I lose HP when interacting with a non-negative task?",
"webFaqAnswer31": "If you complete a task and lose HP when you shouldnt have, you encountered a delay while the server was syncing changes made on other platforms. For example, if you use Gold, Mana, or lose HP on the mobile app and then complete a task on the website, the server is simply confirming everything is in sync.",
"faqQuestion32": "When can I choose a class?",
"webFaqAnswer32": "There are four classes in Habitica: Warrior, Mage, Rogue, and Healer. All players start as the Warrior class until they reach level 10. Once you reach level 10, youll be given the choice between selecting a new class or continuing as a Warrior.\n\nEach class has different Equipment and Skills. If you don't want to choose a class, you can select \"Opt Out.\" If you choose to opt out, you can always enable the Class System from Settings later.",
"faqQuestion32": "How can I choose a class?",
"webFaqAnswer32": "All players start as the Warrior class until they reach level 10. Once you reach level 10, youll be given the choice between selecting a new class or continuing as a Warrior.\n\nEach class has different Equipment and Skills. If you don't want to choose a class, you can select \"Opt Out.\" If you choose to opt out, you can always enable the Class System from Settings later.\n\nIf youd like to change your class after Level 10, you can do so by using the Orb of Rebirth. The Orb of Rebirth becomes available in the Market for 6 Gems at level 50 or for free at level 100.\n\nAlternatively, you can change class at any time from Settings for 3 Gems. This will not reset your level like Orb of Rebirth, but it will allow you to re-allocate the skill points youve accumulated as youve levelled up to match your new class.",
"faqQuestion33": "What is the blue bar that appears after level 10?",
"webFaqAnswer33": "After you unlock the Class System, you also unlock Skills that require Mana to be cast. Mana is determined by your INT stat and can be adjusted by Skills and Equipment."
"webFaqAnswer33": "After you unlock the Class System, you also unlock Skills that require Mana to be cast. Mana is determined by your INT stat and can be adjusted by Skills and Equipment.",
"webFaqAnswer34": "Pets like Food that matches their colour. Base Pets are the exception, but all Base Pets like the same item. You can see the specific foods each Pet likes below:\n\n * Base Pets like Meat\n * White Pets like Milk\n * Desert Pets like Potatoes\n * Red Pets like Strawberries\n * Shade Pets like Chocolate\n * Skeleton Pets like Fish\n * Zombie Pets like Rotten Meat\n * Cotton Candy Pink Pets like Pink Cotton Candy\n * Cotton Candy Blue Pets like Blue Cotton Candy\n * Golden Pets like Honey",
"webFaqAnswer35": "Once youve fed your Pet enough to raise it into a Mount, youll need to hatch that type of Pet again to have it in your stable.\n\nTo view Mounts on the mobile apps:\n\n * From the Menu, select “Pets & Mounts” and switch to the Mounts tab\n\nTo view Mounts on the website:\n\n * From the Inventory menu, select “Pets and Mounts” and scroll down to the Mounts section",
"faqQuestion36": "How do I change the appearance of my Avatar?",
"webFaqAnswer36": "There are endless ways to customise the appearance of your Habitica Avatar! You can change your Avatars body shape, hair style and colour, or skin colour, or add glasses or mobility aids by selecting \"Customise Avatar\" from the menu.\n\nTo customise your Avatar on the mobile apps:\n * From the menu, select “Customise Avatar”\n\nTo customise your Avatar on the website:\n * From the user menu in the navigation, select \"Customise Avatar\"",
"faqQuestion37": "Why isnt my Equipment displaying on my Avatar?",
"webFaqAnswer37": "Check to see if the Costume option is toggled on. If your Avatar is wearing a Costume, that set of Equipment will show instead of your Battle Gear.\n\nTo toggle the Costume on the mobile apps:\n * From the menu, select “Equipment” to find the Costume toggle\n\nTo toggle the Costume on the website:\n * From your Inventory, select “Equipment” and locate the Costume toggle in the Costume tab of the Equipment drawer",
"faqQuestion38": "Why can't I purchase certain items?",
"webFaqAnswer38": "New Habitica players can only purchase the basic Warrior class Equipment. Players must buy Equipment in sequential order to unlock the next piece.\n\nMany pieces of Equipment are class-specific, which means that a player can only buy Equipment belonging to their current class.",
"webFaqAnswer39": "If youre looking to get more Equipment, you can become a Habitica Subscriber, take a chance on the Enchanted Armoire, or splurge during one of Habiticas Grand Galas.\n\nHabitica subscribers receive a special exclusive gear set every month and Mystic Hourglasses to buy past Equipment sets from the Time Traveler Shop.\n\nThe Enchanted Armoire treasure chest in your Rewards has over 350 pieces of Equipment! For 100 Gold, youll have a chance at receiving either special Equipment, Food to raise your Pet to a Mount, or Experience to level up!\n\nDuring the four seasonal Grand Galas, brand-new class Equipment becomes available for purchase with Gold and previous Gala sets can be purchased with Gems.",
"faqQuestion40": "What are Gems, and how do I get them?",
"webFaqAnswer40": "Gems are Habiticas in-app paid currency used to purchase Equipment, Avatar Customisations, Backgrounds, and more! Gems can be purchased in bundles or with Gold if youre a Habitica subscriber. You can also win Gems by being selected as the winner of a Challenge.",
"webFaqAnswer41": "Mystic Hourglasses are Habiticas exclusive Subscriber currency used in the Time Travelers Shop. Subscribers receive a Mystic Hourglass at the start of each month they have subscription benefits, along with a bunch of other perks. Be sure to check out our subscription options if youre interested in the special Backgrounds, Pets, Quests, and Equipment offered in the Time Travelers Shop!",
"faqQuestion42": "What can I do to increase accountability?",
"webFaqAnswer42": "One of the best ways to motivate yourself and hold yourself accountable for accomplishing your tasks is to join a Party! Partying with other Habitica players is a great way to take on Quests to receive Pets and Equipment, receive buffs from Party members Skills, and boost your motivation.\n\nAnother way to increase accountability is to join a Challenge. Challenges automatically add tasks related to a specific goal to your lists! They also add an element of competition against other Habitica players that may motivate you as you strive for the Gem prize. There are official Challenges created by the Habitica Team as well as Challenges made by other players.",
"faqQuestion43": "How do I take on Quests?",
"webFaqAnswer43": "To begin a Quest, you will need to be a member of a Party. Parties can be solo adventures where you challenge Quests alone, or you can invite other Habitica players to tackle Quests at a quicker rate!\n\nChoose a Quest Scroll from your inventory by selecting the “Begin Quest” button from your Party. Complete your tasks as you normally would to progress on the Quest! Youll either build up damage against a monster if youre taking on a Boss Quest, or have a chance to find items if youre taking on a Collection Quest. All pending progress is applied the next day.\n\nWhen you do enough damage or collect all items, the Quest is complete and you will receive your rewards!",
"faqQuestion44": "How can I delete Challenge tasks?",
"webFaqAnswer44": "You will need to leave the Challenge or wait for the Challenge to be closed in order to delete the associated tasks. A red megaphone icon implies the Challenge has been closed and a gray megaphone implies the Challenge is still running.\n\nTo delete Challenge tasks on the **Android** app:\n 1. Tap on a task belonging to the Challenge.\n 2. Tap on \"Delete\" in the upper right corner of the screen.\n 3. Choose to remove the Challenge tasks from your task list.\n\nTo delete Challenge tasks on the **iOS** app:\n 1. Find the Challenge task you wish to delete and look at the megaphone icon.\n 2. If the megaphone icon is red, tap on the task and select \"Delete\" at the bottom\n 3. If the megaphone icon is gray, youll need to find the Challenge and leave it to remove the task.\n\nTo delete Challenge tasks on the **website**:\n 1. Find the Challenge task you wish to delete and look at the megaphone icon.\n 2. If the megaphone icon is red, click it then choose to remove the tasks from your task list.\n 3. If the megaphone icon is gray, you'll need to find the Challenge and leave it to remove the task.",
"faqQuestion45": "My Avatar transformed into a snowman, starfish, flower, or ghost. How can I change back?"
}
+4 -1
View File
@@ -2255,5 +2255,8 @@
"weaponSpecialSpring2024WarriorNotes": "This colorful 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."
"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!",
"moreArmoireGearComing": "The Enchanted Wardrobe gets new stock every month too!"
}
+2 -1
View File
@@ -237,5 +237,6 @@
"bannedPlayer": "This player is banned.",
"whyReportingPlayer": "Why are you reporting this player?",
"whyReportingPlayerPlaceholder": "Reason for report",
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habiticas Community Guidelines."
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habiticas Community Guidelines.",
"titleCustomizations": "Customisations"
}
@@ -7,7 +7,7 @@
"checkinEarned": "Your Check-In Counter went up!",
"unlockedCheckInReward": "You unlocked a Check-In Prize!",
"checkinProgressTitle": "Progress until next",
"incentiveBackgroundsUnlockedWithCheckins": "Locked Plain Backgrounds will unlock with Daily Check-Ins.",
"incentiveBackgroundsUnlockedWithCheckins": "More standard backgrounds will unlock with Daily Check-Ins.",
"oneOfAllPetEggs": "one of each standard Pet Egg",
"twoOfAllPetEggs": "two of each standard Pet Egg",
"threeOfAllPetEggs": "three of each standard Pet Egg",
+2 -1
View File
@@ -129,5 +129,6 @@
"amountExp": "<%= amount %> Exp",
"limitedAvailabilityDays": "Available for <%= days %>d <%= hours %>h <%= minutes %>m",
"limitedAvailabilityHours": "Available for <%= hours %>h <%= minutes %>m",
"sellItems": "Sell Items"
"sellItems": "Sell Items",
"customizationsShopText": "Want to change up your style? You came to the right place! We stock the freshest looks to fit the season."
}
+3 -2
View File
@@ -85,7 +85,7 @@
"mountsReleased": "Mounts released",
"welcomeStable": "Welcome to your Pets and Mounts!",
"welcomeStableText": "Welcome to the stable! Im Matt, the beastmaster. Every time you complete a task, you'll have a random chance at receiving an Egg or a Hatching Potion to hatch Pets. When you hatch a Pet, it will appear here! Click a Pet's image to add it to your Avatar. Feed them with the Pet Food you find and they'll grow into hardy Mounts.",
"petLikeToEat": "What does my pet like to eat?",
"petLikeToEat": "What does my Pet like to eat?",
"petLikeToEatText": "Pets will grow no matter what you feed them, but they'll grow faster if you feed them the one Pet Food that they like best. Experiment to find out the pattern, or see the answers here: <br/> <a href=\"https://habitica.fandom.com/wiki/Food_Preferences\" target=\"_blank\">https://habitica.fandom.com/wiki/Food_Preferences</a>",
"filterByStandard": "Standard",
"filterByMagicPotion": "Magic Potion",
@@ -111,5 +111,6 @@
"tooMuchFood": "You're trying to feed too much food to your pet, action cancelled",
"notEnoughFood": "You don't have enough food",
"veteranDragon": "Veteran Dragon",
"jubilantGryphatrice": "Jubilant Gryphatrice"
"jubilantGryphatrice": "Jubilant Gryphatrice",
"veteranCactus": "Veteran Cactus"
}
+1 -1
View File
@@ -2,7 +2,7 @@
"subscription": "Subscription",
"subscriptions": "Subscriptions",
"sendGems": "Send Gems",
"buyGemsGold": "Buy Gems with Gold",
"buyGemsGold": "Free Monthly Gems",
"mustSubscribeToPurchaseGems": "Must subscribe to purchase gems with GP",
"reachedGoldToGemCapQuantity": "Your requested amount <%= quantity %> exceeds the amount you can buy for this month (<%= convCap %>). The full amount becomes available within the first three days of each month. Thanks for subscribing!",
"mysteryItem": "Exclusive monthly items",
+7 -1
View File
@@ -891,5 +891,11 @@
"backgroundFirstSnowForestNotes": "Da un aterrador primer paso en las Primeras Nieves en el Bosque.",
"backgroundWinterLandscapeWithCabinNotes": "Mantente cómodo en un paisaje invernal con una cabaña.",
"backgrounds012025": "CONJUNTO 128: Publicado en enero de 2025",
"backgroundWinterLandscapeWithCabinText": "Paisaje invernal con cabaña"
"backgroundWinterLandscapeWithCabinText": "Paisaje invernal con cabaña",
"backgrounds022025": "CONJUNTO 129: Publicado en Febrero 2025",
"backgroundOldFashionedTeaShopText": "Tienda de Té Entrañable",
"backgroundOldFashionedTeaShopNotes": "Deléitate con una infusión restauradora en la Tienda de Té Entrañable.",
"backgrounds032025": "CONJUNTO 130: Publicado en Marzo 2025",
"backgroundMountainSceneWithBlossomsText": "Floreada Escena Montañosa",
"backgroundMountainSceneWithBlossomsNotes": "Disfruta de las hermosas vistas y delicados aromas en una Floreada Escena Montañosa."
}
+3 -3
View File
@@ -83,7 +83,7 @@
"allocatePerPop": "Añadir un punto a Percepción",
"allocateInt": "Puntos asignados a Inteligencia:",
"allocateIntPop": "Añade un punto de inteligencia",
"noMoreAllocate": "Ahora que has alcanzado el nivel 100, no ganarás más Puntos de Atributo. ¡Puedes continuar subiendo de nivel, o empezar una nueva aventura en el nivel 1 usando el <a href='https://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Orbe del Renacimiento</a>!",
"noMoreAllocate": "Ahora que has alcanzado el nivel 100, no ganarás más Puntos de Atributo. ¡Puedes continuar subiendo de nivel, o empezar una nueva aventura en el nivel 1 usando el <a href='/shops/market'> Orbe del Renacimiento</a>!",
"stats": "Atributos",
"strength": "Fuerza",
"strText": "Fuerza aumenta la posibilidad de \"golpes críticos\" y el Oro, la Experiencia y la posibilidad de que caigan objetos aumentan con ellos. Además, ayuda a lidiar con el daño de los Jefes.",
@@ -129,8 +129,8 @@
"healerText": "Los Sanadores son impasibles frente al daño y extienden esa protección a otros. No cumplir tareas Diarias y los malos Hábitos no les afectan demasiado y tienen maneras de recuperar la Salud. ¡Juega como un Médico si disfrutas asistiendo a otros en tu grupo o si la idea de engañar a la muerte a través del trabajo duro te inspira!",
"optOutOfClasses": "Renunciar",
"chooseClass": "Elige tu clase",
"chooseClassLearnMarkdown": "[Descubre más sobre el sistema de clases de Habitica](https://habitica.fandom.com/es/wiki/Sistema_de_Clases)",
"optOutOfClassesText": "¿No te importan las clases? ¿Quieres elegir más tarde? Haz clic en \"Renunciar\" - serás un guerrero sin habilidades especiales. Puedes leer sobre el Sistema de Clases más tarde en la wiki y habilitar las clases en cualquier momento en Icono del Usuario > Ajustes.",
"chooseClassLearnMarkdown": "[Descubre más sobre el sistema de clases de Habitica](/static/faq#que-clase)",
"optOutOfClassesText": "¿Aún no estás preparado para elegir? ¡No hay prisa! Por el momento puedes leer sobre cada Clase en <a href='/static/faq#que-clase' target='_blank'>nuestras Preguntas Frecuentes</a>y ir a Ajustes cuando estés listo para activar el Sistema de Clases.",
"selectClass": "Seleccionar <%= heroClass %>",
"select": "Seleccionar",
"stealth": "Sigilo",
+8 -1
View File
@@ -392,5 +392,12 @@
"questEggDogText": "Cachorro",
"questEggDogMountText": "Perro",
"questEggDogAdjective": "un amistoso",
"hatchingPotionGingerbread": "Pan de Jengibre"
"hatchingPotionGingerbread": "Pan de Jengibre",
"questEggCatText": "Gatita",
"questEggCatMountText": "Gato",
"questEggCatAdjective": "Traviesa",
"questEggOtterMountText": "Nutria",
"questEggOtterAdjective": "latrocida",
"hatchingPotionJade": "Jade",
"questEggOtterText": "Nutria"
}
+2 -2
View File
@@ -40,10 +40,10 @@
"backerTier": "Nivel de Sponsor",
"playerTiers": "Niveles de Jugador",
"tier": "Rango",
"conRewardsURL": "https://habitica.fandom.com/es/wiki/Recompensas_de_Contribuidor",
"conRewardsURL": "https://github.com/HabitRPG/habitica/wiki/Contribuir-para-Habitica#colaborador-nivel-recompensas",
"surveysSingle": "Ayudó a Habitica a crecer, ya sea completando una encuesta o ayudando con un testeo masivo. ¡Gracias!",
"surveysMultiple": "Ayudó a Habitica a crecer en <%= count %> ocasiones, rellenando una encuesta o dedicando un gran esfuerzo a hacer pruebas . ¡Gracias!",
"blurbHallPatrons": "Este es el Salón de Patrocinadores, donde honramos a los nobles aventureros que colaboraron en el primer Kickstarter de Habitica. ¡Les damos las gracias por haber hecho posible Habitica!",
"blurbHallContributors": "Este es el Salón de los Colaboradores, donde se honra a quienes han colaborado en el código libre de Habitica. Con su labor de programación, arte, música, escritura o, simplemente, su ayuda, han obtenido <a href='https://habitica.fandom.com/es/wiki/Recompensas_de_Contribuidor' target='_blank'>gemas, objetos exclusivos</a> y <a href='https://habitica.fandom.com/es/wiki/T%C3%ADtulos_de_Contribuidor' target='_blank'>prestigiosos títulos</a>. ¡Tú también puedes colaborar con Habitica! <a href='https://habitica.fandom.com/es/wiki/Contribuir_a_Habitica' target='_blank'>Más información, aquí.</a>",
"blurbHallContributors": "Este es el Salón de los Colaboradores, donde se honra a quienes han colaborado en el código libre de Habitica. Con su labor de programación, arte, música, escritura o, simplemente, su ayuda, han obtenido <a href='https://github.com/HabitRPG/habitica/wiki/Contrribuir-para-Habitica#colaborador-nivel-recompensas' target='_blank'> Gemas, objetos exclusivos</a> y <a href='https://github.com/HabitRPG/habitica/wiki/Contrribuir-para-Habitica#colaborador-nivel-recompensas' target='_blank'>prestigiosos títulos</a>. ¡Tú también puedes colaborar con Habitica! <a href='https://github.com/HabitRPG/habitica/wiki/Contribuir-para-Habitica' target='_blank'>Más información, aquí.</a>",
"noPrivAccess": "No tienes los privilegios requeridos."
}
+5 -5
View File
@@ -4,12 +4,12 @@
"deathPenaltyDetails": "Has perdido un Nivel, tu Oro y una pieza de equipamiento, ¡pero puedes recuperarlos con trabajo duro! Buena suerte--lo harás genial.",
"refillHealthTryAgain": "Rellenar salud y volver a intentarlo",
"dyingOftenTips": "¿Pasa esto a menudo? <a href='https://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>¡Aqui tienes ayuda!</a>",
"losingHealthWarning": "¡Cuidado, estás perdiendo salud rapidamente!",
"losingHealthWarning2": "¡No dejes que tu salud baje a cero! Si lo haces, perderás un nivel, tu oro y un Articulo.",
"toRegainHealth": "Para recuperar tu salud:",
"losingHealthWarning": "¡Cuidado, estás perdiendo salud rápidamente!",
"losingHealthWarning2": "¡No dejes que tu salud baje a cero! Si lo haces, perderás un nivel, tu Oro y un artículo.",
"toRegainHealth": "Para recuperar tu Salud:",
"lowHealthTips1": "¡Sube de nivel para sanarte por completo!",
"lowHealthTips2": "Compra una Poción de Salud en la columna Recompensas para recuperar 15 puntos de salud.",
"losingHealthQuickly": "¿Estás perdiendo salud muy rápido?",
"lowHealthTips2": "Compra una Poción de Salud en la columna Recompensas para recuperar 15 Puntos de Salud.",
"losingHealthQuickly": "¿Estás perdiendo Salud muy rápido?",
"lowHealthTips3": "¡Las tareas diarias que no cumplas te dañarán durante la noche: no añadas demasiadas al principio!",
"lowHealthTips4": "Si tienes alguna tarea diaria que no sea necesario realizar un día concreto, haz clic en el icono del lápiz y desactiva ese día.",
"goodLuck": "¡Buena suerte!",
+5 -3
View File
@@ -11,7 +11,7 @@
"faqQuestion27": "¿Porqué cambian las tareas de color?",
"webFaqAnswer27": "El color de una tarea es una representación visual del valor de la tarea en sí misma. Todas las tareas empiezan en color amarillo, que es el que denominaremos, color neutral, la tendencia hacia el azul significa que estamos mejorando y la tendencia hacia el rojo significa que estamos empeorando. A continuación veamos cómo en cada tipo de tarea se determina el valor de esta.\n\nLos hábitos van cambiando de color (hacia el azul o hacia el rojo) dependiendo de si seleccionamos el botón con el símbolo + o -. Los hábitos tanto positivos como negativos se van degradando hacia el amarillo y después el rojo con el paso de los períodos de tiempo si no los practicamos. Los hábitos contrapuestos cambian de color basándose en los avances (+), tendencia al azul y fracasos (-) tendencia al rojo.\n\nLas Tareas Diarias cambian de color en base a la frecuencia con las que las completamos, tendiendo al azul si las logramos y hacia el rojo si no hemos podido realizarlas.\n\nLas Tareas Pendientes tienden hacia el rojo a medida que pasan los periodos de tiempo sin que se completen.\n\nCuanto más cerca del rojo este una tarea más Oro y Experiencia te proporcionará el completarla así que ¡ponte manos a la obra y trata de completar inclusos las tareas que te resulten más difíciles!",
"faqQuestion28": "¿Puedo poner en “Pausa” las Tareas Diarias para tomarme un descanso y que no me causen pérdida de puntos de vida?",
"webFaqAnswer32": "Hay cuatro diferentes profesiones que puedes elegir en Habitica: Guerrero, Mago, Pícaro y Sanador. Todos los jugadores empiezan siendo como base, Guerreros hasta que alcanzan el Nivel 10. Una vez alcanzado este nivel, tienes la opción de elegir entre seguir como Guerrero o elegir otra profesión.\n\nCada profesión tiene un equipamiento y unas habilidades diferentes. Si no quieres elegir profesión, puedes seleccionar “Renunciar”. Si decides renunciar, ten en cuenta, que siempre tendrás la posibilidad en el futuro de elegir una profesión accediendo al Sistema de Profesiones en los Ajustes.",
"webFaqAnswer32": "Todos los jugadores empiezan siendo como base, Guerreros hasta que alcanzan el Nivel 10. Una vez alcanzado este nivel, tienes la opción de elegir entre seguir como Guerrero o elegir otra profesión.\n\nCada profesión tiene un equipamiento y unas habilidades diferentes. Si no quieres elegir profesión, puedes seleccionar “Renunciar”. Si decides renunciar, ten en cuenta, que siempre tendrás la posibilidad en el futuro de elegir una profesión accediendo al Sistema de Profesiones en los Ajustes.\n\nSi quieres cambiar tu profesión después del Nivel 10, puedes hacer usando una Esfera de Renacimiento. La Esfera del Renacimiento está disponible en el Mercado por 6 Gemas a partir del Nivel 50 y gratis a partir del Nivel 100.\n\nComo alternativa, puedes cambiar de clase en cualquier momento en los Ajustes por 3 Gemas. Esto no va a reiniciar tu Nivel como si hace la Esfera de Renacimiento, pero te permite redistribuir los puntos de habilidad que llevabas acumulados debido al nivel alcanzado, para así ajustar tus características a tu nueva profesión.",
"webFaqAnswer28": "¡Por supuesto! Puedes encontrar el botón “Pausar Daño” en Ajustes. Al activarlo no perderás puntos de vida (HP) si no completas las Tareas Diarias. Usar esta opción puede ser muy útil si estas de vacaciones, necesitas un descanso o si por cualquier otra razón quieres desconectar por un tiempo. Si durante una “Pausa” estas activo en una Misión, también tu progreso en esta quedará en pausa pero, tienes q tener en cuenta, que el daño recibido por tu equipo aún podrá afectarte, en especial debido a las Tareas Diarias incompletas.\n\nUn pequeño truco si quieres “Pausar” Tareas Diarias especificas es; editar la tarea en concreto y programarla a realizar cada 0 días hasta que estés listo para volver a reactivarla.",
"faqQuestion29": "¿Cómo recuperó Puntos de Vida?",
"webFaqAnswer29": "Puedes recuperar 15 Puntos de Vida (HP) comprando en la sección de Recompensas una Poción de Salud por 25 monedas de Oro. Adicionalmente ten en cuenta que siempre vas a recuperar todos tus Puntos de Vida (HP) ¡cuando subas de nivel!",
@@ -19,7 +19,7 @@
"webFaqAnswer30": "Si tus Puntos de Vida descienden por debajo de cero, perderás un nivel de experiencia, todas tus monedas de oro y una pieza aleatoria de Equipo que, por supuesto, podrás volver a adquirir recomprándola más adelante.",
"faqQuestion31": "¿Porqué he perdido Puntos de Vida (HP) al interactuar o incluso completar una tarea no negativa?",
"webFaqAnswer31": "Si completas una tarea y aún así pierdes Puntos de Vida, puede ser debido, a que hay un pequeño desfase con el servidor mientras se sincronizan los cambios producidos en diferentes dispositivos. Por ejemplo, si usas monedas de oro, Mana o pierdes Puntos de Vidas en la aplicación para tu teléfono móvil y por otro lado completas unas tara en la página web, el servidor simplemente confirma que todo en tu cuenta está sincronizado y de ahí esta situación que a priori puede parecer extraña.",
"faqQuestion32": "¿Cuando puedo elegir una profesión?",
"faqQuestion32": "¿Cómo puedo elegir una profesión?",
"faqQuestion33": "¿Qué significa la barra azul que aparece en la plantilla de mi personaje cuando alcanzó el nivel 10?",
"webFaqAnswer33": "Cuando desbloqueas el Sistema de Profesiones, también desbloqueas algunas habilidades que requieren Mana para su uso. La cantidad de Mana la determina tu atributo INT (Inteligencia) y puede obtener modificadores debido a Habilidades y Equipo.",
"faqQuestion34": "¿Cuál es la comida preferida de mi Mascota?",
@@ -241,5 +241,7 @@
"subscriptionDetail400": "Para los actuales suscriptores, recibiréis vuestro primer Reloj de arena Místico y +2 Gemas añadidas a vuestra capacidad mensual, la primera vez que entréis en Habitica después de su publicación. Esto significa que si resulta que ya estabais dados de alta en Noviembre, vuestro incremento mensual será para Diciembre.",
"subscriptionDetail451": "Cada suscripción de regalo se añadirá a la cantidad de meses que un jugador tiene beneficios de suscriptor, permitiendo así que este reciba más Relojes de Arena místicos y incrementar su capacidad de Gemas por cada mes.",
"subscriptionDetail470": "Los beneficios de los suscriptores de Plan de Grupo se comportarán de la misma manera que las suscripciones recurrentes de 1 mes. Recibirás un Reloj de arena Místico al empezar el mes y la cantidad de Gemas que podrás comprar cada mes en el Mercado se incrementará en 2 hasta alcanzar las 50.",
"subscriptionPara3": "¡Esperamos que este nuevo formato sea más intuitivo, permita un mayor acceso a los artículos de la Tienda de los Viajeros del TIempo, y os ayude a estar más motivados a progresar en vuestras tareas mensuales!"
"subscriptionPara3": "¡Esperamos que este nuevo formato sea más intuitivo, permita un mayor acceso a los artículos de la Tienda de los Viajeros del TIempo, y os ayude a estar más motivados a progresar en vuestras tareas mensuales!",
"faqQuestion67": "¿Cuales son las profesiones en Habitica?",
"webFaqAnswer67": "La Profesiones son los diferentes roles con los que juegas con tu personaje. Cada profesión tiene un conjunto único de beneficios y habilidades que puedes potenciar cuando vas subiendo de nivel. Estas habilidades pueden modificar la forma en que interactúas con tus tareas o ayudarte, contribuyendo a completar Misiones con tu Equipo.\n\nTu profesión también determina el equipamiento que tendrás disponible para comprar en las Recompensas, el Mercado y la Tienda Estacional.\n\nAquí tienes un resumen de cada profesión para ayudarte a elegir cuál se ajusta mejor a tu estilo de juego:\n#### **Guerrero**\n*Los guerreros son los mejores preparados para dañar a los monstruos y tienen muchas oportunidades de lanzar golpes críticos al completar tareas, recompensándote con Experiencia y Oro extra.\n* La Fuerza es su característica principal, incrementando así el daño que causas.\n* Constitución es su habilidad secundaria, reduciendo el daño que recibes.\n* Las habilidades de los guerreros mejoran la constitución y la fuerza de sus compañeros de Equipo.\n* Elige Guerrero como profesión si te gusta luchar contra los monstruos, pero también si piensas que vas a necesitar protección extra contra la pérdida de vida debida a fallos ocasionales en tus Tareas.\n#### **Sanador**\n* Los Sanadores tienen una elevada resistencia al daño y pueden curarse a ellos mismos y también a los miembros de su Equipo.\n* Como Sanador tu característica principal es la Constitución, incrementando la velocidad de curación y reduciendo el daño que recibes.\n* La Inteligencia es tu característica secundaria, incrementando tus valores de Maná y Experiencia.\n* Tus habilidades como Sanador ayudan a que tus tareas tiendan menos hacia el rojo y mejoran la Constitución de los miembros de tu Equipo.\n* Elige Sanador como profesión si piensas que vas a fallar frecuentemente con algunas de tus tareas y vas a necesitar la habilidad especial de sanación en ti o en los compañeros de Equipo. También los Sanadores suben de nivel muy rápido.\n#### **Mago**\n* Los Magos suben de nivel muy rápido, obtienen más Maná y dañan severamente a los monstruos en las Misiones.\n* La Inteligencia es tu característica principal que incrementa tu nivel de Maná y tu Experincia.\n* La Percepción es tu característica secundaria, incrementando la cantidad de oro y objetos que obtienes.\n* Con tus habilidades puedes congelar los contadores de tus tareas, restaurar el Maná le tus compañeros de Equipo y mejorar su Inteligencia.\n* Elige Mago como profesión si lo que te mantiene motivado es progresar rápidamente con respecto a subir de nivel y contribuir significativamente al daño producido a los monstruos en las Misiones.\n#### **Pícaro**\n* Los Pícaros son los que más oro y objetos obtienen al completar tareas y tienen muchas oportunidades de lanzar golpes críticos obteniendo así más Experiencia y Oro.\n* Tu característica principal como Pícaro es la Percepción incrementando la cantidad de objetos y Oro que obtienes.\n* La Fuerza es tu característica secundaria, elevando el daño que produces.\n* Tus habilidades como Pícaro te ayudan a esquivar los fallos en tus Tareas Diarias, robar Oro y mejorar la Percepción de los miembros de tu Equipo.\n* Si lo que te mantiene motivado es obtener muchos objetos y recompensas elige Pícaro como tu profesión."
}
+52 -4
View File
@@ -2614,7 +2614,7 @@
"weaponSpecialSpring2023WarriorText": "Florete de colibrí",
"weaponSpecialSpring2023WarriorNotes": "¡En garde! ¡Mantén a tus enemigos lejos de tus flores con este florete! Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de primavera 2023.",
"weaponSpecialSpring2023MageText": "Magia de piedra de luna",
"weaponSpecialSpring2023MageNotes": "Cuanto más brillantes, mayor es su poder. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de primavera 2023.",
"weaponSpecialSpring2023MageNotes": "Cuanto más brillantes, mayor es su poder. Aumenta la Inteligencia en <%= int %> y la Percepción en <%= per %>. Equipamiento de edición limitada de primavera 2023.",
"weaponSpecialSpring2023HealerText": "Polen de lirio",
"weaponSpecialSpring2023HealerNotes": "Con un soplo y una chispa despiertas nuevos brotes, alegría y color. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de primavera 2023.",
"weaponSpecialFall2023RogueText": "Cuchara sopernatural",
@@ -3233,7 +3233,7 @@
"headSpecialWinter2025HealerNotes": "Vale, no pierdas el tiempo tratando de desenredar esta maraña de luces, mejor póntela como sombrero ganarás tiempo. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Invierno 2024-2025.",
"headSpecialWinter2025MageText": "Sobrero Aurora Boreal",
"headSpecialWinter2025MageNotes": "Me lo cuentan y no me lo creo, este sombrero te transforma literalmente en la Aurora boreal. Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Invierno 2024-2025.",
"armorSpecialWinter2025WarriorText": "Armadura de Guerreo Alce",
"armorSpecialWinter2025WarriorText": "Armadura de Guerrero Alce",
"armorSpecialWinter2025WarriorNotes": "Crom va a sentirse muy complacido cuando tus enemigos aterrorizados huyan dejándote un pasillo triunfal al ver que llevas puesta esta armadura. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Invierno 2024-2025.",
"weaponSpecialWinter2025RogueNotes": "¡Golpea y deslumbra esas tareas difíciles hasta someterlas! ¡Serás literalmente imparable! Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada Invierno 2024-2025.",
"weaponSpecialWinter2025MageNotes": "¡Este asombroso y colorido despliegue proporciona el telón de fondo perfecto! ¡Serás simbólicamente imparable! Aumenta la inteligencia en <%= int %> y la percepción en <%= per %>. Equipamiento de edición limitada Invierno 2024-2025.",
@@ -3242,7 +3242,7 @@
"headMystery202412Notes": "Cálido y acogedor, ¡como una taza de chocolate caliente con menta en una noche de invierno! No otorga ningún beneficio. Artículo de Suscriptor Diciembre 2024.",
"headArmoireFestiveHelperHatText": "Sombrero de Ayudante Festivo",
"headArmoireFestiveHelperHatNotes": "Consejo vacacional gratis #27: ten en todo momento un sombreo de ayudante a mano. ¡Si es tan grande como este quizás puedas esconder algún juguete para no aburrirte debajo! Aumenta la Inteligencia en <%= int %>. Armario Encantado: Conjunto Ayudante Festivo (Artículo 1 de 2)",
"shieldSpecialWinter2025WarriorText": "Escudo de Guerreo Alce",
"shieldSpecialWinter2025WarriorText": "Escudo de Guerrero Alce",
"shieldSpecialWinter2025WarriorNotes": "Crom ha sido muy generoso contigo, te ha concedido este escudo tan robusto como un alce para que evites distracciones. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Invierno 2024-2025.",
"shieldSpecialWinter2025HealerText": "El Regalo Perfecto",
"shieldSpecialWinter2025HealerNotes": "El regalo perfecto te está esperando a que lo abras. ¿Que clase de brujería contendrá? Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Invierno 2024-2025.",
@@ -3253,5 +3253,53 @@
"headArmoireSnowyTrapperHatText": "Sombrero de trampero nevado",
"headArmoireSnowyTrapperHatNotes": "Las orejas azules y congeladas serán cosa del pasado. ¡Disfruta de una calidez acogedora con estilo! Aumenta la Constitución y la Percepción en <%= attrs %> cada una. Armario encantado: conjunto de sombrero de trampero nevado (objeto 1 de 2).",
"shieldMystery202501Text": "Bastón de Vinculaescarcha Pálido",
"shieldMystery202501Notes": "Decora cualquier escenario al aire libre con una capa de diamante de escarcha brillante. No aporta ningún beneficio. Artículo para suscriptores de enero de 2025."
"shieldMystery202501Notes": "Decora cualquier escenario al aire libre con una capa de diamante de escarcha brillante. No aporta ningún beneficio. Artículo para suscriptores de enero de 2025.",
"weaponSpecialSpring2025WarriorText": "Cimitarra Brillo Solar",
"weaponSpecialSpring2025RogueNotes": "Solo con un simple balanceo puedes asestar un golpe crítico y eliminar cualquier obstáculo que se interponga en tus objetivos. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada Primavera 2025.",
"weaponSpecialSpring2025WarriorNotes": "Con un simple tajo, puedes cortar los tallos de suficientes flores para hacer un gran ramo o atravesar cualquier superficie produciendo un daño considerable y así completar tus tareas. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada Primavera 2025.",
"weaponSpecialSpring2025RogueText": "Mayal Puntas de Cristal",
"weaponSpecialSpring2025HealerText": "Báculo Flor Plumaria",
"weaponSpecialSpring2025MageText": "Bastón Mantis",
"weaponSpecialSpring2025MageNotes": "Con un golpe puedes usar la magia elemental y controlar elementos del medio ambiente que te rodean tales como el hechizo enredadera. ¡Aprovecha tu ventaja primaveral! Aumenta la inteligencia en <%= int %> y la percepción en <%= per %>. Equipamiento de edición limitada Primavera 2025.",
"weaponSpecialSpring2025HealerNotes": "Al agitarlo puedes invocar, plaga de polinizadores alérgenos como apoyo y que te ayuden a salir victorioso en tus aventuras. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Primavera 2025.",
"armorSpecialSpring2025RogueNotes": "Está increíble capa está entretejida con fragmentos de cristales estelares imbuidos con magia secreta que solo tu eres capaz de identificar. Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Primavera 2025.",
"armorSpecialSpring2025HealerNotes": "Estos atuendos tan maravillosos que te pueden hacer perder la cordura contienen pétalos de flor plumaria que la hacen suave y blandita. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Primavera 2025.",
"armorMystery202502Notes": "¡Estás completamente relleno de bromas bondadosas y chistes bien intencionados, desde los volantes de tu cuello hasta los zapatones gigantes! No otorga ningún beneficio. Artículo de Suscriptor Febrero 2025.",
"armorArmoireSpringPetalYukataNotes": "Esta tradicional Yukata es perfecta para celebrar la entrada de la primavera observando la Sakura. Asegúrate de estar presente en la caída de los pétalos de cerezo y obtener una buena instantánea. Aumenta la constitucion y la fuerza en <%= attrs %>. Armario Encantado: Conjunto Pétalos Primaverales (Artículo 1 de 2).",
"headSpecialSpring2025WarriorNotes": "El penacho de este brillante yelmo se asemeja a la senda solar pero también parece un buen cepillo que podrías usar para la acostumbrada limpieza de escoria en mazmorra en temporada primaveral. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada Primavera 2025.",
"headSpecialSpring2025RogueNotes": "Los cristales incrustados en este sombrero acumulan energía productiva produciendo una pálida luz que te permite hacer lo que tienes que hacer y guiarte por las diferentes estancias de Khazad-dûm tanto de día como de noche. Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Primavera 2025.",
"headSpecialSpring2025MageNotes": "La Mantis es conocida por tres cosas, un buen camuflaje, movimiento lento y la ingesta del macho por parte de la hembra. Elige tu táctica preferida que creas te va a ayudar más a alcanzar tus objetivos y ten en cuenta que en cualquier momento puedes cambiar tu táctica si lo necesitas. Aumenta la percepcion en <%= per %>. Equipamiento de edición limitada Primavera 2025.",
"armorSpecialSpring2025WarriorText": "Armadura Brillo Solar",
"armorSpecialSpring2025WarriorNotes": "Está impresionante armadura emite un áurea de reflejos que evocan la paleta celeste en un día de primavera. Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Primavera 2025.",
"armorSpecialSpring2025RogueText": "Capa Puntas de Cristal",
"armorSpecialSpring2025HealerText": "Atuendo Flor Plumaria",
"armorSpecialSpring2025MageText": "Uniforme Mantis",
"armorSpecialSpring2025MageNotes": "Este imposible uniforme contiene colores tan raros que no son perceptibles por el ojo humano además el camuflaje extra te ayuda a afrontar tus peores tareas con sigilo. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Primavera 2025.",
"armorMystery202502Text": "Traje de Arlequín Sentimental",
"armorArmoireSpringPetalYukataText": "Tradicional Yukata de Pétalos Primaverales",
"headSpecialSpring2025WarriorText": "Yelmo Brillo Solar",
"headSpecialSpring2025RogueText": "Sombrero Puntas de Cristal",
"headSpecialSpring2025HealerText": "Tocado Flor Plumaria",
"headSpecialSpring2025HealerNotes": "¡Esta flor simboliza nacimiento, amor y nuevos comienzos! También te imbuye de una delicada y hermosa fragancia para que los que te rodean y tu os deleitéis mientras trabajas y cumples con tus tareas. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada Primavera 2025.",
"headSpecialSpring2025MageText": "Máscara Mantis",
"headMystery202502Text": "Sombrero de Arlequín Sentimental",
"headMystery202502Notes": "¡Este alegre y ridículo sombrerito seguro que inspirará alegría y vergüenza ajena en cualquiera que te vea! No otorga ningún beneficio. Artículo de Suscriptor Febrero 2025.",
"headMystery202503Text": "Pelo Jade de Juggernaut",
"headMystery202503Notes": "Este verdoso peinado se ajusta a la perfección a un guerrero valeroso que se ofrezca voluntario para defender el planeta. No otorga ningún beneficio. Artículo de Suscriptor Marzo 2025.",
"headArmoireFancyFloralHatText": "Elegante Sombrero Floral",
"shieldArmoireFancyFloralFanText": "Abanico Floral Elegante",
"shieldArmoireFancyFloralFanNotes": "Remata tu aspecto elegante con este abanico de primeras marcas de fabulosa fábrica floral. Aumenta la Percepción en <%= per %>. Armario Encantado: Conjunto de Elegantes Accesorios Florales (Artículo 2 de 2).",
"shieldArmoireSpringPetalUchiwaNotes": "Este manejable abanico, creado por un poderoso alquimista siguiendo el patrón de un hermoso pétalo produce una brisa refrescante al acercarse el matsuri de verano. Aumenta la inteligencia y la percepción en <%= attrs %> cada uno. Armario Encantado: Conjunto Pétalos Primaverales (Artículo 2 de 2).",
"eyewearMystery202503Notes": "¡Esta mirada abyecta con estos ojos inyectados hará que el corazón de cualquiera que te desafíe se derrita de terror! Se prudente con su uso, las consecuencias pueden ser lamentables. No otorga ningún beneficio. Artículo de Suscriptor Marzo 2025.",
"headArmoireFancyFloralHatNotes": "Alégrate la vista con este elegante sombrero lleno de flores de fantasía y volantes imposibles. Un auténtico deleite para los sentidos. Aumenta la Inteligencia en <%= int %>. Armario Encantado: Conjunto de Elegantes Accesorios Florales (Artículo 1 de 2).",
"shieldSpecialSpring2025WarriorText": "Escudo Rayo Solar",
"shieldSpecialSpring2025WarriorNotes": "Usa la poderosa magia de este escudo para cegar a tus enemigos, solo tienes que hacer que el sol se refleje en el apuntando el rayo directamente a sus ojos. ¡Aprovecha que ya es primavera en el…! Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Primavera 2025.",
"shieldSpecialSpring2025RogueText": "Mayal Puntas de Cristal",
"shieldSpecialSpring2025RogueNotes": "Puedes usar su bola de cristal para tratar de adivinar un futuro prometedor para ti mismo, tu te lo guisas y tu te lo comes, ya sabes. ¡Aprovecha que ya es primavera en el…! Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada Primavera 2025.",
"shieldSpecialSpring2025HealerText": "Escudo Flor Plumaria",
"shieldMystery202502Text": "Globos de Arlequín Sentimental",
"shieldSpecialSpring2025HealerNotes": "Puedes usar este pétalo mutante para promover la bondad y repeler el mal o para alejar los pensamientos negativos. ¡Aprovecha que ya es primavera en el…! Aumenta la Constitución en <%= con %>. Equipamiento de edición limitada Primavera 2025.",
"shieldMystery202502Notes": "Este día de San Valentín y cada día al ser el hazmerreír de aquellos que te rodeen, que tu corazón sea tan ligero como estos globos flotantes que sostienes. No otorga ningún beneficio. Artículo de Suscriptor Febrero 2025.",
"shieldArmoireSpringPetalUchiwaText": "Abanico Uchiwa de Pétalo Primaveral",
"eyewearMystery202503Text": "Ojos Jade de Juggernaut"
}

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