Compare commits

..

92 Commits

Author SHA1 Message Date
Phillip Thelen cd94aeeb1a Improve user history logging 2024-09-06 13:47:41 +02:00
Phillip Thelen 86ea34f0be Add script to notify on heroku deploys (#15286)
* add script for heroku to notify about a deploy

* add emoji to server name

* add fallback for when script is run outside of git repo

* make script use bash

* remove exit
2024-09-06 12:00:00 +02:00
Phillip Thelen 0d0a24deac Formatting fix 2024-09-06 11:59:08 +02:00
Phillip Thelen 3cfe099864 Improve hero saving 2024-09-06 11:58:16 +02:00
Phillip Thelen cdcaca3188 fix armoire buying issue 2024-09-03 16:28:30 +02:00
Sabe Jones 55e39a1ec9 fix broken test (#15304)
Co-authored-by: Phillip Thelen <phillip@habitica.com>
2024-09-03 16:16:17 +02:00
Natalie 992e82cbcf 2024-09 Content Prebuild (#15295)
* 202409 subscriber gear

* 2024-09 enchanted armoire gear

* 2024 fall festival gear

* 2024-09 background

* 2024-09 pet quest

* typos and update featuredItems.js

* quest and typo fix

* fix subscriber set name

* text amendments

* update quest title
# Conflicts:
#	habitica-images
2024-09-03 15:33:54 +02:00
Phillip Thelen 9b33453040 fix lint 2024-09-03 15:30:50 +02:00
Phillip Thelen cb865b171b fix tests 2024-09-03 15:15:20 +02:00
Phillip Thelen 68560894b9 improve setting client in history 2024-09-03 15:03:33 +02:00
Phillip Thelen 665b934e35 Improve admin panel stats input 2024-09-03 13:11:53 +02:00
Phillip Thelen ff53a387d4 allow stats to be edited from admin panel 2024-08-28 16:03:29 +02:00
Phillip Thelen 0bd0ba096b show user history in admin panel 2024-08-28 13:42:19 +02:00
Phillip Thelen 38cad7102f log armoire, quoest response and cron events to history 2024-08-28 12:49:00 +02:00
Natalie 62f5b9698a Add rage button to debug menu (#15291)
* + Rage

* tinkering

* remove if statement wrapper and modify error message

* add test cases

* more work on test cases

* adding contexts to test cases

* test(debug): fix up tests

* fix(lint): whisepate

---------

Co-authored-by: Sabe Jones <sabe@habitica.com>
2024-08-28 12:49:00 +02:00
Sabe Jones 8a3824ec02 fix(CI): force apt update before fetching libkrb5-dev 2024-08-28 12:49:00 +02:00
Phillip Thelen 41fa200271 Improve the performance of some frequently used API calls (#15251)
* use lean for getting task lists

* Only load necessary user data for group-plans call

Also don’t make a db request for groups if the user is in none

* Only load necessary user fields for in app rewards

* Optimize updateStore by not checking every item

* Only load necessary user data for task scoring

* improve performance of inbox request calls

* merge fix

* fix scoring task call

* add quests to scoring call

* fix showing official pinned items

* also load achievements
2024-08-28 12:49:00 +02:00
Sabe Jones 91c810925a 5.27.3 2024-08-28 12:49:00 +02:00
Weblate 2887eab3ef Translated using Weblate (French)
Currently translated at 99.7% (792 of 794 strings)

Translated using Weblate (French)

Currently translated at 100.0% (387 of 387 strings)

Translated using Weblate (German)

Currently translated at 91.7% (2892 of 3153 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Turkish)

Currently translated at 92.2% (154 of 167 strings)

Translated using Weblate (Russian)

Currently translated at 99.5% (425 of 427 strings)

Translated using Weblate (Russian)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.2% (764 of 794 strings)

Translated using Weblate (Russian)

Currently translated at 94.1% (2969 of 3153 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3153 of 3153 strings)

Translated using Weblate (French)

Currently translated at 99.2% (788 of 794 strings)

Translated using Weblate (German)

Currently translated at 98.7% (232 of 235 strings)

Translated using Weblate (German)

Currently translated at 91.6% (2890 of 3153 strings)

Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Vasily Maslyukov <vasily.maslyukov@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: billy <kreideraine@gmail.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/content/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translation: Habitica/Achievements
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Groups
Translation: Habitica/Questscontent
Translation: Habitica/Subscriber
2024-08-28 12:49:00 +02:00
Phillip Thelen 4b1656f61c Correctly load bootstrap radio component (#15293) 2024-08-28 12:49:00 +02:00
Phillip Thelen b42341e0ae better timezone handling 2024-08-28 12:49:00 +02:00
Phillip Thelen 267221544b fix loading user data in app.vue (#15292)
* fix handling user version

* fix notification display
2024-08-28 12:49:00 +02:00
Phillip Thelen 5ed9528241 load sounds from aws (#15249) 2024-08-28 12:49:00 +02:00
Phillip Thelen 2298f4cf7b Don’t load browser-script again if it’s already the correct language (#15263) 2024-08-28 12:49:00 +02:00
Phillip Thelen b7cb743f14 Reduce size of client js bundles (#15264)
* add packages

* Only include the needed parts of BootstrapVue

* remove yargs from client

* treeshake validator library

* formatting

* fix import
2024-08-28 12:49:00 +02:00
Phillip Thelen 7f25232218 Refactor the root App to load less data for front page visits (#15265)
* refactor root app to not load everything when visiting landing page

# Conflicts:
#	website/client/src/app.vue

* fix lint

* fix hiding loading screen

* fix showing snackbars when not logged in

* remove console
2024-08-28 12:49:00 +02:00
Phillip Thelen a7b9a78aa4 Improve rate limiting (#15272)
* Improve rate limiting

* make rate limiter config names more consistent

* fix tests and add new one

* correct math
2024-08-28 12:49:00 +02:00
Sabe Jones 6d7467ccaf Remove and clean up unused invite notif (#15279)
* fix(notifications): remove and clean up unused invite notif

* fix(lint): remove unused const

* refactor(invites): updateMany in migration, don't load inviter unless needed

* fix(lint): remove extra whitespace

* fix(groups): remove more broken inviter logic

---------

Co-authored-by: Sabe Jones <sabe@habitica.com>
2024-08-28 12:49:00 +02:00
Phillip Thelen b2531ecd0d Fix schedule using wrong month at the beginning hours of month (#15290)
* Fix schedule using wrong month at the beginning hours of month

* fix broken test

* fix switchover for time based matchers

* Fix scheduling issue related to timezones

* Fix end date creating issues
2024-08-28 12:49:00 +02:00
Sabe Jones 83ffa929d5 5.27.2 2024-08-28 12:49:00 +02:00
Weblate 1ad5932d3d Translated using Weblate (French)
Currently translated at 97.8% (184 of 188 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3153 of 3153 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (Indonesian)

Currently translated at 96.2% (181 of 188 strings)

Translated using Weblate (Indonesian)

Currently translated at 88.8% (167 of 188 strings)

Translated using Weblate (French)

Currently translated at 100.0% (235 of 235 strings)

Translated using Weblate (French)

Currently translated at 99.8% (3148 of 3153 strings)

Translated using Weblate (Indonesian)

Currently translated at 87.7% (165 of 188 strings)

Translated using Weblate (French)

Currently translated at 99.1% (787 of 794 strings)

Translated using Weblate (German)

Currently translated at 95.3% (757 of 794 strings)

Translated using Weblate (German)

Currently translated at 99.4% (385 of 387 strings)

Translated using Weblate (German)

Currently translated at 100.0% (878 of 878 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Russian)

Currently translated at 96.0% (763 of 794 strings)

Translated using Weblate (Portuguese)

Currently translated at 35.1% (66 of 188 strings)

Translated using Weblate (Portuguese)

Currently translated at 25.5% (48 of 188 strings)

Co-authored-by: Catarina Rocha <caticalhau312@gmail.com>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Hanafi <naflizo@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Natalie Luhrs <eilatan@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>
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/content/de/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/es/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/id/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
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/questscontent/de/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/fr/
Translation: Habitica/Backgrounds
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Questscontent
Translation: Habitica/Subscriber
2024-08-28 12:49:00 +02:00
Natalie 9f2bdaaf55 Update static navbar on mobile (#15289)
* update logo on static pages (mobile)

* remove typo
2024-08-28 12:49:00 +02:00
Phillip Thelen 33a696be4d Add a timeout to mongoldb connections (#15258)
* Add option to set a socket timeout for mongodb requests

* Handle mongodb timeouts better

* add default to config
2024-08-28 12:49:00 +02:00
Natalie 7aeec2e8eb Navigation Bar Visual Improvements (#15278)
* update privacy policy

* Fix serving memoized content

* add missing info to mystery item strings

* add missing string info to July mystery items

* fix food

* melior updates - loading screen & menu bar

* updates to currency tray spacing

* table styling

* one last table style

* add margin adjustment

* fix spacing

* clean up spacing styles

* remove table rounded corners

* correct faq tyops

* spacing updates

* fix web challenge instructions

* beach umbrella you are not shady except when you are

* fix mobile margin weirdness

* update wording on answers

* mobile spacing

* add chart showing details of item 1.4

* revert unrelated changes

* melior centering and icon spacing

* remove unnecessary files

* rejiggering spacing

* remove errant comma

* remove unnecessary files

* remove duplicated class

* remove duplicated class

* ...and more spacing

* notification bubble

* notification icon & currency alignment

* fix(CSS): clean up some unnecessary classes

---------

Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: Sabe Jones <sabe@habitica.com>
2024-08-28 12:49:00 +02:00
Phillip Thelen 187f6a2547 fix date dependatent time travel test (#15285) 2024-08-28 12:48:11 +02:00
Natalie 77a6335706 update armorArmoireBasketballUniformNotes to correct stat display (#15262)
Co-authored-by: Sabe Jones <sabe@habitica.com>
2024-08-28 12:48:11 +02:00
Natalie db913a1373 FAQ Typos (#15282)
* update privacy policy

* Fix serving memoized content

* add missing info to mystery item strings

* add missing string info to July mystery items

* fix food

* melior updates - loading screen & menu bar

* updates to currency tray spacing

* table styling

* one last table style

* add margin adjustment

* fix spacing

* clean up spacing styles

* remove table rounded corners

* correct faq tyops

* spacing updates

* fix web challenge instructions

* update wording on answers

* revert unrelated changes

---------

Co-authored-by: Phillip Thelen <phillip@habitica.com>
Co-authored-by: Sabe Jones <sabe@habitica.com>
2024-08-28 12:48:11 +02:00
Sabe Jones 13b51dca74 5.27.1 2024-08-28 12:48:11 +02:00
Weblate 30da77022f Translated using Weblate (Portuguese)
Currently translated at 24.4% (46 of 188 strings)

Translated using Weblate (Japanese)

Currently translated at 97.8% (3085 of 3153 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.6% (109 of 114 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (264 of 264 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 98.4% (3105 of 3153 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 79.2% (149 of 188 strings)

Translated using Weblate (Portuguese)

Currently translated at 23.4% (44 of 188 strings)

Translated using Weblate (Portuguese)

Currently translated at 23.4% (44 of 188 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 94.7% (752 of 794 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (387 of 387 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese)

Currently translated at 95.3% (184 of 193 strings)

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (878 of 878 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (878 of 878 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.2% (764 of 794 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Indonesian)

Currently translated at 76.5% (144 of 188 strings)

Translated using Weblate (Indonesian)

Currently translated at 76.5% (144 of 188 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Co-authored-by: Catarina Rocha <caticalhau312@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Hanafi <naflizo@gmail.com>
Co-authored-by: Muhammad Hanafi <Cytricgame@gmail.com>
Co-authored-by: Márcio Ramos Corrêa <marcio.ramos.correa@gmail.com>
Co-authored-by: Pierre Huang <3541262043@qq.com>
Co-authored-by: Static Meteor <josusantaeufemiaiglesias@gmail.com>
Co-authored-by: TOMA Mitsuru <toma0001@gmail.com>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/character/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/content/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/id/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/uk/
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/settings/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/uk/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Pets
Translation: Habitica/Quests
Translation: Habitica/Questscontent
Translation: Habitica/Settings
Translation: Habitica/Tasks
2024-08-28 12:48:11 +02:00
Sabe Jones d2017c276d fix(lint): clean up migration for ongoing use 2024-08-28 12:48:11 +02:00
Sabe Jones 6a9d5a826c chore(migration): set up for Naming Day 2024 2024-08-28 12:48:11 +02:00
Phillip Thelen f137c472da fix displaying if a pet is hatchable (#15281) 2024-08-28 12:48:03 +02:00
dependabot[bot] c6086b958e Bump fast-xml-parser from 4.3.4 to 4.4.1 (#15280)
Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 4.3.4 to 4.4.1.
- [Release notes](https://github.com/NaturalIntelligence/fast-xml-parser/releases)
- [Changelog](https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/NaturalIntelligence/fast-xml-parser/compare/v4.3.4...v4.4.1)

---
updated-dependencies:
- dependency-name: fast-xml-parser
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Sabe Jones <sabe@habitica.com>
2024-08-28 12:48:03 +02:00
Sabe Jones 9d4a2a1437 fix(customization): restore broken popovers 2024-08-28 12:48:03 +02:00
Sabe Jones dcddbcbda3 fix(lint): remove console statement 2024-08-28 12:48:03 +02:00
Sabe Jones 9891658da7 Squashed commit of the following:
commit 8ed95731cb
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Jul 23 17:59:56 2024 +0200

    fix hatched dialog

commit 53242ad96c
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Jul 23 17:38:13 2024 +0200

    fix popover not showing

commit ce4bfd25bd
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Jul 3 17:28:30 2024 +0200

    move item popover to own component

commit 2e6a300c46
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 1 18:48:24 2024 +0200

    make scaled sprites look nice

commit a3cbadb8c2
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 1 18:48:17 2024 +0200

    fix hatching dialog

commit 0e5126df5e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Mon Jul 1 18:48:12 2024 +0200

    fix popover alignment

commit 7362af9236
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Jun 28 17:07:03 2024 +0200

    fix item display

commit cf353efdb7
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Jun 28 16:59:13 2024 +0200

    fix pet display

commit caf0cba9f2
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Jun 28 15:24:39 2024 +0200

    fix background icon display

commit 3b06febc01
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Jun 26 12:30:04 2024 +0200

    fix sprites for notifications

commit 160b2debdc
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Jun 26 10:35:13 2024 +0200

    fix gear display in profile

commit b200a2f17d
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Jun 26 10:28:11 2024 +0200

    fix sprites for keys to the kennel

commit 3614e7a8fb
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Jun 26 10:28:00 2024 +0200

    fix sprites on avatar customization

commit 35f993d055
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Jun 26 09:18:41 2024 +0200

    fix hover icons

commit 28fc80115e
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Jun 11 16:50:37 2024 +0200

    remove console

commit b041c67679
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Jun 11 15:18:44 2024 +0200

    more lint fixes

commit f4261d0440
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Jun 11 15:18:16 2024 +0200

    fix lint

commit 878ee8f77b
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Jun 11 13:23:08 2024 +0200

    support gifs

commit aac24715aa
Author: Phillip Thelen <phillip@habitica.com>
Date:   Tue Jun 11 13:15:52 2024 +0200

    move avatar customization to sprites

commit f4d3663130
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Jun 7 17:25:19 2024 +0200

    Move more sprites out of css

commit 6e6b4c981a
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Jun 7 16:59:30 2024 +0200

    add new sprite to item and shopItem component

commit 8712413f5d
Author: Phillip Thelen <phillip@habitica.com>
Date:   Fri Jun 7 16:37:24 2024 +0200

    use new sprites for pets list

commit 1172893826
Author: Phillip Thelen <phillip@habitica.com>
Date:   Wed Jun 5 09:43:51 2024 +0200

    Begin building new system for loading sprites
2024-08-28 12:48:03 +02:00
Phillip Thelen f506044aa6 Seasonal gear fix (#15255)
* cleanup unneeded season definitions

* assign first winter seasonal gear right season

* add missing winter definition

* Fix enddate for winter galas

* fix lint

* fix halloween sprites

* set season

* fix loading habitoween sprites

* add missing customization shop sprites

* Fix test

* update customization shop sprites
2024-08-28 12:48:02 +02:00
Phillip Thelen 3cbb67c71a Steampunk gear should not have an end date (#15256) 2024-08-28 12:48:02 +02:00
Sabe Jones d7ed938efc fix(lint): clean up migration for ongoing use 2024-08-28 12:48:02 +02:00
Sabe Jones 134401d153 chore(migration): set up for Naming Day 2024 2024-08-28 12:48:02 +02:00
Sabe Jones fb29ee22f8 5.27.0 2024-08-28 12:48:02 +02:00
Weblate bf5825f1a9 Translated using Weblate (French)
Currently translated at 99.7% (386 of 387 strings)

Translated using Weblate (French)

Currently translated at 100.0% (878 of 878 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (235 of 235 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3153 of 3153 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (794 of 794 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (387 of 387 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (876 of 878 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.9% (129 of 133 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.5% (3067 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 78.1% (147 of 188 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.2% (764 of 794 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (875 of 875 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (234 of 234 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 94.7% (108 of 114 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.8% (261 of 264 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (427 of 427 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.2% (3055 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 76.5% (144 of 188 strings)

Translated using Weblate (Indonesian)

Currently translated at 39.3% (74 of 188 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.2% (764 of 794 strings)

Translated using Weblate (Spanish)

Currently translated at 99.3% (789 of 794 strings)

Translated using Weblate (Indonesian)

Currently translated at 79.1% (72 of 91 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (384 of 384 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (377 of 377 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese)

Currently translated at 97.6% (163 of 167 strings)

Translated using Weblate (Japanese)

Currently translated at 96.8% (760 of 785 strings)

Co-authored-by: Alex Kalergi <nitrogenphospat@proton.me>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Muhammad Hanafi <Cytricgame@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: TOMA Mitsuru <toma0001@gmail.com>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/id/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/content/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/id/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/es/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/es/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/uk/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Npc
Translation: Habitica/Pets
Translation: Habitica/Questscontent
Translation: Habitica/Subscriber
Translation: Habitica/Tasks
2024-08-28 12:48:02 +02:00
Natalie 56b3a881db August 2024 Content Prebuild (#15277)
* add sprites

* 2024-08 content build

* fixing stuff

* update boss rage effects

* update quest rage text and releaseDates.js

* update shop-featuredItems.js

* fricken fracken beach umbrella

* more beach umbrella

* remove egregious typo
2024-08-28 12:48:02 +02:00
Sabe Jones 569b2fce2d 5.26.3 2024-08-28 12:48:02 +02:00
Weblate 29fe48bb17 Translated using Weblate (German)
Currently translated at 91.8% (2888 of 3143 strings)

Translated using Weblate (Slovak)

Currently translated at 97.2% (177 of 182 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (785 of 785 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (56 of 56 strings)

Translated using Weblate (Slovak)

Currently translated at 92.3% (12 of 13 strings)

Translated using Weblate (German)

Currently translated at 91.7% (2883 of 3143 strings)

Translated using Weblate (Slovak)

Currently translated at 96.7% (176 of 182 strings)

Translated using Weblate (Indonesian)

Currently translated at 33.5% (63 of 188 strings)

Translated using Weblate (English (United Kingdom))

Currently translated at 2.6% (5 of 188 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (765 of 785 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (384 of 384 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (377 of 377 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Indonesian)

Currently translated at 32.9% (62 of 188 strings)

Translated using Weblate (Indonesian)

Currently translated at 29.2% (55 of 188 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (German)

Currently translated at 91.6% (2881 of 3143 strings)

Translated using Weblate (Slovak)

Currently translated at 93.9% (171 of 182 strings)

Translated using Weblate (French)

Currently translated at 100.0% (785 of 785 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Turkish)

Currently translated at 80.4% (107 of 133 strings)

Translated using Weblate (Turkish)

Currently translated at 7.9% (15 of 188 strings)

Translated using Weblate (Russian)

Currently translated at 95.6% (751 of 785 strings)

Translated using Weblate (French)

Currently translated at 98.3% (772 of 785 strings)

Translated using Weblate (German)

Currently translated at 91.6% (2879 of 3143 strings)

Translated using Weblate (French)

Currently translated at 98.0% (770 of 785 strings)

Co-authored-by: Adithya Mahadev. B <adithyamahadev2521@gmail.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Ece Ekinci <plutonium3613@gmail.com>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Hanafi <naflizo@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: Tetiana <merekka13@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/achievements/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/character/sk/
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/faq/en_GB/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/id/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/tr/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ru/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/spells/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/uk/
Translation: Habitica/Achievements
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Content
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Npc
Translation: Habitica/Questscontent
Translation: Habitica/Rebirth
Translation: Habitica/Spells
Translation: Habitica/Tasks
2024-08-28 12:48:02 +02:00
Sabe Jones 399d406ebb feat(avatar): popovers for customization 2024-08-28 12:48:02 +02:00
Phillip Thelen bacb015f62 fix purchasing wacky potions (#15276) 2024-08-28 12:48:02 +02:00
Phillip Thelen e5cb82e20f Fix some scheduling issues (#15274)
* fix logic for time travelers schedule

* fix potion availability

* fix tests
2024-08-28 12:48:02 +02:00
Sabe Jones 04573ff422 5.26.2 2024-08-28 12:47:56 +02:00
Weblate 173ee9f929 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.6% (872 of 875 strings)

Translated using Weblate (German)

Currently translated at 91.5% (2877 of 3143 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Spanish)

Currently translated at 98.2% (771 of 785 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.9% (3046 of 3143 strings)

Translated using Weblate (Portuguese)

Currently translated at 57.0% (1793 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 97.4% (765 of 785 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (13 of 13 strings)

Translated using Weblate (Italian)

Currently translated at 87.5% (7 of 8 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Italian)

Currently translated at 86.1% (368 of 427 strings)

Translated using Weblate (Italian)

Currently translated at 11.1% (21 of 188 strings)

Translated using Weblate (Italian)

Currently translated at 94.2% (740 of 785 strings)

Translated using Weblate (Italian)

Currently translated at 54.9% (50 of 91 strings)

Translated using Weblate (Italian)

Currently translated at 95.7% (45 of 47 strings)

Translated using Weblate (Italian)

Currently translated at 97.4% (188 of 193 strings)

Translated using Weblate (Italian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Italian)

Currently translated at 74.9% (194 of 259 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (German)

Currently translated at 91.4% (2875 of 3143 strings)

Translated using Weblate (Italian)

Currently translated at 94.6% (828 of 875 strings)

Translated using Weblate (Italian)

Currently translated at 94.0% (823 of 875 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (427 of 427 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 76.5% (144 of 188 strings)

Translated using Weblate (German)

Currently translated at 91.4% (2873 of 3143 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Czech)

Currently translated at 85.7% (114 of 133 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (427 of 427 strings)

Translated using Weblate (German)

Currently translated at 91.3% (2871 of 3143 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (1 of 1 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 95.4% (21 of 22 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (427 of 427 strings)

Translated using Weblate (German)

Currently translated at 91.2% (2869 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (French)

Currently translated at 100.0% (133 of 133 strings)

Translated using Weblate (German)

Currently translated at 98.4% (131 of 133 strings)

Translated using Weblate (French)

Currently translated at 100.0% (264 of 264 strings)

Translated using Weblate (French)

Currently translated at 100.0% (22 of 22 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (427 of 427 strings)

Translated using Weblate (French)

Currently translated at 100.0% (3143 of 3143 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.5% (239 of 240 strings)

Translated using Weblate (French)

Currently translated at 100.0% (240 of 240 strings)

Translated using Weblate (German)

Currently translated at 98.7% (237 of 240 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (384 of 384 strings)

Translated using Weblate (Slovak)

Currently translated at 97.9% (189 of 193 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (110 of 110 strings)

Translated using Weblate (Hebrew)

Currently translated at 92.8% (155 of 167 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (182 of 182 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.4% (781 of 785 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (259 of 259 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Portuguese)

Currently translated at 65.3% (153 of 234 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 98.8% (261 of 264 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.9% (3046 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 76.5% (144 of 188 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 76.5% (144 of 188 strings)

Translated using Weblate (Indonesian)

Currently translated at 28.1% (53 of 188 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.4% (781 of 785 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (377 of 377 strings)

Translated using Weblate (Portuguese)

Currently translated at 98.1% (377 of 384 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese)

Currently translated at 97.6% (163 of 167 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.6% (258 of 259 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (German)

Currently translated at 91.2% (2867 of 3143 strings)

Translated using Weblate (Ukrainian)

Currently translated at 98.4% (773 of 785 strings)

Translated using Weblate (French)

Currently translated at 100.0% (234 of 234 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (94 of 94 strings)

Translated using Weblate (French)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (60 of 60 strings)

Translated using Weblate (Ukrainian)

Currently translated at 61.7% (1940 of 3143 strings)

Translated using Weblate (Portuguese)

Currently translated at 57.0% (1793 of 3143 strings)

Translated using Weblate (German)

Currently translated at 91.1% (2865 of 3143 strings)

Translated using Weblate (Japanese)

Currently translated at 99.4% (3085 of 3102 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (234 of 234 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (264 of 264 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (384 of 384 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (114 of 114 strings)

Translated using Weblate (Ukrainian)

Currently translated at 61.7% (1940 of 3143 strings)

Translated using Weblate (German)

Currently translated at 91.0% (2863 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (234 of 234 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (Slovak)

Currently translated at 74.9% (588 of 785 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (German)

Currently translated at 95.6% (109 of 114 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (427 of 427 strings)

Translated using Weblate (German)

Currently translated at 91.0% (2861 of 3143 strings)

Translated using Weblate (German)

Currently translated at 98.7% (231 of 234 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (113 of 113 strings)

Translated using Weblate (German)

Currently translated at 99.2% (262 of 264 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (91 of 91 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (234 of 234 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (264 of 264 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3143 of 3143 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (384 of 384 strings)

Translated using Weblate (Slovak)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (233 of 233 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (286 of 286 strings)

Translated using Weblate (German)

Currently translated at 90.9% (2857 of 3143 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.4% (382 of 384 strings)

Translated using Weblate (Ukrainian)

Currently translated at 99.4% (382 of 384 strings)

Translated using Weblate (Slovak)

Currently translated at 97.6% (375 of 384 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (875 of 875 strings)

Translated using Weblate (German)

Currently translated at 99.7% (383 of 384 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.8% (3043 of 3143 strings)

Translated using Weblate (German)

Currently translated at 90.8% (2855 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 96.7% (3041 of 3143 strings)

Translated using Weblate (French)

Currently translated at 99.6% (3132 of 3143 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (377 of 377 strings)

Translated using Weblate (French)

Currently translated at 100.0% (384 of 384 strings)

Translated using Weblate (Indonesian)

Currently translated at 91.3% (799 of 875 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (German)

Currently translated at 98.9% (380 of 384 strings)

Translated using Weblate (Indonesian)

Currently translated at 95.3% (184 of 193 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Indonesian)

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 99.7% (377 of 378 strings)

Translated using Weblate (Portuguese)

Currently translated at 100.0% (47 of 47 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (193 of 193 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (875 of 875 strings)

Translated using Weblate (Portuguese (Brazil))

Currently translated at 100.0% (167 of 167 strings)

Translated using Weblate (Indonesian)

Currently translated at 94.0% (157 of 167 strings)

Translated using Weblate (Japanese)

Currently translated at 99.4% (192 of 193 strings)

Translated using Weblate (French)

Currently translated at 99.0% (3114 of 3143 strings)

Translated using Weblate (German)

Currently translated at 90.7% (2853 of 3143 strings)

Translated using Weblate (French)

Currently translated at 100.0% (785 of 785 strings)

Translated using Weblate (Indonesian)

Currently translated at 94.0% (157 of 167 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (German)

Currently translated at 98.5% (421 of 427 strings)

Translated using Weblate (French)

Currently translated at 98.7% (3105 of 3143 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (188 of 188 strings)

Translated using Weblate (French)

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 (German)

Currently translated at 98.4% (190 of 193 strings)

Translated using Weblate (French)

Currently translated at 100.0% (875 of 875 strings)

Translated using Weblate (Turkish)

Currently translated at 100.0% (140 of 140 strings)

Translated using Weblate (Turkish)

Currently translated at 5.8% (11 of 188 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (785 of 785 strings)

Translated using Weblate (German)

Currently translated at 98.4% (773 of 785 strings)

Translated using Weblate (German)

Currently translated at 65.9% (60 of 91 strings)

Translated using Weblate (Ukrainian)

Currently translated at 100.0% (189 of 189 strings)

Translated using Weblate (Spanish)

Currently translated at 99.7% (873 of 875 strings)

Translated using Weblate (German)

Currently translated at 100.0% (875 of 875 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (773 of 773 strings)

Translated using Weblate (Japanese)

Currently translated at 100.0% (868 of 868 strings)

Translated using Weblate (Spanish)

Currently translated at 100.0% (3143 of 3143 strings)

Co-authored-by: Alex G <powerali18@gmail.com>
Co-authored-by: Antonio Spinelli <tonicospinelli@users.noreply.translate.habitica.com>
Co-authored-by: Céu <marcel.ufscar@gmail.com>
Co-authored-by: Elisa Bailo <bailoelisa5@gmail.com>
Co-authored-by: Eva <kornmann.eva@gmx.de>
Co-authored-by: Filip Betko <filipbetko@gmail.com>
Co-authored-by: Isabela de Carvalho <isabela.c.escritora@gmail.com>
Co-authored-by: Jaime Martí <jaumemarti77@icloud.com>
Co-authored-by: Justcallme rye <Blizzardscf32@gmail.com>
Co-authored-by: Miguel Rocha de Macedo Amaral <miguelrmamaral@gmail.com>
Co-authored-by: Natalie Luhrs <eilatan@gmail.com>
Co-authored-by: Paolo Bizzarri <pibizza@gmail.com>
Co-authored-by: Sophie LE MASLE <sophiesuff@gmail.com>
Co-authored-by: TOMA Mitsuru <toma0001@gmail.com>
Co-authored-by: Tetiana <merekka13@gmail.com>
Co-authored-by: Toro Mor <thomas.bizer@gmx.de>
Co-authored-by: Vinicius Rodrigues <suburbanizar@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Yan <ariamao0802@gmail.com>
Co-authored-by: billypat <kreideraine@gmail.com>
Co-authored-by: diamondmonster09 <diamondmonster09@gmail.com>
Co-authored-by: tamara <tab.bravani@gmail.com>
Co-authored-by: 过客是个铁憨憨 <1811304592@qq.com>
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/he/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/id/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/it/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/achievements/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/de/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/es/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/id/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/it/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/backgrounds/zh_Hans/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/challenge/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/character/de/
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/id/
Translate-URL: https://translate.habitica.com/projects/habitica/character/it/
Translate-URL: https://translate.habitica.com/projects/habitica/character/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/character/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/character/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/character/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/de/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/it/
Translate-URL: https://translate.habitica.com/projects/habitica/communityguidelines/uk/
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/ja/
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/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/it/
Translate-URL: https://translate.habitica.com/projects/habitica/contrib/pt/
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/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/faq/tr/
Translate-URL: https://translate.habitica.com/projects/habitica/front/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/de/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/es/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/gear/uk/
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/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/generic/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/de/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/it/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/groups/uk/
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/id/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/limited/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/es/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/it/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/loginincentives/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/merch/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/messages/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/cs/
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/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/npc/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/overview/it/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/de/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/es/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/fr/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/pets/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/quests/uk/
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/it/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/ja/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/questscontent/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/rebirth/it/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/it/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/settings/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/de/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/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/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/pt_BR/
Translate-URL: https://translate.habitica.com/projects/habitica/subscriber/uk/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/sk/
Translate-URL: https://translate.habitica.com/projects/habitica/tasks/tr/
Translation: Habitica/Achievements
Translation: Habitica/Backgrounds
Translation: Habitica/Challenge
Translation: Habitica/Character
Translation: Habitica/Communityguidelines
Translation: Habitica/Content
Translation: Habitica/Contrib
Translation: Habitica/Faq
Translation: Habitica/Front
Translation: Habitica/Gear
Translation: Habitica/Generic
Translation: Habitica/Groups
Translation: Habitica/Limited
Translation: Habitica/Loginincentives
Translation: Habitica/Merch
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/Subscriber
Translation: Habitica/Tasks
2024-08-28 12:47:56 +02:00
Phillip Thelen cf31227df4 Update schedule.js (#15273)
Add SandSculpture for July
2024-08-28 12:47:56 +02:00
Sabe Jones a5c2cc6c6a Update README.md
fix awkward line breaks
2024-08-28 12:47:56 +02:00
Sabe Jones 4d8380f285 Update README.md 2024-08-28 12:47:56 +02:00
Sabe Jones 5686ecdd16 fix(quests): adjust margins 2024-08-28 12:47:56 +02:00
Sabe Jones 7e8239fb28 fix(modals): various tweks 2024-08-28 12:47:56 +02:00
Sabe Jones 193f783652 fix(quests): modest Bundle revisions 2024-08-28 12:47:56 +02:00
Sabe Jones a51230c847 fix(schedule): add Oddballs to November 2024-08-28 12:47:56 +02:00
Sabe Jones bbc07a8abd fix(lint): add missing whitespace for curlies 2024-08-28 12:47:56 +02:00
Sabe Jones 2fb2af20c0 test(chat): coverage for new sunsets 2024-08-28 12:47:56 +02:00
Sabe Jones ec6bb3ae79 fix(groups): fix TypeError when missing 2024-08-28 12:47:56 +02:00
Sabe Jones a0520ddb3f fix(api): close lingering deprecated APIs 2024-08-28 12:47:56 +02:00
Sabe Jones e89bf3e588 fix(memoize): enumerate food 2024-08-28 12:47:56 +02:00
Phillip Thelen 6195071730 remove console 2024-08-22 11:42:51 +02:00
Phillip Thelen d872ba49fd fix email search 2024-08-22 11:33:52 +02:00
Phillip Thelen cea9743087 Split email search into multiple queries 2024-08-21 13:16:22 +02:00
Phillip Thelen b31a6453a3 fix sorting 2024-08-19 17:30:37 +02:00
Phillip Thelen 5fb1e250ee fix loading spinner 2024-08-19 17:19:31 +02:00
Phillip Thelen baec8273d0 time travel button display fix 2024-08-19 16:15:22 +02:00
Phillip Thelen e387585d6d search improvements 2024-08-19 16:15:14 +02:00
Phillip Thelen 2b328c37f7 remove autocannon file 2024-08-19 15:19:07 +02:00
Phillip Thelen 9224f58da5 admin panel display improvements 2024-08-19 15:13:32 +02:00
Phillip Thelen 4d64113613 Fix bottom button display 2024-07-30 18:16:25 +02:00
Phillip Thelen 0305ba4269 Unify date preview display 2024-07-30 18:16:14 +02:00
Phillip Thelen e2f25e34e6 fix checkbox alignment in admin panel 2024-07-29 18:18:31 +02:00
Phillip Thelen 26d5a4503c improve sub styling 2024-07-29 16:12:35 +02:00
Phillip Thelen abf5629f80 add styling for warning buttons 2024-07-29 16:12:22 +02:00
Phillip Thelen 174e2c0078 load own user when pressing enter on empty field 2024-07-26 14:47:52 +02:00
Phillip Thelen b104e371ef escape regex for searching users 2024-07-25 17:15:58 +02:00
Phillip Thelen 6bde0e3fd9 fix width of items 2024-07-25 17:01:52 +02:00
Phillip Thelen 7f66cc28e0 fix test 2024-07-17 15:43:38 +02:00
Phillip Thelen 1a2f299e04 Make Admin panel design more consistent 2024-07-17 15:06:11 +02:00
Phillip Thelen 489bd851bb Add option to search for users by email or username in admin panel 2024-07-17 13:32:25 +02:00
746 changed files with 10819 additions and 3594 deletions
+2 -12
View File
@@ -22,8 +22,7 @@ services:
dockerfile: ./Dockerfile-Dev
command: ["npm", "start"]
depends_on:
mongo:
condition: service_healthy
- mongo
environment:
- NODE_DB_URI=mongodb://mongo/habitrpg
networks:
@@ -34,16 +33,7 @@ services:
- .:/usr/src/habitica
- /usr/src/habitica/node_modules
mongo:
image: mongo:5.0.23
restart: unless-stopped
command: ["--replSet", "rs", "--bind_ip_all", "--port", "27017"]
healthcheck:
test: echo "try { rs.status() } catch (err) { rs.initiate() }" | mongosh --port 27017 --quiet
interval: 10s
timeout: 30s
start_period: 0s
start_interval: 1s
retries: 30
image: mongo:3.6
networks:
- habitica
ports:
+6 -17
View File
@@ -1,12 +1,12 @@
{
"name": "habitica",
"version": "5.29.0",
"version": "5.27.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "habitica",
"version": "5.29.0",
"version": "5.27.3",
"hasInstallScript": true,
"dependencies": {
"@babel/core": "^7.22.10",
@@ -87,7 +87,7 @@
"xml2js": "^0.6.2"
},
"devDependencies": {
"axios": "^1.7.4",
"axios": "^1.4.0",
"chai": "^4.3.7",
"chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0",
@@ -4786,10 +4786,9 @@
"integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
},
"node_modules/axios": {
"version": "1.7.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz",
"integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==",
"dev": true,
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
"integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
@@ -16117,16 +16116,6 @@
"node": ">= 12"
}
},
"node_modules/node-gcm/node_modules/axios": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz",
"integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/node-gcm/node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+2 -3
View File
@@ -1,7 +1,7 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "5.29.0",
"version": "5.27.3",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.22.10",
@@ -107,7 +107,6 @@
"client:build": "cd website/client && npm run build",
"client:unit": "cd website/client && npm run test:unit",
"start": "gulp nodemon",
"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",
"postinstall": "git config --global url.\"https://\".insteadOf git:// && gulp build && cd website/client && npm install",
@@ -115,7 +114,7 @@
"heroku-postbuild": ".heroku/report_deploy.sh"
},
"devDependencies": {
"axios": "^1.7.4",
"axios": "^1.4.0",
"chai": "^4.3.7",
"chai-as-promised": "^7.1.1",
"chai-moment": "^0.1.0",
@@ -10,6 +10,7 @@ describe('GET /heroes/:heroId', () => {
const heroFields = [
'_id', 'id', 'auth', 'balance', 'contributor', 'flags', 'items',
'lastCron', 'party', 'preferences', 'profile', 'purchased', 'secret', 'achievements',
'stats',
];
before(async () => {
@@ -11,6 +11,7 @@ describe('PUT /heroes/:heroId', () => {
const heroFields = [
'_id', 'auth', 'balance', 'contributor', 'flags', 'items', 'lastCron',
'party', 'preferences', 'profile', 'purchased', 'secret', 'permissions', 'achievements',
'stats',
];
before(async () => {
@@ -125,90 +125,6 @@ describe('POST /tasks/:id/score/:direction', () => {
expect(body.finalLvl).to.eql(user.stats.lvl);
});
});
context('handles drops', async () => {
let randomStub;
afterEach(() => {
randomStub.restore();
});
it('gives user a drop', async () => {
user = await generateUser({
'stats.gp': 100,
'achievements.completedTask': true,
'items.eggs': {
Wolf: 1,
},
});
randomStub = sandbox.stub(Math, 'random').returns(0.1);
const task = await user.post('/tasks/user', {
text: 'test habit',
type: 'habit',
});
const res = await user.post(`/tasks/${task.id}/score/up`);
expect(res._tmp.drop).to.be.ok;
});
it('does not give a drop when non-sub drop cap is reached', async () => {
user = await generateUser({
'stats.gp': 100,
'achievements.completedTask': true,
'items.eggs': {
Wolf: 1,
},
'items.lastDrop.count': 5,
});
randomStub = sandbox.stub(Math, 'random').returns(0.1);
const task = await user.post('/tasks/user', {
text: 'test habit',
type: 'habit',
});
const res = await user.post(`/tasks/${task.id}/score/up`);
expect(res._tmp.drop).to.be.undefined;
});
it('gives a drop when subscriber is over regular cap but under subscriber cap', async () => {
user = await generateUser({
'stats.gp': 100,
'achievements.completedTask': true,
'items.eggs': {
Wolf: 1,
},
'items.lastDrop.count': 6,
'purchased.plan.customerId': '123',
});
randomStub = sandbox.stub(Math, 'random').returns(0.1);
const task = await user.post('/tasks/user', {
text: 'test habit',
type: 'habit',
});
const res = await user.post(`/tasks/${task.id}/score/up`);
expect(res._tmp.drop).to.be.ok;
});
it('does not give a drop when subscriber is at subscriber drop cap', async () => {
user = await generateUser({
'stats.gp': 100,
'achievements.completedTask': true,
'items.eggs': {
Wolf: 1,
},
'items.lastDrop.count': 10,
'purchased.plan.customerId': '123',
});
randomStub = sandbox.stub(Math, 'random').returns(0.1);
const task = await user.post('/tasks/user', {
text: 'test habit',
type: 'habit',
});
const res = await user.post(`/tasks/${task.id}/score/up`);
expect(res._tmp.drop).to.be.undefined;
});
});
});
context('todos', () => {
@@ -105,9 +105,9 @@ describe('POST /tasks/:taskId/assign/:memberId', () => {
const groupTask = await user.get(`/tasks/group/${guild._id}`);
const lastNotification = member.notifications[member.notifications.length - 1];
expect(lastNotification.type).to.equal('GROUP_TASK_ASSIGNED');
expect(lastNotification.taskId).to.equal(groupTask._id);
expect(member.notifications.length).to.equal(2);
expect(member.notifications[1].type).to.equal('GROUP_TASK_ASSIGNED');
expect(member.notifications[1].taskId).to.equal(groupTask._id);
});
it('assigns a task to multiple users', async () => {
@@ -89,12 +89,10 @@ describe('POST /tasks/:taskId/unassign/:memberId', () => {
});
it('removes task assignment notification from unassigned user', async () => {
await member.sync();
const oldNotificationCount = member.notifications.length;
await user.post(`/tasks/${task._id}/unassign/${member._id}`);
await member.sync();
expect(member.notifications.length).to.equal(oldNotificationCount - 1);
expect(member.notifications.length).to.equal(1); // mystery items
});
it('unassigns a user and only that user from a task', async () => {
-18
View File
@@ -40,24 +40,6 @@ describe('GET /user', () => {
expect(returnedUser.stats).to.not.exist;
});
it('returns when ALWAYS_LOADED paths are requested', async () => {
const returnedUser = await user.get('/user?userFields=_id,notifications,preferences,auth,flags,permissions');
expect(returnedUser._id).to.equal(user._id);
expect(returnedUser.notifications).to.exist;
expect(returnedUser.preferences).to.exist;
expect(returnedUser.auth).to.exist;
expect(returnedUser.flags).to.exist;
expect(returnedUser.permissions).to.exist;
});
it('returns when subpaths paths are requested', async () => {
const returnedUser = await user.get('/user?userFields=auth.local.username');
expect(returnedUser._id).to.equal(user._id);
expect(returnedUser.auth.local.username).to.exist;
});
it('does not return requested private properties', async () => {
const returnedUser = await user.get('/user?userFields=apiToken,secret.text');
+3 -3
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-06'));
const events = getRepeatingEvents();
expect(events).to.be.empty;
});
@@ -27,14 +27,14 @@ describe('events', () => {
it('returns nye event at beginning of the year', () => {
clock = sinon.useFakeTimers(new Date('2025-01-01'));
const events = getRepeatingEvents();
expect(events).to.have.length(2);
expect(events).to.have.length(1);
expect(events[0].key).to.equal('nye');
});
it('returns nye event at end of the year', () => {
clock = sinon.useFakeTimers(new Date('2024-12-30'));
const events = getRepeatingEvents();
expect(events).to.have.length(2);
expect(events).to.have.length(1);
expect(events[0].key).to.equal('nye');
});
});
+1 -1
View File
@@ -72,7 +72,7 @@ describe('food', () => {
});
it('sets canDrop for pie if it is pie season', () => {
clock = sinon.useFakeTimers(new Date(2024, 2, 15));
clock = sinon.useFakeTimers(new Date(2024, 2, 14));
const datedContent = require('../../website/common/script/content').default;
each(datedContent.food, foodItem => {
if (foodItem.key.indexOf('Pie_') !== -1) {
+1 -1
View File
@@ -131,7 +131,7 @@ describe('content index', () => {
});
it('marks pie as buyable and droppable during pi day', () => {
clock = sinon.useFakeTimers(new Date('2024-03-15'));
clock = sinon.useFakeTimers(new Date('2024-03-14'));
const { food } = content;
Object.keys(food).forEach(key => {
if (key === 'Saddle') {
-42
View File
@@ -1,42 +0,0 @@
import {
each,
} from 'lodash';
import {
expectValidTranslationString,
} from '../helpers/content.helper';
import { quests } from '../../website/common/script/content/quests';
describe('quests', () => {
let clock;
afterEach(() => {
if (clock) {
clock.restore();
}
});
it('contains basic information about each quest', () => {
each(quests, (quest, key) => {
expectValidTranslationString(quest.text);
expectValidTranslationString(quest.notes);
expectValidTranslationString(quest.completion);
expect(quest.key, key).to.equal(key);
expect(quest.category, key).to.be.a('string');
if (quest.boss) {
expectValidTranslationString(quest.boss.name);
expect(quest.boss.hp, key).to.be.a('number');
expect(quest.boss.str, key).to.be.a('number');
}
expect(quest.drop).to.be.an('object');
expect(quest.drop.gp, key).to.be.a('number');
expect(quest.drop.exp, key).to.be.a('number');
if (quest.drop.items) {
quest.drop.items.forEach(drop => {
expectValidTranslationString(drop.text);
expect(drop.type, key).to.exist;
});
}
});
});
});
+104 -76
View File
@@ -23,6 +23,7 @@
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1",
"core-js": "^3.33.1",
"dompurify": "^3.0.3",
"eslint": "7.32.0",
"eslint-config-habitrpg": "6.2.0",
"eslint-plugin-mocha": "5.3.0",
@@ -38,6 +39,7 @@
"sass": "^1.63.4",
"sass-loader": "^14.1.1",
"sinon": "^17.0.1",
"smartbanner.js": "^1.19.3",
"stopword": "^2.0.8",
"timers-browserify": "^2.0.12",
"uuid": "^9.0.1",
@@ -57,7 +59,7 @@
"chai": "^5.1.0",
"inspectpack": "^4.7.1",
"terser-webpack-plugin": "^5.3.10",
"webpack": "^5.94.0"
"webpack": "^5.89.0"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -2305,6 +2307,15 @@
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
"version": "3.7.7",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
@@ -3118,9 +3129,9 @@
"integrity": "sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA=="
},
"node_modules/@webassemblyjs/ast": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
"integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
"integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
"dependencies": {
"@webassemblyjs/helper-numbers": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6"
@@ -3137,9 +3148,9 @@
"integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
"integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw=="
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
"integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.11.6",
@@ -3157,14 +3168,14 @@
"integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
"integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
"integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
"dependencies": {
"@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/helper-buffer": "1.12.1",
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-buffer": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/wasm-gen": "1.12.1"
"@webassemblyjs/wasm-gen": "1.11.6"
}
},
"node_modules/@webassemblyjs/ieee754": {
@@ -3189,26 +3200,26 @@
"integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
"integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
"integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
"dependencies": {
"@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/helper-buffer": "1.12.1",
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-buffer": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/helper-wasm-section": "1.12.1",
"@webassemblyjs/wasm-gen": "1.12.1",
"@webassemblyjs/wasm-opt": "1.12.1",
"@webassemblyjs/wasm-parser": "1.12.1",
"@webassemblyjs/wast-printer": "1.12.1"
"@webassemblyjs/helper-wasm-section": "1.11.6",
"@webassemblyjs/wasm-gen": "1.11.6",
"@webassemblyjs/wasm-opt": "1.11.6",
"@webassemblyjs/wasm-parser": "1.11.6",
"@webassemblyjs/wast-printer": "1.11.6"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
"integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
"integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
"dependencies": {
"@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/ieee754": "1.11.6",
"@webassemblyjs/leb128": "1.11.6",
@@ -3216,22 +3227,22 @@
}
},
"node_modules/@webassemblyjs/wasm-opt": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
"integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
"integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
"dependencies": {
"@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/helper-buffer": "1.12.1",
"@webassemblyjs/wasm-gen": "1.12.1",
"@webassemblyjs/wasm-parser": "1.12.1"
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-buffer": "1.11.6",
"@webassemblyjs/wasm-gen": "1.11.6",
"@webassemblyjs/wasm-parser": "1.11.6"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
"integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
"integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
"dependencies": {
"@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/ast": "1.11.6",
"@webassemblyjs/helper-api-error": "1.11.6",
"@webassemblyjs/helper-wasm-bytecode": "1.11.6",
"@webassemblyjs/ieee754": "1.11.6",
@@ -3240,11 +3251,11 @@
}
},
"node_modules/@webassemblyjs/wast-printer": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
"integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
"version": "1.11.6",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
"integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
"dependencies": {
"@webassemblyjs/ast": "1.12.1",
"@webassemblyjs/ast": "1.11.6",
"@xtuc/long": "4.2.2"
}
},
@@ -3315,10 +3326,10 @@
"node": ">=0.4.0"
}
},
"node_modules/acorn-import-attributes": {
"version": "1.9.5",
"resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
"integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
"node_modules/acorn-import-assertions": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
"integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
"peerDependencies": {
"acorn": "^8"
}
@@ -4035,11 +4046,11 @@
}
},
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dependencies": {
"fill-range": "^7.1.1"
"fill-range": "^7.0.1"
},
"engines": {
"node": ">=8"
@@ -5387,6 +5398,11 @@
"url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
"node_modules/dompurify": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.6.tgz",
"integrity": "sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w=="
},
"node_modules/domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
@@ -5480,9 +5496,9 @@
}
},
"node_modules/enhanced-resolve": {
"version": "5.17.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
"integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
"version": "5.15.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
"integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
@@ -6855,9 +6871,9 @@
}
},
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -8992,11 +9008,11 @@
}
},
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
"dependencies": {
"braces": "^3.0.3",
"braces": "^3.0.2",
"picomatch": "^2.3.1"
},
"engines": {
@@ -12079,6 +12095,17 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/smartbanner.js": {
"version": "1.22.0",
"resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.22.0.tgz",
"integrity": "sha512-JhERLgwEPuzVdwAHds1J6txWBVq9BwmlAn+5VicrAfIOMO3ehNA7VHu8IIJNnW1LsElSCaLWxjdLjlEwLDqAvA==",
"engines": {
"node": ">=10.24.1 <22.0.0"
},
"funding": {
"url": "https://github.com/sponsors/ain"
}
},
"node_modules/sockjs": {
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
@@ -13315,9 +13342,9 @@
}
},
"node_modules/watchpack": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
"integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
"integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
@@ -13351,32 +13378,33 @@
}
},
"node_modules/webpack": {
"version": "5.94.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz",
"integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==",
"version": "5.89.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
"integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
"dependencies": {
"@types/estree": "^1.0.5",
"@webassemblyjs/ast": "^1.12.1",
"@webassemblyjs/wasm-edit": "^1.12.1",
"@webassemblyjs/wasm-parser": "^1.12.1",
"@types/eslint-scope": "^3.7.3",
"@types/estree": "^1.0.0",
"@webassemblyjs/ast": "^1.11.5",
"@webassemblyjs/wasm-edit": "^1.11.5",
"@webassemblyjs/wasm-parser": "^1.11.5",
"acorn": "^8.7.1",
"acorn-import-attributes": "^1.9.5",
"browserslist": "^4.21.10",
"acorn-import-assertions": "^1.9.0",
"browserslist": "^4.14.5",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.17.1",
"enhanced-resolve": "^5.15.0",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.2.11",
"graceful-fs": "^4.2.9",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
"schema-utils": "^3.2.0",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.10",
"watchpack": "^2.4.1",
"terser-webpack-plugin": "^5.3.7",
"watchpack": "^2.4.0",
"webpack-sources": "^3.2.3"
},
"bin": {
+3 -1
View File
@@ -25,6 +25,7 @@
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.23.1",
"core-js": "^3.33.1",
"dompurify": "^3.0.3",
"eslint": "7.32.0",
"eslint-config-habitrpg": "6.2.0",
"eslint-plugin-mocha": "5.3.0",
@@ -40,6 +41,7 @@
"sass": "^1.63.4",
"sass-loader": "^14.1.1",
"sinon": "^17.0.1",
"smartbanner.js": "^1.19.3",
"stopword": "^2.0.8",
"timers-browserify": "^2.0.12",
"uuid": "^9.0.1",
@@ -59,6 +61,6 @@
"chai": "^5.1.0",
"inspectpack": "^4.7.1",
"terser-webpack-plugin": "^5.3.10",
"webpack": "^5.94.0"
"webpack": "^5.89.0"
}
}
+12
View File
@@ -7,6 +7,18 @@
<title>Habitica - Gamify Your Life</title>
<meta name="description" content="Habitica is a free habit and productivity app that treats your real life like a game. Habitica can help you achieve your goals to become healthy and happy.">
<meta name="keywords" content="Habits,Goals,Todo,Gamification,Health,Fitness,School,Work">
<meta name="smartbanner:title" content="Habitica">
<meta name="smartbanner:author" content="HabitRPG, Inc.">
<meta name="smartbanner:price" content="FREE">
<meta name="smartbanner:price-suffix-apple" content=" - On the App Store">
<meta name="smartbanner:price-suffix-google" content=" - In Google Play">
<meta name="smartbanner:icon-apple" content="/static/presskit/Logo/iOS.png">
<meta name="smartbanner:icon-google" content="/static/presskit/Logo/Android.png">
<meta name="smartbanner:button" content="VIEW">
<meta name="smartbanner:button-url-apple" content="https://itunes.apple.com/us/app/habitica-gamified-taskmanager/id994882113">
<meta name="smartbanner:button-url-google" content="https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica">
<meta name="smartbanner:enabled-platforms" content="android,ios">
<meta name="smartbanner:hide-ttl" content="2592000000">
<link href="https://fonts.googleapis.com/css?family=Roboto+Condensed:400,400i,700,700i|Roboto:400,400i,700,700i" rel="stylesheet">
<link rel="shortcut icon" sizes="48x48" href="/static/icons/favicon.ico">
<link rel="shortcut icon" sizes="192x192" href="/static/icons/favicon_192x192.png">
+1
View File
@@ -302,3 +302,4 @@ export default {
<style src="@/assets/scss/index.scss" lang="scss"></style>
<style src="@/assets/scss/sprites.scss" lang="scss"></style>
<style src="smartbanner.js/dist/smartbanner.min.css"></style>
@@ -805,11 +805,6 @@
width: 141px;
height: 147px;
}
.background_castle_hall_with_hearth {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_castle_hall_with_hearth.png');
width: 141px;
height: 147px;
}
.background_cemetery_gate {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_cemetery_gate.png');
width: 141px;
@@ -2170,11 +2165,6 @@
width: 141px;
height: 147px;
}
.background_surrounded_by_ghosts {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_surrounded_by_ghosts.png');
width: 141px;
height: 147px;
}
.background_swan_boat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_swan_boat.png');
width: 141px;
@@ -29929,11 +29919,6 @@
width: 114px;
height: 90px;
}
.broad_armor_armoire_stormKnightArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_stormKnightArmor.png');
width: 114px;
height: 90px;
}
.broad_armor_armoire_strawRaincoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_strawRaincoat.png');
width: 114px;
@@ -30454,11 +30439,6 @@
width: 117px;
height: 120px;
}
.head_armoire_stormKnightHelm {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_stormKnightHelm.png');
width: 114px;
height: 90px;
}
.head_armoire_strawRainHat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_strawRainHat.png');
width: 114px;
@@ -30814,11 +30794,6 @@
width: 90px;
height: 90px;
}
.shield_armoire_safetyFlashlight {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_safetyFlashlight.png');
width: 114px;
height: 90px;
}
.shield_armoire_sandyBucket {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_sandyBucket.png');
width: 90px;
@@ -31404,11 +31379,6 @@
width: 114px;
height: 90px;
}
.slim_armor_armoire_stormKnightArmor {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_stormKnightArmor.png');
width: 114px;
height: 90px;
}
.slim_armor_armoire_strawRaincoat {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_strawRaincoat.png');
width: 114px;
@@ -31964,16 +31934,6 @@
width: 114px;
height: 90px;
}
.weapon_armoire_spookyCandyBucket {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_spookyCandyBucket.png');
width: 114px;
height: 90px;
}
.weapon_armoire_stormKnightAxe {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_stormKnightAxe.png');
width: 114px;
height: 90px;
}
.weapon_armoire_vermilionArcherBow {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_vermilionArcherBow.png');
width: 90px;
@@ -35319,26 +35279,6 @@
width: 114px;
height: 90px;
}
.back_mystery_202410 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_202410.png');
width: 114px;
height: 90px;
}
.headAccessory_mystery_202410 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_mystery_202410.png');
width: 114px;
height: 90px;
}
.body_mystery_202411 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/body_mystery_202411.png');
width: 114px;
height: 90px;
}
.head_mystery_202411 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202411.png');
width: 114px;
height: 90px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;
@@ -40297,11 +40237,6 @@
width: 219px;
height: 219px;
}
.quest_dog {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_dog.png');
width: 219px;
height: 219px;
}
.quest_dolphin {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_dolphin.png');
width: 219px;
@@ -40432,11 +40367,6 @@
width: 219px;
height: 219px;
}
.quest_lostMasterclasser4 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_lostMasterclasser4.png');
width: 219px;
height: 219px;
}
.quest_mayhemMistiflying1 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_mayhemMistiflying1.png');
width: 150px;
@@ -41037,11 +40967,6 @@
width: 68px;
height: 68px;
}
.inventory_quest_scroll_dog {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/inventory_quest_scroll_dog.png');
width: 68px;
height: 68px;
}
.inventory_quest_scroll_dolphin {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/inventory_quest_scroll_dolphin.png');
width: 68px;
@@ -42882,56 +42807,6 @@
width: 105px;
height: 105px;
}
.Mount_Body_Dog-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-Base.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-CottonCandyBlue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-CottonCandyBlue.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-CottonCandyPink {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-CottonCandyPink.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-Desert {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-Desert.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-Golden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-Golden.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-Red {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-Red.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-Shade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-Shade.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-Skeleton {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-Skeleton.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-White {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-White.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dog-Zombie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dog-Zombie.png');
width: 105px;
height: 105px;
}
.Mount_Body_Dolphin-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Body_Dolphin-Base.png');
width: 105px;
@@ -48377,56 +48252,6 @@
width: 105px;
height: 105px;
}
.Mount_Head_Dog-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-Base.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-CottonCandyBlue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-CottonCandyBlue.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-CottonCandyPink {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-CottonCandyPink.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-Desert {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-Desert.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-Golden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-Golden.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-Red {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-Red.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-Shade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-Shade.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-Skeleton {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-Skeleton.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-White {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-White.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dog-Zombie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dog-Zombie.png');
width: 105px;
height: 105px;
}
.Mount_Head_Dolphin-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Mount_Head_Dolphin-Base.png');
width: 105px;
@@ -53932,56 +53757,6 @@
width: 81px;
height: 99px;
}
.Pet-Dog-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-Base.png');
width: 81px;
height: 99px;
}
.Pet-Dog-CottonCandyBlue {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-CottonCandyBlue.png');
width: 81px;
height: 99px;
}
.Pet-Dog-CottonCandyPink {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-CottonCandyPink.png');
width: 81px;
height: 99px;
}
.Pet-Dog-Desert {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-Desert.png');
width: 81px;
height: 99px;
}
.Pet-Dog-Golden {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-Golden.png');
width: 81px;
height: 99px;
}
.Pet-Dog-Red {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-Red.png');
width: 81px;
height: 99px;
}
.Pet-Dog-Shade {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-Shade.png');
width: 81px;
height: 99px;
}
.Pet-Dog-Skeleton {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-Skeleton.png');
width: 81px;
height: 99px;
}
.Pet-Dog-White {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-White.png');
width: 81px;
height: 99px;
}
.Pet-Dog-Zombie {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dog-Zombie.png');
width: 81px;
height: 99px;
}
.Pet-Dolphin-Base {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dolphin-Base.png');
width: 81px;
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

@@ -78,15 +78,3 @@ $gold-color: #FFA624;
$hourglass-color: #2995CD;
$purple-task: #925cf3;
.gray-200 {
color: $gray-200 !important;
}
.purple-300 {
color: $purple-300 !important;
}
.white {
color: $white !important;
}
@@ -10,10 +10,10 @@
@hide="hide"
>
<div class="modal-body text-center">
<Sprite
<div
class="quest"
:image-name="`quest_${user.party.quest.completed}`"
/>
:class="`quest_${user.party.quest.completed}`"
></div>
<p
v-if="questData.completion && typeof questData.completion === 'function'"
v-html="questData.completion()"
@@ -58,12 +58,10 @@ import percent from '@/../../common/script/libs/percent';
import { MAX_HEALTH as maxHealth } from '@/../../common/script/constants';
import { mapState } from '@/libs/store';
import QuestRewards from '../shops/quests/questRewards';
import Sprite from '../ui/sprite';
export default {
components: {
QuestRewards,
Sprite,
},
data () {
return {
@@ -11,11 +11,10 @@
</div>
<div class="modal-body">
<div class="pull-right-sm text-center">
<div class="col-centered">
<Sprite
:image-name="`quest_${quests[user.party.quest.key].key}`"
/>
</div>
<div
class="col-centered"
:class="`quest_${quests[user.party.quest.key].key}`"
></div>
<div ng-if="quests[user.party.quest.key].boss">
<h4>{{ quests[user.party.quest.key].boss.name() }}</h4>
<p>
@@ -94,12 +93,8 @@ import * as quests from '@/../../common/script/content/quests';
import percent from '@/../../common/script/libs/percent';
import { MAX_HEALTH as maxHealth } from '@/../../common/script/constants';
import { mapState } from '@/libs/store';
import Sprite from '@/components/ui/sprite';
export default {
components: [
Sprite,
],
data () {
return {
maxHealth,
@@ -7,7 +7,11 @@
>
Could not find any matching users.
</div>
<loading-spinner class="mx-auto mb-2" dark-color="true" v-if="isSearching" />
<loading-spinner
v-if="isSearching"
class="mx-auto mb-2"
dark-color="true"
/>
<div
v-if="users.length > 0"
class="list-group"
@@ -256,11 +256,14 @@ export default {
},
methods: {
async saveItem (item) {
// prepare the item's new value and path for being saved
this.hero.achievementPath = item.path;
this.hero.achievementVal = item.value;
await this.saveHero({ hero: this.hero, msg: item.path });
await this.saveHero({
hero: {
_id: this.hero._id,
achievementPath: item.path,
achievementVal: item.value,
},
msg: item.path,
});
item.modified = false;
},
enableValueChange (item) {
@@ -1,5 +1,10 @@
<template>
<form @submit.prevent="saveHero({ hero, msg: 'Contributor details', clearData: true })">
<form @submit.prevent="saveHero({ hero: {
_id: hero._id,
contributor: hero.contributor,
secret: hero.secret,
permissions: hero.permissions,
}, msg: 'Contributor details', clearData: true })">
<div class="card mt-2">
<div class="card-header">
<h3
@@ -1,5 +1,11 @@
<template>
<form @submit.prevent="saveHero({ hero, msg: 'Authentication' })">
<form
@submit.prevent="saveHero({ hero: {
_id: hero._id,
auth: hero.auth,
preferences: hero.preferences,
}, msg: 'Authentication' })"
>
<div class="card mt-2">
<div class="card-header">
<h3
@@ -38,7 +44,10 @@
<strong v-else>No</strong>
</div>
</div>
<div v-if="cronError" class="form-group row">
<div
v-if="cronError"
class="form-group row"
>
<label class="col-sm-3 col-form-label">lastCron value:</label>
<strong>{{ hero.lastCron | formatDate }}</strong>
<br>
@@ -53,12 +62,12 @@
<div class="col-sm-9 col-form-label">
<strong>
{{ hero.auth.timestamps.loggedin | formatDate }}</strong>
<button
<a
class="btn btn-warning btn-sm ml-4"
@click="resetCron()"
>
Reset Cron to Yesterday
</button>
</a>
</div>
</div>
<div class="form-group row">
@@ -110,13 +119,14 @@
<div class="form-group row">
<label class="col-sm-3 col-form-label">API Token</label>
<div class="col-sm-9">
<button
<a
href="#"
value="Change API Token"
class="btn btn-danger"
@click="changeApiToken()"
>
Change API Token
</button>
</a>
<div
v-if="tokenModified"
>
@@ -268,13 +278,24 @@ export default {
return false;
},
async changeApiToken () {
this.hero.changeApiToken = true;
await this.saveHero({ hero: this.hero, msg: 'API Token' });
await this.saveHero({
hero: {
_id: this.hero._id,
changeApiToken: true,
},
msg: 'API Token',
});
this.tokenModified = true;
},
resetCron () {
this.hero.resetCron = true;
this.saveHero({ hero: this.hero, msg: 'Last Cron', clearData: true });
this.saveHero({
hero: {
_id: this.hero._id,
resetCron: true,
},
msg: 'Last Cron',
clearData: true,
});
},
},
};
@@ -232,11 +232,14 @@ export default {
},
methods: {
async saveItem (item) {
// prepare the item's new value and path for being saved
this.hero.purchasedPath = item.path;
this.hero.purchasedVal = item.value;
await this.saveHero({ hero: this.hero, msg: item.path });
await this.saveHero({
hero: {
_id: this.hero._id,
purchasedPath: item.path,
purchasedVal: item.value,
},
msg: item.path,
});
item.modified = false;
},
enableValueChange (item) {
@@ -47,6 +47,11 @@
:preferences="hero.preferences"
/>
<stats
:hero="hero"
:reset-counter="resetCounter"
/>
<items-owned
:hero="hero"
:reset-counter="resetCounter"
@@ -67,6 +72,11 @@
:reset-counter="resetCounter"
/>
<user-history
:hero="hero"
:reset-counter="resetCounter"
/>
<contributor-details
:hero="hero"
:reset-counter="resetCounter"
@@ -121,6 +131,8 @@ import Transactions from './transactions';
import SubscriptionAndPerks from './subscriptionAndPerks';
import CustomizationsOwned from './customizationsOwned.vue';
import Achievements from './achievements.vue';
import UserHistory from './userHistory.vue';
import Stats from './stats.vue';
import { userStateMixin } from '../../../mixins/userState';
@@ -135,6 +147,8 @@ export default {
PrivilegesAndGems,
ContributorDetails,
Transactions,
UserHistory,
Stats,
SubscriptionAndPerks,
UserProfile,
Achievements,
@@ -269,16 +269,19 @@ export default {
methods: {
async saveItem (item) {
// prepare the item's new value and path for being saved
this.hero.itemPath = item.path;
const toSave = {
_id: this.hero._id,
};
toSave.itemPath = item.path;
if (item.value === null) {
this.hero.itemVal = 'null';
toSave.itemVal = 'null';
} else if (item.value === false) {
this.hero.itemVal = 'false';
toSave.itemVal = 'false';
} else {
this.hero.itemVal = item.value;
toSave.itemVal = item.value;
}
await this.saveHero({ hero: this.hero, msg: item.key });
await this.saveHero({ hero: toSave, msg: item.key });
item.neverOwned = false;
item.modified = false;
},
@@ -1,5 +1,11 @@
<template>
<form @submit.prevent="saveHero({hero, msg: 'Privileges or Gems or Moderation Notes'})">
<form @submit.prevent="saveHero({hero: {
_id: hero._id,
flags: hero.flags,
balance: hero.balance,
auth: hero.auth,
secret: hero.secret,
}, msg: 'Privileges or Gems or Moderation Notes'})">
<div class="card mt-2">
<div class="card-header">
<h3
@@ -0,0 +1,72 @@
<template>
<div class="form-group row">
<label
class="col-sm-3 col-form-label"
:class="color"
>{{ label }}</label>
<div class="col-sm-9">
<input
:value="value"
class="form-control"
type="number"
:step="step"
:max="max"
:min="min"
@input="$emit('input', parseInt($event.target.value, 10))"
>
</div>
</div>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
.about-row {
margin-left: 0px;
margin-right: 0px;
}
.red-label {
color: $red_100;
}
.blue-label {
color: $blue_100;
}
.purple-label {
color: $purple_300;
}
.yellow-label {
color: $yellow_50;
}
</style>
<script>
export default {
model: {
prop: 'value',
event: 'input',
},
props: {
label: {
type: String,
required: true,
},
color: {
type: String,
default: 'text-label',
},
value: {
type: Number,
required: true,
},
step: {
type: String,
default: 'any',
},
min: {
},
max: {
},
},
};
</script>
@@ -0,0 +1,235 @@
<template>
<form @submit.prevent="submitClicked()">
<div class="card mt-2">
<div class="card-header">
<h3
class="mb-0 mt-0"
:class="{'open': expand}"
@click="expand = !expand"
>
Stats
</h3>
</div>
<div
v-if="expand"
class="card-body"
>
<stats-row
label="Health"
color="red-label"
:max="maxHealth"
v-model="hero.stats.hp" />
<stats-row
label="Experience"
color="yellow-label"
min="0"
:max="maxFieldHardCap"
v-model="hero.stats.exp" />
<stats-row
label="Mana"
color="blue-label"
min="0"
:max="maxFieldHardCap"
v-model="hero.stats.mp" />
<stats-row
label="Level"
step="1"
min="0"
:max="maxLevelHardCap"
v-model="hero.stats.lvl" />
<stats-row
label="Gold"
min="0"
:max="maxFieldHardCap"
v-model="hero.stats.gp" />
<h3>Stat Points</h3>
<stats-row
label="Unallocated"
min="0"
step="1"
:max="maxStatPoints"
v-model="hero.stats.points" />
<stats-row
label="Strength"
color="red-label"
min="0"
:max="maxStatPoints"
step="1"
v-model="hero.stats.str" />
<stats-row
label="Intelligence"
color="blue-label"
min="0"
:max="maxStatPoints"
step="1"
v-model="hero.stats.int" />
<stats-row
label="Perception"
color="purple-label"
min="0"
:max="maxStatPoints"
step="1"
v-model="hero.stats.per" />
<stats-row
label="Constitution"
color="yellow-label"
min="0"
:max="maxStatPoints"
step="1"
v-model="hero.stats.con" />
<div class="form-group row" v-if="statPointsIncorrect">
<div class="offset-sm-3 col-sm-9 red-label">
Error: Sum of stat points should equal the users level
</div>
</div>
<h3>Buffs</h3>
<stats-row
label="Strength"
color="red-label"
min="0"
step="1"
v-model="hero.stats.buffs.str" />
<stats-row
label="Intelligence"
color="blue-label"
min="0"
step="1"
v-model="hero.stats.buffs.int" />
<stats-row
label="Perception"
color="purple-label"
min="0"
step="1"
v-model="hero.stats.buffs.per" />
<stats-row
label="Constitution"
color="yellow-label"
min="0"
step="1"
v-model="hero.stats.buffs.con" />
<div class="form-group row">
<div class="offset-sm-3 col-sm-9">
<button
type="button"
class="btn btn-warning btn-sm"
@click="resetBuffs">
Reset Buffs
</button>
</div>
</div>
</div>
<div
v-if="expand"
class="card-footer"
>
<input
type="submit"
value="Save"
class="btn btn-primary mt-1"
>
</div>
</div>
</form>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
.about-row {
margin-left: 0px;
margin-right: 0px;
}
</style>
<script>
import {
MAX_HEALTH,
MAX_STAT_POINTS,
MAX_LEVEL_HARD_CAP,
MAX_FIELD_HARD_CAP,
} from '@/../../common/script/constants';
import markdownDirective from '@/directives/markdown';
import saveHero from '../mixins/saveHero';
import { mapState } from '@/libs/store';
import { userStateMixin } from '../../../mixins/userState';
import StatsRow from './stats-row';
function resetData (self) {
self.expand = false;
}
export default {
directives: {
markdown: markdownDirective,
},
components: {
StatsRow,
},
mixins: [
userStateMixin,
saveHero,
],
computed: {
...mapState({ user: 'user.data' }),
statPointsIncorrect () {
return (parseInt(this.hero.stats.points, 10)
+ parseInt(this.hero.stats.str, 10)
+ parseInt(this.hero.stats.int, 10)
+ parseInt(this.hero.stats.per, 10)
+ parseInt(this.hero.stats.con, 10)
) !== this.hero.stats.lvl;
},
},
props: {
resetCounter: {
type: Number,
required: true,
},
hero: {
type: Object,
required: true,
},
},
data () {
return {
expand: false,
maxHealth: MAX_HEALTH,
maxStatPoints: MAX_STAT_POINTS,
maxLevelHardCap: MAX_LEVEL_HARD_CAP,
maxFieldHardCap: MAX_FIELD_HARD_CAP,
};
},
watch: {
resetCounter () {
resetData(this);
},
},
mounted () {
resetData(this);
},
methods: {
submitClicked () {
if (this.statPointsIncorrect) {
return;
}
this.saveHero({
hero: {
_id: this.hero._id,
stats: this.hero.stats,
},
msg: 'Stats',
});
},
resetBuffs () {
this.hero.stats.buffs = {
str: 0,
int: 0,
per: 0,
con: 0,
};
},
},
};
</script>
@@ -1,5 +1,10 @@
<template>
<form @submit.prevent="saveHero({ hero, msg: 'Subscription Perks' })">
<form
@submit.prevent="saveHero({ hero: {
_id: hero._id,
purchased: hero.purchased
}, msg: 'Subscription Perks' })"
>
<div class="card mt-2">
<div class="card-header">
<h3
@@ -0,0 +1,236 @@
<template>
<div class="card mt-2">
<div class="card-header">
<h3
class="mb-0 mt-0"
:class="{'open': expand}"
@click="toggleHistoryOpen"
>
User History
</h3>
</div>
<div
v-if="expand"
class="card-body"
>
<div>
<div class="clearfix">
<div class="mb-4 float-left">
<button
class="page-header btn-flat tab-button textCondensed"
:class="{'active': selectedTab === 'armoire'}"
@click="selectTab('armoire')"
>
Armoire
</button>
<button
class="page-header btn-flat tab-button textCondensed"
:class="{'active': selectedTab === 'questInvites'}"
@click="selectTab('questInvites')"
>
Quest Invitations
</button>
<button
class="page-header btn-flat tab-button textCondensed"
:class="{'active': selectedTab === 'cron'}"
@click="selectTab('cron')"
>
Cron
</button>
</div>
</div>
<div class="row">
<div
v-if="selectedTab === 'armoire'"
class="col-12"
>
<table class="table">
<tr>
<th
v-once
>
{{ $t('timestamp') }}
</th>
<th v-once>
Client
</th>
<th
v-once
>
Received
</th>
</tr>
<tr
v-for="entry in armoire"
:key="entry.timestamp"
>
<td>
<span
v-b-tooltip.hover="entry.timestamp"
>{{ entry.timestamp | timeAgo }}</span>
</td>
<td>{{ entry.client }}</td>
<td>{{ entry.reward }}</td>
</tr>
</table>
</div>
<div
v-if="selectedTab === 'questInvites'"
class="col-12"
>
<table class="table">
<tr>
<th
v-once
>
{{ $t('timestamp') }}
</th>
<th v-once>
Client
</th>
<th v-once>
Quest Key
</th>
<th v-once>
Response
</th>
</tr>
<tr
v-for="entry in questInviteResponses"
:key="entry.timestamp"
>
<td>
<span
v-b-tooltip.hover="entry.timestamp"
>{{ entry.timestamp | timeAgo }}</span>
</td>
<td>{{ entry.client }}</td>
<td>{{ entry.quest }}</td>
<td>{{ entry.response }}</td>
</tr>
</table>
</div>
<div
v-if="selectedTab === 'cron'"
class="col-12"
>
<table class="table">
<tr>
<th
v-once
>
{{ $t('timestamp') }}
</th>
<th v-once>
Client
</th>
<th v-once>
Checkin Count
</th>
</tr>
<tr
v-for="entry in cron"
:key="entry.timestamp"
>
<td>
<span
v-b-tooltip.hover="entry.timestamp"
>{{ entry.timestamp | timeAgo }}</span>
</td>
<td>{{ entry.client }}</td>
<td>{{ entry.checkinCount }}</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
@import '~@/assets/scss/colors.scss';
.page-header.btn-flat {
background: transparent;
}
.tab-button {
height: 2rem;
font-size: 24px;
font-weight: bold;
font-stretch: condensed;
line-height: 1.33;
letter-spacing: normal;
color: $gray-10;
margin-right: 1.125rem;
padding-left: 0;
padding-right: 0;
padding-bottom: 2.5rem;
&.active, &:hover {
color: $purple-300;
box-shadow: 0px -0.25rem 0px $purple-300 inset;
outline: none;
}
}
</style>
<script>
import moment from 'moment';
import { userStateMixin } from '../../../mixins/userState';
export default {
filters: {
timeAgo (value) {
return moment(value).fromNow();
},
},
mixins: [userStateMixin],
props: {
hero: {
type: Object,
required: true,
},
resetCounter: {
type: Number,
required: true,
},
},
data () {
return {
expand: false,
selectedTab: 'armoire',
armoire: [],
questInviteResponses: [],
cron: [],
};
},
watch: {
resetCounter () {
if (this.expand) {
this.retrieveUserHistory();
}
},
},
methods: {
selectTab (type) {
this.selectedTab = type;
},
async toggleHistoryOpen () {
this.expand = !this.expand;
if (this.expand) {
this.retrieveUserHistory();
}
},
async retrieveUserHistory () {
const history = await this.$store.dispatch('adminPanel:getUserHistory', { userIdentifier: this.hero._id });
this.armoire = history.armoire;
this.questInviteResponses = history.questInviteResponses;
this.cron = history.cron;
},
},
};
</script>
@@ -1,5 +1,10 @@
<template>
<form @submit.prevent="saveHero({hero, msg: 'Users Profile'})">
<form
@submit.prevent="saveHero({hero: {
_id: hero._id,
profile: hero.profile
}, msg: 'Users Profile'})"
>
<div class="card mt-2">
<div class="card-header">
<h3
+4 -5
View File
@@ -1,6 +1,7 @@
<template>
<div>
<buy-gems-modal v-if="user" />
<!--modify-inventory(v-if="isUserLoaded")-->
<footer>
<!-- Product -->
<div class="product">
@@ -21,7 +22,7 @@
</a>
</li>
<li>
<router-link :to="user ? '/group-plans' : '/static/group-plans'">
<router-link to="/group-plans">
{{ $t('groupPlans') }}
</router-link>
</li>
@@ -291,7 +292,7 @@
<div
class="time-travel"
v-if="TIME_TRAVEL_ENABLED && user?.permissions?.fullAccess"
v-if="TIME_TRAVEL_ENABLED && user.permissions && user.permissions.fullAccess"
:key="lastTimeJump"
>
<a
@@ -534,8 +535,7 @@ footer {
"donate-text donate-text donate-text donate-button social"
"hr hr hr hr hr"
"copyright copyright melior privacy-terms privacy-terms"
"time-travel time-travel time-travel time-travel time-travel"
"debug-toggle debug-toggle debug-toggle debug-toggle debug-toggle";
"time-travel time-travel debug-toggle debug-toggle debug-toggle";
grid-template-columns: repeat(5, 1fr);
grid-template-rows: auto;
@@ -739,7 +739,6 @@ h3 {
"privacy-policy privacy-policy"
"mobile-terms mobile-terms"
"melior melior"
"time-travel time-travel"
"debug-toggle debug-toggle";
grid-template-columns: repeat(2, 2fr);
grid-template-rows: auto;
@@ -608,9 +608,10 @@ import axios from 'axios';
import hello from 'hellojs';
import debounce from 'lodash/debounce';
import isEmail from 'validator/es/lib/isEmail';
import DOMPurify from 'dompurify';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { buildAppleAuthUrl } from '../../libs/auth';
import sanitizeRedirect from '@/mixins/sanitizeRedirect';
import exclamation from '@/assets/svg/exclamation.svg';
import gryphon from '@/assets/svg/gryphon.svg';
import habiticaIcon from '@/assets/svg/logo-horizontal.svg';
@@ -618,7 +619,6 @@ import googleIcon from '@/assets/svg/google.svg';
import appleIcon from '@/assets/svg/apple_black.svg';
export default {
mixins: [sanitizeRedirect],
data () {
const data = {
username: '',
@@ -747,6 +747,11 @@ export default {
}
});
}, 500),
sanitizeRedirect (redirect) {
if (!redirect) return '/';
const sanitizedString = DOMPurify.sanitize(redirect).replace(/\\|\/\/|\./g, '');
return sanitizedString;
},
async register () {
// @TODO do not use alert
if (!this.email) {
@@ -0,0 +1,214 @@
<!-- THIS IS A VERY OLD FILE DO NOT USE -->
<template>
<div class="create-group-modal-pages">
<div
v-if="activePage === PAGES.CREATE_GROUP"
class="col-12"
>
<h2>{{ $t('nameYourGroup') }}</h2>
<div class="form-group">
<label
class="control-label"
for="new-group-name"
>{{ $t('name') }}</label>
<input
id="new-group-name"
v-model="newGroup.name"
class="form-control input-medium option-content"
required="required"
type="text"
:placeholder="$t('exampleGroupName')"
>
</div>
<div class="form-group">
<label for="new-group-description">{{ $t('description') }}</label>
<textarea
id="new-group-description"
v-model="newGroup.description"
class="form-control option-content"
cols="3"
:placeholder="$t('exampleGroupDesc')"
></textarea>
</div>
<div
v-if="newGroup.type === 'guild'"
class="form-group text-left"
>
<div class="custom-control custom-radio">
<input
v-model="newGroup.privacy"
class="custom-control-input"
type="radio"
name="new-group-privacy"
value="private"
>
<label class="custom-control-label">{{ $t('thisGroupInviteOnly') }}</label>
</div>
</div>
<div class="form-group text-left">
<div class="custom-control custom-checkbox">
<input
id="create-group-leaderOnlyChallenges-checkbox"
v-model="newGroup.leaderOnly.challenges"
class="custom-control-input"
type="checkbox"
>
<label
class="custom-control-label"
for="create-group-leaderOnlyChallenges-checkbox"
>{{ $t('leaderOnlyChallenges') }}</label>
</div>
</div>
<div
v-if="newGroup.type === 'party'"
class="form-group"
>
<button
class="btn btn-secondary form-control"
:value="$t('create')"
@click="createGroup()"
></button>
</div>
<div class="form-group">
<button
class="btn btn-primary btn-lg btn-block"
:disabled="!newGroupIsReady"
@click="createGroup()"
>
{{ $t('create') }}
</button>
</div>
</div>
<div
v-if="activePage === PAGES.PAY"
class="col-12"
>
<h2>{{ $t('choosePaymentMethod') }}</h2>
<payments-buttons
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
:amazon-data="pay(PAYMENTS.AMAZON)"
/>
</div>
</div>
</template>
<style lang="scss" scoped>
h2 {
font-family: 'Varela Round', sans-serif;
font-weight: normal;
font-size: 29px;
color: #34313a;
margin-top: 1em;
}
.box {
border-radius: 2px;
background-color: #ffffff;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
padding: 2em;
text-align: center;
vertical-align: bottom;
height: 100px;
width: 306px;
margin: 0 auto;
margin-bottom: 1em;
}
.box .svg-icon {
margin: 0 auto;
}
.form-group {
text-align: left;
font-weight: bold;
}
.custom-control-input {
z-index: -1;
opacity: 0;
}
.box:hover {
cursor: pointer;
opacity: 0.7;
}
.btn-block {
margin-bottom: 1em;
}
</style>
<script>
import { mapState } from '@/libs/store';
import paymentsMixin from '../../mixins/payments';
import paymentsButtons from '@/components/payments/buttons/list';
export default {
components: {
paymentsButtons,
},
mixins: [paymentsMixin],
data () {
return {
amazonPayments: {},
PAGES: {
CREATE_GROUP: 'create-group',
UPGRADE_GROUP: 'upgrade-group',
PAY: 'pay',
},
PAYMENTS: {
AMAZON: 'amazon',
STRIPE: 'stripe',
},
activePage: 'create-group',
newGroup: {
type: 'guild',
privacy: 'private',
name: '',
leaderOnly: {
challenges: false,
},
},
};
},
computed: {
...mapState({ user: 'user.data' }),
newGroupIsReady () {
return Boolean(this.newGroup.name);
},
},
methods: {
changePage (page) {
this.activePage = page;
window.scrollTo(0, 0);
},
createGroup () {
this.changePage(this.PAGES.PAY);
},
pay (paymentMethod) {
const subscriptionKey = 'group_monthly';
const paymentData = {
subscription: subscriptionKey,
coupon: null,
};
if (this.upgradingGroup && this.upgradingGroup._id) {
paymentData.groupId = this.upgradingGroup._id;
paymentData.group = this.upgradingGroup;
} else {
paymentData.groupToCreate = this.newGroup;
}
this.paymentMethod = paymentMethod;
if (this.paymentMethod === this.PAYMENTS.STRIPE) {
this.redirectToStripe(paymentData);
} else if (this.paymentMethod === this.PAYMENTS.AMAZON) {
paymentData.type = 'subscription';
return paymentData;
}
return null;
},
},
};
</script>
@@ -1,13 +1,16 @@
<template>
<b-modal
id="create-group"
:title="$t('createGroupTitle')"
:title="activePage === PAGES.CREATE_GROUP ? 'Create your Group' : 'Select Payment'"
:hide-footer="true"
:hide-header="true"
size="md"
@hide="onHide()"
>
<div class="col-12">
<div
v-if="activePage === PAGES.CREATE_GROUP"
class="col-12"
>
<!-- HEADER -->
<div
class="modal-close"
@@ -22,7 +25,7 @@
class="btn btn-primary next-button"
:value="$t('next')"
:disabled="!newGroupIsReady"
@click="stripeGroup({ group: newGroup })"
@click="createGroup()"
>
{{ $t('next') }}
</button>
@@ -98,12 +101,25 @@
<button
class="btn btn-primary btn-lg btn-block btn-payment"
:disabled="!newGroupIsReady"
@click="stripeGroup({ group: newGroup })"
@click="createGroup()"
>
{{ $t('nextPaymentMethod') }}
</button>
</div>
</div>
<!-- PAYMENT -->
<!-- @TODO: Separate payment into a separate modal -->
<div
v-if="activePage === PAGES.PAY"
class="col-12 payments"
>
<div class="text-center">
<payments-buttons
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
:amazon-data="pay(PAYMENTS.AMAZON)"
/>
</div>
</div>
</b-modal>
</template>
@@ -179,6 +195,9 @@
width: 200px;
height: 215px;
.dollar {
}
.number {
font-size: 60px;
}
@@ -229,17 +248,31 @@
<script>
import paymentsMixin from '../../mixins/payments';
import { mapState } from '@/libs/store';
import paymentsButtons from '@/components/payments/buttons/list';
import selectTranslatedArray from '@/components/tasks/modal-controls/selectTranslatedArray';
import lockableLabel from '@/components/tasks/modal-controls/lockableLabel';
import * as Analytics from '@/libs/analytics';
export default {
components: {
paymentsButtons,
selectTranslatedArray,
lockableLabel,
},
mixins: [paymentsMixin],
data () {
return {
amazonPayments: {},
PAGES: {
CREATE_GROUP: 'create-group',
// UPGRADE_GROUP: 'upgrade-group',
PAY: 'pay',
},
PAYMENTS: {
AMAZON: 'amazon',
STRIPE: 'stripe',
},
paymentMethod: '',
newGroup: {
type: 'guild',
privacy: 'private',
@@ -251,6 +284,7 @@ export default {
demographics: null,
user: '',
},
activePage: 'create-group',
type: 'guild',
};
},
@@ -268,9 +302,55 @@ export default {
close () {
this.$root.$emit('bv::hide::modal', 'create-group');
},
changePage (page) {
this.activePage = page;
},
createGroup () {
this.changePage(this.PAGES.PAY);
},
pay (paymentMethod) {
const subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
const demographicsKey = this.newGroup.demographics;
const paymentData = {
subscription: subscriptionKey,
coupon: null,
demographics: demographicsKey,
};
Analytics.track({
hitType: 'event',
eventName: 'group plan create',
eventAction: 'group plan create',
eventCategory: 'behavior',
demographics: this.newGroup.demographics,
type: this.newGroup.type,
}, { trackOnClient: true });
if (this.upgradingGroup && this.upgradingGroup._id) {
paymentData.groupId = this.upgradingGroup._id;
paymentData.group = this.upgradingGroup;
} else {
paymentData.groupToCreate = this.newGroup;
}
this.paymentMethod = paymentMethod;
if (this.paymentMethod === this.PAYMENTS.AMAZON) {
paymentData.type = 'subscription';
return paymentData;
}
if (this.paymentMethod === this.PAYMENTS.STRIPE) {
this.redirectToStripe(paymentData);
}
return null;
},
onHide () {
this.sendingInProgress = false;
},
},
};
</script>
@@ -0,0 +1,377 @@
<template>
<b-modal
id="group-plan-overview"
title="Empty"
size="lg"
hide-footer="hide-footer"
>
<div
slot="modal-header"
class="header-wrap text-center"
>
<h2 v-once>
{{ $t('gettingStarted') }}
</h2>
<p v-once>
{{ $t('congratsOnGroupPlan') }}
</p>
</div>
<div class="row">
<div class="col-12">
<div
class="card"
:class="{expanded: expandedQuestions.question1}"
>
<div class="question-head">
<div class="q">
Q.
</div>
<div class="title">
{{ $t('whatsIncludedGroup') }}
</div>
<div
class="arrow float-right"
@click="toggle('question1')"
>
<div
v-if="expandedQuestions.question1"
class="svg-icon"
v-html="icons.upIcon"
></div>
<div
v-else
class="svg-icon"
v-html="icons.downIcon"
></div>
</div>
</div>
<div
v-if="expandedQuestions.question1"
class="question-body"
>
<p>{{ $t('whatsIncludedGroupDesc') }}</p>
</div>
</div>
</div>
<div class="col-12">
<div
class="card"
:class="{expanded: expandedQuestions.question2}"
>
<div class="question-head">
<div class="q">
Q.
</div>
<div class="title">
{{ $t('howDoesBillingWork') }}
</div>
<div
class="arrow float-right"
@click="toggle('question2')"
>
<div
v-if="expandedQuestions.question2"
class="svg-icon"
v-html="icons.upIcon"
></div>
<div
v-else
class="svg-icon"
v-html="icons.downIcon"
></div>
</div>
</div>
<div
v-if="expandedQuestions.question2"
class="question-body"
>
<p>{{ $t('howDoesBillingWorkDesc') }}</p>
</div>
</div>
</div>
<div class="col-12">
<div
class="card"
:class="{expanded: expandedQuestions.question3}"
>
<div class="question-head">
<div class="q">
Q.
</div>
<div class="title">
{{ $t('howToAssignTask') }}
</div>
<div
class="arrow float-right"
@click="toggle('question3')"
>
<div
v-if="expandedQuestions.question3"
class="svg-icon"
v-html="icons.upIcon"
></div>
<div
v-else
class="svg-icon"
v-html="icons.downIcon"
></div>
</div>
</div>
<div
v-if="expandedQuestions.question3"
class="question-body"
>
<p>{{ $t('howToAssignTaskDesc') }}</p>
<div class="assign-tasks image-example"></div>
</div>
</div>
</div>
<div class="col-12">
<div
class="card"
:class="{expanded: expandedQuestions.question4}"
>
<div class="question-head">
<div class="q">
Q.
</div>
<div class="title">
{{ $t('howToRequireApproval') }}
</div>
<div
class="arrow float-right"
@click="toggle('question4')"
>
<div
v-if="expandedQuestions.question4"
class="svg-icon"
v-html="icons.upIcon"
></div>
<div
v-else
class="svg-icon"
v-html="icons.downIcon"
></div>
</div>
</div>
<div
v-if="expandedQuestions.question4"
class="question-body"
>
<p>{{ $t('howToRequireApprovalDesc') }}</p>
<div class="requires-approval image-example"></div>
<p>{{ $t('howToRequireApprovalDesc2') }}</p>
<div class="approval-requested image-example"></div>
</div>
</div>
</div>
<div class="col-12">
<div
class="card"
:class="{expanded: expandedQuestions.question5}"
>
<div class="question-head">
<div class="q">
Q.
</div>
<div class="title">
{{ $t('whatIsGroupManager') }}
</div>
<div
class="arrow float-right"
@click="toggle('question5')"
>
<div
v-if="expandedQuestions.question5"
class="svg-icon"
v-html="icons.upIcon"
></div>
<div
v-else
class="svg-icon"
v-html="icons.downIcon"
></div>
</div>
</div>
<div
v-if="expandedQuestions.question5"
class="question-body"
>
<p>{{ $t('whatIsGroupManagerDesc') }}</p>
<div class="promote-leader image-example"></div>
</div>
</div>
</div>
<div class="col-12 text-center">
<button
class="btn btn-primary close-button"
@click="close()"
>
{{ $t('goToTaskBoard') }}
</button>
</div>
</div>
</b-modal>
</template>
<style>
#group-plan-overview___BV_modal_header_ {
border-bottom: none;
}
</style>
<style lang="scss" scoped>
@import url('https://fonts.googleapis.com/css?family=Varela+Round');
.header-wrap {
padding-left: 4em;
padding-right: 4em;
h2 {
font-size: 32px;
font-weight: bold;
margin-top: 1em;
}
p {
color: #878190;
font-size: 16px;
}
}
.row {
margin-bottom: 2em;
.col-12 {
margin-bottom: .5em;
}
}
.card.expanded {
padding-bottom: 1em;
.title {
color: #4f2a93;
}
}
.card {
min-height: 60px;
border-radius: 4px;
background-color: #ffffff;
border: none;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
.question-head {
.q {
font-family: 'Varela Round', sans-serif;
font-size: 20px;
color: #a5a1ac;
margin: 1em;
}
.title {
font-weight: normal;
}
div {
display: inline-block;
}
.arrow {
margin: 1em;
padding-top: .9em;
.svg-icon {
width: 26px;
height: 16px;
}
}
.arrow:hover {
cursor: pointer;
}
}
.question-body {
padding-left: 4.4em;
padding-right: 4em;
p {
color: #4e4a57;
}
}
}
.image-example {
background-repeat: no-repeat;
margin: 0 auto;
background-position: center;
background-size: contain;
}
.assign-tasks {
background-image: url('~@/assets/images/group-plans/assign-task@3x.png');
width: 400px;
height: 150px;
}
.requires-approval {
background-image: url('~@/assets/images/group-plans/requires-approval@3x.png');
width: 402px;
height: 20px;
margin-bottom: 1em;
}
.approval-requested {
background-image: url('~@/assets/images/group-plans/approval-requested@3x.png');
width: 471px;
height: 204px;
}
.promote-leader {
background-image: url('~@/assets/images/group-plans/promote-leader@3x.png');
width: 423px;
height: 185px;
}
.close-button {
margin-top: 1em;
}
</style>
<script>
import { mapState } from '@/libs/store';
import upIcon from '@/assets/svg/up.svg';
import downIcon from '@/assets/svg/down.svg';
export default {
data () {
return {
icons: Object.freeze({
upIcon,
downIcon,
}),
expandedQuestions: {
question1: false,
question2: false,
question3: false,
question4: false,
question5: false,
},
};
},
computed: {
...mapState({ user: 'user.data' }),
},
methods: {
toggle (question) {
this.expandedQuestions[question] = !this.expandedQuestions[question];
},
close () {
this.$root.$emit('bv::hide::modal', 'group-plan-overview');
},
},
};
</script>
@@ -3,6 +3,7 @@
class="standard-page"
@click="openCreateBtn ? openCreateBtn = false : null"
>
<group-plan-overview-modal />
<task-modal
ref="taskModal"
:task="workingTask"
@@ -186,6 +187,7 @@ import taskDefaults from '@/../../common/script/libs/taskDefaults';
import TaskColumn from '../tasks/column';
import TaskModal from '../tasks/taskModal';
import TaskSummary from '../tasks/taskSummary';
import GroupPlanOverviewModal from './groupPlanOverviewModal';
import toggleSwitch from '@/components/ui/toggleSwitch';
import sync from '../../mixins/sync';
@@ -206,6 +208,7 @@ export default {
TaskColumn,
TaskModal,
TaskSummary,
GroupPlanOverviewModal,
toggleSwitch,
},
mixins: [sync],
@@ -306,6 +309,10 @@ export default {
if (!this.searchId) this.searchId = this.groupId;
this.load();
if (this.$route.query.showGroupOverview) {
this.$root.$emit('bv::show::modal', 'group-plan-overview');
}
this.$root.$on('habitica:team-sync', () => {
this.loadTasks();
this.loadGroupCompletedTodos();
@@ -0,0 +1,465 @@
<template>
<!-- @TODO: Move to group plans folder-->
<div>
<group-plan-creation-modal />
<div>
<div class="header">
<h1
v-once
class="text-center"
>
{{ $t('groupPlanTitle') }}
</h1>
<div class="row">
<div class="col-8 offset-2 text-center">
<h2
v-once
class="sub-text"
>
{{ $t('groupBenefitsDescription') }}
</h2>
</div>
</div>
</div>
<div class="container benefits">
<div class="row">
<div class="col-4">
<div class="box">
<img
class="box1"
src="~@/assets/images/group-plans/group-14@3x.png"
>
<hr>
<h2 v-once>
{{ $t('teamBasedTasks') }}
</h2>
<p v-once>
{{ $t('teamBasedTasksListDesc') }}
</p>
</div>
</div>
<div class="col-4">
<div class="box">
<img
class="box2"
src="~@/assets/images/group-plans/group-12@3x.png"
>
<hr>
<h2 v-once>
{{ $t('groupManagementControls') }}
</h2>
<p v-once>
{{ $t('groupManagementControlsDesc') }}
</p>
</div>
</div>
<div class="col-4">
<div class="box">
<img
class="box3"
src="~@/assets/images/group-plans/group-13@3x.png"
>
<hr>
<h2 v-once>
{{ $t('inGameBenefits') }}
</h2>
<p v-once>
{{ $t('inGameBenefitsDesc') }}
</p>
</div>
</div>
</div>
</div>
<!-- Upgrading an existing group -->
<div
v-if="upgradingGroup._id"
id="upgrading-group"
class="container payment-options"
>
<h1 class="text-center purple-header">
Are you ready to upgrade?
</h1>
<div class="row">
<div class="col-12 text-center mb-4 d-flex justify-content-center">
<div class="purple-box">
<div class="amount-section">
<div class="dollar">
$
</div>
<div class="number">
9
</div>
<div class="name">
Group Owner Subscription
</div>
</div>
<div class="plus">
<div
class="svg-icon"
v-html="icons.positiveIcon"
></div>
</div>
<div class="amount-section">
<div class="dollar">
$
</div>
<div class="number">
3
</div>
<div class="name">
Each Individual Group Member
</div>
</div>
</div>
<div class="box payment-providers">
<payments-buttons
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
:amazon-data="pay(PAYMENTS.AMAZON)"
/>
</div>
</div>
</div>
</div>
<!-- Create a new group -->
<div
v-if="!upgradingGroup._id"
class="container col-6 offset-3 create-option"
>
<div class="row">
<h1 class="col-12 text-center purple-header">
Create Your Group Today!
</h1>
</div>
<div class="row">
<div class="col-12 text-center">
<button
class="btn btn-primary create-group"
@click="launchModal('create-page')"
>
Create Your New Group!
</button>
</div>
</div>
<div class="row pricing justify-content-center align-items-center">
<div class="dollar">
$
</div>
<div class="number">
9
</div>
<div class="name">
<div>Group Owner</div>
<div>Subscription</div>
</div>
<div class="plus">
+
</div>
<div class="dollar">
$
</div>
<div class="number">
3
</div>
<div class="name">
<div>Each Additional</div>
<div>Member</div>
</div>
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
#upgrading-group {
.amount-section {
position: relative;
}
.dollar {
position: absolute;
left: -16px;
top: 16px;
}
.purple-box {
color: #bda8ff;
border-top-right-radius: 0px;
border-bottom-right-radius: 0px;
border-top-left-radius: 8px;
border-bottom-left-radius: 8px;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
}
.number {
font-weight: bold;
color: #fff;
}
.plus .svg-icon{
width: 24px;
}
.payment-providers {
width: 350px;
border-top-right-radius: 8px;
border-bottom-right-radius: 8px;
}
}
.header {
background: #432874;
background: linear-gradient(180deg, #4F2A93 0%, #432874 100%);
color: #fff;
padding: 32px;
height: 340px;
margin-bottom: 32px;
margin-left: -12px;
margin-right: -12px;
h1 {
font-size: 48px;
line-height: 1.16;
margin-top: 12px;
color: #fff;
}
h2.sub-text {
color: #D5C8FF;
font-size: 24px;
font-weight: 400;
line-height: 1.33;
}
}
.benefits {
margin-top: -10em;
.box {
height: 416px;
border-radius: 8px;
}
h2 {
color: #6133b4;
}
}
.box {
border-radius: 2px;
background-color: #ffffff;
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
padding: 2em;
text-align: center;
display: inline-block !important;
vertical-align: bottom;
margin-right: 1em;
img {
margin: 0 auto;
margin-top: 2em;
margin-bottom: 1em;
}
}
img.box1 {
width: 266px;
}
img.box2 {
margin-top: 3.5em;
width: 262px;
margin-bottom: 3.7em;
}
img.box3 {
width: 225px;
margin-bottom: 3.0em;
}
button.create-group {
width: 330px;
height: 96px;
border-radius: 8px;
font-size: 1.5rem;
}
.purple-header {
color: #6133b4;
font-size: 48px;
margin-top: 16px;
}
.pricing {
margin-top: 32px;
margin-bottom: 64px;
.dollar, .number, .name {
display: inline-block;
vertical-align: bottom;
color: #a5a1ac;
}
.plus {
font-size: 2.125rem;
color: #a5a1ac;
margin-left: 16px;
margin-right: 16px;
}
.dollar {
margin-bottom: 24px;
font-size: 2rem;
font-weight: bold;
}
.name {
font-size: 1.5rem;
margin-left: 8px;
margin-right: 8px;
}
.number {
font-size: 4.5rem;
font-weight: bolder;
}
}
.payment-options {
margin-bottom: 64px;
h4 {
color: #34313a;
}
.purple-box {
background-color: #4f2a93;
color: #fff;
padding: 8px;
border-radius: 8px;
width: 200px;
height: 215px;
.dollar {
}
.number {
font-size: 60px;
}
.name {
width: 100px;
margin-left: 4.8px;
}
.plus {
width: 100%;
text-align: center;
}
div {
display: inline-block;
}
}
.box, .purple-box {
display: inline-block;
vertical-align: bottom;
}
}
</style>
<script>
import paymentsMixin from '../../mixins/payments';
import { mapState } from '@/libs/store';
import positiveIcon from '@/assets/svg/positive.svg';
import paymentsButtons from '@/components/payments/buttons/list';
import groupPlanCreationModal from '../group-plans/groupPlanCreationModal';
export default {
components: {
paymentsButtons,
groupPlanCreationModal,
},
mixins: [paymentsMixin],
data () {
return {
amazonPayments: {},
icons: Object.freeze({
positiveIcon,
}),
PAGES: {
CREATE_GROUP: 'create-group',
UPGRADE_GROUP: 'upgrade-group',
PAY: 'pay',
},
PAYMENTS: {
AMAZON: 'amazon',
STRIPE: 'stripe',
},
paymentMethod: '',
newGroup: {
type: 'guild',
privacy: 'private',
name: '',
leaderOnly: {
challenges: false,
},
},
activePage: '',
type: 'guild', // Guild or Party @TODO enum this
};
},
computed: {
newGroupIsReady () {
return Boolean(this.newGroup.name);
},
upgradingGroup () {
return this.$store.state.upgradingGroup;
},
// @TODO: can we move this to payment mixin?
...mapState({ user: 'user.data' }),
},
mounted () {
this.activePage = this.PAGES.BENEFITS;
this.$store.dispatch('common:setTitle', {
section: this.$t('groupPlans'),
});
},
methods: {
launchModal () {
this.$root.$emit('bv::show::modal', 'create-group');
},
createGroup () {
this.changePage(this.PAGES.PAY);
},
pay (paymentMethod) {
const subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
const paymentData = {
subscription: subscriptionKey,
coupon: null,
};
if (this.upgradingGroup && this.upgradingGroup._id) {
paymentData.groupId = this.upgradingGroup._id;
paymentData.group = this.upgradingGroup;
} else {
paymentData.groupToCreate = this.newGroup;
}
this.paymentMethod = paymentMethod;
if (this.paymentMethod === this.PAYMENTS.AMAZON) {
paymentData.type = 'subscription';
return paymentData;
}
if (this.paymentMethod === this.PAYMENTS.STRIPE) {
this.redirectToStripe(paymentData);
}
return null;
},
},
};
</script>
@@ -51,10 +51,10 @@
:class="{'not-participating': !userIsOnQuest}"
>
<div class="col-12 text-center">
<Sprite
<div
class="quest-boss"
:image-name="'quest_' + questData.key"
/>
:class="'quest_' + questData.key"
></div>
<div class="quest-box">
<div
v-if="questData.collect"
@@ -66,7 +66,7 @@
class="quest-item-row"
>
<div class="quest-item-icon">
<Sprite :image-name="'quest_' + questData.key + '_' + key" />
<div :class="'quest_' + questData.key + '_' + key"></div>
</div>
<div class="quest-item-info">
<span class="label quest-label">{{ value.text() }}</span>
@@ -643,7 +643,6 @@ import * as quests from '@/../../common/script/content/quests';
import percent from '@/../../common/script/libs/percent';
import { mapState } from '@/libs/store';
import sidebarSection from '../sidebarSection';
import Sprite from '../ui/sprite';
import questIcon from '@/assets/svg/quest.svg';
import swordIcon from '@/assets/svg/sword.svg';
@@ -654,7 +653,6 @@ import questActionsMixin from '@/components/groups/questActions.mixin';
export default {
components: {
sidebarSection,
Sprite,
},
mixins: [questActionsMixin],
props: ['group'],
@@ -529,7 +529,7 @@ export default {
// List of prompts for user on changes.
// Sounds like we may need a refactor here, but it is clean for now
if (!this.user.flags.welcomed && !this.$route.name.includes('groupPlan')) {
if (!this.user.flags.welcomed) {
if (this.$store.state.avatarEditorOptions) {
this.$store.state.avatarEditorOptions.editingUser = false;
}
@@ -28,6 +28,12 @@
:alt="$t('paypal')"
>&nbsp;
</button>
<amazon-button
v-if="amazonAvailable"
class="payment-item"
:disabled="disabled"
:amazon-data="amazonData"
/>
</div>
</template>
@@ -86,14 +92,21 @@
</style>
<script>
import amazonButton from '@/components/payments/buttons/amazon';
import creditCardIcon from '@/assets/svg/credit-card-icon.svg';
export default {
components: {
amazonButton,
},
props: {
disabled: {
type: Boolean,
default: false,
},
amazonData: {
type: Object,
},
stripeFn: {
type: Function,
},
@@ -115,6 +128,9 @@ export default {
paypalAvailable () {
return typeof this.paypalFn === 'function';
},
amazonAvailable () {
return this.amazonData !== undefined;
},
},
};
</script>
@@ -4,7 +4,7 @@
id="buy-gems"
:hide-footer="true"
size="md"
:modal-class="eventInfo?.class"
:modal-class="eventClass"
>
<div
slot="modal-header"
@@ -21,7 +21,7 @@
class="col-12 text-center"
>
<img
v-if="eventInfo?.name === 'fall_extra_gems'"
v-if="eventName === 'fall_extra_gems'"
:alt="$t('supportHabitica')"
srcset="
~@/assets/images/gems/fall-header.png,
@@ -30,7 +30,7 @@
src="~@/assets/images/gems/fall-header.png"
>
<img
v-else-if="eventInfo?.name === 'spooky_extra_gems'"
v-else-if="eventName === 'spooky_extra_gems'"
:alt="$t('supportHabitica')"
srcset="
~@/assets/images/gems/spooky-header.png,
@@ -51,7 +51,7 @@
</div>
</div>
<div
v-if="eventInfo?.promo === 'g1g1'"
v-if="currentEvent && currentEvent.promo && currentEvent.promo === 'g1g1'"
class="gift-promo-banner d-flex justify-content-around align-items-center px-4"
@click="showSelectUser"
>
@@ -162,31 +162,24 @@
:amazon-data="{type: 'single', gemsBlock: selectedGemsBlock}"
/>
<div
v-if="eventInfo?.name === 'fall_extra_gems' || eventInfo?.name === 'spooky_extra_gems'"
v-if="eventName === 'fall_extra_gems' || eventName === 'spooky_extra_gems'"
class="d-flex flex-column justify-content-center"
>
<h4 class="mt-3 mx-auto">
{{ $t('howItWorks') }}
</h4>
<small class="text-center">
{{ $t('gemSaleHow', {
eventStartMonth: eventInfo.startMonth,
eventStartOrdinal: eventInfo.startOrdinal,
eventEndOrdinal: eventInfo.endOrdinal,
}) }}
{{ $t('gemSaleHow', { eventStartMonth, eventStartOrdinal, eventEndOrdinal }) }}
</small>
<h4 class="mt-3 mx-auto">
{{ $t('limitations') }}
</h4>
<small class="text-center">
{{ $t('gemSaleLimitationsText', {
eventStartMonth: eventInfo.startMonth,
eventStartOrdinal: eventInfo.startOrdinal,
eventStartTime: eventInfo.startTime,
eventEndMonth: eventInfo.endMonth,
eventEndOrdinal: eventInfo.endOrdinal,
eventEndTime: eventInfo.endTime,
timeZone: eventInfo.timeZoneAbbrev,
{{ $t('gemSaleLimitations', {
eventStartMonth,
eventStartOrdinal,
eventEndMonth,
eventEndOrdinal,
}) }}
</small>
</div>
@@ -438,34 +431,37 @@ export default {
originalGemsBlocks: 'content.gems',
currentEventList: 'worldState.data.currentEventList',
}),
eventInfo () {
const currentEvent = find(
this.currentEventList, event => Boolean(event.gemsPromo) || Boolean(event.promo),
);
if (!currentEvent) return null;
// https://stackoverflow.com/questions/1954397/detect-timezone-abbreviation-using-javascript#answer-66180857
const timeZoneAbbrev = new Intl.DateTimeFormat('en-us', { timeZoneName: 'short' })
.formatToParts(new Date())
.find(part => part.type === 'timeZoneName')
.value;
return {
name: currentEvent.event,
class: currentEvent.gemsPromo ? `event-${currentEvent.event}` : '',
gemsPromo: currentEvent.gemsPromo,
promo: currentEvent.promo,
timeZoneAbbrev,
startMonth: moment(currentEvent.start).format('MMMM'),
startOrdinal: moment(currentEvent.start).format('Do'),
startTime: moment(currentEvent.start).format('hh:mm A'),
endMonth: moment(currentEvent.end).format('MMMM'),
endOrdinal: moment(currentEvent.end).format('Do'),
endTime: moment(currentEvent.end).format('hh:mm A'),
};
currentEvent () {
return find(this.currentEventList, event => Boolean(event.gemsPromo) || Boolean(event.promo));
},
eventName () {
return this.currentEvent && this.currentEvent.event;
},
eventClass () {
if (this.currentEvent && this.currentEvent.gemsPromo) {
return `event-${this.eventName}`;
}
return '';
},
eventStartMonth () {
return moment(this.currentEvent.start).format('MMMM');
},
eventStartOrdinal () {
return moment(this.currentEvent.start).format('Do');
},
eventEndMonth () {
return moment(this.currentEvent.end).format('MMMM');
},
eventEndOrdinal () {
return moment(this.currentEvent.end).format('Do');
},
isGemsPromoActive () {
return Boolean(this.eventInfo);
const currEvt = this.currentEvent;
if (currEvt && currEvt.gemsPromo && moment().isBefore(currEvt.end)) {
return true;
}
return false;
},
gemsBlocks () {
// We don't want to modify the original gems blocks when a promotion is running
@@ -480,7 +476,7 @@ export default {
if (this.isGemsPromoActive) {
newBlock.originalGems = originalBlock.gems;
newBlock.gems = (
this.eventInfo.gemsPromo[gemsBlockKey] || originalBlock.gems
this.currentEvent.gemsPromo[gemsBlockKey] || originalBlock.gems
);
}
});
@@ -534,7 +534,7 @@
color: $white;
height: 2rem;
line-height: 16px;
margin: 24px auto -24px;
margin: auto -1rem -1rem;
}
.gems-left {
@@ -847,7 +847,7 @@ export default {
}
if (this.genericPurchase) {
this.makeGenericPurchase(this.item, 'buyModal', this.selectedAmountToBuy);
await this.purchased(this.item.text);
this.purchased(this.item.text);
}
}
@@ -39,16 +39,9 @@ export const QuestHelperMixin = {
return !drop.onlyOwner;
}).map(item => {
if (item.type === 'gear') {
return this.content.gear.flat[item.key];
}
const contentItem = this.content.gear.flat[item.key];
if (item.type === 'quests') {
const questScroll = {};
Object.assign(questScroll, this.content.quests[item.key]);
questScroll.type = 'quests';
questScroll.text = item.text();
questScroll.onlyOwner = item.onlyOwner;
return questScroll;
return contentItem;
}
return {
@@ -1,10 +1,9 @@
<template>
<div class="quest-content">
<Sprite
<div
class="quest-image"
:image-name="item.purchaseType === 'bundles'
? `quest_bundle_${item.key}` : `quest_${item.key}`"
/>
:class="item.purchaseType === 'bundles' ? `quest_bundle_${item.key}` : `quest_${item.key}`"
></div>
<h3 class="text-center">
{{ itemText }}
</h3>
@@ -41,7 +40,6 @@
margin: 0 auto;
margin-bottom: 16px;
margin-top: 24px;
display: block;
}
.leader-label {
@@ -69,13 +67,11 @@
<script>
import QuestInfo from './questInfo.vue';
import UserLabel from '../../userLabel';
import Sprite from '../../ui/sprite';
export default {
components: {
UserLabel,
QuestInfo,
Sprite,
},
props: {
item: {
@@ -1,6 +1,7 @@
<template>
<div
class="notifications"
:class="notificationsTopPosClass"
:style="{'--current-scrollY': notificationTopY}"
>
<transition-group
@@ -103,6 +104,7 @@ export default {
computed: {
...mapState({
notificationStore: 'notificationStore',
userSleeping: 'user.data.preferences.sleep',
currentEventList: 'worldState.data.currentEventList',
}),
currentEvent () {
@@ -111,6 +113,18 @@ export default {
isEventActive () {
return Boolean(this.currentEvent?.event);
},
notificationsTopPosClass () {
const base = 'notifications-top-pos-';
let modifier = '';
if (this.userSleeping) {
modifier = 'sleeping';
} else {
modifier = 'normal';
}
return `${base}${modifier} scroll-${this.scrollY}`;
},
notificationBannerHeight () {
let scrollPosToCheck = 56;
@@ -1,204 +1,228 @@
<template>
<div>
<group-plan-creation-modal />
<div class="d-flex justify-content-center">
<div
class="group-plan-page text-center"
:class="{ static: isStaticPage }"
>
<div class="group-plan-static text-center">
<amazon-payments-modal />
<div class="container">
<div class="row top">
<div class="top-left"></div>
<div class="col-6 offset-3 mb-100">
<div class="col-6 offset-3">
<img
class="party"
src="../../assets/images/group-plans-static/party@3x.png"
>
<h1 class="mt-5" v-if="upgradingGroup._id">{{ $t('upgradeYourCrew') }}</h1>
<h1 class="mt-5" v-else>{{ $t('groupPlanTitle') }}</h1>
<p class="mb-0">{{ $t('groupPlanDesc') }}</p>
<div class="pricing mt-5">
<h1>{{ $t('groupPlanTitle') }}</h1>
<p>{{ $t('groupPlanDesc') }}</p>
<div class="pricing">
<span>Just</span>
<span class="number">$9</span>
<span class="bold">per month +</span>
<span class="number">$3</span>
<span class="bold">per additional member*</span>
<span class="bold">per member*</span>
</div>
<div class="text-center">
<button
class="btn btn-primary cta-button white mt-4 mb-3"
class="btn btn-primary cta-button"
@click="goToNewGroupPage()"
>
{{ $t('getStarted') }}
</button>
</div>
<p class="gray-200">{{ $t('billedMonthly') }}</p>
<small>{{ $t('billedMonthly') }}</small>
</div>
<div class="top-right"></div>
<div class="d-flex justify-content-between align-items-middle w-100 gap-72 mb-100">
<div class="ml-auto my-auto w-448 text-left">
<h2 class="mt-0">{{ $t('teamBasedTasksList') }}</h2>
<p>{{ $t('teamBasedTasksListDesc') }}</p>
</div>
<div class="mr-auto my-auto">
<img src="../../assets/images/group-plans-static/group-management@3x.png">
</div>
</div>
<div class="row">
<div class="text-col col-12 col-md-6 text-left">
<h2>{{ $t('teamBasedTasksList') }}</h2>
<p>{{ $t('teamBasedTasksListDesc') }}</p>
</div>
<div class="d-flex justify-content-between align-items-middle w-100 gap-72 mb-100">
<div class="ml-auto my-auto">
<img src="../../assets/images/group-plans-static/team-based@3x.png">
</div>
<div class="mr-auto my-auto w-448 text-left">
<h2 class="mt-0">{{ $t('groupManagementControls') }}</h2>
<p>{{ $t('groupManagementControlsDesc') }}</p>
</div>
<div class="col-12 col-md-6">
<div
class="team-based"
v-html="svg.teamBased"
></div>
</div>
<div class="d-flex flex-column justify-content-center">
</div>
<div class="row">
<div class="col-12 col-md-6">
<div
class="group-management"
v-html="svg.groupManagement"
></div>
</div>
<div class="text-col col-12 col-md-6 text-left">
<h2>{{ $t('groupManagementControls') }}</h2>
<p>{{ $t('groupManagementControlsDesc') }}</p>
</div>
</div>
<div class="row">
<div class="col-12 col-md-6 offset-md-3 text-center">
<img
class="big-gem mb-3 mx-auto"
class="big-gem"
src="../../assets/images/group-plans-static/big-gem@3x.png"
>
<h2 class="mt-3">{{ $t('inGameBenefits') }}</h2>
<p class="final-paragraph mx-auto">{{ $t('inGameBenefitsDesc') }}</p>
<h2>{{ $t('inGameBenefits') }}</h2>
<p>{{ $t('inGameBenefitsDesc') }}</p>
</div>
<div class="text-center mb-128">
<div class="bot-left"></div>
<div class="col-6 offset-3">
<h2 class="purple-300 mt-0 mb-4" v-if="upgradingGroup._id">
{{ $t('readyToUpgrade') }}
</h2>
<h2 v-else class="purple-300 mt-0 mb-4">
{{ $t('createGroupToday') }}
</h2>
<div class="pricing mb-4">
<span>Just</span>
<span class="number">$9</span>
<span class="bold">per month +</span>
<span class="number">$3</span>
<span class="bold">per member*</span>
</div>
<div class="text-center mb-3">
<button
class="btn btn-primary cta-button white"
@click="goToNewGroupPage()"
>
{{ $t('getStarted') }}
</button>
</div>
<p class="gray-200">{{ $t('billedMonthly') }}</p>
</div>
<div class="row">
<div class="bot-left"></div>
<div class="col-6 offset-3">
<h2 class="purple">
{{ $t('inspireYourParty') }}
</h2>
<div class="pricing">
<span>Just</span>
<span class="number">$9</span>
<span class="bold">per month +</span>
<span class="number">$3</span>
<span class="bold">per member*</span>
</div>
<div class="bot-right"></div>
<div class="text-center">
<button
class="btn btn-primary cta-button"
@click="goToNewGroupPage()"
>
{{ $t('getStarted') }}
</button>
</div>
<small>{{ $t('billedMonthly') }}</small>
</div>
<b-modal
id="group-plan"
title
size="md"
:hide-footer="true"
:hide-header="true"
>
<div>
<h2>{{ $t('letsMakeAccount') }}</h2>
<auth-form @authenticate="authenticate()" />
</div>
</b-modal>
<div class="bot-right"></div>
</div>
</div>
<div
class="bottom-banner text-center"
:class="{ static: isStaticPage }"
<b-modal
id="group-plan"
title
size="md"
:hide-footer="true"
:hide-header="true"
>
<h2 class="white">{{ $t('interestedLearningMore') }}</h2>
<p class="purple-600" v-html="$t('checkGroupPlanFAQ')"></p>
</div>
<div v-if="modalPage === 'account'">
<h2>{{ $t('letsMakeAccount') }}</h2>
<auth-form @authenticate="authenticate()" />
</div>
<div v-if="modalPage === 'purchaseGroup'">
<create-group-modal-pages />
</div>
</b-modal>
</div>
</template>
<style lang='scss'>
.bottom-banner > .purple-600 {
color: #D5C8FF !important;
a {
color: #D5C8FF;
text-decoration: underline;
}
}
</style>
<style lang='scss' scoped>
@import url('https://fonts.googleapis.com/css?family=Varela+Round');
@import '~@/assets/scss/colors.scss';
// General typography tweaks
h1, h2 {
font-family: 'Varela Round', sans-serif;
font-weight: 400;
font-weight: normal;
}
.party {
width: 386px;
margin-top: 4em;
}
.team-based {
background-image: url('../../assets/images/group-plans-static/group-management@3x.png');
background-size: contain;
position: absolute;
height: 356px;
width: 411px;
margin-top: -2em;
}
.group-management {
background-image: url('../../assets/images/group-plans-static/team-based@3x.png');
background-size: contain;
position: absolute;
height: 294px;
width: 411px;
}
.top-left, .top-right, .bot-left, .bot-right {
width: 273px;
height: 396px;
background-size: contain;
position: absolute;
}
.top-left {
background-image: url('../../assets/images/group-plans-static/top-left@3x.png');
left: 4em;
height: 420px;
}
.top-right {
background-image: url('../../assets/images/group-plans-static/top-right@3x.png');
right: 4em;
height: 420px;
}
.bot-left {
background-image: url('../../assets/images/group-plans-static/bot-left@3x.png');
left: 4em;
bottom: 1em;
}
.bot-right {
background-image: url('../../assets/images/group-plans-static/bot-right@3x.png');
right: 4em;
bottom: 1em;
}
h1 {
color: $purple-300;
font-size: 48px;
line-height: 56px;
font-size: 42px;
color: #34313a;
line-height: 1.17;
}
h2 {
color: $gray-50;
font-size: 32px;
line-height: 40px;
font-size: 29px;
color: #34313a;
margin-top: 1em;
}
.purple {
color: #6133b4;
}
p {
color: $gray-100;
font-size: 20px;
line-height: 28px;
color: #878190;
}
// Major layout elements
.group-plan-static {
margin-top: 6em;
position: relative;
}
.bottom-banner {
height: 152px;
background-image: linear-gradient(rgba(97, 51, 180), rgba(79, 42, 147));
padding-top: 32px;
width: 100vw;
.row {
margin-top: 10em;
margin-bottom: 10em;
}
&.static {
padding-top: 16px;
}
.text-col {
margin-top: 3em;
}
&:not(.static) {
margin-left: -12px;
}
.big-gem {
width: 138.5px;
}
.cta-button {
font-family: 'Varela Round', sans-serif;
font-weight: normal;
padding: 1em 2em;
border-radius: 8px;
background-color: $purple-300;
margin-top: 1em;
margin-bottom: 1em;
border-radius: 4px;
background-color: #6133b4;
box-shadow: inset 0 -4px 0 0 rgba(52, 49, 58, 0.4);
font-size: 20px;
line-height: 28px;
&.btn-primary:hover {
background-color: $purple-400;
}
}
.final-paragraph {
width: 684px;
margin-bottom: 11rem;
}
.group-plan-page {
max-width: 1440px;
position: relative;
&.static {
margin-top: 56px;
}
color: #fff;
}
.pricing {
color: $gray-100;
color: #878190;
font-size: 24px;
span {
@@ -210,103 +234,40 @@
}
.number {
color: $green-10;
color: #1ca372;
font-weight: bold;
}
}
// One-off spacing adjustments
.gap-72 {
gap: 72px;
}
.mb-100 {
margin-bottom: 100px !important;
}
.mb-128 {
margin-bottom: 128px !important;
}
.w-448 {
width: 448px;
}
// Images
.big-gem {
width: 138.5px;
}
.bot-left, .bot-right, .top-left, .top-right {
width: 246px;
height: 340px;
background-size: contain;
position: absolute;
background-repeat: no-repeat;
}
.bot-left {
background-image: url('../../assets/images/group-plans-static/bot-left@3x.png');
left: 48px;
bottom: 48px;
}
.bot-right {
background-image: url('../../assets/images/group-plans-static/bot-right@3x.png');
right: 48px;
bottom: 48px;
}
.party {
width: 386px;
margin-top: 100px;
}
.top-left {
background-image: url('../../assets/images/group-plans-static/top-left@3x.png');
top: 48px;
left: 48px;
}
.top-right {
background-image: url('../../assets/images/group-plans-static/top-right@3x.png');
right: 48px;
top: 48px;
small {
font-size: 16px;
color: #a5a1ac;
}
</style>
<script>
import { setup as setupPayments } from '@/libs/payments';
import paymentsMixin from '../../mixins/payments';
import amazonPaymentsModal from '@/components/payments/amazonModal';
import AuthForm from '../auth/authForm.vue';
import GroupPlanCreationModal from '../group-plans/groupPlanCreationModal.vue';
import CreateGroupModalPages from '../group-plans/createGroupModalPages.vue';
import party from '../../assets/images/group-plans-static/party.svg';
export default {
components: {
AuthForm,
GroupPlanCreationModal,
CreateGroupModalPages,
amazonPaymentsModal,
},
mixins: [paymentsMixin],
data () {
return {
modalOption: '',
modalPage: 'account',
svg: {
party,
},
modalTitle: this.$t('register'),
modalPage: 'account',
};
},
computed: {
isStaticPage () {
return this.$route.meta.requiresLogin === false;
},
upgradingGroup () {
return this.$store.state.upgradingGroup;
},
user () {
return this.$store.state.user?.data;
},
},
mounted () {
this.$nextTick(() => {
// Load external scripts after the app has been rendered
@@ -317,19 +278,11 @@ export default {
});
},
methods: {
authenticate () {
this.$root.$emit('bv::hide::modal', 'group-plan');
this.$root.$emit('bv::show::modal', 'create-group');
},
goToNewGroupPage () {
if (this.isStaticPage && !this.user) {
this.modalOption = 'static';
return this.$root.$emit('bv::show::modal', 'group-plan');
}
if (this.upgradingGroup._id) {
return this.stripeGroup({ group: this.upgradingGroup, upgrade: true });
}
return this.$root.$emit('bv::show::modal', 'create-group');
this.$root.$emit('bv::show::modal', 'group-plan');
},
authenticate () {
this.modalPage = 'purchaseGroup';
},
},
};
@@ -784,7 +784,6 @@ import debounce from 'lodash/debounce';
import isEmail from 'validator/es/lib/isEmail';
import { MINIMUM_PASSWORD_LENGTH } from '@/../../common/script/constants';
import { buildAppleAuthUrl } from '../../libs/auth';
import sanitizeRedirect from '@/mixins/sanitizeRedirect';
import googlePlay from '@/assets/images/home/google-play-badge.svg';
import iosAppStore from '@/assets/images/home/ios-app-store.svg';
import iphones from '@/assets/images/home/iphones.svg';
@@ -805,7 +804,6 @@ import makeuseof from '@/assets/images/home/make-use-of.svg';
import thenewyorktimes from '@/assets/images/home/the-new-york-times.svg';
export default {
mixins: [sanitizeRedirect],
data () {
return {
icons: Object.freeze({
@@ -925,9 +923,7 @@ export default {
groupInvite,
});
const redirect = this.sanitizeRedirect(this.$route.query.redirectTo);
window.location.href = redirect;
window.location.href = this.$route.query.redirectTo || '/';
},
playButtonClick () {
this.$router.push('/register');
@@ -8,10 +8,7 @@
'white-header': $route.name === 'plans'
}"
/>
<div
class="static-wrapper"
:class="{ 'groups-bg': $route.name === 'groupPlans' }"
>
<div class="static-wrapper">
<router-view />
</div>
<div
@@ -208,13 +205,6 @@
.strong {
font-weight: bold;
}
&.groups-bg {
background-color: $white;
background-image: url('../../assets/images/group-plans-static/top.svg');
background-repeat: no-repeat;
background-position-y: 56px;
}
}
</style>
@@ -318,10 +318,6 @@
color: $gray-50;
}
td span {
line-break: anywhere;
}
th, td {
padding-top: 0.35rem !important;
padding-bottom: 0.35rem !important;
+1
View File
@@ -22,6 +22,7 @@ import getStore from './store';
import StoreModule from './libs/store';
import './filters/registerGlobals';
import i18n from './libs/i18n';
import 'smartbanner.js/dist/smartbanner';
const IS_PRODUCTION = process.env.NODE_ENV === 'production'; // eslint-disable-line no-process-env
-26
View File
@@ -6,7 +6,6 @@ import { mapState } from '@/libs/store';
import encodeParams from '@/libs/encodeParams';
import notificationsMixin from '@/mixins/notifications';
import { CONSTANTS, setLocalSetting } from '@/libs/userlocalManager';
import * as Analytics from '@/libs/analytics';
const STRIPE_PUB_KEY = process.env.STRIPE_PUB_KEY;
@@ -199,16 +198,6 @@ export default {
alert(`Error while redirecting to Stripe: ${checkoutSessionResult.error.message}`);
throw checkoutSessionResult.error;
}
if (paymentType === 'groupPlan') {
Analytics.track({
hitType: 'event',
eventName: 'group plan create',
eventAction: 'group plan create',
eventCategory: 'behavior',
demographics: appState.newGroup.demographics,
type: appState.newGroup.type,
}, { trackOnClient: true });
}
} catch (err) {
console.error('Error while redirecting to Stripe', err); // eslint-disable-line
alert(`Error while redirecting to Stripe: ${err.message}`);
@@ -381,20 +370,5 @@ export default {
window.alert(e.response.data.message); // eslint-disable-line no-alert
}
},
stripeGroup (options = { group: {}, upgrade: false }) {
const paymentData = {
subscription: 'group_monthly',
coupon: null,
};
if (options.upgrade && options.group._id) {
paymentData.groupId = options.group._id;
paymentData.group = options.group;
} else {
paymentData.groupToCreate = options.group;
}
this.redirectToStripe(paymentData);
},
},
};
@@ -1,16 +0,0 @@
export default {
methods: {
sanitizeRedirect (redirect) {
if (!redirect) {
return '/';
}
if (process.env.TRUSTED_DOMAINS.split(',').includes(redirect)) {
return redirect;
}
if (redirect.slice(0, 1) !== '/' || redirect.slice(1, 1) === '/') {
return '/';
}
return redirect;
},
},
};
+1 -7
View File
@@ -24,7 +24,7 @@
<app-menu />
<div
class="container-fluid"
:class="{'no-margin': noMargin, 'groups-background': $route.fullPath === '/group-plans' }"
:class="{'no-margin': noMargin}"
>
<app-header />
<buyModal
@@ -67,12 +67,6 @@
.container-fluid {
flex: 1 0 auto;
&.groups-background {
background-color: white;
background-image: url('../assets/images/group-plans-static/top.svg');
background-repeat: no-repeat;
}
}
.no-margin {
@@ -37,6 +37,15 @@ export default function handleRedirect (to, from, next) {
const newGroup = newAppState.group;
if (newGroup && newGroup._id) {
// Handle new user signup
if (newAppState.newSignup === true) {
return next({
name: 'groupPlanDetailTaskInformation',
params: { groupId: newGroup._id },
query: { showGroupOverview: 'true' },
});
}
return next({
name: 'groupPlanDetailTaskInformation',
params: { groupId: newGroup._id },
+1 -1
View File
@@ -41,7 +41,7 @@ const StablePage = () => import(/* webpackChunkName: "inventory" */'@/components
// Guilds & Parties
const GroupPage = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/group');
const GroupPlansAppPage = () => import(/* webpackChunkName: "guilds" */ '@/components/static/groupPlans');
const GroupPlansAppPage = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/groupPlan');
const LookingForParty = () => import(/* webpackChunkName: "guilds" */ '@/components/groups/lookingForParty');
// Group Plans
@@ -5,3 +5,9 @@ export async function searchUsers (store, payload) {
const response = await axios.get(url);
return response.data.data;
}
export async function getUserHistory (store, payload) {
const url = `/api/v4/admin/user/${payload.userIdentifier}/history`;
const response = await axios.get(url);
return response.data.data;
}
@@ -2,6 +2,7 @@
"backgrounds": "Фонови изображения",
"background": "Фоново изображение",
"backgroundShop": "Магазин за фонови изображения",
"backgroundShopText": "Магазин за фонови изображения",
"noBackground": "Няма избрано фоново изображение",
"backgrounds062014": "КОМПЛЕКТ 1: юни 2014",
"backgroundBeachText": "Плаж",
+8
View File
@@ -6,6 +6,8 @@
"keepIt": "Запазване",
"removeIt": "Премахване",
"brokenChallenge": "Повредена връзка на предизвикателство: тази задача е била част от предизвикателство, но то (или групата) е било изтрито. Какво бихте искали да направите с останалите задачи?",
"keepThem": "Запазване на задачите",
"removeThem": "Премахване на задачите",
"challengeCompleted": "Това предизвикателство е приключило и победителят е <span class=\"badge\"><%- user %></span>! Какво искате да направите с останалите задачи?",
"unsubChallenge": "Повредена връзка на предизвикателство: тази задача е била част от предизвикателство, но Вие сте се отписали от него. Какво искате да направите с останалите задачи?",
"challenges": "Предизвикателства",
@@ -21,20 +23,25 @@
"createChallenge": "Създаване на предизвикателство",
"createChallengeAddTasks": "Добавяне на задачи в предизвикателството",
"createChallengeCloneTasks": "Клониране на задачите в предизвикателството",
"addTaskToChallenge": "Добавяне на задача",
"challengeTag": "Име на етикета",
"prize": "Награда",
"prizePopTavern": "Ако предизвикателството Ви може да бъде „спечелено“, може да наградите победителя с диаманти. Максималната награда е броят на Вашите диаманти. Забележка: Наградата не може да бъде променена по-късно, а цената на предизвикателствата в кръчмата не може да бъде възстановена, ако предизвикателството бъде прекратено.",
"publicChallengesTitle": "Обществени предизвикателства",
"officialChallenge": "Официално предизвикателство на Хабитика",
"by": "от",
"participants": "Участници: <%= membercount %>",
"join": "Присъединяване",
"exportChallengeCSV": "Изнасяне като CSV",
"challengeCreated": "Предизвикателството е създадено",
"sureDelCha": "Наистина ли искате да изтриете това предизвикателство?",
"sureDelChaTavern": "Наистина ли искате да изтриете това предизвикателство? Диамантите Ви няма да бъдат възстановени.",
"keepTasks": "Запазване на задачите",
"owned": "Собствени",
"not_owned": "Чужди",
"not_participating": "Не участвате",
"clone": "Копиране",
"congratulations": "Поздравления!",
"hurray": "Ура!",
"noChallengeOwner": "без притежател",
"challengeMemberNotFound": "Потребителят не е намерен сред участниците в предизвикателството",
@@ -55,6 +62,7 @@
"myChallenges": "Моите предизвикателства",
"findChallenges": "Разглеждане на предизвикателствата",
"noChallengeTitle": "Нямате никакви предизвикателства.",
"challengeDescription1": "Предизвикателствата са обществени събития, в които играчите се състезават и печелят награди като изпълняват няколко свързани по някакъв начин задачи.",
"challengeDescription2": "Открийте препоръчани за Вас предизвикателства според интересите Ви, разгледайте обществените предизвикателства на Хабитика, или създайте свои собствени предизвикателства.",
"noChallengeMatchFilters": "Не можем да открием съответстващи предизвикателства.",
"createdBy": "Създадено от",
+5 -9
View File
@@ -2,7 +2,7 @@
"communityGuidelinesWarning": "Имайте предвид, че екранното Ви име, профилната снимка и информацията за Вас трябва да отговорят на <a href='https://habitica.com/static/community-guidelines' target='_blank'>Обществените правила</a> (тоест без ругатни, съдържание за възрастни, обиди и т.н.). Ако имате въпроси относно това дали нещо е подходящо или не, можете да пишете на <%= hrefBlankCommunityManagerEmail %>!",
"profile": "Профил",
"avatar": "Персонализиране на героя",
"editAvatar": "Редактиране на Героя",
"editAvatar": "Редактиране на героя",
"noDescription": "Този хабитиканец не е добавил описание.",
"noPhoto": "Този хабитиканец не е добавил снимка.",
"other": "Други",
@@ -27,10 +27,12 @@
"color": "Цвят",
"hair": "Коса",
"bangs": "Бретон",
"hairBangs": "Бретон",
"glasses": "Очила",
"hairSet1": "Прически — комплект 1",
"hairSet2": "Прически — комплект 2",
"hairSet3": "Прически — комплект 3",
"bodyFacialHair": "Лицево окосмяване",
"beard": "Брада",
"mustache": "Мустак",
"flower": "Цвете",
@@ -85,6 +87,7 @@
"allocateIntPop": "Добавяне на точка към Интелигентност",
"noMoreAllocate": "След като достигнахте ниво 100, вече няма да получавате повече показателни точки. Може да продължавате да вдигате нива или да започнете ново приключение от ниво 1, използвайки <a href='https://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Кълбото на прераждането</a>!",
"stats": "Показатели",
"achievs": "Постижения",
"strength": "Сила",
"strText": "Силата увеличава шанса за случайни „критични удари“, както и златото, опита и шансовете за падане на предмет от тях. Тя също помага за нанасянето на щети на чудовищата-главатари.",
"constitution": "Якост",
@@ -184,12 +187,5 @@
"purchasePetItemConfirm": "Тази покупка би надвишила броя на предметите, които са ви нужни за да излюпите всички възможни <%= itemText %> любимци. Сигурни ли сте?",
"purchaseForGold": "Купуване за <%= cost %> Злато?",
"notEnoughGold": "Недостатъчно злато.",
"nextReward": "Следваща награда при влизане",
"skins": "Кожи",
"titleHaircolor": "Цвят на коса",
"titleHairbase": "Прически",
"titleFacialHair": "Окосмяване",
"customizations": "Персонализации",
"chatCastSpellPartyTimes": "<%= username %> използва заклинанието <%= spell %> върху групата <%= times %> пъти.",
"chatCastSpellUserTimes": "<%= username %> използва заклинанието <%= spell %> върху <%= target %> <%= times %> пъти."
"nextReward": "Следваща награда при влизане"
}
@@ -9,14 +9,32 @@
"commGuidePara015": "В Хабитика има два вида места за общуване: обществени и частни. Обществените включват кръчмата, обществените гилдии, GitHub, Trello и уикито. Частните са частните гилдии, груповия чат и личните съобщения. Всички екранни имена трябва да отговарят на Правилата на обществените места. За да промените екранното си име, отидете в Потребител -> Профил и натиснете бутона „Редактиране“.",
"commGuidePara016": "Когато посещавате обществените места в Хабитика, трябва да спазвате някои общи правила, които гарантират безопасността и любезността. Те не би трябвало да представляват трудност за приключенци като Вас!",
"commGuideList02A": "<strong>Уважавайте се взаимно.</strong> Бъдете учтиви, мили, приятелски настроени и отзивчиви. Запомнете: хабитиканците идват от всички краища на света и имат различни култури. Това е една от причините, поради които Хабитика е толкова страхотна! Изграждането на общност означава да уважаваме и да се радваме на разликите си така, както и на приликите си. Ето няколко лесни начина да се уважаваме взаимно.",
"commGuideList02B": "<strong>Спазвайте всички <a href='/static/terms' target='_blank'>Правила и условия</a></strong>.",
"commGuideList02C": "<strong>Не публикувайте изображения или текст, които са неприятни, заплашителни, със сексуален характер или които насърчават към дискриминация, фанатизъм, расизъм, омраза, тормоз или насилие към който и да е човек или група.</strong> Дори и на шега. Без обиди и оприличавания. Не всички имат еднакво чувство за хумор, така че ако нещо Ви се струва смешно, то за другиго може да е обидно. Нападайте ежедневните си задачи, а не един-другиго.",
"commGuideList02D": "<strong>Обсъжданията са достъпни за хора от всички възрасти. Внимавайте с езика.</strong> Има много млади хабитиканци, които използват уеб сайта! Нека не опетняваме невинността им и нека не им пречим да постигнат целите си.",
"commGuideList02E": "<strong>Избягвайте ругатните. Това включва дори леките, религиозни клетви, които може да са приемливи на други места.</strong> Тук има всякакви хора и искаме всички те да се чувстват приети в обществените места. <strong>Ако някой модератор или член на екипа Ви каже, че дадена дума не бива да се използва в Хабитика, дори това да не Ви се струва така, спазвайте това, задължително!</strong> Освен това, обидите ще бъдат наказвани строго, тъй като те нарушават и Условията на услугата.",
"commGuideList02F": "<strong>Избягвайте продължителни обсъждания на теми, които предизвикват разногласия, в кръчмата, той като тя не е мястото за това.</strong>Ако смятате, че някой е казал нещо грубо или обидно, не се разправяйте с него. Ако някой спомене нещо, което е позволено от правилата, но Ви обижда или наранява по някакъв начин, може учтиво да му обясните това. Ако обаче е против правилата или Условията на услугата, трябва да го докладвате и да оставите модераторите да му отговорят. Ако не знаете кое е по-правилно, по-добре докладвайте публикацията.",
"commGuideList02G": "<strong>Спазвайте това, което Ви казват модераторите</strong>. Те може да искат от Вас да публикувате определени съобщения само на определени места, да редактирате профила си, за да премахнете неподходящото съдържание, да преместите дискусията си на по-подходящо място и т.н.",
"commGuideList02J": "<strong>Не пълнете чата с нежелани съобщения</strong>. Това включва (списъкът не е изчерпателен): публикуването на едно и също съобщение на няколко места, публикуването на връзки без обяснение или контекст, публикуването на безсмислени съобщения, публикуването на множество реклами за една и съща гилдия, група или предизвикателство, или публикуването на множество съобщения едно след друго. Молбите за диаманти или абонамент в чатовете или в лични съобщения също спада към тази категория. Ако щракването на публикувана от Вас връзка Ви носи някакви облаги, трябва да обявите това в съобщението си, иначе то също ще спада към тази категория.<br/><br/>Модераторите имат правото да преценяват дали нещо спада към категорията на нежеланите съобщения или не, независимо от Вашето мнение. Например: рекламирането на гилдия веднъж или два пъти може да е приемливо, но ако го направите няколко пъти за един ден, то това ще бъде прието за нежелано съобщение, независимо колко полезна е въпросната гилдия!",
"commGuideList02K": "<strong>Избягвайте публикуването на уголемен текст в обществените места, особено в кръчмата.</strong> Също като писането само с ГЛАВНИ БУКВИ, това изглежда сякаш крещите и нарушава спокойната обстановка.",
"commGuideList02L": "<strong>Съветваме Ви да се споделяте лична информация в обществените места, особено такава, която може да помогне на някого да Ви идентифицира.</strong> Такава информация може да бъде (но не само): адрес, е-поща, жетон за ППИ, парола. Това е за Ваша защита! Екипът и модераторите могат да премахнат подобни публикации по собствена преценка. Ако някой иска от Вас лична информация в частна гилдия, група или чрез ЛС, нашият съвет е да откажете учтиво и да уведомите екипа и модераторите, като или: 1) докладвате съобщението, ако то е публикувано в група или частна гилдия, или 2) попълните <a href='https://contact.habitica.com/' target='_blank'>формуляра за връзка с модератор</a> и включите снимки на екрана.",
"commGuidePara019": "<strong>В частните места</strong> потребителите имат повече свобода да обсъждат каквото искат, но пак може да нарушат Правилата и условията, като например публикуват обидни, дискриминиращи, груби или заплашителни съобщения. Имайте предвид, че тъй като имената на предизвикателствата се виждат в обществения профил на победителя, ВСИЧКИ имена на предизвикателства трябва да спазват Правилата на обществените места, дори да се появяват в частни места.",
"commGuidePara020": "<strong>Личните съобщения (ЛС)</strong> имат още някои правила. Ако някой Ви е блокирал, не се опитвайте да се свържете с него по друг начин, за да го молите да премахне блокирането. Освен това, не бива да изпращате ЛС на някого и да го молите да Ви помогне (тъй като видимите в общността отговори на заявки за помощ биха били в помощ за всички). И накрая, не изпращайте лични съобщения с молба за подаръци, диаманти или абонамент, тъй като това би се окачествило като нежелана поща.",
"commGuidePara020A": "<strong>Ако видите публикация, който според Вас нарушава обществените правила, описани по-горе, или която се отнася до Вас или Ви кара да се чувствате неудобно, можете да я посочите на модераторите и екипа като щракнете върху иконката за докладване.</strong> Член на екипа или модератор ще обърне внимания на ситуацията възможно най-скоро. Имайте предвид, че нарочното докладване на най-обикновени публикации, които нямат проблеми, е нарушение на правилата (вижте по-долу в раздела „Нарушения“). В момента не могат да се докладват лични съобщения, така че ако имате нужда да докладвате ЛС, моля, свържете се с модераторите чрез страницата за „Връзка с нас“, която можете да достъпите и чрез помощното меню, като натиснете „<a href='https://contact.habitica.com/' target='_blank'>Връзка с екипа на модераторите</a>“. Това може да Ви потрябва, ако сте забелязали няколко проблемни публикации от един и същ човек в няколко гилдии, или ако ситуацията изисква по-подробно обяснение. Можете да се свържете с нас на собствения си език, ако това Ви е по-лесно – може да се наложи да използваме преводача на Гугъл, но за нас е по-важно да не се притеснявате да докладвате нещата, които Ви притесняват.",
"commGuidePara021": "Освен това, някои обществени места в Хабитика имат допълнителни правила.",
"commGuideHeadingTavern": "Кръчмата",
"commGuidePara022": "Кръчмата е основното място за общуване на хабитиканците. Даниел Кръчмаря управлява мястото, а Lemoness с радост ще Ви забърка лимонада, докато си почивате и разговаряте. Само имайте предвид, че…",
"commGuidePara023": "<strong>Разговорите обикновено са на общи теми или са свързани с продуктивността и подобряването на живота.</strong>Кръчмата може да запази 200 съобщения, поради което <strong>не е подходящо място за дълги обсъждания, особено на чувствителни теми</strong> (като политика, религия, депресия, за или против лова на гоблини и т.н.). Тези разговори трябва да се провеждат в по-подходяща гилдия. Модераторите могат да Ви насочат към подходяща гилдия, но като цяло е Ваша отговорност да потърсите правилното място за съобщенията си.",
"commGuidePara024": "<strong>Не обсъждайте нищо пристрастяващо в кръчмата.</strong> Много хора използват Хабитика, за да се отърсят от вредните си навици. Слушайки как хората говорят за пристрастяващи/незаконни вещества може да направи това много по-трудно за тях! Уважавайте другите посетители на кръчмата и имайте предвид това. Подобни неща са (списъкът не е изчерпателен): пушене, алкохол, порнография, хазарт и използване/злоупотреба с дрога.",
"commGuidePara027": "<strong>Когато модератор Ви препоръча да преместите разговора си на друго място, ако няма подходяща гилдия, той може да Ви насочи към Задния ъгъл</strong>. Гилдията на Задния ъгъл е общодостъпно място за обсъждане на всякакви чувствителни теми, което трябва да се използва само когато модератор го препоръча. То също се следи от модераторите. Това не е място за общи разговори, то ще Ви бъде препоръчано от модератор, само когато има смисъл.",
"commGuideHeadingPublicGuilds": "Обществени гилдии",
"commGuidePara029": "<strong>Обществените гилдии приличат на кръчмата, но вместо да се обсъждат общи неща, те имат определена тема.</strong> Публичният чат на гилдията би трябвало да се концентрира върху тази тема. Например, членовете на гилдията „Думоковачи“ може да се възмутят, ако разговорът изведнъж се концентрира върху градинарството, вместо върху писането; а членовете на гилдията „Любители на драконите“ може би не се интересуват от разгадаване на древни руни. Някои гилдии може да позволяват това, но общото правило е: <strong>спазвайте темата</strong>!",
"commGuidePara031": "Някои обществени гилдии може да съдържат чувствителни теми като депресия, религия, политика и т.н. В това няма проблем, стига разговорите в тези гилдии да спазват Правилата и условията или Правилата на обществените места, както и да спазват темата си.",
"commGuidePara033": "<strong>В обществените гилдии НЕ трябва да има съдържание, подходящо само за възрастни. Ако такова ще се обсъжда често, това трябва да се посочи в заглавието на гилдията.</strong> Целта на това е Хабитика да е безопасно и приятно място за всички.",
"commGuidePara035": "<strong>Ако в гилдията се обсъждат различни теми, неподходящи за широката публика, би било добре да поставяте предупреждение към коментарите си (например: „Внимание: тук се говори за самонараняване“).</strong> За тези предупреждения може да има и други правила, които гилдиите могат да опишат по подробно. Ако е възможно, моля, използвайте синтаксиса на <a href='http://habitica.fandom.com/wiki/Markdown_Cheat_Sheet' target='_blank'>markdown</a>, за да скриете неподходящото съдържание на нов ред, така че онези, които искат да избегнат четенето му, да могат просто да го подминат без изобщо да го видят. Екипът и модераторите на Хабитика могат въпреки всичко да премахнат това съдържание по собствена преценка.",
"commGuidePara036": "Освен това, когато се обсъждат такива неща, те трябва да са по темата — обсъждането на самонараняване може да има смисъл в гилдия за борба с депресията, но споменаването му може да не е толкова подходящо в музикална гилдия, например. Ако видите някого, който често нарушава това правило, особено ако вече му е обърнато внимание на това, моля, докладвайте публикациите му и се свържете с модераторите чрез <a href='https://contact.habitica.com/' target='_blank'>формуляра за връзка с модераторите</a>.",
"commGuidePara037": "<strong>Гилдия, било тя обществена или частна, не може да бъде създавана с цел да бъде нападана дадена група или човек.</strong> Създаването на подобна гилдия е основание за незабавно блокиране. Борете се с вредните си навици, а не с другарите си приключенци!",
"commGuidePara038": "<strong>Всички предизвикателства в кръчмата и такива от обществени гилдии също трябва да спазват тези правила</strong>.",
"commGuideHeadingInfractionsEtc": "Нарушения, последствия и възстановяване",
"commGuideHeadingInfractions": "Нарушения",
"commGuidePara050": "Повечето от хабитиканците си помагат, уважават се и работят съвместно, за да бъде общността една приятна и приятелска среда. Но понякога, ако има синя луна, някой хабитиканец може да извърши нещо в разрез с гореописаните правила. Когато това се случи, модераторите могат да направят всичко, което сметнат за необходимо, за да подсигурят безопасността на Хабитика и добруването на обитателите ѝ.",
@@ -35,7 +53,9 @@
"commGuidePara054": "Средно-тежките нарушения не са заплаха за сигурността на общността ни, но са неприятни. Тези нарушения ще имат средно-тежки последствия. Когато се комбинират няколко такива, последствията може да станат по-сериозни.",
"commGuidePara055": "Следват няколко примера за средно-тежки нарушения. Списъкът не е изчерпателен.",
"commGuideList06A": "Спорене с, пренебрегване или неуважение на модератор. Това включва публично оплакване от модератор или друг потребител; или публично възхваляване или защитаване на изгонен потребител; или обсъждането на това дали определено действие на модератор е били правилно. Ако имате притеснения относно някое от правилата или модераторите, моля, свържете се с екипа по е-поща (<a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>).",
"commGuideList06B": "Модераторстване без правомощия. Нека бъде ясно: вежливото споменаване на правилата е разрешено. Модераторстването без правомощия представлява заповядване, изискване и/или силно намекване, че някой трябва да направи нещо, което Вие искате, с цел да поправи някаква грешка. Може да кажете на някого, че е извършил нарушение, но не изисквайте действия от него. Например, можете да кажете следното: „Просто да знаеш, че на ругатните в кръчмата не се гледа с добро око, така че май е по-добре да изтриеш това.“ Това би било по-добре от: „Ще те помоля да изтриеш тази своя публикация.“",
"commGuideList06C": "Нарочно докладване на най-обикновени публикации.",
"commGuideList06D": "Повтарящи се нарушения на Правилата на обществените места",
"commGuideList06E": "Повтарящи се леки нарушения",
"commGuideHeadingMinorInfractions": "Леки нарушения",
"commGuidePara056": "Леките нарушения, въпреки че са леки, все пак имат последствия. Ако продължат да се повтарят, те може да доведат до по-сериозни последствия с времето.",
@@ -44,12 +64,24 @@
"commGuideList07B": "Всякакви изявления или действия, които водят до отговор от вида: „Моля, недейте“. Когато на модератор се налага да каже „Моля, не правете това“ на потребител, това се брои за много леко нарушение за него. Например: \"Моля, не продължавайте да спорите за тази идея за функционалност, след като Ви казахме няколко пъти, че тя не е осъществима.“ В много случаи, изказването от вида „Моля, недейте“ е леко последствие, но ако модераторите са принудени да го повторят няколко пъти на един потребител, леките нарушения ще се превърнат в средно-тежки.",
"commGuidePara057A": "Някои публикации може да бъдат скрити, понеже съдържат поверителна информация или може да бъдат възприети по неправилен начин. Обикновено това не се брои за нарушение, особено когато се случва за пръв път!",
"commGuideHeadingConsequences": "Последствия",
"commGuidePara058": "В Хабитика, както и в реалния живот, всяко действие има последствие, независимо дали това е влизането във форма в следствие на тичане, образуването на кариес поради яденето на прекалено много захар или вземането на изпит в следствие на учене.",
"commGuidePara059": "<strong>По същия начин, всички нарушения имат преки последствия.</strong> По-долу са представени някои примерни последствия.",
"commGuidePara060": "<strong>Ако нарушението Ви има средни или тежки последствия, във форума, където е извършено нарушението, ще бъде публикувано съобщение от член на екипа или модератор, обясняващо</strong>:",
"commGuideList08A": "какво е било нарушението",
"commGuideList08B": "какво е последствието",
"commGuideList08C": "какво да направите, за да поправите нещата и възстановите положението си, ако е възможно.",
"commGuidePara060A": "Ако ситуацията го изисква, може да получите ЛС или е-писмо, в допълнение към публикацията във форума, където е извършено нарушението. В някои случаи може и изобщо да не получите публично порицание.",
"commGuidePara060B": "Ако профилът Ви е блокиран (сериозно последствие), няма да можете да влизате в Хабитика и ще получите съобщение за грешка при опит да влезете. <strong>Ако искате да се извините или да помолите за възстановяване на достъпа, пишете на екипа на <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>, посочвайки потребителския си идентификатор</strong> (който ще намерите в съобщението за грешка). <strong>Ваша</strong> е отговорността за това да се свържете с нас, ако искате случаят Ви да бъде преразгледан и да възстановите достъпа си..",
"commGuideHeadingSevereConsequences": "Примери за тежки последствия",
"commGuideList09A": "Блокиране на профила (вижте по-горе)",
"commGuideList09C": "Постоянна забрана за напредване към следващо ниво на сътрудник („замразяване“ на нивото)",
"commGuideHeadingModerateConsequences": "Примери за средно-тежки последствия",
"commGuideList10A": "Ограничени привилегии в обществения и/или частния чат",
"commGuideList10A1": "Ако поради действията си бъдете лишен(а) от правото за писане в чата, някой член на екипа или модератор ще Ви изпрати ЛС и/или ще пише във форума, в който вече нямате право да пишете, за да Ви уведоми за причината и за продължителността на наказанието Ви. В края на този период ще си възвърнете правото да пишете в чата, стига да имате желание да поправите поведението си, заради което сте получили наказанието, и да се съгласявате с Обществените правила.",
"commGuideList10C": "Ограничени привилегии за създаване на гилдии/предизвикателства",
"commGuideList10D": "Временна забрана за напредване към следващо ниво на сътрудник („замразяване“ на нивото)",
"commGuideList10E": "Понижаване на нивото на сътрудник",
"commGuideList10F": "Поставяне на потребители на \"Изпитателен Срок\"",
"commGuideHeadingMinorConsequences": "Примери за леки последствия",
"commGuideList11A": "Напомняне на Правилата на обществените места",
"commGuideList11B": "Предупреждения",
@@ -61,21 +93,31 @@
"commGuidePara062": "Обявлението, съобщението и/или е-писмото, което ще получите, обясняващо последствията от действията Ви е добър източник на информация. Съобразете се с определените Ви ограничения и се постарайте да спазвате правилата, за да Ви бъде премахнато наказанието.",
"commGuidePara063": "Ако не разбирате последствията или естеството на нарушението, помолете някои от екипа или модераторите за помощ, за да не правите повече нарушения в бъдеще. Ако смятате, че определено решение е несправедливо, можете да се свържете с екипа и да го обсъдите, на адрес <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
"commGuideHeadingMeet": "Запознайте се с екипа и модераторите!",
"commGuidePara006": "Хабитика има неуморни странстващи рицари, които помагат на екипа в опазването на реда и спокойствието в общността. Всеки има своя област на действие, но при нужда може да бъде привикан на служба в друга.",
"commGuidePara007": "Екипът има лилави етикети с корони. Тяхната титла е „Герой“.",
"commGuidePara008": "Модераторите имат тъмносини етикети със звезди. Тяхната титла е „Пазител“. Единственото изключение е Бейли, която е компютърен персонаж и има черно-зелен етикет със звезда.",
"commGuidePara009": "Настоящите членове на екипа са (от ляво надясно):",
"commGuideAKA": "<%= habitName %> или <%= realName %>",
"commGuideOnTrello": "<%= trelloName %> в Трело",
"commGuideOnGitHub": "<%= gitHubName %> в GitHub",
"commGuidePara010": "Има и няколко модератори, които помагат на членовете на екипа. Те са внимателно подбрани, затова моля, уважавайте ги и се вслушвайте в предложенията им.",
"commGuidePara011": "Настоящите модератори са (от ляво надясно):",
"commGuidePara011b": "в GitHub/Wikia",
"commGuidePara011c": "в Wikia",
"commGuidePara011d": "в GitHub",
"commGuidePara012": "Ако имате проблем или притеснения относно конкретен модератор, моля, изпратете е-писмо до екипа (<a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>).",
"commGuidePara013": "В общност с размера на Хабитика, някои потребителите си тръгват и на тяхно място идват нови; понякога членовете на екипа и модераторите трябва да свалят знатното си наметало и да си починат. Следните членове на екипа и модератори са почетни. Те вече нямат правомощията на членове на екипа или модератори, но все пак искаме да почетем работата им!",
"commGuidePara014": "Почетни членове на екипа и модератори:",
"commGuideHeadingFinal": "Последният раздел",
"commGuidePara067": "И така, храбри хабитиканецо, това са Обществените правила! Изтрийте потта от челото си и си дайте малко опит за прочитането на всичко това. Ако имате въпроси или притеснения относно тези правила, моля, свържете се с нас чрез <a href='https://contact.habitica.com/' target='_blank'>формуляра за връзка с модератор</a> и с радост ще Ви помогнем.",
"commGuidePara068": "Напред, смели приключенецо, разбий няколко ежедневни задачи!",
"commGuideHeadingLinks": "Полезни връзки",
"commGuideLink01": "<a href='/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a' target='_blank'>Помощ за Хабитика: Задайте въпрос</a>: гилдия, в която потребителите могат да задават въпроси!",
"commGuideLink02": "<a href='http://habitica.fandom.com/wiki/Habitica_Wiki' target='_blank'>Уикито</a>: най-голямата колекция от информация относно Хабитика.",
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: за докладване на проблеми и помощ с кода!",
"commGuideLink04": "<a href='https://trello.com/b/EpoYEYod/' target='_blank'>Основната дъска в Трело</a>: за заявяване на нови функционалности за уеб сайта.",
"commGuideLink05": "<a href='https://trello.com/b/mXK3Eavg/' target='_blank'>Мобилната дъска в Трело</a>: за заявяване на нови функционалности за версиите за мобилни устройства.",
"commGuideLink06": "<a href='https://trello.com/b/vwuE9fbO/' target='_blank'>Художествената дъска в Трело</a>: за изпращане на пикселни изображения.",
"commGuideLink07": "<a href='https://trello.com/b/nnv4QIRX/' target='_blank'>Дъската за мисии в Трело</a>: за изпращане на нови текстове за мисии.",
"commGuidePara069": "Следните талантливи художници допринесоха за тези илюстрации:"
}
+2 -1
View File
@@ -212,6 +212,7 @@
"hatchingPotionFrost": "Скреж",
"hatchingPotionIcySnow": "Леден сняг",
"hatchingPotionNotes": "Излейте това върху яйце и от него ще се излюпи любимец с(ъс) <%= potText(locale) %>.",
"premiumPotionAddlNotes": "Не може да се използва върху яйца за любимци от мисии.",
"foodMeat": "Месо",
"foodMeatThe": "Месото",
"foodMeatA": "Месо",
@@ -306,4 +307,4 @@
"foodSaddleNotes": "Моментално превръща един от любимците Ви в превоз.",
"foodSaddleSellWarningNote": "Хей! Това е доста полезен предмет! Знаете ли как да използвате седло за любимците си?",
"foodNotes": "Нахранете домашен любимец с това и той може да порасне и да се превърне в превоз."
}
}
+9
View File
@@ -27,17 +27,26 @@
"kickstartText": "Подкрепил кампанията в Kickstarter",
"helped": "Помогнал(а) за развитието на Хабитика",
"hall": "Зала на героите",
"contribTitle": "Звание на сътрудника (напр, „Ковач“)",
"contribLevel": "Ниво сътрудник",
"contribHallText": "1-7 за обикновени сътрудници, 8 за модератори, 9 за екипа. Това определя какви предмети, любимци и превози са налични. Също определя цвета на етикета с името. Ниво 8 и 9 автоматично получават администраторски права.",
"hallContributors": "Зала на сътрудниците",
"hallPatrons": "Зала на дарителите",
"rewardUser": "Награждаване на потребителя",
"UUID": "Потребителски идентификатор",
"loadUser": "Зареждане на потребителя",
"noAdminAccess": "Нямате администраторски достъп.",
"userNotFound": "Потребителят не е намерен.",
"invalidUUID": "Идентификаторът UUID трябва да бъде правилен",
"title": "Звание",
"moreDetails": "По-подробно (1-7)",
"moreDetails2": "по-подробно (8-9)",
"contributions": "Принос",
"admin": "Администратор",
"notGems": "е в Щатски долари (USD), а <em>не</em> в диаманти. Например, ако числото е 1, означава 4 диаманта. Използвайте тази възможност само когато давате диаманти на играчите ръчно. Не я използвайте, когато давате ниво на сътрудник. В този случай диамантите се дават автоматично.",
"gamemaster": "Ръководител на играта (член на екипа / модератор)",
"backerTier": "Ниво на подкрепа",
"balance": "Наличност",
"playerTiers": "Нива на играчите",
"tier": "Ниво",
"conRewardsURL": "http://habitica.fandom.com/wiki/Contributor_Rewards",
+2 -2
View File
@@ -3,7 +3,7 @@
"dontDespair": "Не се отчайвайте!",
"deathPenaltyDetails": "Изгубихте ниво, всичкото си злато и един предмет от екипировката, но можете да си ги върнете с усърдна работа! Късмет — ще се справите.",
"refillHealthTryAgain": "Възстановете здравето си и опитайте отново",
"dyingOftenTips": "Това често ли Ви се случва? <a href='https://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Ето няколко съвета!</a>",
"dyingOftenTips": "Това често ли Ви се случва? <a href='http://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>Ето няколко съвета!</a>",
"losingHealthWarning": "Внимавайте — губите здраве!",
"losingHealthWarning2": "Не позволявайте на здравето Ви да спадне до 0! Ако това се случи, ще загубите ниво, златото си и един предмет от екипировката.",
"toRegainHealth": "За да възстановите здраве:",
@@ -14,4 +14,4 @@
"lowHealthTips4": "Ако някоя ежедневна задача не трябва да бъде изпълнявана в определен ден, може да я изключите като натиснете иконката с молива.",
"goodLuck": "Късмет!",
"cannotRevive": "Само умрелите могат да бъдат съживявани"
}
}
+52
View File
@@ -1,5 +1,57 @@
{
"frequentlyAskedQuestions": "Често задавани въпроси",
"faqQuestion0": "Объркан(а) съм. Къде да намеря общ преглед?",
"iosFaqAnswer0": "Първо, въведете задачите, които искате да изпълнявате в ежедневието си. След като ги изпълните и отметнете, ще получите опит и злато. Златото се използва за купуване на екипировка и различни предмети, както и за персонализирани награди. Трупането на опит повишава нивото на героя Ви и отключва любимци, умения и мисии! Героят Ви може да бъде персонализиран от Меню > Персонализиране на героя.\n\nНякои основни начини за взаимодействие: щракнете знака (+) в горния десен ъгъл, за да добавите нова задача. Натиснете върху съществуваща задача за редактиране или я плъзнете наляво, за да я изтриете. Може да пренареждате задачите чрез етикетите в горния ляв ъгъл, както и да показвате и скривате подзадачите като щракнете върху балончето с броя им.",
"androidFaqAnswer0": "Първо, въведете задачите, които искате да изпълнявате в ежедневието си. След като ги изпълните и отметнете, ще получите опит и злато. Златото се използва за купуване на екипировка и различни предмети, както и за персонализирани награди. Трупането на опит повишава нивото на героя Ви и отключва любимци, умения и мисии! Героят Ви може да бъде персонализиран от Меню > [Инвентар >] Герой.\n\nНякои основни начини за взаимодействие: щракнете знака (+) в долния десен ъгъл, за да добавите нова задача. Натиснете върху съществуваща задача за редактиране или я плъзнете наляво, за да я изтриете. Може да пренареждате задачите чрез етикетите в горния ляв ъгъл, както и да показвате и скривате подзадачите като щракнете върху квадратчето с броя им.",
"webFaqAnswer0": "Първо, въведете задачите, които искате да изпълнявате в ежедневието си. След като ги изпълните и отметнете, ще получите опит и злато. Златото се използва за купуване на екипировка и различни предмети, както и за персонализирани награди. Трупането на опит повишава нивото на героя Ви и отключва любимци, умения и мисии! За повече подробности вижте обзора на играта, представен стъпка по стъпка в [Помощ -> Обзор за нови потребители](https://habitica.com/static/overview).",
"faqQuestion1": "Как да настроя задачите си?",
"iosFaqAnswer1": "Добрите навици (тези с +) са задачи, които може да изпълнявате многократно всеки ден, като например яденето на зеленчуци. Лошите навици (тези с -) са задачи, които трябва да избягвате, като например гризането на нокти. Навиците с + и - имат добър и лош избор, като например използването на стълби срещу използването на асансьор. Добрите навици Ви носят опит и злато. Лошите навици отнемат от здравето Ви.\n\nЕжедневните задачи са такива, които трябва да изпълнявате всеки ден, като например миене на зъбите или проверка на е-пощата. Може да настройвате дните, в които една ежедневна задача трябва да бъде изпълнявана, като я докоснете и редактирате. Ако пропуснете да изпълните ежедневна задача, героят Ви ще получи щети след края на деня. Не добавяйте твърде много ежедневни задачи наведнъж!\n\nЗадачите представляват списък от неща, които трябва да направите. Завършването на задача Ви носи злато и опит. От задачите не можете да изгубите здраве. Можете да добавите крайна дата към задача като я докоснете и редактирате.",
"androidFaqAnswer1": "Добрите навици (тези с +) са задачи, които може да изпълнявате многократно всеки ден, като например яденето на зеленчуци. Лошите навици (тези с -) са задачи, които трябва да избягвате, като например гризането на нокти. Навиците с + и - имат добър и лош избор, като например използването на стълби срещу използването на асансьор. Добрите навици Ви носят опит и злато. Лошите навици отнемат от здравето Ви.\n\nЕжедневните задачи са такива, които трябва да изпълнявате всеки ден, като например миене на зъбите или проверка на е-пощата. Може да настройвате дните, в които една ежедневна задача трябва да бъде изпълнявана, като я докоснете и редактирате. Ако пропуснете да изпълните ежедневна задача, героят Ви ще получи щети след края на деня. Не добавяйте твърде много ежедневни задачи наведнъж!\n\nЗадачите представляват списък от неща, които трябва да направите. Завършването на задача Ви носи злато и опит. От задачите не можете да изгубите здраве. Можете да добавите крайна дата към задача като я докоснете и редактирате.",
"webFaqAnswer1": "Добрите навици (тези с :heavy_plus_sign:) са задачи, които може да изпълнявате многократно всеки ден, като например яденето на зеленчуци. Лошите навици (тези с :heavy_minus_sign:) са задачи, които трябва да избягвате, като например гризането на нокти. Навиците с :heavy_plus_sign: и :heavy_minus_sign: имат добър и лош избор, като например използването на стълби срещу използването на асансьор. Добрите навици Ви носят опит и злато. Лошите навици отнемат от здравето Ви.\nЕжедневните задачи са такива, които трябва да изпълнявате всеки ден, като например миене на зъбите или проверка на е-пощата. Може да настройвате дните, в които една ежедневна задача трябва да бъде изпълнявана, като щракнете върху моливчето и я редактирате. Ако пропуснете да изпълните ежедневна задача, героят Ви ще получи щети след края на деня. Не добавяйте твърде много ежедневни задачи наведнъж!\nЗадачите представляват списък от неща, които трябва да направите. Завършването на задача Ви носи злато и опит. От задачите не можете да изгубите здраве. Можете да добавите крайна дата към задача като щракнете върху моливчето и я редактирате.",
"faqQuestion2": "Мога ли да разгледам няколко примерни задачи?",
"iosFaqAnswer2": "В уикито има четири списъка с примерни задачи за вдъхновение:\n<br><br>\n* [Примерни навици](http://habitica.fandom.com/wiki/Sample_Habits)\n* [Примерни ежедневни задачи](http://habitica.fandom.com/wiki/Sample_Dailies)\n* [Примерни задачи](http://habitica.fandom.com/wiki/Sample_To-Dos)\n* [Примерни персонализирани награди](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"androidFaqAnswer2": "В уикито има четири списъка с примерни задачи за вдъхновение:\n<br><br>\n* [Примерни навици](http://habitica.fandom.com/wiki/Sample_Habits)\n* [Примерни ежедневни задачи](http://habitica.fandom.com/wiki/Sample_Dailies)\n* [Примерни задачи](http://habitica.fandom.com/wiki/Sample_To-Dos)\n* [Примерни персонализирани награди](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"webFaqAnswer2": "В уикито има четири списъка с примерни задачи за вдъхновение:\n* [Примерни навици](http://habitica.fandom.com/wiki/Sample_Habits)\n* [Примерни ежедневни задачи](http://habitica.fandom.com/wiki/Sample_Dailies)\n* [Примерни задачи](http://habitica.fandom.com/wiki/Sample_To-Dos)\n* [Примерни персонализирани награди](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"faqQuestion3": "Защо задачите ми променят цвета си?",
"iosFaqAnswer3": "Вашите задачи променят цвета си според това колко добре ги изпълнявате в момента! Всяка нова задача започва в неутрално жълто. Когато изпълнявате ежедневните си задачи или по-често вършите добрите си навици, задачите постепенно сменят цвета си към синьо. Ако пропуснете ежедневна задача или се поддадете на лош навик, задачата ще почервенее. Колкото по-червена е една задача, толкова по-голяма награда носи, но и толкова повече ще Ви нарани, ако е ежедневна или лош навик. Това ви помага да се мотивирате и да изпълните задачите, които ви създават проблеми.",
"androidFaqAnswer3": "Вашите задачи променят цвета си според това колко добре ги изпълнявате в момента! Всяка нова задача започва в неутрално жълто. Когато изпълнявате ежедневните си задачи или по-често вършите добрите си навици, задачите постепенно сменят цвета си към синьо. Ако пропуснете ежедневна задача или се поддадете на лош навик, задачата ще почервенее. Колкото по-червена е една задача, толкова по-голяма награда носи, но и толкова повече ще Ви нарани, ако е ежедневна или лош навик. Това ви помага да се мотивирате и да изпълните задачите, които ви създават проблеми.",
"webFaqAnswer3": "Вашите задачи променят цвета си според това колко добре ги изпълнявате в момента! Всяка нова задача започва в неутрално жълто. Когато изпълнявате ежедневните си задачи или по-често вършите добрите си навици, задачите постепенно сменят цвета си към синьо. Ако пропуснете ежедневна задача или се поддадете на лош навик, задачата ще почервенее. Колкото по-червена е една задача, толкова по-голяма награда носи, но и толкова повече ще Ви нарани, ако е ежедневна или лош навик. Това ви помага да се мотивирате и да изпълните задачите, които ви създават проблеми.",
"faqQuestion4": "Защо героят ми загуби здраве и как да го възстановя?",
"iosFaqAnswer4": "Има няколко неща, които могат да Ви нанесат щети. Първо, ако не изпълните своите ежедневни задачи през деня, и ако не ги отметнете на екрана, който Ви се появи на следващата сутрин, тези незавършени ежедневни задачи ще Ви наранят. Второ, ако докоснете лош навик, ще поемете щети. И накрая, ако се биете срещу главатар заедно с групата си и някой от нея не е изпълнил всичките си ежедневни задачи, главатарят ще Ви нападне.\n\nОсновният начин да оздравеете е да качите ниво, тъй като така възстановявате изцяло здравето си. Може също така да си купите лековита отвара от колоната с награди, използвайки златото си. Освен това, след ниво 10 може да изберете да станете лечител и да придобиете умения за лечение. Ако в групата Ви има лечител, той също може да Ви излекува.",
"androidFaqAnswer4": "Има няколко неща, които могат да Ви нанесат щети. Първо, ако не изпълните своите ежедневни задачи през деня, и ако не ги отметнете на екрана, който Ви се появи на следващата сутрин, тези незавършени ежедневни задачи ще Ви наранят. Второ, ако докоснете лош навик, ще поемете щети. И накрая, ако се биете срещу главатар заедно с групата си и някой от нея не е изпълнил всичките си ежедневни задачи, главатарят ще Ви нападне.\n\nОсновният начин да оздравеете е да качите ниво, тъй като така възстановявате изцяло здравето си. Може също така да си купите лековита отвара от раздела с наградите в страницата със задачи, използвайки златото си. Освен това, след ниво 10 може да изберете да станете лечител и да придобиете умения за лечение. Ако в групата Ви има лечител, той също може да Ви излекува.",
"webFaqAnswer4": "Има няколко неща, които могат да Ви нанесат щети. Първо, ако не изпълните своите ежедневни задачи през деня, и ако не ги отметнете на екрана, който Ви се появи на следващата сутрин, тези незавършени ежедневни задачи ще Ви наранят. Второ, ако щракнете върху лош навик, ще поемете щети. И накрая, ако се биете срещу главатар заедно с групата си и някой от нея не е изпълнил всичките си ежедневни задачи, главатарят ще Ви нападне. Основният начин да оздравеете е да качите ниво, тъй като така възстановявате изцяло здравето си. Може също така да си купите лековита отвара от колоната с награди, използвайки златото си. Освен това, след ниво 10 може да изберете да станете лечител и да придобиете умения за лечение. Ако в групата Ви има лечител, той също може да Ви излекува. Научете повече като изберете „Група“ от лентата за навигация.",
"faqQuestion5": "Как да играя Хабитика с приятелите си?",
"iosFaqAnswer5": "Най-добрият начин е да си направите група! Групите могат заедно да изпълняват мисии, да се бият с чудовища и да използват уменията си, за да се подкрепят. Идете в Меню > Група и щракнете „Създаване на нова група“, ако все още нямате такава. След това докоснете списъка с членовете и докоснете „Покана“ в горния десен ъгъл, за да добавите приятелите си, като въведете техните потребителски идентификатори (низ от цифри и букви, които може да откриете в „Настройки > Подробности за профила“ в приложението, или в „Настройки > ППИ“ в уеб сайта). В уеб сайта можете да поканите приятелите си и чрез е-писмо; тази възможност ще бъде добавена и към приложението в някое бъдещо обновление.\n\nВ уеб сайта, вие и приятелите Ви можете също да се присъединявате към гилдии, които представляват обществени стаи за разговори. Гилдиите ще бъдат добавени към приложението в някое бъдещо обновление!",
"androidFaqAnswer5": "Най-добрият начин е да си направите група! Групите могат заедно да изпълняват мисии, да се бият с чудовища и да използват уменията си, за да се подкрепят. Ако все още нямата група, идете в [уеб сайта(https://habitica.com/), за да си направите. Също така можете заедно да се присъединявате към гилдии (Общност > Гилдии). Гилдиите представляват стаи за разговори, концентрирани върху споделен интерес или преследването на обща цел и могат да бъдат обществени или частни. Можете да се присъедините към колкото желаете гилдии, но групата Ви може да бъде само една.\n\nЗа повече подробности, вижте страниците в уикито за [Групите](http://habitica.fandom.com/wiki/Party) и [Гилдиите](http://habitica.fandom.com/wiki/Guilds).",
"webFaqAnswer5": "Най-добрият начин е да си направите група като щракнете върху „Група“ в лентата за навигация! Групите могат заедно да изпълняват мисии, да се бият с чудовища и да използват уменията си, за да се подкрепят. Можете също заедно да се присъединявате към гилдии („Общност > Гилдии“ в лентата за навигация). Гилдиите са стаи за разговори, организирани около общ интерес или преследването на обща цел, и могат да бъдат обществени или частни. Можете да се присъедините към колкото искате гилдии, но само към една група. За по-подробна информация, прегледайте страниците в уикито относно [Групите](http://habitica.fandom.com/wiki/Party) и [Гилдиите](http://habitica.fandom.com/wiki/Guilds).",
"faqQuestion6": "Как да се сдобия с любимец или превоз?",
"iosFaqAnswer6": "Всеки път когато завършите задача, ще имате шанс да Ви се падне Яйце, Излюпваща отвара или Храна за любимци. Тези неща ще се съхраняват в Меню > Предмети.\n\nЗа да се излюпи любимец Ви трябва Яйце и Излюпваща Отвара. Докоснете Яйцето, за да определите какво искате да се излюпи и изберете „Излюпване“. След това изберете Излюпваща Отвара, за да определите цвета! Идете в Меню > Любимци, и докоснете новия си Любимец за да го екипирате.\n\nМожете да превърнете любимците си в превози като ги храните от Меню > Любимци. Докоснете любимец и изберете „Хранене“! Ще трябва да нахраните Любимеца си много пъти, преди той да се превърне в Превоз, но ако разберете каква е любимата му храна, той ще расте по-бързо. Опитайте чрез проба и грешка или [вижте информацията наготово тук](http://habitica.fandom.com/wiki/Food#Food_Preferences). След като вече имате превоз, идете в Меню > Превози и го докоснете, за да го екипирате.\n\nМоже да получите Яйца за Любимци от Мисии, ако завършите някои конкретни мисии. (Вижте по-надолу, за да научите повече относно Мисиите.)",
"androidFaqAnswer6": "Когато достигнете ниво 3 се отключва системата за падане на предмети. Всеки път когато завършите задача, ще имате шанс да Ви се падне яйце, излюпваща отвара или храна. Тези неща ще се съхраняват в Меню > Предмети.\n\nЗа да се излюпи любимец Ви трябва яйце и излюпваща отвара. Докоснете яйцето, за да определите какво искате да се излюпи от него, и изберете „Излюпване с отвара“. След това изберете излюпваща отвара, за да определите цвета! За да екипирате новия си любимец, идете в Меню > Конюшня > Любимци, изберете вид, а след това желания любимец и изберете „Използване“ (героят Ви няма да се обнови, за да видите промяната).\n\nМожете да превърнете любимците си в превози, като ги храните от Меню > Конюшня [ > Любимци ]. Докоснете любимец и изберете „Хранене“! Ще трябва да нахраните любимеца си много пъти, преди той да се превърне в превоз, но ако разберете каква е любимата му храна, той ще расте по-бързо. Опитайте чрез проба и грешка, или [вижте информацията наготово тук](http://habitica.fandom.com/wiki/Food#Food_Preferences). За да екипирате превоза си, идете в Меню > Конюшня > Превози, изберете вид, а след това желания превози, и изберете „Използване“ (героят Ви няма да се обнови, за да видите промяната).\n\nМоже да получите яйца за любимци от мисии, ако завършите някои конкретни мисии. (Вижте по-надолу, за да научите повече относно мисиите.)",
"webFaqAnswer6": "Всеки път, когато завършите задача, ще имате шанс да Ви се падне Яйце, Излюпваща Отвара или Храна за любимец. Тези неща ще се съхраняват в „Инвентар > Предмети“. За да се излюпи Любимец, Ви трябва Яйце и Излюпваща Отвара. Когато се сдобиете с Яйце и Излюпваща Отвара, идете в „Инвентар > Конюшня“, и докоснете изображението за да излюпите Любимеца си. След като излюпите Любимец, можете да го екипирате на Героя си, като щракнете върху него. Можете да превърнете Любимците си в Превози като ги храните от „Инвентар > Конюшня“. Завлачете избраната Храна от лентата с действия в дъното на екрана и я пуснете върху Любимеца, за да го нахраните. Ще трябва да нахраните Любимеца си много пъти, преди той да се превърне в Превоз, но ако разберете каква е любимата му храна, той ще расте по-бързо. Опитайте чрез проба и грешка или [вижте информацията наготово тук](http://habitica.fandom.com/wiki/Food#Food_Preferences). След като вече имате Превоз, щракнете върху него, за да го екипирате на Героя си. Може да получите Яйца за Любимци от Мисии, ако завършите някои конкретни Мисии. (Вижте по-надолу, за да научите повече относно мисиите.)",
"faqQuestion7": "Как да стана воин, магьосник, мошеник или лечител?",
"iosFaqAnswer7": "Когато достигнете ниво 10, може да изберете да станете воин, магьосник, мошеник или лечител. (Всички играчи по подразбиране започват като воини.) Всеки клас има различна екипировка; различни умения, които могат да използват след ниво 11; и различни предимства. Воините могат лесно да нанасят щети на главатарите, както и да понесат повече щети от задачите си и като цяло правят групата си по-силна. Магьосниците също с лекота нанасят щети на главатарите, а също и качват нива по-бързо и възстановяват маната на групата си. Мошениците печелят най-много злато и намират най-много предмети, и могат да помогнат на останалите в групата да имат същия късмет. И накрая, лечителите могат да лекуват себе си и останалите в групата.\n\nАко не искате веднага да избирате клас, например ако все още събирате средства, с които да закупите цялата екипировка за текущия си клас, може да решите по-късно и когато сте готов(а), да го направите в Меню > Избор на клас.",
"androidFaqAnswer7": "Когато достигнете ниво 10, може да изберете да станете воин, магьосник, мошеник или лечител. (Всички играчи по подразбиране започват като воини.) Всеки клас има различна екипировка; различни умения, които могат да използват след ниво 11; и различни предимства. Воините могат лесно да нанасят щети на главатарите, както и да понесат повече щети от задачите си и като цяло правят групата си по-силна. Магьосниците също с лекота нанасят щети на главатарите, а също и качват нива по-бързо и възстановяват маната на групата си. Мошениците печелят най-много злато и намират най-много предмети, и могат да помогнат на останалите в групата да имат същия късмет. И накрая, лечителите могат да лекуват себе си и останалите в групата.\n\nАко не искате веднага да избирате клас, например ако все още събирате средства, с които да закупите цялата екипировка за текущия си клас, може да се откажете от тази възможност, и когато сте готов(а), да го направите в Меню > Избор на клас.",
"webFaqAnswer7": "Когато достигнете ниво 10, може да изберете да станете воин, магьосник, мошеник или лечител. (Всички играчи по подразбиране започват като воини.) Всеки клас има различна екипировка; различни умения, които могат да използват след ниво 11; и различни предимства. Воините могат лесно да нанасят щети на главатарите, както и да понесат повече щети от задачите си и като цяло правят групата си по-силна. Магьосниците също с лекота нанасят щети на главатарите, а също и качват нива по-бързо и възстановяват маната на групата си. Мошениците печелят най-много злато и намират най-много предмети, и могат да помогнат на останалите в групата да имат същия късмет. И накрая, лечителите могат да лекуват себе си и останалите в групата. Ако не искате веднага да избирате клас, например ако все още събирате средства, с които да закупите цялата екипировка за текущия си клас, може да се откажете от тази възможност, и когато сте готов(а), да я включите отново от настройките.",
"faqQuestion8": "Каква е синята лента, която се появява в горната част след ниво 10?",
"iosFaqAnswer8": "Синята лента, която се появи след като достигнахте ниво 10 и избрахте клас, е лентата за маната. С качването на нива, ще отключвате специални умения, чието използване изисква мана. Всеки клас има различни умения, които се появяват след ниво 11 в Меню > Използване на умения. За разлика от здравето, маната не се възстановява напълно когато качите ниво. Тя се възстановява постепенно, когато изпълнявате добрите си навици, ежедневните си задачи и задачите си от списъка; тя се понижава, ако се поддавате на лошите си навици. Също така, малко мана се възстановява и след края на деня — колкото повече ежедневни задачи сте изпълнили през деня, толкова повече мана ще възстановите.",
"androidFaqAnswer8": "Синята лента, която се появи след като достигнахте ниво 10 и избрахте клас, е лентата за маната. С качването на нива, ще отключвате специални умения, чието използване изисква мана. Всеки клас има различни умения, които се появяват след ниво 11 в Меню > Умения. За разлика от здравето, маната не се възстановява напълно, когато качите ниво. Тя се възстановява постепенно, когато изпълнявате добрите си навици, ежедневните си задачи и задачите си от списъка; тя се понижава, ако се поддавате на лошите си навици. Също така, малко мана се възстановява и след края на деня — колкото повече ежедневни задачи сте изпълнили през деня, толкова повече мана ще възстановите.",
"webFaqAnswer8": "Синята лента, която се появи след като достигнахте ниво 10 и избрахте клас, е лентата за маната. С качването на нива, ще отключвате специални умения, чието използване изисква мана. Всеки клас има различни умения, които се появяват след ниво 11 в лентата с действия в дъното на екрана. За разлика от здравето, маната не се възстановява напълно когато качите ниво. Тя се възстановява постепенно, когато изпълнявате добрите си навици, ежедневните си задачи и задачите си от списъка; тя се понижава, ако се поддавате на лошите си навици. Също така, малко мана се възстановява и след края на деня — колкото повече ежедневни задачи сте изпълнили през деня, толкова повече мана ще възстановите.",
"faqQuestion9": "Как да се бия с чудовища и да изпълнявам мисии?",
"iosFaqAnswer9": "Първо, ще трябва да създадете група или да се присъедините към такава (вижте малко по-нагоре). Въпреки че можете да се биете с чудовища и сам(а), ние Ви препоръчваме да го правите в група, тъй като така мисиите ще бъдат доста по-лесни. Освен това, приятелите ще Ви насърчават и мотивират да изпълнявате задачите си!\n\nСлед това ще Ви трябва свитък с мисия (свитъците с мисии се пазят в Меню > Предмети). Има три начина да се сдобиете с такъв:\n\n— На ниво 15 получавате последователност от мисии, тоест три свързани мисии. Подобни последователности се отключват и на ниво 30, 40 и 60;\n— Когато поканите хора в групата си, ще получите свитъка за Василисъка!\n— Можете да купувате мисии от магазина в замяна на злато и диаманти.\n\nЗа да се биете с главатаря или да събирате предмети за събираческа мисия, просто завършвайте задачите си както обикновено, а те ще бъдат превърнати в щети след края на деня. (Може да се наложи да презаредите, като плъзнете пръст надолу по екрана, за да видите как здравето на главатаря намалява.) Ако се биете с главатар и сте пропуснали дори една ежедневна задача, той ще нанесе щети на групата Ви в същото време, когато Вие нанасяте щети на него.\n\nСлед ниво 11, магьосниците и воините получават умения, с които могат да нанасят допълнителни щети на главатаря, така че тези класове са добър избор на ниво 10, ако искате да удряте здраво.",
"androidFaqAnswer9": "Първо, ще трябва да създадете група или да се присъедините към такава (вижте малко по-нагоре). Въпреки че можете да се биете с чудовища и сам(а), ние Ви препоръчваме да го правите в група, тъй като така мисиите ще бъдат доста по-лесни. Освен това, приятелите ще Ви насърчават и мотивират да изпълнявате задачите си!\n\nСлед това ще Ви трябва свитък с мисия (свитъците с мисии се пазят в Меню > Предмети). Има три начина да се сдобиете с такъв:\n\n— На ниво 15 получавате последователност от мисии, тоест три свързани мисии. Подобни последователности се отключват и на ниво 30, 40 и 60;\n— Когато поканите хора в групата си, ще получите свитъка за Василисъка!\n— Можете да купувате мисии от магазина за мисии в замяна на злато и диаманти.\n\nЗа да се биете с главатаря или да събирате предмети за събираческа мисия, просто завършвайте задачите си както обикновено, а те ще бъдат превърнати в щети след края на деня. (Може да се наложи да презаредите, като плъзнете пръст надолу по екрана, за да видите как здравето на главатаря намалява.) Ако се биете с главатар и сте пропуснали дори една ежедневна задача, той ще нанесе щети на групата Ви в същото време, когато Вие нанасяте щети на него.\n\nСлед ниво 11, магьосниците и воините получават умения, с които могат да нанасят допълнителни щети на главатаря, така че тези класове са добър избор на ниво 10, ако искате да удряте здраво.",
"webFaqAnswer9": "Първо, ще трябва да създадете група или да се присъедините към такава, като щракнете върху „Група“ в лентата за навигация. Въпреки че можете да се биете с чудовища и сам(а), ние Ви препоръчваме да го правите в група, тъй като така мисиите ще бъдат доста по-лесни. Освен това, приятелите ще Ви насърчават и мотивират да изпълнявате задачите си! След това ще Ви трябва свитък с мисия (свитъците с мисии се пазят в „Инвентар > Мисии“). Има четири начина да се сдобиете с такъв:\n* Когато поканите хора в групата си, ще получите свитъка за Василисъка!\n* На ниво 15 получавате последователност от мисии, тоест три свързани мисии. Подобни последователности се отключват и на ниво 30, 40 и 60;\n* Можете да купувате мисии от магазина за мисии („Магазини > Мисии“) в замяна на злато и диаманти.\n* Когато се отчитате в Хабитика определен брой пъти, ще получите като награда свитъци с зисии. Ще получите свитък при 1-вото, 7-мото, 22-рото и 40-тото си отчитане.\nЗа да се биете с главатаря или да събирате предмети за събираческа мисия, просто завършвайте задачите си както обикновено, а те ще бъдат превърнати в щети след края на деня. (Може да се наложи да презаредите, за да видите как здравето на главатаря намалява.) Ако се биете с главатар и сте пропуснали дори една ежедневна задача, той ще нанесе щети на групата Ви в същото време, когато Вие нанасяте щети на него. След ниво 11, магьосниците и воините получават умения, с които могат да нанасят допълнителни щети на главатаря, така че тези класове са добър избор на ниво 10, ако искате да удряте здраво.",
"faqQuestion10": "Какво са диамантите и как да се сдобия с тях?",
"iosFaqAnswer10": "Диамантите се купуват с истински пари; това става като докоснете иконката с диамант в горната част. Когато хората купуват диаманти, те ни помагат да поддържаме уеб сайта работещ. Благодарим за подкрепата им!\n\nОсвен да бъдат купени, има три други начина играчите да се сдобият с диаманти:\n\n* Чрез спечелване на предизвикателство, което е било създадено от друг играч. Идете в „Общност > Предизвикателства“, за да се присъедините към някое.\n* Чрез абониране, което дава възможност за купуване на определен брой диаманти всеки месец;\n* Чрез допринасяне към Хабитика. Вижте тази статия в уикито за повече информация: [Допринасяне към Хабитика](http://habitica.fandom.com/wiki/Contributing_to_Habitica).\n\nИмайте предвид, че предметите, купени с диаманти, не дават повече показатели, така че играчите, използващи приложението без тях, няма да бъдат ощетени!",
"androidFaqAnswer10": "Диамантите се купуват с истински пари; това става като докоснете иконката с диамант в горната част. Когато хората купуват диаманти, те ни помагат да поддържаме уеб сайта работещ. Благодарим за подкрепата им!\n\nОсвен да бъдат купени, има три други начина играчите да се сдобият с диаманти:\n\n* Чрез спечелване на предизвикателство, което е било създадено от друг играч. Идете в „Общност > Предизвикателства“, за да се присъедините към някое.\n* Чрез абониране, което дава възможност за купуване на определен брой диаманти всеки месец;\n* Чрез допринасяне към Хабитика. Вижте тази статия в уикито за повече информация: [Допринасяне към Хабитика](http://habitica.fandom.com/wiki/Contributing_to_Habitica).\n\nИмайте предвид, че предметите, купени с диаманти, не дават повече показатели, така че играчите, използващи приложението без тях, няма да бъдат ощетени!",
"webFaqAnswer10": "Диамантите се купуват с истински пари, но [абонираните](https://habitica.com/user/settings/subscription) могат да ги купуват със злато. Когато хората се абонират или купуват диаманти, те ни помагат да поддържаме уеб сайта работещ. Благодарим за подкрепата им! Освен да бъдат купени с пари или чрез абониране, има два други начина играчите да се сдобият с диаманти:\n* Чрез спечелване на предизвикателство, което е било създадено от друг играч. Идете в „Общност > Разглеждане на предизвикателствата“, за да се присъедините към някое.\n* Чрез допринасяне към Хабитика. Вижте тази статия в уикито за повече информация: [Допринасяне към Хабитика](http://habitica.fandom.com/wiki/Contributing_to_Habitica).\nИмайте предвид, че предметите, купени с диаманти, не дават повече показатели, така че играчите, използващи уеб сайта без тях, няма да бъдат ощетени!",
"faqQuestion11": "Как да съобщя за проблем или да предложа нова функционалност?",
"iosFaqAnswer11": "Можете да докладвате проблеми, да предложите нова функционалност или да изпратите обратна връзка от „Меню > Относно > Докладване на проблем“ и „Меню > Относно > Изпращане на обратна връзка“! Ще направим всичко по силите си, за да Ви съдействаме.",
"androidFaqAnswer11": "Можете да докладвате проблеми, да предложите нова функционалност или да изпратите обратна връзка от „Относно > Докладване на проблем“ и „Относно > Изпращане на обратна връзка“! Ще направим всичко по силите си, за да Ви съдействаме.",
"webFaqAnswer11": "За да докладвате проблем, идете в [Помощ > Докладване на проблем](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) и прочетете точките над текстовото поле. Ако не можете да влезете в Хабитика, изпратете ни данните си за влизане (без паролата!! на [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Не се притеснявайте, ще Ви помогнем при първа възможност! Предложенията на нови функционалности се събират в Трело. Идете в [Помощ > Предлагане на функционалност](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) и следвайте инструкциите.",
"faqQuestion12": "Как да се бия със световен главатар?",
"iosFaqAnswer12": "Световните главатари са специални чудовища, които се появяват в кръчмата. Всички активни потребители автоматично се бият с главатаря като задачите и уменията им автоматично му нанасят щети, както обикновено.\n\nВъзможно е в същото време да изпълнявате обикновена мисия. В такъв случай задачите и уменията Ви ще влияят както на световния главатар, така и на мисията на групата Ви.\n\nСветовният главатар не може да Ви нанесе щети или да навреди на профила Ви. Вместо това той има лента за ярост, която се запълва, когато потребителите пропускат ежедневните си задачи. Ако лентата за ярост се напълни до края, чудовището ще нападне някой от компютърните персонажи на уеб сайта и ще промени изображението му.\n\nМоже да прочетете повече относно [миналите световни главатари](http://habitica.fandom.com/wiki/World_Bosses) в уикито.",
"androidFaqAnswer12": "Световните главатари са специални чудовища, които се появяват в кръчмата. Всички активни потребители автоматично се бият с главатаря като задачите и уменията им автоматично му нанасят щети, както обикновено.\n\nВъзможно е в същото време да изпълнявате обикновена мисия. В такъв случай задачите и уменията Ви ще влияят както на световния главатар, така и на мисията на групата Ви.\n\nСветовният главатар не може да Ви нанесе щети или да навреди на профила Ви. Вместо това той има лента за ярост, която се запълва, когато потребителите пропускат ежедневните си задачи. Ако лентата за ярост се напълни до края, чудовището ще нападне някой от компютърните персонажи на уеб сайта и ще промени изображението му.\n\nМоже да прочетете повече относно [миналите световни главатари](http://habitica.fandom.com/wiki/World_Bosses) в уикито.",
"webFaqAnswer12": "Световните главатари са специални чудовища, които се появяват в кръчмата. Всички активни потребители автоматично се бият с главатаря като задачите и уменията им автоматично му нанасят щети, както обикновено. Възможно е в същото време да изпълнявате обикновена мисия. В такъв случай задачите и уменията Ви ще влияят както на световния главатар, така и на мисията на групата Ви. Световният главатар не може да Ви нанесе щети или да навреди на профила Ви. Вместо това той има лента за ярост, която се запълва, когато потребителите пропускат ежедневните си задачи. Ако лентата за ярост се напълни до края, чудовището ще нападне някой от компютърните персонажи на уеб сайта и ще промени изображението му. Може да прочетете повече относно [миналите световни главатари](http://habitica.fandom.com/wiki/World_Bosses) в уикито.",
"iosFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в кръчмата чрез Меню > Кръчма! Ще се радваме да помогнем.",
"androidFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в кръчмата чрез Меню > Кръчма! Ще се радваме да помогнем.",
"webFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в [Помощната гилдия на Хабитика](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! Ще се радваме да помогнем.",
+10
View File
@@ -1,6 +1,8 @@
{
"FAQ": "ЧЗВ",
"termsAndAgreement": "Натискайки бутона по-долу, Вие заявявате, че сте прочули и се съгласявате с <a href='/static/terms'>Условията за ползване</a> и <a href='/static/privacy'>Политиката за поверителност</a>.",
"accept1Terms": "С натискане на бутона по-долу, аз се съгласявам с",
"accept2Terms": "и",
"chores": "Домакинска работа",
"clearBrowserData": "Изчистване на данните на браузъра",
"communityExtensions": "Добавки и разширения",
@@ -54,9 +56,11 @@
"mobileAndroid": "Андроид",
"mobileIOS": "iOS",
"oldNews": "Новини",
"newsArchive": "Архив на новините в „Wikia“ (на много езици)",
"setNewPass": "Задаване на нова парола",
"password": "Парола",
"playButton": "Играйте",
"playButtonFull": "Влизане в Хабитика",
"presskit": "Медийни материали",
"presskitText": "Благодарим за интереса Ви в Хабитика! Можете да използвате следните изображения в статии или видеа относно Хабитика. За повече информация, моля, свържете се с нас на <%= pressEnquiryEmail %>.",
"pkQuestion1": "Какво вдъхнови Хабитика? Как започна всичко?",
@@ -81,6 +85,8 @@
"pkBoss": "Главатари",
"pkSamples": "Примерни екрани",
"pkWebsite": "Уеб сайт",
"pkiOS": "iOS",
"pkAndroid": "Андроид",
"privacy": "Политика за поверителност",
"register": "Регистрирация",
"school": "Училище",
@@ -121,8 +127,12 @@
"usernameTOSRequirements": "Потребителските имена трябва са съобразени с <a href='/static/terms' target='_blank'>Условията за ползване</a> и <a href='/static/community-guidelines' target='_blank'>Обществените правила</a>. Ако преди това не сте имали име за вписване, то потребителското Ви име е създадено автоматично.",
"usernameTaken": "Потребителското име е заето.",
"passwordConfirmationMatch": "Повторената парола не съвпада с първата.",
"invalidLoginCredentials": "Грешно потребителско име и/или е-поща и/или парола.",
"passwordResetPage": "Нулиране на паролата",
"passwordReset": "Ако имаме адреса на Вашата е-поща, значи ще получите е-писмо с инструкции за подновяване на паролата си там.",
"passwordResetEmailSubject": "Подновяване на паролата в Хабитика",
"passwordResetEmailText": "Ако сте заявили нулиране на паролата си за <%= username %> в Хабитика, отидете на <%= passwordResetLink %>, за да зададете нова. Тази връзка ще загуби давност след 24 часа. Ако не сте заявили нулиране на паролата си, не обръщайте внимание на това писмо.",
"passwordResetEmailHtml": "Ако сте заявили нулиране на паролата си за <strong><%= username %></strong> в Хабитика, <a href=\"<%= passwordResetLink %>\">натиснете тук</a>, за да зададете нова. Тази връзка ще загуби давност след 24 часа.<br/><br>Ако не сте заявили нулиране на паролата си, не обръщайте внимание на това писмо.",
"invalidLoginCredentialsLong": "Опа, потребителското име/е-пощата или паролата е грешна.\n— Уверете се, че всичко е изписано правилно. Потребителското име и паролата са чувствителни към регистъра;\n— Може да сте се вписали чрез Фейсбук или Гугъл, а не чрез е-поща. Проверете това, като опитате да влезете чрез Фейсбук или Гугъл;\n— Ако сте забравили паролата си, натиснете „Забравена парола“.",
"invalidCredentials": "Няма профил, който използва тези данни за вход.",
"accountSuspended": "Този акаунт, с потребителски идентификатор „<%= userId %>“, е блокиран за нарушаване на [Обществените правила](https://habitica.com/static/community-guidelines) или [Условията за ползване](https://habitica.com/static/terms). За повече подробности, или ако искате да помолите за отблокиране, моля, пишете на управителя за общността на адрес <%= communityManagerEmail %> или помолете свой родител или настойник да пише. Моля, напишете и потребителското си име в писмото.",
+38
View File
@@ -9,6 +9,7 @@
"mysterySets": "Тайнствени комплекти",
"gearNotOwned": "Не притежавате този предмет.",
"noGearItemsOfType": "Не притежавате нищо от тези.",
"noGearItemsOfClass": "Вече имате всичката възможна класова екипировка! Още ще стане налична по време на големите празненства, около слънцестоенията и равноденствията.",
"classLockedItem": "Този предмет е достъпен само за определен клас. От ниво 10 и нагоре, можете да промените класа си от Потребителската иконка > Настройки > Изграждане на героя!",
"tierLockedItem": "Този предмет е достъпен само след като вече сте закупили предходните предмети в последователността. Продължавайте да работите!",
"sortByType": "Тип",
@@ -1268,6 +1269,7 @@
"headArmoireVeilOfSpadesText": "Воал — пика",
"headArmoireVeilOfSpadesNotes": "Прикриващ и загадъчен воал, който ще увеличи умението Ви да се промъквате незабелязано. Увеличава усета с <%= per %>. Омагьосан гардероб: комплект „Асо пика“ (предмет 1 от 3).",
"offhand": "страничен предмет",
"offhandCapitalized": "Страничен предмет",
"shieldBase0Text": "Няма страничен предмет",
"shieldBase0Notes": "Няма щит или друг страничен предмет.",
"shieldWarrior1Text": "Дървен щит",
@@ -1316,66 +1318,98 @@
"shieldSpecialYetiNotes": "Този щит отразява светлината от снега. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2013-2014 г.",
"shieldSpecialSnowflakeText": "Снежинков щит",
"shieldSpecialSnowflakeNotes": "Всеки щит е уникален. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2013-2014 г.",
"shieldSpecialSpringRogueText": "Ноктоподобни куки",
"shieldSpecialSpringRogueNotes": "Чудесни за катерене на високи сгради, а също и за рязане на килими. Увеличава силата с <%= str %>. Ограничена серия: Пролетна екипировка 2014 г.",
"shieldSpecialSpringWarriorText": "Яйчен щит",
"shieldSpecialSpringWarriorNotes": "Този щит никога няма да се счупи, без значение колко силно го удряте! Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2014 г.",
"shieldSpecialSpringHealerText": "Писклива топка на върховната защита",
"shieldSpecialSpringHealerNotes": "Издава отвратителен, продължителен писък, когато бъде захапана, прогонвайки враговете надалеч. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2014 г.",
"shieldSpecialSummerRogueText": "Пиратска сабя",
"shieldSpecialSummerRogueNotes": "Стой! Ежедневните задачи сами ще скачат от кораба! Увеличава силата с <%= str %>. Ограничена серия: Лятна екипировка 2014 г.",
"shieldSpecialSummerWarriorText": "Щит от дървени отломки",
"shieldSpecialSummerWarriorNotes": "Този щит, направен от дъските на разбити кораби, може да възпре и най-бурните ежедневни задачи. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2014 г.",
"shieldSpecialSummerHealerText": "Плиткодънен щит",
"shieldSpecialSummerHealerNotes": "Никой няма да посмее да нападне кораловия риф, щом зърне този лъскав щит! Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2014 г.",
"shieldSpecialFallRogueText": "Сребърен кол",
"shieldSpecialFallRogueNotes": "Умъртвява немъртви. Също дава предимство срещу върколаци, за всеки случай. Увеличава силата с <%= str %>. Ограничена серия: Есенна екипировка 2014 г.",
"shieldSpecialFallWarriorText": "Силна научна отвара",
"shieldSpecialFallWarriorNotes": "Разлива се тайнствено върху лабораторни престилки. Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2014 г.",
"shieldSpecialFallHealerText": "Инкрустиран щит",
"shieldSpecialFallHealerNotes": "Този искрящ щит е открит в древна гробница. Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2014 г.",
"shieldSpecialWinter2015RogueText": "Ледена висулка",
"shieldSpecialWinter2015RogueNotes": "Наистина, определено, със сигурност го взехте от земята. Увеличава силата с <%= str %>. Ограничена серия: Зимна екипировка 2014-2015 г.",
"shieldSpecialWinter2015WarriorText": "Желиран щит",
"shieldSpecialWinter2015WarriorNotes": "Този на пръв поглед сладък щит всъщност е направен от хранителни, пихтиести зеленчуци. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2014-2015 г.",
"shieldSpecialWinter2015HealerText": "Успокояващ щит",
"shieldSpecialWinter2015HealerNotes": "Този щит спира вледеняващия вятър. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2014-2015 г.",
"shieldSpecialSpring2015RogueText": "Експлодиращ писък",
"shieldSpecialSpring2015RogueNotes": "Не се заблуждавайте от звука — тези експлозиви нанасят много щети. Увеличава силата с <%= str %>. Ограничена серия: Пролетна екипировка 2015 г.",
"shieldSpecialSpring2015WarriorText": "Чиния-диск",
"shieldSpecialSpring2015WarriorNotes": "Хвърлете я по враговете… или я задръжте, защото ще се напълни с вкусно едросмляно зърно за вечеря. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2015 г.",
"shieldSpecialSpring2015HealerText": "Шарена възглавница",
"shieldSpecialSpring2015HealerNotes": "Можете да положите глава върху тази мека възглавница или да я разкъсате със страшните си нокти. Грр! Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2015 г.",
"shieldSpecialSummer2015RogueText": "Огнестрелящ корал",
"shieldSpecialSummer2015RogueNotes": "Този роднина на огнения корал има способността да изстрелва отровата си през водата. Увеличава силата с <%= str %>. Ограничена серия: Лятна екипировка 2015 г.",
"shieldSpecialSummer2015WarriorText": "Щит с риба луна",
"shieldSpecialSummer2015WarriorNotes": "Този блестящ като пясъка и морето щит е изработен от дълбочинен океански метал от майсторите на Мудноград. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2015 г.",
"shieldSpecialSummer2015HealerText": "Намотан щит",
"shieldSpecialSummer2015HealerNotes": "Използвайте този щит, за да мачкате трюмни плъхове. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2015 г.",
"shieldSpecialFall2015RogueText": "Бой-на брадва",
"shieldSpecialFall2015RogueNotes": "Страховитите задачи за изпълнение треперят пред вида на тази брадва. Увеличава силата с <%= str %>. Ограничена серия: Есенна екипировка 2015 г.",
"shieldSpecialFall2015WarriorText": "Чанта с птичи семена",
"shieldSpecialFall2015WarriorNotes": "Вярно е, че би трябвало да ПЛАШИТЕ гаргите, но няма нищо лошо и да станете приятели с тях. Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2015 г.",
"shieldSpecialFall2015HealerText": "Пръчка за разбъркване",
"shieldSpecialFall2015HealerNotes": "Тази пръчка може да разбърка всичко и то без да го стопи, разтвори или възпламени! Също така може да бъде използвана за сръчкване на вражески настроените задачи. Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2015 г.",
"shieldSpecialWinter2016RogueText": "Чаша какао",
"shieldSpecialWinter2016RogueNotes": "Топла напитка или врящ снаряд? Вие решавате… Увеличава силата с <%= str %>. Ограничена серия: Зимна екипировка 2015-2016 г.",
"shieldSpecialWinter2016WarriorText": "Щит-шейна",
"shieldSpecialWinter2016WarriorNotes": "Използвайте тази шейна, за да отблъсквате ударите или я яхнете и влезте победоносно в битката! Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2015-2016 г.",
"shieldSpecialWinter2016HealerText": "Фейски подарък",
"shieldSpecialWinter2016HealerNotes": "Отворете го, отворете го, отворете го, отворете го, отворете го, отворете го!!!!!!!!! Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2015-2016 г.",
"shieldSpecialSpring2016RogueText": "Огнен болеадорас",
"shieldSpecialSpring2016RogueNotes": "Вече усъвършенствахте топката, тоягата и ножа. Време е да преминете към жонглирането с огън. Оох! Увеличава силата с <%= str %>. Ограничена серия: Пролетна екипировка 2016 г.",
"shieldSpecialSpring2016WarriorText": "Пита сирене",
"shieldSpecialSpring2016WarriorNotes": "Преминахте през ужасяващи капани, за да се сдобиете с тази увеличаваща защитата храна. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2016 г.",
"shieldSpecialSpring2016HealerText": "Цветен щит",
"shieldSpecialSpring2016HealerNotes": "Първоаприлският шегаджия твърди, че този малък щит може да отблъсква лъскави семена. Не му вярвайте. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2016 г.",
"shieldSpecialSummer2016RogueText": "Електрически прът",
"shieldSpecialSummer2016RogueNotes": "Всеки, който се изправи срещу Вас, ще бъде шокиран… Увеличава силата с <%= str %>. Ограничена серия: Лятна екипировка 2016 г.",
"shieldSpecialSummer2016WarriorText": "Зъб на акула",
"shieldSpecialSummer2016WarriorNotes": "Захапете трудните задачи с този приличащ на зъб щит! Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2016 г.",
"shieldSpecialSummer2016HealerText": "Звезден морски щит",
"shieldSpecialSummer2016HealerNotes": "Понякога неправилно наричан „щит-морска звезда“. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2016 г.",
"shieldSpecialFall2016RogueText": "Паякова кама",
"shieldSpecialFall2016RogueNotes": "Усетете отровата на захапката на паяка! Увеличава силата с <%= str %>. Ограничена серия: Есенна екипировка 2016 г.",
"shieldSpecialFall2016WarriorText": "Защитни корени",
"shieldSpecialFall2016WarriorNotes": "Защитете се от ежедневните си задачи с тези оплетени корени! Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2016 г.",
"shieldSpecialFall2016HealerText": "Горгонски щит",
"shieldSpecialFall2016HealerNotes": "Не се оглеждайте в този щит. Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2016 г.",
"shieldSpecialWinter2017RogueText": "Ледена брадва",
"shieldSpecialWinter2017RogueNotes": "Тази брадва е чудесна за нападение, защита и катерене по лед! Увеличава силата с <%= str %>. Ограничена серия: Зимна екипировка 2016-2017 г.",
"shieldSpecialWinter2017WarriorText": "Щит от шайба",
"shieldSpecialWinter2017WarriorNotes": "Този щит, направен от голяма шайба за хокей, може да устои на доста бой. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2016-2017 г.",
"shieldSpecialWinter2017HealerText": "Захаросан щит",
"shieldSpecialWinter2017HealerNotes": "Този влакнест щит ще Ви защити и от най киселите задачи! Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2016-2017 г.",
"shieldSpecialSpring2017RogueText": "Морковен меч",
"shieldSpecialSpring2017RogueNotes": "Тези остриета ще обработват бързо задачите, но стават и за рязане на зеленчуци! Вкусно! Увеличава силата с <%= str %>. Ограничена серия: Пролетна екипировка 2017 г.",
"shieldSpecialSpring2017WarriorText": "Щит от прежда",
"shieldSpecialSpring2017WarriorNotes": "Във всяка нишка от този щит има втъкани защитни заклинания! Не си играйте (твърде много) с него. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2017 г.",
"shieldSpecialSpring2017HealerText": "Щит-кошница",
"shieldSpecialSpring2017HealerNotes": "Защитава, а и има къде да си носите лечебните билки и снаряжението. Увеличава якостта с <%= con %>. Ограничена серия: Пролетна екипировка 2017 г.",
"shieldSpecialSummer2017RogueText": "Перки на морски дракон",
"shieldSpecialSummer2017RogueNotes": "Ръбовете на тези перки са остри като бръсначи. Увеличава силата с <%= str %>. Ограничена серия: Лятна екипировка 2017 г.",
"shieldSpecialSummer2017WarriorText": "Раковинен щит",
"shieldSpecialSummer2017WarriorNotes": "Този щит, който тъкмо намерихте, става за украса И защита! Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2017 г.",
"shieldSpecialSummer2017HealerText": "Стриден щит",
"shieldSpecialSummer2017HealerNotes": "Тази вълшебна стрида постоянно произвежда перли, но и защитава добре. Увеличава якостта с <%= con %>. Ограничена серия: Лятна екипировка 2017 г.",
"shieldSpecialFall2017RogueText": "Захаросан ябълков боздуган",
"shieldSpecialFall2017RogueNotes": "Сразете враговете си със сладост! Увеличава силата с <%= str %>. Ограничена серия: Есенна екипировка 2017 г.",
"shieldSpecialFall2017WarriorText": "Захаросан царевичен щит",
"shieldSpecialFall2017WarriorNotes": "Този захаросан щит има могъщи защитни сили, така че не си похапвайте от него! Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2017 г.",
"shieldSpecialFall2017HealerText": "Прокълнато кълбо",
"shieldSpecialFall2017HealerNotes": "Това кълбо от време на време пищи. Съжаляваме, не знаем защо. Но поне изглежда страхотно! Увеличава якостта с <%= con %>. Ограничена серия: Есенна екипировка 2017 г.",
"shieldSpecialWinter2018RogueText": "Ментова качулка",
"shieldSpecialWinter2018RogueNotes": "Идеална за катерене на стени или за разсейване на враговете със сладки неща. Увеличава силата с <%= str %>. Ограничена серия: Зимна екипировка 2017-2018 г.",
"shieldSpecialWinter2018WarriorText": "Вълшебна торба с подаръци",
"shieldSpecialWinter2018WarriorNotes": "В тази торба можете да откриете почти всички, от което се нуждаете, ако знаете правилните вълшебни думички. Увеличава якостта с <%= con %>. Ограничена серия: Зимна екипировка 2017-2018 г.",
"shieldSpecialWinter2018HealerText": "Имелов звънец",
@@ -1471,6 +1505,7 @@
"shieldArmoireMightyQuillText": "Могъщо перо",
"shieldArmoireMightyQuillNotes": "По-могъщо от меч, както казват! Увеличава усета с <%= per %>. Омагьосан гардероб: комплект на книжника (предмет 2 от 3).",
"back": "Аксесоар за гръб",
"backCapitalized": "Аксесоар за гръб",
"backBase0Text": "Няма аксесоар за гръб",
"backBase0Notes": "Няма аксесоар за гръб.",
"animalTails": "Животински опашки",
@@ -1539,6 +1574,7 @@
"backWolfTailText": "Опашка на лъв",
"backWolfTailNotes": "С тази опашка приличате на предан вълк! Не променя показателите.",
"body": "Аксесоар за тяло",
"bodyCapitalized": "Аксесоар за тяло",
"bodyBase0Text": "Няма аксесоар за тяло",
"bodyBase0Notes": "Няма аксесоар за тяло.",
"bodySpecialWonderconRedText": "Рубинена яка",
@@ -1576,6 +1612,7 @@
"bodyArmoireCozyScarfText": "Удобен шал",
"bodyArmoireCozyScarfNotes": "С този лек шал ще Ви бъде топло, докато вършите зимната си работа. Увеличава якостта и усета с по <%= attrs %>. Омагьосан гардероб: Фенерджийски комплект (предмет 4 от 4).",
"headAccessory": "аксесоар за глава",
"headAccessoryCapitalized": "Аксесоар за глава",
"accessories": "Аксесоари",
"animalEars": "Животински уши",
"headAccessoryBase0Text": "Няма аксесоар за глава",
@@ -1665,6 +1702,7 @@
"headAccessoryArmoireGogglesOfBookbindingText": "Очила за подвързване",
"headAccessoryArmoireGogglesOfBookbindingNotes": "С тези очила ще видите ясно всяка задача – била тя голяма или малка! Увеличава усета с <%= per %>. Омагьосан гардероб: Подвързачески комплект (предмет 1 от 4).",
"eyewear": "Предмет за очи",
"eyewearCapitalized": "Предмет за очи",
"eyewearBase0Text": "Няма предмет за очи",
"eyewearBase0Notes": "Няма предмет за очи.",
"eyewearSpecialBlackTopFrameText": "Обикновени черни очила",
+1
View File
@@ -45,6 +45,7 @@
"notEnoughGems": "Нямате достатъчно диаманти",
"alreadyHave": "Опа! Вече притежавате този предмет. Не е необходимо да го купувате пак!",
"delete": "Изтриване",
"gemsPopoverTitle": "Диаманти",
"gems": "Диаманти",
"needMoreGems": "Нуждаете се от още диаманти?",
"needMoreGemsInfo": "Купете диаманти сега, или станете абонат, за да можете да купувате диаманти със злато, да получавате тайнствени предмети, да имате по-високи ограничения за падания на предмети и още!",
+17
View File
@@ -5,21 +5,26 @@
"innCheckOutBannerShort": "Вие си почивате в странноприемницата.",
"resumeDamage": "Продължаване на щетите",
"helpfulLinks": "Полезни връзки",
"communityGuidelinesLink": "Обществени правила",
"lookingForGroup": "Публикации за търсене на група",
"dataDisplayTool": "Инструмент за показване на данните",
"requestFeature": "Предлагане на функционалност",
"askAQuestion": "Задаване на въпрос",
"askQuestionGuild": "Задайте въпрос (помощна гилдия на Хабитика)",
"contributing": "Принос",
"faq": "ЧЗВ",
"tutorial": "Инструктаж",
"glossary": "<a target='_blank' href='http://habitica.fandom.com/wiki/Glossary'>Речник</a>",
"wiki": "Уики",
"requestAF": "Предлагане на функционалност",
"dataTool": "Инструмент за показване на данните",
"resources": "Материали",
"communityGuidelines": "Обществени правила",
"bannedWordUsed": "Опа! Изглежда тази публикация съдържа ругатня, религиозна клетва или намеква за употреба на пристрастяващо вещество или друга тема, подходяща само за възрастни (<%= swearWordsUsed %>). Хабитика се използва от най-различни потребители, затова държим на това съобщенията в чата да бъдат подходящи за всички. Редактирайте съобщението си и ще можете да го публикувате!",
"bannedSlurUsed": "Публикацията Ви съдържа неприлични думи или изказ, затова привилегиите Ви в чата Ви бяха отнети.",
"party": "Група",
"usernameCopied": "Потребителското име е копирано в буфера.",
"createGroupPlan": "Създаване",
"create": "Създаване",
"userId": "Потребителски идентификатор",
"invite": "Покана",
@@ -47,7 +52,9 @@
"inviteOnly": "Само с покана",
"gemCost": "Цената за създаването на гилдия подсигурява качеството на гилдиите, а диамантите се прехвърлят в банката на гилдията, от където те могат да бъдат използвани като награди в предизвикателствата на гилдията!",
"search": "Търсене",
"publicGuilds": "Обществени гилдии",
"createGuild": "Създаване на гилдия",
"createGuild2": "Създаване",
"guild": "Гилдия",
"guilds": "Гилдии",
"sureKick": "Наистина ли искате да премахнете този член от групата/гилдията?",
@@ -65,6 +72,7 @@
"applySortToHeader": "Прилагане на настройките за подреждане към заглавната част на групата",
"confirmGuild": "Създавате ли гилдията за 4 диаманта?",
"confirm": "Потвърждаване",
"leaveGroup": "Напускане на гилдията",
"leaveParty": "Напускане на групата",
"send": "Изпращане",
"pmsMarkedRead": "Личните Ви съобщения бяха отбелязани като прочетени",
@@ -72,6 +80,7 @@
"PMPlaceholderTitle": "Тук все още няма нищо",
"PMPlaceholderDescription": "Изберете разговор отляво",
"PMPlaceholderTitleRevoked": "Привилегиите Ви в чата Ви бяха отнети",
"PMPlaceholderDescriptionRevoked": "Не можете да изпращате лични съобщения, тъй като привилегиите Ви в чата Ви бяха отнети. Ако имате въпроси или притеснения относно това, моля, пишете на <a href=\"mailto:admin@habitica.com\">admin@habitica.com</a>, за да ги обсъдите с екипа.",
"PMEnabledOptPopoverText": "Личните съобщения са включени. Потребителите могат да се свържат с Вас чрез профила Ви.",
"PMDisabledOptPopoverText": "Личните съобщения са изключени. Включете ги, ако искате потребителите да могат да се свързват с Вас чрез профила Ви.",
"PMDisabledCaptionTitle": "Личните съобщения са забранени",
@@ -165,6 +174,8 @@
"userCountRequestsApproval": "<strong><%= userCount %> членове</strong> искат одобрение",
"youAreRequestingApproval": "Вие искате одобрение",
"chatPrivilegesRevoked": "Не можете да направите това, защото привилегиите Ви в чата са Ви били отнети. За детайли или запитване за връшане на привилегии, моля пратете email на нашия Обществен Оправител на admin@habitica.com или попитайте вашия родител или настойник да им прати email. Моля, напишете и потребителското си име в писмото. Ако модератор вече ви е казал че блокирането ви към чата е временно, няма нужда да пращате email.",
"cannotCreatePublicGuildWhenMuted": "Не можете да създадете обществена гилдия, защото привилегиите Ви в чата са Ви били отнети.",
"cannotInviteWhenMuted": "Не можете да изпратите покана за гилдия или група, защото привилегиите Ви в чата са Ви били отнети.",
"to": "До:",
"from": "От:",
"assignTask": "Задаване на задача",
@@ -204,6 +215,7 @@
"userMustBeMember": "Потребителят трябва да бъде член",
"userIsNotManager": "Потребителят не е управител",
"canOnlyApproveTaskOnce": "Тази задача е вече одобрена.",
"addTaskToGroupPlan": "Създаване",
"joinedGuild": "Присъединил(а) се към гилдия",
"joinedGuildText": "Потопил(а) се в обществената част на Хабитика чрез присъединяване към гилдия!",
"badAmountOfGemsToPurchase": "Стойността трябва да бъде поне 1.",
@@ -265,8 +277,11 @@
"wantToJoinPartyTitle": "Искате да се присъедините към група?",
"wantToJoinPartyDescription": "Дайте потребителското си име на приятел, който вече има група, или се отправете към гилдията <a href='/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>„Търсене на група“ (Party Wanted)</a>, за да се срещнете с потенциални другари!",
"copy": "Копиране",
"inviteToPartyOrQuest": "Канене на групата за мисия",
"inviteInformation": "Ако натиснете „Поканване“, ще изпратите покани до всички членове на групата. Мисията започва, когато всички приемат или отхвърлят поканата си.",
"questOwnerRewards": "Надгради на притежателя на мисията",
"updateParty": "Обновяване на групата",
"upgrade": "Надграждане",
"selectPartyMember": "Изберете член на групата",
"areYouSureDeleteMessage": "Наистина ли искате да изтриете това съобщение?",
"reverseChat": "Обръщане на разговора",
@@ -278,6 +293,7 @@
"groupTaskBoard": "Дъска със задачи",
"groupInformation": "Информация за групата",
"groupBilling": "Таксуване на групата",
"wouldYouParticipate": "Искате ли да участвате?",
"managerAdded": "Управителят е добавен успешно",
"managerRemoved": "Управителят е премахнат успешно",
"leaderChanged": "Водачът беше сменен",
@@ -299,6 +315,7 @@
"groupManagementControlsDesc": "Използвайте възможността за одобрение на задачите, за да потвърждавате, че дадена задача наистина е изпълнена; добавете управители на групата, за да споделите отговорностите; и се възползвайте от груповия чат за членовете на екипа.",
"inGameBenefits": "Облаги в играта",
"inGameBenefitsDesc": "Членовете на групов план получават изключителния превоз „Рогат заек“, както и всички облаги на абонамента, включително специална месечна екипировка и възможността за закупуване на диаманти със злато.",
"inspireYourParty": "Вдъхновете групата си, превърнете заедно живота си в игра.",
"letsMakeAccount": "Първо, трябва да си създадете профил",
"nameYourGroup": "След това трябва да дадете име на групата си",
"exampleGroupName": "Например: „Академия за отмъстители“",
+1 -3
View File
@@ -4,7 +4,5 @@
"eggsItemType": "Яйца",
"hatchingPotionsItemType": "Излюпващи Отвари",
"specialItemType": "Специални предмети",
"lockedItem": "Заключен Предмет",
"petAndMount": "Конюшня",
"allItems": "Всички предмети"
"lockedItem": "Заключен Предмет"
}
+7 -4
View File
@@ -130,13 +130,15 @@
"winter2019PyrotechnicSet": "Пиротехник (магьосник)",
"winter2019WinterStarSet": "Зимна звезда (лечител)",
"winter2019PoinsettiaSet": "Коледна звезда (мошеник)",
"winterPromoGiftHeader": "ПОДАРЕТЕ АБОНАМЕНТ И ЩЕ ПОЛУЧИТЕ ОЩЕ ЕДИН БЕЗПЛАТНО!",
"winterPromoGiftHeader": "ПОДАРЕТЕ АБОНАМЕНТ И ЩЕ ПОЛУЧИТЕ ОЩЕ ЕДИН БЕЗПЛАТНО!",
"winterPromoGiftDetails1": "Само до 6 януари, ако подарите абонамент на някого, ще получите същия и за себе си безплатно!",
"winterPromoGiftDetails2": "Моля, имайте предвид, че ако Вие или получателят на подаръка Ви вече имате повтарящ се абонамент, подареният ще започне след като текущият бъде прекратен или изтече. Благодарим Ви за подкрепата! <3",
"discountBundle": "пакет",
"g1g1Announcement": "Подарете абонамент и ще получите още един безплатно! Събитието протича в момента!",
"g1g1Details": "Подарете абонамент на приятел от профила му и ще получите същия абонамент безплатно!",
"spring2020LapisLazuliRogueSet": "Лапис Лазули (мошеник)",
"september2018": "Септември 2018",
"september2017": "Септември 2017",
"spring2020LapisLazuliRogueSet": "Лапис Лазули (мошеник)",
"spring2020IrisHealerSet": "Ирис (лечител)",
"spring2020PuddleMageSet": "Локва (магьосник)",
"spring2020BeetleWarriorSet": "Носорог Бръмбар (воин)",
@@ -155,5 +157,6 @@
"spring2019CloudRogueSet": "Облак (мошеник)",
"spring2019RobinHealerSet": "Червеношийка (лечител)",
"spring2019AmberMageSet": "Кехлибар (Магьосник)",
"spring2019OrchidWarriorSet": "Орхидея (воин)"
}
"spring2019OrchidWarriorSet": "Орхидея (воин)",
"june2018": "Юни 2018"
}
+23 -22
View File
@@ -1,24 +1,25 @@
{
"unlockedReward": "Получихте <%= reward %>",
"earnedRewardForDevotion": "Получихте <%= reward %> за усърдието си в подобряването на живота си.",
"nextRewardUnlocksIn": "Брой отчитания до следващата награда: <%= numberOfCheckinsLeft %>",
"awesome": "Страхотно!",
"incentivesDescription": "Когато става въпрос за изграждане на навици, ключът е в постоянството. Всеки ден, в който се отчетете, Ви доближава до наградата.",
"checkinEarned": "Броячът на отчитанията Ви се увеличи!",
"unlockedCheckInReward": "Отключихте награда за отчитане!",
"checkinProgressTitle": "Напредък до следващата награда",
"incentiveBackgroundsUnlockedWithCheckins": "Повече фонови изображения ще се отключат чрез ежедневните Ви отчитания.",
"oneOfAllPetEggs": "по един брой от всяко обикновено яйце за любимец",
"twoOfAllPetEggs": "по два броя от всяко обикновено яйце за любимец",
"threeOfAllPetEggs": "по три броя от всяко обикновено яйце за любимец",
"oneOfAllHatchingPotions": "по един брой от всяка обикновена излюпваща отвара",
"threeOfEachFood": "по три броя от всяка обикновена храна за любимци",
"fourOfEachFood": "по четири броя от всяка обикновена храна за любимци",
"twoSaddles": "две седла",
"threeSaddles": "три седла",
"incentiveAchievement": "постижението „Царствена преданост“",
"royallyLoyal": "Царствена преданост",
"royallyLoyalText": "Потребителят се е отчел 500 пъти и е получил всички възможни награди за това!",
"checkInRewards": "Награди за отчитане",
"backloggedCheckInRewards": "Получихте награди за отчитане! Отворете инвентара и екипировката си, за да видите новите неща."
"unlockedReward": "Получихте <%= reward %>",
"earnedRewardForDevotion": "Получихте <%= reward %> за усърдието си в подобряването на живота си.",
"nextRewardUnlocksIn": "Брой отчитания до следващата награда: <%= numberOfCheckinsLeft %>",
"awesome": "Страхотно!",
"countLeft": "Брой отчитания до следващата награда: <%= count %>",
"incentivesDescription": "Когато става въпрос за изграждане на навици, ключът е в постоянството. Всеки ден, в който се отчетете, Ви доближава до наградата.",
"checkinEarned": "Броячът на отчитанията Ви се увеличи!",
"unlockedCheckInReward": "Отключихте награда за отчитане!",
"checkinProgressTitle": "Напредък до следващата награда",
"incentiveBackgroundsUnlockedWithCheckins": "Заключените едноцветни фонови изображения ще се отключат чрез ежедневните Ви отчитания.",
"oneOfAllPetEggs": "по един брой от всяко обикновено яйце за любимец",
"twoOfAllPetEggs": "по два броя от всяко обикновено яйце за любимец",
"threeOfAllPetEggs": "по три броя от всяко обикновено яйце за любимец",
"oneOfAllHatchingPotions": "по един брой от всяка обикновена излюпваща отвара",
"threeOfEachFood": "по три броя от всяка обикновена храна за любимци",
"fourOfEachFood": "по четири броя от всяка обикновена храна за любимци",
"twoSaddles": "две седла",
"threeSaddles": "три седла",
"incentiveAchievement": "постижението „Царствена преданост",
"royallyLoyal": "Царствена преданост",
"royallyLoyalText": "Потребителят се е отчел 500 пъти и е получил всички възможни награди за това!",
"checkInRewards": "Награди за отчитане",
"backloggedCheckInRewards": "Получихте награди за отчитане! Отворете инвентара и екипировката си, за да видите новите неща."
}
+2
View File
@@ -36,10 +36,12 @@
"messageGroupRequiresInvite": "Не можете да се присъедините към група, за която не сте получили покана.",
"messageGroupCannotRemoveSelf": "Не можете да премахнете себе си!",
"messageGroupChatBlankMessage": "Не можете да изпратите празно съобщение",
"messageGroupChatLikeOwnMessage": "Не можете да харесате собственото си съобщение. Не бъдете такъв човек.",
"messageGroupChatFlagAlreadyReported": "Вече сте докладвали това съобщение",
"messageGroupChatNotFound": "Съобщението не е намерено!",
"messageGroupChatAdminClearFlagCount": "Само администратор може да изчисти броя на докладванията!",
"messageCannotFlagSystemMessages": "Не можете да докладвате системно съобщение. Ако искате да докладвате за нарушение на Обществените правила свързано с това съобщение, моля, изпратете е-писмо със снимка и обяснение на нашия Обществен Управител на адрес <%= communityManagerEmail %>.",
"messageGroupChatSpam": "Опа! Изглежда публикувате твърде много съобщения. Моля, изчакайте малко и опитайте отново. Чатът в кръчмата може да показва най-много 200 съобщения, така че съветваме потребителите да публикуват по-дълги и добре обмислени съобщения, както и да обединяват отговорите си. Скоро ще можете да пишете отново! :)",
"messageCannotLeaveWhileQuesting": "Не можете да приемете тази покана за присъединяване в група, докато изпълнявате мисия. Ако искате да се присъедините към тази група, трябва първо да прекратите мисията си – можете да направите това от екрана за групата. Ще си получите обратно свитъка с мисията.",
"messageUserOperationProtected": "Пътят `<%= operation %>` не беше запазен, тъй като е защитен път.",
"messageNotificationNotFound": "Известието не е намерено.",
+5
View File
@@ -20,6 +20,7 @@
"sleepBullet1": "Пропуснатите ежедневни задачи няма да Ви нараняват",
"sleepBullet2": "Задачите няма да губят серията си",
"sleepBullet3": "Главатарите няма да Ви нанасят щети заради пропуснатите Ви ежедневни задачи",
"sleepBullet4": "Щетите Ви срещу главатар и предметите от събираческите мисии ще Ви чакат докато излезете от странноприемницата",
"pauseDailies": "Спиране на щетите",
"unpauseDailies": "Продължаване на щетите",
"staffAndModerators": "Екип и модератори",
@@ -56,6 +57,7 @@
"wrongItemType": "„<%= type %>“ не е правилен тип на предмет.",
"wrongItemPath": "„<%= path %>“ не е правилен път за предмет.",
"unpinnedItem": "Откачихте „<%= item %>“! Този предмет вече няма да се показва в колоната Ви с награди.",
"cannotUnpinArmoirPotion": "Лечебната отвара и Омагьосаният гардероб не могат да бъдат откачени.",
"purchasedItem": "Закупихте <%= itemName %>",
"ianTextMobile": "Мога ли да Ви заинтересовам с няколко свитъка за мисии? Активирайте ги, за да се биете срещу чудовища заедно с групата си!",
"featuredQuests": "Препоръчани мисии!",
@@ -97,6 +99,7 @@
"tourStatsPage": "Това е страницата с показателите и статистиките Ви! Печелете постижения като изпълнявате описаните задачи.",
"tourTavernPage": "Добре дошли в кръчмата — мястото за разговори, достъпно за хора от всички възрасти! Може да избегнете нараняванията от ежедневните си задачи, в случай на болест или пътуване, като натиснете бутона „Спиране на щетите“. Елате и поздравете останалите!",
"tourPartyPage": "Групата ще Ви помогне да бъдете по-отговорен/на. Поканете приятелите си, за да отключите свитък с мисия!",
"tourGuildsPage": "Гилдиите са групи за разговори по общи интереси, създавани от играчите и за играчите. Прегледайте списъка и се присъединете към гилдиите, които Ви се струват интересни! Вижте също и популярната гилдия за задаване на въпроси и помощ, където всеки може да зададе въпросите си относно Хабитика!",
"tourChallengesPage": "Предизвикателствата са тематични списъци от задачи, създавани от потребителите! Присъединявайки се към предизвикателство, Вие ще добавите задачите от него към профила си. Състезавайте се с други потребители, за да печелите диаманти като награда!",
"tourMarketPage": "Всеки път когато завършите задача, има шанс да получите Яйце, Излюпваща Отвара или парче Храна за Любимци. Може също да закупите тези продукти от тук.",
"tourHallPage": "Добре дошли в залата на героите, където почитаме хората с принос към Хабитика. Дали чрез код, изображения, музика, текстове или просто услужливост, те са си заслужили диаманти, изключителни предмети и престижни звания. Вие също можете да допринесете за развитието на Хабитика!",
@@ -105,6 +108,7 @@
"tourEquipmentPage": "Тук се съхранява екипировката Ви! Снаряжението Ви променя показателите Ви. Ако искате да покажете различна екипировка на героя си, без да променяте показателите си, щракнете „Използване на костюм.“",
"equipmentAlreadyOwned": "Вече притежавате този предмет",
"tourOkay": "Добре!",
"tourAwesome": "Страхотно!",
"tourSplendid": "Прекрасно!",
"welcomeToHabit": "Добре дошли в Хабитика!",
"welcome1": "Създайте си обикновен герой.",
@@ -113,6 +117,7 @@
"welcome2notes": "Колкото по-добре се справяте със задачите си в истинския живот, толкова по-добре ще се справяте и в играта!",
"welcome3": "Напредвайте в живота и в играта!",
"welcome3notes": "Като подобрявате живота си, героят Ви ще качва нива и отключва любимци, мисии, екипировка и още!",
"imReady": "Влизане в Хабитика",
"limitedOffer": "Налично до <%= date %>",
"paymentCanceledDisputes": "Пратихме потвърждение за прекратяване на вашият email. Ако не виждате съобщението, моля свържете се с нас, за да се предотвратят бъдещи конфликти за таксуване.",
"paymentAutoRenew": "Този абонамент ще се обновява автоматично, докато не се прекрати. Ако искате да прекратите този абонамент, може да го направите чрез настройките.",
+4 -4
View File
@@ -1,10 +1,10 @@
{
"needTips": "Имате нужда от съвети как да започнете? Ето кратко ръководство!",
"step1": "Стъпка 1: Въведете задачите си",
"webStep1Text": "Хабитика трябва да знае какви са истинските Ви цели, затова въведете няколко задачи за изпълнение. Винаги можете да добавите още по-късно, като натиснете бутона „Създаване“.\n * **Създаване на [задачи за изпълнение](https://habitica.fandom.com/wiki/To_Do%27s):** Въведете задачите, които трябва да свършите веднъж, или които се вършат много рядко, в колоната за задачи, една по една. След това можете да щракнете моливчето и да ги редактирате, като добавите списък от подзадачи, крайна дата и още!\n * **Създаване на [ежедневни задачи](https://habitica.fandom.com/wiki/Dailies):** Въведете дейностите, които трябва да вършите всекидневно или в един и същ ден всяка седмица, в колоната с ежедневни. Щракнете върху задача, за да редактирате дните от седмицата, през които въпросната задача трябва да се върши. Можете също да изискате изпълнението ѝ на определен период, например на всеки 3 дни.\n * **Създаване на [навици](https://habitica.fandom.com/wiki/Habits):** Въведете навиците, които искате да си създадете, в колоната с навици. Може да настроите дали навикът е добър :heavy_plus_sign: или лош :heavy_minus_sign:.\n * **Създаване на [награди](https://habitica.fandom.com/wiki/Rewards):** Освен наградите, предлагани от самата игра, можете да добавите различни дейности или примамливи неща, които да използвате като мотивация, в колоната с награди. Почивката и удоволствията също са важни!\n* Ако имате нужда от малко вдъхновение, можете да разгледате страниците в уикито с [примерни навици](https://habitica.fandom.com/wiki/Sample_Habits), [примерни ежедневни задачи](https://habitica.fandom.com/wiki/Sample_Dailies), [примерни задачи за изпълнение](https://habitica.fandom.com/wiki/Sample_To-Do%27s), и [примерни награди](https://habitica.fandom.com/wiki/Sample_Custom_Rewards).",
"webStep1Text": "Хабитика трябва да знае какви са истинските Ви цели, затова въведете няколко задачи за изпълнение. Винаги можете да добавите още по-късно, като натиснете бутона „Създаване“.\n * **Създаване на [задачи за изпълнение](http://habitica.fandom.com/wiki/To-Dos):** Въведете задачите, които трябва да свършите веднъж, или които се вършат много рядко, в колоната за задачи, една по една. След това можете да щракнете моливчето и да ги редактирате, като добавите списък от подзадачи, крайна дата и още!\n * **Създаване на [ежедневни задачи](http://habitica.fandom.com/wiki/Dailies):** Въведете дейностите, които трябва да вършите всекидневно или в един и същ ден всяка седмица, в колоната с ежедневни. Щракнете върху задача, за да редактирате дните от седмицата, през които въпросната задача трябва да се върши. Можете също да изискате изпълнението ѝ на определен период, например на всеки 3 дни.\n * **Създаване на [навици](http://habitica.fandom.com/wiki/Habits):** Въведете навиците, които искате да си създадете, в колоната с навици. Може да настроите дали навикът е добър :heavy_plus_sign: или лош :heavy_minus_sign:.\n * **Създаване на [награди](http://habitica.fandom.com/wiki/Rewards):** Освен наградите, предлагани от самата игра, можете да добавите различни дейности или примамливи неща, които да използвате като мотивация, в колоната с награди. Почивката и удоволствията също са важни!\n* Ако имате нужда от малко вдъхновение, можете да разгледате страниците в уикито с [примерни навици](http://habitica.fandom.com/wiki/Sample_Habits), [примерни ежедневни задачи](http://habitica.fandom.com/wiki/Sample_Dailies), [примерни задачи за изпълнение](http://habitica.fandom.com/wiki/Sample_To-Dos), и [примерни награди](http://habitica.fandom.com/wiki/Sample_Custom_Rewards).",
"step2": "Стъпка 2: Печелете точки като вършите неща в истинския живот",
"webStep2Text": "А сега започнете да преследвате целите си от списъка! Когато завършвате задачи и ги отмятате в Хабитика, ще получавате [опит](https://habitica.fandom.com/wiki/Experience_Points), чрез който качвате ниво и [злато](https://habitica.fandom.com/wiki/Gold_Points), с което можете да си купувате награди. Ако се поддадете на лош навик или пропуснете ежедневна задача, ще загубите [здраве](https://habitica.fandom.com/wiki/Health_Points). Така лентите за опит и здраве представляват своеобразен показател за напредъка към целите Ви. Подобрявайки истинския си живот, Вашият герой в играта ще напредва.",
"webStep2Text": "А сега започнете да преследвате целите си от списъка! Когато завършвате задачи и ги отмятате в Хабитика, ще получавате [опит](http://habitica.fandom.com/wiki/Experience_Points), чрез който качвате ниво и [злато](http://habitica.fandom.com/wiki/Gold_Points), с което можете да си купувате награди. Ако се поддадете на лош навик или пропуснете ежедневна задача, ще загубите [здраве](http://habitica.fandom.com/wiki/Health_Points). Така лентите за опит и здраве представляват своеобразен показател за напредъка към целите Ви. Подобрявайки истинския си живот, Вашият герой в играта ще напредва.",
"step3": "Стъпка 3: Персонализирайте и изследвайте Хабитика",
"webStep3Text": "След като свикнете с нещата, ще можете да се забавлявате още повече с Хабитика, с тези интересни функционалности:\n * Организирайте Задачите си с [етикети](https://habitica.fandom.com/wiki/Tags) (етикетите се добавят в прозорчето за редактиране на Задача);\n * Персонализирайте [Героя](https://habitica.fandom.com/wiki/Avatar) си, като натиснете потребителската иконка в горния десен ъгъл;\n * Купете си [екипировка](https://habitica.fandom.com/wiki/Equipment) от колоната с награди или от [магазините](<%= shopUrl %>) и екипирайте героя си с нея в [Инвентар > Екипировка](<%= equipUrl %>);\n * Свържете се с други потребители посредством [Търсене на Група](https://habitica.com/looking-for-party);\n * Излюпване на [любимци](https://habitica.fandom.com/wiki/Pets) като събирате [Яйца](https://habitica.fandom.com/wiki/Eggs) и [Излюпващи Отвари](https://habitica.fandom.com/wiki/Hatching_Potions). [Хранете](https://habitica.fandom.com/wiki/Food) ги, за да се превърнат в [превози](https://habitica.fandom.com/wiki/Mounts);\n * След като достигнете ниво 10, ще можете да изберете [Клас](https://habitica.fandom.com/wiki/Class_System) и да използвате Класово-специфични [умения](https://habitica.fandom.com/wiki/Skills) (нива 11 до 14);\n * Сформирайте Група с приятелите си от [Група](<%= partyUrl %>), за да се държите отговорни взаимно и да получите свитък с мисия;\n * Побеждавайте чудовища и събирайте предмети от [Мисии](https://habitica.fandom.com/wiki/Quests) (ще получите мисия, когато достигнете ниво 15).",
"overviewQuestionsRevised": "Имате още въпроси? Проверете в <a href='/static/faq'>ЧЗВ</a>!Ако вашият въпрос не е споменат там, можете да поискате допълнителна помощ чрез този формуляр: "
"webStep3Text": "След като свикнете с нещата, ще можете да се забавлявате още повече с Хабитика, с тези интересни функционалности:\n * Организирайте Задачите си с [етикети](http://habitica.fandom.com/wiki/Tags) (етикетите се добавят в прозорчето за редактиране на Задача);\n * Персонализирайте [Героя](http://habitica.fandom.com/wiki/Avatar) си, като натиснете потребителската иконка в горния десен ъгъл;\n * Купете си [екипировка](http://habitica.fandom.com/wiki/Equipment) от колоната с награди или от [магазините](<%= shopUrl %>) и екипирайте героя си с нея в [Инвентар > Екипировка](<%= equipUrl %>);\n * Свържете се с други потребители посредством [кръчмата](http://habitica.fandom.com/wiki/Tavern);\n * Излюпване на [любимци](http://habitica.fandom.com/wiki/Pets) като събирате [Яйца](http://habitica.fandom.com/wiki/Eggs) и [Излюпващи Отвари](http://habitica.fandom.com/wiki/Hatching_Potions). [Хранете](http://habitica.fandom.com/wiki/Food) ги, за да се превърнат в [превози](http://habitica.fandom.com/wiki/Mounts);\n * След като достигнете ниво 10, ще можете да изберете [Клас](http://habitica.fandom.com/wiki/Class_System) и да използвате Класово-специфични [умения](http://habitica.fandom.com/wiki/Skills) (нива 11 до 14);\n * Сформирайте Група с приятелите си от [Група](<%= partyUrl %>), за да се държите отговорни взаимно и да получите свитък с мисия;\n * Побеждавайте чудовища и събирайте предмети от [Мисии](http://habitica.fandom.com/wiki/Quests) (ще получите мисия, когато достигнете ниво 15).",
"overviewQuestions": "Имате въпрос? Вижте нашите [ЧЗВ](<%= faqUrl %>)! Ако не намирате въпроса си там, можете да ни попитате за помощ в [Помощната гилдия на Хабитика](<%= helpGuildUrl %>).\n\nУспех със задачите Ви!"
}
+4
View File
@@ -39,9 +39,11 @@
"hatchingPotion": "излюпваща отвара",
"haveHatchablePet": "Имате излюпваща отвара с(ъс) <%= potion %> и яйце на <%= egg %>, с които можете да излюпите този любимец! <b>Натиснете</b> за да го излюпите!",
"quickInventory": "Бърз инвентар",
"foodText": "храна",
"food": "Храна за Любимци и седла",
"noFoodAvailable": "Нямате Храна за Любимци.",
"noSaddlesAvailable": "Нямате седла.",
"noFood": "Вие нямате нито храна, нито седла.",
"dropsExplanation": "Вземете тези предмети по-бързо с диаманти, ако не Ви се чака да Ви се паднат след приключване на задача. <a href=\"http://habitica.fandom.com/wiki/Drops\">Научете повече за системата за падане на предмети.</a>",
"dropsExplanationEggs": "Използвайте диамантите, за да получавате яйца по-бързо, ако не искате да чакате да Ви се паднат яйца по нормалния начин, или да повтаряте мисиите, за да получите яйца от мисии. <a href=\"http://habitica.fandom.com/wiki/Drops\">Научете повече за падането на предмети.</a>",
"premiumPotionNoDropExplanation": "Магическите излюпващи отвари не могат да бъдат използвани за яйца, придобити от мисии. Единственият начин да получите магическа излюпваща отвара, е като я закупите по-долу; тя няма никога да Ви се падне.",
@@ -59,6 +61,8 @@
"triadBingoText": "Намерил/а всички 90 любимци, всички 90 превоза и всички 90 любимци ОТНОВО (КАК СТАВА ТОВА!)",
"triadBingoText2": " и освободил(а) пълната си конюшня общо <%= count %> път(и)",
"triadBingoAchievement": "Спечелихте постижението „Тройно бинго“ за това, че намерихте всички любимци, опитомихте всички превози и намерихте всички любимци отново!",
"dropsEnabled": "Падането на предмети е включено!",
"firstDrop": "Отключихте системата за падане на предмети! Сега като изпълните задача, има малък шанс да Ви се падне някакъв предмет, включително яйца, отвари и храна! Току-що намерихте <strong>яйце на <%= eggText %></strong>! <%= eggNotes %>",
"hatchedPet": "Вие излюпихте <%= egg %> с <%= potion %>!",
"hatchedPetGeneric": "Излюпихте нов любимец!",
"hatchedPetHowToUse": "Посетете [конюшнята](<%= stableUrl %>), за да нахраните и екипирате новия си любимец!",
+6
View File
@@ -13,6 +13,7 @@
"rewardsQuestOwner": "Допълнителни награди за притежателя на мисията",
"inviteParty": "Канене на групата за мисия",
"questInvitation": "Покана за мисия: ",
"questInvitationInfo": "Покана за мисията „<%= quest %>“",
"invitedToQuest": " Получихте покана за присъединяване в мисията <span class=\"notification-bold-blue\"><%= quest %></span>",
"askLater": "Питайте ме по-късно",
"buyQuest": "Купуване на мисията",
@@ -21,6 +22,7 @@
"rejected": "Отказана",
"pending": "В очакване",
"questCollection": "Намерени предмети от мисия: + <%= val %>",
"questDamage": "Щети за главатаря: + <%= val %>",
"begin": "Започване",
"bossHP": "Здраве на главатаря",
"bossStrength": "Сила на главатаря",
@@ -36,7 +38,10 @@
"questConfirm": "Наистина ли искате това? Само <%= questmembers %> от всички <%= totalmembers %> членове на групата Ви са се присъединили в мисията! Мисиите започват автоматично, след като всичко играчи се присъединят или откажат поканата.",
"sureCancel": "Наистина ли искате да прекратите мисията? Всички приети покани ще бъдат загубени. Притежателят на мисията ще си запази свитъка ѝ.",
"sureAbort": "Наистина ли искате да прекратите мисията? Тя ще бъде прекратена за всекиго в групата, а напредъкът по нея ще бъде загубен. Свитъкът с мисията ще бъде върнат на притежателя си.",
"doubleSureAbort": "Наистина ли искате това? Дано приятелите Ви не се ядосат!",
"bossRageTitle": "Ярост",
"bossRageDescription": "Когато тази лента се напълни, главатарят ще отприщи специална атака!",
"startAQuest": "ЗАПОЧНЕТЕ МИСИЯ",
"startQuest": "Започнете мисия",
"questInvitationDoesNotExist": "Няма изпратени покани за мисията.",
"questInviteNotFound": "Няма намерени покани за мисията.",
@@ -46,6 +51,7 @@
"questNotGemPurchasable": "Мисията „<%= key %>“ не може да бъде купена с диаманти.",
"questAlreadyUnderway": "Групата Ви е вече изпълнява мисия. Опитайте отново, когато текущата мисия приключи.",
"questAlreadyAccepted": "Вече сте приели поканата за мисията.",
"noActiveQuestToLeave": "Няма текуща мисия за напускане",
"questLeaderCannotLeaveQuest": "Водачът на мисията не може да я напусне",
"notPartOfQuest": "Не сте част от мисията",
"youAreNotOnQuest": "Не участвате в мисия",
+1 -1
View File
@@ -8,7 +8,7 @@
"rebirthOrb": "Използвал(а) Кълбо на прераждане, за да започне отново след достигане на ниво <%= level %>.",
"rebirthOrb100": "Използвал(а) Кълбо на прераждане, за да започне отново след достигане на ниво 100 или по-високо.",
"rebirthOrbNoLevel": "Използвал(а) Кълбо на прераждане, за да започне отново.",
"rebirthPop": "Рестартиране на героя Ви от ниво 1, запазвайки постиженията, събраните предмети и екипировката. Задачите и историята им ще бъдат запазени, но цветът им ще се промени на жълт. Сериите Ви ще бъдат премахнати, освен задачите, които принадлежат към активните Предизвикателства и Групови Планове. Златото, опитът, маната и ефектите на всички умения ще бъдат премахнати. Всичко това ще бъде извършено на момента.",
"rebirthPop": "Рестартиране на героя Ви от ниво 1, запазвайки постиженията, събраните предмети и екипировката. Задачите и историята им ще бъдат запазени, но цветът им ще се промени на жълт. Сериите Ви ще бъдат премахнати, освен задачите, които принадлежат към активните Предизвикателства и Групови Планове. Златото, опитът, маната и ефектите на всички умения ще бъдат премахнати. Всичко това ще бъде извършено на момента. За повече информация вижте страницата в уикито относно <a href='http://habitica.fandom.com/wiki/Orb_of_Rebirth' target='_blank'>Кълбото на прераждането</a>.",
"rebirthName": "Кълбо за прераждане",
"rebirthComplete": "Вие бяхте прероден(а)!",
"nextFreeRebirth": "<strong><%= days %> дни</strong> до <strong>БЕЗПЛАТНО</strong> Кълбо на Прераждане"
+23 -1
View File
@@ -5,8 +5,16 @@
"helpWithTranslation": "Искате ли да помогнете с превода на Habitica? Чудесно! Посетете <a href=\"/groups/guild/7732f64c-33ee-4cce-873c-fc28f147a6f7\">Aspiring Linguists Guild</a>!",
"stickyHeader": "Лепкава горна част",
"newTaskEdit": "Новите задачи да се отварят в режим на редактиране",
"dailyDueDefaultView": "По подразбиране да се показва разделът с „чакащи“ ежедневни задачи",
"dailyDueDefaultViewPop": "Ако е зададено, по подразбиране ще се показва разделът с „чакащи“ ежедневни задачи, вместо този с „всички“",
"reverseChatOrder": "Съобщенията в чата да се показват в обратен ред",
"startAdvCollapsed": "Разширените настройки на задачите да бъдат скрити поначало",
"startAdvCollapsedPop": "Ако е зададено, разширените настройки отначало ще бъдат скрити, когато отворите задача за редактиране.",
"dontShowAgain": "Да не се показва повече",
"suppressLevelUpModal": "Да не се показва изскачащ прозорец при вдигане на ниво",
"suppressHatchPetModal": "Да не се показва изскачащ прозорец при излюпване на любимец",
"suppressRaisePetModal": "Да не се показва изскачащ прозорец, когато любимец се превърне в превоз",
"suppressStreakModal": "Да не се показва изскачащ прозорец при спечелване на постижение за серия",
"showTour": "Показване на обиколката",
"showBailey": "Показване на Бейли",
"showBaileyPop": "Градският глашатай Бейли ще се покаже, за да можете да прегледате по-старите новини.",
@@ -19,6 +27,7 @@
"deleteAccount": "Изтриване на профила",
"deleteAccPop": "Изтрива и премахва Вашия профил в Хабитика.",
"feedback": "Ако искате да ни изпратите отзивите си, моля, въведете ги по-долу. Ще се радваме да научим какво Ви е харесало, или пък не, в Хабитика! Не говорите английски добре? Няма проблем! Пишете на който искате език.",
"qrCode": "QR-код",
"dataExport": "Изнасяне на данни",
"saveData": "Ето няколко възможности за запазване на данните Ви.",
"habitHistory": "История на навиците",
@@ -57,6 +66,13 @@
"hideAPIToken": "Скриване на жетона за ППИ",
"APITokenWarning": "Ако Ви трябва нов жетон за ППИ (ако например старият Ви вече не е таен), пишете на <%= hrefTechAssistanceEmail %>, посочвайки потребителския си идентификатор и текущия си жетон. След като той бъде подновен, ще трябва отново да разрешите достъпа на всичко, което сте използвали, като излезете от профила си в уеб сайта и мобилното приложение, и след това въведете новия си жетон във всички инструменти за Хабитика, които използвате.",
"thirdPartyApps": "Външни приложения",
"dataToolDesc": "Страница, която може да Ви покаже разнообразна информация, извлечена от Вашия профил в Хабитика, като например статистики относно Вашите задачи, екипировка и умения.",
"beeminder": "Beeminder",
"beeminderDesc": "Позволете на Beeminder да следи автоматично Вашите задачи за изпълнение. Можете да се ангажирате да изпълнявате даден брой задачи всеки ден или седмица, или можете да се ангажирате постепенно да намалявате оставащите Ви незавършени задачи за изпълнение. (Под „ангажиране“ в Beeminder се разбира реална заплаха от плащане на истински пари! Но може и просто да Ви харесат красивите диаграми на Beeminder.)",
"chromeChatExtension": "Разширение на Chrome за чат",
"chromeChatExtensionDesc": "Разширението на Chrome за чат в Хабитика добавя интуитивна област за съобщения, достъпна в целия уеб сайт habitica.com. Тя позволява на потребителите да си пишат съобщения в кръчмата, групата и всички гилдии, в които участват.",
"otherExtensions": "<a target='blank' href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations'>Други разширения</a>",
"otherDesc": "Открийте още приложения, разширения и инструменти в уикито на Хабитика.",
"resetDo": "Потвърждавам, нулирайте профила ми!",
"resetComplete": "Нулирането е завършено!",
"fixValues": "Промяна на стойности",
@@ -79,6 +95,7 @@
"emailNotifications": "Известия по е-поща",
"wonChallenge": "Вие спечелихте предизвикателство!",
"newPM": "Получихте лично съобщение",
"newPMInfo": "Ново съобщение от <%= name %>: <%= message %>",
"giftedGems": "Подарък — диаманти",
"giftedGemsInfo": "<%= name %> Ви подари <%= amount %> диамант(а)",
"giftedGemsFull": "Здравейте <%= username %>, <%= sender %> Ви изпрати <%= gemAmount %> диамант(а)!",
@@ -110,6 +127,7 @@
"promoCode": "Промоционален код",
"promoCodeApplied": "Промоционалният код беше приложен! Проверете инвентара си",
"promoPlaceholder": "Въведете промоционален код",
"displayInviteToPartyWhenPartyIs1": "Показване на бутона за канене в групата, когато в нея има 1 член.",
"saveCustomDayStart": "Запазване",
"registration": "Регистрация",
"addLocalAuth": "Добавяне на метод за вписване чрез е-поща и парола",
@@ -146,17 +164,21 @@
"push": "Известия",
"about": "Относно",
"setUsernameNotificationTitle": "Потвърдете потребителското си име!",
"setUsernameNotificationBody": "Скоро ще преобразуваме имената за вписване към уникални, публични потребителски имена. Тези потребителски имена ще бъдат използвани за покани, @споменавания в чата, и съобщения.",
"usernameIssueSlur": "Потребителските имена не може да съдържат неприлични думи.",
"usernameIssueForbidden": "Потребителските имена не може да съдържат забранени думи.",
"usernameIssueLength": "Потребителските имена трябва да бъдат с дължина между 1 и 20 знака.",
"usernameIssueInvalidCharacters": "Потребителското име може да съдържа само латинските букви от „a“ до „z“, числата от 0 до 9, тире и долна черта.",
"currentUsername": "Текущо потребителско име:",
"displaynameIssueLength": "Екранните имена трябва да бъдат с дължина между 1 и 30 знака.",
"displaynameIssueSlur": "Екранните имена не може да съдържат неприлични думи.",
"goToSettings": "Към настройките",
"usernameVerifiedConfirmation": "Вашето потребителско име, <%= username %>, е потвърдено!",
"usernameNotVerified": "Моля, потвърдете потребителското си име.",
"changeUsernameDisclaimer": "Потребителското ви име се ползва за покани, @споменавания в чата и съобщения, трябва да е от 1 до 20 символа, да съдържа само буквите от a до z, цифрите от 0 до 9, тирета или долни черти и не може да съдържа неприлични думи.",
"verifyUsernameVeteranPet": "Един от тези любимци-ветерани ще Ви чака след като приключите с потвърждението!",
"subscriptionReminders": "Абонаментни Напомняния",
"newPMNotificationTitle": "Ново съобщение от <%= name %>"
"newPMNotificationTitle": "Ново съобщение от <%= name %>",
"chatExtensionDesc": "Чат Разширението за Habitica добавя интуитивен чат прозорец за цялата habitica.com. Позволява на потребителите да чатят в Кръчмата, групата им и в гилдиите, в които са членове.",
"chatExtension": "<a target='blank' href='https://chrome.google.com/webstore/detail/habitrpg-chat-client/hidkdfgonpoaiannijofifhjidbnilbb'>Chrome Чат Разширение</a> и <a target='blank' href='https://addons.mozilla.org/en-US/firefox/addon/habitica-chat-client-2/'>Firefox Чат Разширение</a>"
}
+5 -4
View File
@@ -7,6 +7,7 @@
"spellWizardEarthNotes": "Вашата умствена сила разлюлява земята. Цялата група получава подсилка на интелигентността! (Зависи от: неподсилената ИНТ)",
"spellWizardFrostText": "Смразяващ студ",
"spellWizardFrostNotes": "Лед покрива задачите Ви. Сериите Ви няма да бъдат нулирани утре!",
"spellWizardFrostAlreadyCast": "Вече сте изпълнили това заклинание днес. Сериите Ви вече са замразени и няма нужда да го изпълнявате повторно.",
"spellWarriorSmashText": "Зверско разбиване",
"spellWarriorSmashNotes": "Правите задача по-синя или по-малко червена, за да нанесете допълнителни щети на главатарите! (Зависи от: СИЛ)",
"spellWarriorDefensiveStanceText": "Отбранителна поза",
@@ -24,8 +25,9 @@
"spellRogueStealthText": "Невидимост",
"spellRogueStealthNotes": "При всяко изпълнение част от незавършените Ви ежедневни задачи няма да Ви нанесат щети след края на деня. Сериите и цветовете им няма да се променят. (Зависи от: УСЕ)",
"spellRogueStealthDaliesAvoided": "<%= originalText %> Брой избегнати ежедневни задачи: <%= number %>.",
"spellRogueStealthMaxedOut": "Вие вече сте избегнали всичките си ежедневни задачи. Няма нужда да правите това заклинание отново.",
"spellHealerHealText": "Лечебна светлина",
"spellHealerHealNotes": "Блестяща светлина възстановява здравето Ви! (Зависи от: ЯКО и ИНТ)",
"spellHealerHealNotes": "Блестяща светлина възстановява здравето Ви! (Зависи от: ЯКО и ИНТ).",
"spellHealerBrightnessText": "Заслепяваща светлина",
"spellHealerBrightnessNotes": "Силна светлина прави задачите Ви по-сини или по-малко червени! (Зависи от: ИНТ)",
"spellHealerProtectAuraText": "Защитна аура",
@@ -53,6 +55,5 @@
"challengeTasksNoCast": "Използването на умения върху задачи от предизвикателства не е позволено.",
"groupTasksNoCast": "Използването на умения върху групови задачи не е позволено.",
"spellNotOwned": "Не притежавате това умение.",
"spellLevelTooHigh": "Трябва да бъдете ниво <%= level %>, за да използвате това умение.",
"spellAlreadyCast": "Използването на това умение няма да има допълнителен ефект."
}
"spellLevelTooHigh": "Трябва да бъдете ниво <%= level %>, за да използвате това умение."
}
@@ -4,6 +4,7 @@
"sendGems": "Изпратете Диаманти",
"buyGemsGold": "Купете Диаманти със Злато",
"mustSubscribeToPurchaseGems": "Купуването на диаманти със злато изисква абонамент",
"reachedGoldToGemCap": "Достигнахте месечното ограничение на златото, което може да бъде превърнато в диаманти: <%= convCap %>. Целта на това е да предотвратим злоупотребите. Ограничението се нулира през първите три дни на всеки месец.",
"reachedGoldToGemCapQuantity": "Заявеното от Вас количество – <%= quantity %>, превишава количеството, което може да закупите за този месец.Ограничението се нулира през първите три дни на всеки месец. Благодарим Ви, че се абонирахте!",
"mysteryItem": "Изключителни месечни предмети",
"mysteryItemText": "Всеки месец ще получавате уникален козметичен предмет за героя си! Освен това, за всеки три месеца непрекъснат абонамент, Тайнствените Пътешественици във Времето ще Ви дават достъп до исторически (и футуристични!) козметични предмети.",
@@ -11,12 +12,14 @@
"giftSubscription": "Искате ли да подарите предимствата на абонамент на някой друг?",
"giftSubscriptionText4": "Благодарим Ви за това, че подкрепяте Habitica!",
"groupPlans": "Групови планове",
"subscribe": "Абонамент",
"nowSubscribed": "Вече имате абонамент за Habitica!",
"cancelSub": "Прекратяване на абонамента",
"cancelSubInfoGroupPlan": "Тъй като имате безплатен абонамент от Групов План, не можете да го прекратите. Той ще приключи когато спрете да бъдете член на Груповия План. Ако Вие сте лидера на Групата и искате да прекратите целия групов план, можете да го направите от раздела „Таксуване на Граупата“.",
"cancelingSubscription": "Прекратяване на абонамента",
"contactUs": "Свържете се с нас",
"checkout": "Гише",
"sureCancelSub": "Наистина ли искате да прекратите абонамента си?",
"subGemPop": "Тъй като сте абонат на Habitica, всеки месец можете да купувате определен брой Диаманти със Злато.",
"subGemName": "Диаманти от абонамента",
"maxBuyGems": "Не можете да купите повече диаманти този месец. Ограничението се премахва през първите три дни на всеки месец. Благодарим Ви за абонамента!",
@@ -93,6 +96,7 @@
"mysterySetwondercon": "Уъндер-кон",
"subUpdateCard": "Обнови Кредитна Карта",
"subUpdateTitle": "Обнови",
"subUpdateDescription": "Обновете картата, която използвате за плащане.",
"notEnoughHourglasses": "Нямате достатъчно Тайнствени Пясъчни Часовници.",
"petsAlreadyOwned": "Вече притежавате този любимец.",
"mountsAlreadyOwned": "Вече притежавате този оседлан звяр.",
@@ -113,7 +117,9 @@
"invalidCoupon": "Грешен код от купон.",
"couponUsed": "Този код от купон вече е използван.",
"couponCodeRequired": "Кодът от купона е задължителен.",
"paypalCanceled": "Абонаментът Ви е прекратен",
"choosePaymentMethod": "Изберете разплащателен метод",
"buyGemsSupportsDevs": "Купуването на Диаманти подкрепя разработчиците и помага на Habitica да продължи да съществува",
"support": "ПОДКРЕПА",
"gemBenefitLeadin": "Диамантите Ви позволяват да купувате забавни допълнителни неща за профила си, като?",
"gemBenefit1": "Уникални и модни костюми за героя си.",
+7
View File
@@ -6,6 +6,7 @@
"addATask": "Добавяне на <%= type %>",
"editATask": "Редактиране на <%= type %>",
"createTask": "Създаване на <%= type %>",
"addTaskToUser": "Добавяне на задача",
"scheduled": "С краен срок",
"theseAreYourTasks": "Това са Вашите <%= taskType %>",
"habit": "Навик",
@@ -65,7 +66,9 @@
"silver": "Сребро (100 сребро = 1 злато)",
"price": "Цена",
"tags": "Етикети",
"editTags": "Редактиране",
"newTag": "Нов етикет",
"editTags2": "Редактиране на етикетите",
"toRequired": "Трябва да зададете стойност „до“ („to“)",
"startDate": "Начална дата",
"streaks": "Постигнати серии",
@@ -81,10 +84,13 @@
"fortifyPop": "Връща всички задачи в неутрално състояние (жълт цвят) и възстановява напълно здравето.",
"fortify": "Подсилване",
"fortifyComplete": "Подсилването е изпълнено!",
"deleteTask": "Изтриване на тази задача",
"sureDelete": "Наистина ли искате да изтриете тази задача?",
"streakCoins": "Бонус за серия!",
"taskToTop": "Към началото",
"taskToBottom": "Към края",
"taskAliasAlreadyUsed": "Псевдонимът на задачата вече се използва за друга задача.",
"taskNotFound": "Задачата не е намерена.",
"invalidTaskType": "Типът на задачата трябва да бъде един от следните: „habit“, „daily“, „todo“, „reward“.",
"invalidTasksType": "Типът на задачата трябва да бъде един от следните: „habits“, „dailys“, „todos“, „rewards“.",
"invalidTasksTypeExtra": "Типът на задачата трябва да бъде един от следните: „habits“, „dailys“, „todos“, „rewards“, „completedTodos“.",
@@ -96,6 +102,7 @@
"tagIdRequired": "„tagId“ трябва да бъде правилно форматиран идентификатор UUID, съответстващ на етикет, принадлежащ на потребителя.",
"positionRequired": "„position“ е задължително и трябва да бъде число.",
"cantMoveCompletedTodo": "Завършена задача за изпълнение не може да бъде преместена.",
"directionUpDown": "„direction“ е задължително и трябва да бъде „up“ или „down“.",
"alreadyTagged": "Този етикет вече е приложен към задачата.",
"taskRequiresApproval": "Тази задача трябва да бъде одобрена, преди да я изпълните. Одобрението вече беше поискано",
"taskApprovalHasBeenRequested": "Одобрението беше поискано",
+2 -1
View File
@@ -134,6 +134,7 @@
"achievementShadeOfItAllModalText": "Zkrotil jsi všechny stínové držáky!",
"achievementRoughRider": "Drsný jezdec",
"achievementRoughRiderText": "Vylíhl/a jsi všechny základní barvy nepohodlných mazlíčků a zvířat: kaktus, ježka a kámen!",
"achievementRoughRiderNotes": "Získal/a jsi všechny základní barvy nepohodlných mazlíčků a zvířat!",
"achievementGroupsBeta2022ModalText": "Vy a vaše skupiny jste testováním a poskytnutím zpětné vazby a pomohli Habitice!",
"achievementPolarPro": "Polární profík",
"achievementPolarProText": "Vylíhl/a jsi všechny základní barvy polárních mazlíčků: medvěda, lišku, tučňáka, velrybu a vlka!",
@@ -157,5 +158,5 @@
"achievementBonelessBossModalText": "Získal/a jsi všechny bezobratlé mazlíčky!",
"achievementDuneBuddy": "Kámoš z dun",
"achievementDuneBuddyText": "Vylíhl/a jsi všechny, v poušti se vyskytující, mazlíčky: pásovce, kaktus, lišku, žábu, hada a pavouka!",
"achievementDuneBuddyModalText": "Sesbíral jsi všechna zvířata žijící v poušti!"
"achievementDuneBuddyNotes": "Získal/a jsi všechny, v poušti se vyskytující, mazlíčky!"
}

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