diff --git a/.gitignore b/.gitignore index ff958aac91..002780bbdc 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ test/*.js test/*.map website/public/docs *.sublime-workspace +coverage coverage.html common/dist/scripts/habitrpg-shared.js diff --git a/.travis.yml b/.travis.yml index 847cc97718..dcd028fd9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,3 +11,5 @@ before_script: - cp config.json.example config.json - "until nc -z localhost 27017; do echo Waiting for MongoDB; sleep 1; done" - "export DISPLAY=:99" +after_script: + - "./node_modules/.bin/lcov-result-merger 'coverage/**/*.info' | ./node_modules/coveralls/bin/coveralls.js" diff --git a/README.md b/README.md index 65113909eb..7c7ad55172 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -HabitRPG [![Build Status](https://travis-ci.org/HabitRPG/habitrpg.png?branch=develop)](https://travis-ci.org/HabitRPG/habitrpg) [![Code Climate](https://codeclimate.com/github/HabitRPG/habitrpg.png)](https://codeclimate.com/github/HabitRPG/habitrpg) [![Bountysource](https://api.bountysource.com/badge/tracker?tracker_id=68393)](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE) [![Dependency Status](https://gemnasium.com/HabitRPG/habitrpg.svg)](https://gemnasium.com/HabitRPG/habitrpg) +HabitRPG [![Build Status](https://travis-ci.org/HabitRPG/habitrpg.png?branch=develop)](https://travis-ci.org/HabitRPG/habitrpg) [![Code Climate](https://codeclimate.com/github/HabitRPG/habitrpg.png)](https://codeclimate.com/github/HabitRPG/habitrpg) [![Coverage Status](https://coveralls.io/repos/HabitRPG/habitrpg/badge.svg?branch=develop)](https://coveralls.io/r/HabitRPG/habitrpg?branch=develop) [![Bountysource](https://api.bountysource.com/badge/tracker?tracker_id=68393)](https://www.bountysource.com/trackers/68393-habitrpg?utm_source=68393&utm_medium=shield&utm_campaign=TRACKER_BADGE) [![Dependency Status](https://gemnasium.com/HabitRPG/habitrpg.svg)](https://gemnasium.com/HabitRPG/habitrpg) =============== [HabitRPG](https://habitrpg.com) is an open source habit building program which treats your life like a Role Playing Game. Level up as you succeed, lose HP as you fail, earn money to buy weapons and armor. diff --git a/bower.json b/bower.json index f936f0d7b8..54fec9e612 100644 --- a/bower.json +++ b/bower.json @@ -33,7 +33,7 @@ "Angular-At-Directive": "git://github.com/snicker/Angular-At-Directive#master", "js-emoji": "git://github.com/snicker/js-emoji#master", "sticky": "*", - "swagger-ui": "git://github.com/wordnik/swagger-ui.git", + "swagger-ui": "git://github.com/wordnik/swagger-ui.git#v2.0.24", "ngInfiniteScroll": "1.0.0", "jquery-colorbox": "~1.4.36", "pnotify": "~1.3.1", diff --git a/common/locales/cs/backgrounds.json b/common/locales/cs/backgrounds.json index e0c14d343e..02ad3393ea 100644 --- a/common/locales/cs/backgrounds.json +++ b/common/locales/cs/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Horské jezero", "backgroundMountainLakeNotes": "Namoč si prstíky v horském jezeře.", "backgroundPagodasText": "Pagody", - "backgroundPagodasNotes": "Vyšplhej na vršek pagod." + "backgroundPagodasNotes": "Vyšplhej na vršek pagod.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/cs/challenge.json b/common/locales/cs/challenge.json index e70a702167..fe410cd0b0 100644 --- a/common/locales/cs/challenge.json +++ b/common/locales/cs/challenge.json @@ -16,7 +16,7 @@ "selectWinner": "Zvolit vítěze a zavřít výzvu:", "deleteOrSelect": "Smazat nebo určit výherce", "endChallenge": "Ukončit výzvu", - "challengeDiscription": "These are the Challenge's tasks that will be added to your task dashboard when you join this Challenge. The sample Challenge tasks below will change color and gain graphs to show you the overall progress of the group.", + "challengeDiscription": "Toto jsou úkoly Výzvy, které ti budou přidány do tvých úkolů na hlavní stránce jakmile se Výzvy zúčastníš. Vzorové úkoly Výzvy níže budou měnit barvu a získávat grafy, aby ses mohl podívat na tvůj celkový postup skupiny.", "hows": "Jak se všem daří?", "filter": "Filtr", "groups": "Skupiny", @@ -33,8 +33,8 @@ "challengeTagPop": "Výzvy se ti objeví na seznamu štítků pod panelem i v popiscích úkolů. Takže název může být dlouhý, ale budeš také potřebovat 'krátký název'. Tzn. 'Shodit za 3 měsíce 10 kilo' by mohlo být zkráceno na '-10kg' (Klikni pro více informací).", "challengeDescr": "Popis", "prize": "Cena", - "prizePop": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later.", - "prizePopTavern": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later and Tavern challenges will not be refunded if the challenge is cancelled.", + "prizePop": "Pokud někdo může \"vyhrát\" tvou výzvu, můžeš jej odměnit drahokamy. Maximum = #počet tvých drahokamů (+ drahokamy ve tvém cechu) Pozn.: Výhra nemůže být později změněna.", + "prizePopTavern": "Pokud někdo může 'vyhrát' tvou výzvu, můžeš jej odměnit drahokamy. Maximum = počet tvých drahokamů (+ drahokamy cechu, pokud jsi tvůrcem výzvy tohoto cechu). Poznámka: Výhra nemůže být později změněna a výhra z Výzvy z krčmy se nevrací, pokud je výzva zrušena.", "publicChallenges": "Minimálně 1 drahokam za veřejné výzvy (opravdu to eliminuje spam).", "officialChallenge": "Oficiální výzva HabitRPG", "by": "od", @@ -44,7 +44,7 @@ "selectGroup": "Prosím, vyber skupinu", "challengeCreated": "Výzva vytvořena", "sureDelCha": "Jsi si jistý, že chceš tuto výzvu smazat?", - "sureDelChaTavern": "Delete challenge, are you sure? Your gems will not be refunded.", + "sureDelChaTavern": "Jsi si jistý, že chceš tuto výzvu smazat? Nedostaneš zpět Drahokamy.", "removeTasks": "Odstranit úkoly", "keepTasks": "Ponechat úkoly", "closeCha": "Zavřít výzvu a...", diff --git a/common/locales/cs/character.json b/common/locales/cs/character.json index fd29758075..bf93b8dda1 100644 --- a/common/locales/cs/character.json +++ b/common/locales/cs/character.json @@ -52,9 +52,11 @@ "costume": "Kostým", "costumeText": "Pokud se ti více líbí vzhled jiného vybavení, než toho, které máš na sobě, zaškrtni \"použít kostým\". Kostým se ti zobrazí na tvém právě používaném vybavení, které tak hezky schová.", "useCostume": "Použít kostým", - "gearAchievement": "Získal jsi Ocenění \"Maximální Vybavení\" za vylepšení výbavy na maximální úroveň.", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Maximální výbava", - "ultimGearText": "Vylepšil zbraň a brnění na maximální úroveň.", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Úroveň", "levelUp": "Další úroveň!", "mana": "Mana", diff --git a/common/locales/cs/content.json b/common/locales/cs/content.json index eec3bbcad9..61234feaf1 100644 --- a/common/locales/cs/content.json +++ b/common/locales/cs/content.json @@ -1,6 +1,10 @@ { "potionText": "Lektvar zdraví", "potionNotes": "Obnoví 15 bodů zdraví (okamžitě)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "vlk", "dropEggWolfAdjective": "věrný", "dropEggTigerCubText": "tygřík", diff --git a/common/locales/cs/front.json b/common/locales/cs/front.json index ed9d156692..c7880e8d22 100644 --- a/common/locales/cs/front.json +++ b/common/locales/cs/front.json @@ -173,10 +173,10 @@ "watchVideos": "Podívej se na videa", "work": "Práce", "zelahQuote": "HabitRPG mi pomáhá rozhodnout se, jestli jít do postele a získat za to body, nebo zůstat vzhůru a přijít o zdraví!", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", - "generalQuestionsSite": "General Questions about the Site", - "businessInquiries": "Business Inquiries", - "merchandiseInquiries": "Merchandise Inquiries", - "marketingInquiries": "Marketing/Social Media Inquiries" + "reportAccountProblems": "Nahlásit problémy z účtem", + "reportCommunityIssues": "Nahlásit problém v komunitě", + "generalQuestionsSite": "Obecné otázky o stránce", + "businessInquiries": "Obchodní poptávka", + "merchandiseInquiries": "Poptávka po zboží", + "marketingInquiries": "Poptávka marketing/sociální média" } \ No newline at end of file diff --git a/common/locales/cs/gear.json b/common/locales/cs/gear.json index c1ce80a81e..bc32b65327 100644 --- a/common/locales/cs/gear.json +++ b/common/locales/cs/gear.json @@ -120,8 +120,8 @@ "weaponMystery201411Notes": "Píchni své nepřátele nebo se pusť do svého oblíbeného jídla - tyhle všestranné vidle zvládnou všechno! Nepřináší žádný benefit.", "weaponMystery201502Text": "Třpytivá okřídlená hůl lásky a také pravdy", "weaponMystery201502Notes": "Za křídla! Za lásku! A také za pravdu! Nepřináší žádný benefit. Předmět pro předplatitele únor 2015.", - "weaponMystery201505Text": "Green Knight Lance", - "weaponMystery201505Notes": "This green and silver lance has unseated many opponents from their mounts. Confers no benefit. May 2015 Subscriber Item.", + "weaponMystery201505Text": "Kopí zeleného rytíře", + "weaponMystery201505Notes": "Toto zelené a stříbrné kopí sundalo již mnoho jezdců z jejich zvířat. Nepřináší žádný benefit. Předmět pro předplatitele květen 2015.", "weaponMystery301404Text": "Steampunková hůl", "weaponMystery301404Notes": "Výborná na procházku po městě. Předmět pro předplatitele březen 2015. Nepřináší žádný benefit.", "armor": "zbroj", @@ -372,8 +372,8 @@ "headMystery201412Notes": "Kdo je tu tučňák? nepřináší žádný benefit. Předmět pro předplatitele prosinec 2014.", "headMystery201501Text": "Hvězdná helma", "headMystery201501Notes": "Hvězdné konstalace se třpytí a poblikávají v této helmě a vedou nositelovy myšlenky k většímu soustředění. Nepřináší žádný benefit. Předmět pro předplatitele leden 2015.", - "headMystery201505Text": "Green Knight Helm", - "headMystery201505Notes": "The green plume on this iron helm waves proudly. Confers no benefit. May 2015 Subscriber Item.", + "headMystery201505Text": "Helma zeleného rytíře", + "headMystery201505Notes": "Zelená chocholka na této železné helmě se hrdě třepotá. Nepřináší žádný benefit. Předmět pro předplatitele květen 2015.", "headMystery301404Text": "Fešný cylindr", "headMystery301404Notes": "Fešný cylindr pro ty největší džentlmeny. Předmět pro předplatitele leden 2015. Nepřináší žádný benefit.", "headMystery301405Text": "Obyčejný cylindr", diff --git a/common/locales/cs/generic.json b/common/locales/cs/generic.json index c69ba6545c..9e3cca64ae 100644 --- a/common/locales/cs/generic.json +++ b/common/locales/cs/generic.json @@ -5,20 +5,20 @@ "habitica": "Habitika", "expandToolbar": "Rozbalit lištu", "collapseToolbar": "Zabalit lištu", - "markdownBlurb": "HabitRPG uses markdown for message formatting. See the Markdown Cheat Sheet for more info.", - "showFormattingHelp": "Show formatting help", - "hideFormattingHelp": "Hide formatting help", - "youType": "You type:", - "youSee": "You see:", - "italics": "*Italics*", - "bold": "**Bold**", - "strikethrough": "~~Strikethrough~~", - "emojiExample": ":smile:", - "markdownLinkEx": "[HabitRPG is great!](https://habitrpg.com)", - "markdownImageEx": "![mandatory alt text](https://habitrpg.com/cake.png \"optional mouseover title\")", - "unorderedListHTML": "+ First item
+ Second item
+ Third item", - "unorderedListMarkdown": "+ First item\n+ Second item\n+ Third item", - "code": "`code`", + "markdownBlurb": "HabitRPG používá formátování ve zprávách. Podívej se na Tahák na formátování, kde najdeš více informací.", + "showFormattingHelp": "Ukázat nápovědu k formátování", + "hideFormattingHelp": "Schovat nápovědu k formátování", + "youType": "Napíšeš:", + "youSee": "Vidíš:", + "italics": "*kurzíva*", + "bold": "**tučně**", + "strikethrough": "~~přeškrtnuto~~", + "emojiExample": ":smajlík:", + "markdownLinkEx": "[HabitRPG je super!](https://habitrpg.com)", + "markdownImageEx": "![povinný text](https://habitrpg.com/cake.png \"nepovinný název po najetí myší\")", + "unorderedListHTML": "+ První položka
+ Druhá položka
+ Třetí položka", + "unorderedListMarkdown": "+ První položka\n+ Druhá položka\n+ Třetí položka", + "code": "`kód`", "achievements": "Úspěchy", "modalAchievement": "Úspěch!", "special": "Speciální", diff --git a/common/locales/cs/groups.json b/common/locales/cs/groups.json index 2c540a12bf..d466e1373e 100644 --- a/common/locales/cs/groups.json +++ b/common/locales/cs/groups.json @@ -110,11 +110,11 @@ "byColon": "Od:", "inviteNewUsers": "Pozvat nové uživatele", "inviteAlertInfo2": "Nebo sdílej tento link (kopírovat/vložit):", - "sendGiftHeading": "Send Gift to <%= name %>", - "sendGiftGemsBalance": "From <%= number %> Gems", - "sendGiftCost": "Total: $<%= cost %> USD", - "sendGiftFromBalance": "From Balance", - "sendGiftPurchase": "Purchase", - "sendGiftMessagePlaceholder": "Personal message (optional)", - "sendGiftSubscription": "<%= months %> Month(s): $<%= price %>" + "sendGiftHeading": "Poslat dárek <%= name %>", + "sendGiftGemsBalance": "Z <%= number %> Drahokamů", + "sendGiftCost": "Celkem: $<%= cost %> USD", + "sendGiftFromBalance": "Z bilance", + "sendGiftPurchase": "Koupit", + "sendGiftMessagePlaceholder": "Osobní zpráva (volitelné)", + "sendGiftSubscription": "<%= months %> měsíc(e/ů): $<%= price %>" } \ No newline at end of file diff --git a/common/locales/cs/npc.json b/common/locales/cs/npc.json index 154623fe4b..f4e8191011 100644 --- a/common/locales/cs/npc.json +++ b/common/locales/cs/npc.json @@ -2,8 +2,8 @@ "npc": "NPC", "npcText": "Podpořil projekt na Kickstarteru, jak to jen bylo možné! ", "mattBoch": "Matt Boch", - "mattShall": "Shall I bring you your steed, <%= name %>? Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!", - "mattBochText1": "Welcome to the Stable! I'm Matt, the beast master. After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "mattShall": "<%= name %>, cítíš se na projížďku? Jakmile dostatečně nakrmíš mazlíčka, objeví se tady a budeš se na něm moci projet. Klikni na zvíře, které si chceš osedlat. ", + "mattBochText1": "Vítej ve Stáji! Jsem Matt, Pán šelem. Až dosáhneš úrovně 4, budeš moci pomocí lektvarů líhnout vajíčka. Když se ti na Trhu vylíhne mazlíček, objeví se tady! Klikni na něj a objeví se u tvé postavy. Krm ho jídlem, které budeš nacházet, a on pak vyroste a budeš se na něm moci projet.", "daniel": "Daniel", "danielText": "Vítej v krčmě. Chvilku se zdrž a poznej místní. Pokud si potřebuješ odpočinout (jedeš na dovolenou? náhlá nemoc?), nabízím ti pokoj v Hostinci. Zatímco tu budeš přihlášen, tvé denní úkoly ti na konci dne neublíží, ale klidně si je můžeš odškrtnout .", "danielText2": "Dej pozor: Pokud se účastníš boje s bossem, ublíží ti i za nesplněné denní úkoly ostatních členů tvé družiny! Navíc, jakákoliv újma, kterou uštědříš Bossovi (nebo nasbírané předměty) se ti nepřipíšou dokud se z Hostince neodhlásíš.", @@ -45,9 +45,9 @@ "tourScrollDown": "Nezapomeň sjet dolů na stránce, abys viděl všechny možnosti! Klikni na svého avatara, aby ses vrátil zpět na stránku s úkoly.", "tourMuchMore": "Když skončíš s úkoly, můžeš s přáteli vytvořit Družinu, popovídat si v zájmových ceších, přidat se k Výzvám a více!", "tourStatsPage": "Tohle je stránka s tvými statistikami! Získej ocenění za splnění vyjmenovaných úkolů.", - "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", + "tourTavernPage": "Vítej v Krčme, chatu pro všechny věkové kategorie! Můžeš si tu zmrazit Denní úkoly, aby ti neublížily, když budeš třeba nemocný nebo když budeš pryč. Stačí kliknout na \"Odpočívat v hostinci\". Pojď pozdravit!", "tourPartyPage": "Tvá družina ti pomůže dodržovat cíle. Pozvi své přátele a odemkni Svitek výpravy!", "tourGuildsPage": "Cechy jsou sociální skupiny s podobnými zájmy. Můžeš si vyhledat témata, která tě zajímají! Doporučujeme Newbies Guild neboli Cech pro nováčky.", - "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", + "tourChallengesPage": "Výzvy jsou seznamy tématických úkolů vytvořené uživateli! Přidání se k výzvě ti přidá úkoly do tvých listů. Soutěž proti ostatním uživatelům a vyhraj cenné drahokamy!", "tourMarketPage": "Když dosáhneš úrovně 4, začneš po splnění úkolů náhodně nacházet vejce a lektvary. Budou se objevovat tady - použij je k vylíhnutí mazlíčků! Můžeš si je také koupi na Trhu." } \ No newline at end of file diff --git a/common/locales/cs/quests.json b/common/locales/cs/quests.json index a476af8329..407ae91303 100644 --- a/common/locales/cs/quests.json +++ b/common/locales/cs/quests.json @@ -19,7 +19,7 @@ "bossStrength": "Síla bosse", "collect": "Sbírat", "collected": "Získáno", - "bossDmg1": "Each completed Daily and To-Do and each positive Habit hurts the boss. Hurt it more with redder tasks or Brutal Smash and Burst of Flames. The boss will deal damage to every quest participant for every Daily you've missed (multiplied by the boss's Strength) in addition to your regular damage, so keep your party healthy by completing your Dailies! All damage to and from a boss is tallied on cron (your day roll-over).", + "bossDmg1": "Každý splnění Denní úkol, úkol z Úkolníčku a každý pozitivní zvyk zraní Bosse. Zraň ho víc červenějšími úkoly nebo Brutální ranou nebo Vzplanutím ohňů. Boss zraní každého účastníka výpravy za každý nesplněný Denní úkol (újma je násobena jeho Silou) navíc k normálnímu zranění, takže udržuj skupinu zdravou plněním úkolů. Veškerá zranění bossovi i vám se přičítají na kronu (na konci dne).", "bossDmg2": "Jen ti, kteří přijmou pozvání, budou bojovat proti bossovi a rozdělí si odměnu za výpravu.", "tavernBossInfo": "Abys zranil světového bosse, musíš splnit všechny své Denní úkoly a úkoly v Úkolníčku. Čím více bodů za úkoly získáš, tím větší zranění bossovi způsobíš (splnění červených úkolů, Mágova kouzla, útoky Válečníka, atd.) Za každý Denní úkol, který nesplníš (znásobený bossovou Sílou), se zvýší bossova Zuřivost. Jakmile jeho Zuřivost dosáhne maxima, stane se něco špatného - takže plň své Denní úkoly! Všechna újma způsobená bossovi nebo tobě se přičítá na kronu (na konci dne).", "bossColl1": "Pro získání předmětů plň své pozitivní úkoly. Předměty z výpravy budeš nacházet stejně jako normální předměty, uvidíš je však až další den, kdy se vše, co jste našli, shromáždí a přidá na hromadu.", diff --git a/common/locales/cs/tasks.json b/common/locales/cs/tasks.json index 216c2f8d05..ee2b17ea35 100644 --- a/common/locales/cs/tasks.json +++ b/common/locales/cs/tasks.json @@ -14,7 +14,7 @@ "save": "Uložit", "addChecklist": "Přidat seznam", "checklist": "Seznam", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "Rozděl si úkoly na menší části! Seznamy úkolů zvyšují Zkušenost a zlaťáky, které za splnění úkolu získáš, a zmírňují újmu, kterou bys dostal, za zmeškání Denního úkolu.", "expandCollapse": "Rozbalit/Sbalit", "text": "Text", "extraNotes": "Další poznámky", @@ -22,7 +22,7 @@ "advancedOptions": "Pokročilé možnosti", "difficulty": "Obtížnost", "difficultyHelpTitle": "Jak obtížný je tento úkol?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "Čím těžší úkol, tím více Zkušenosti a Zlaťáků dostaneš až ho odškrtneš... ale také ti víc ublíží, pokud to je Denní úkol nebo Zlozvyk!", "easy": "Jednoduché", "medium": "Středně těžké", "hard": "Těžké", diff --git a/common/locales/da/backgrounds.json b/common/locales/da/backgrounds.json index 86ac580f71..c829393251 100644 --- a/common/locales/da/backgrounds.json +++ b/common/locales/da/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Climb to the top of Pagodas." + "backgroundPagodasNotes": "Climb to the top of Pagodas.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/da/character.json b/common/locales/da/character.json index dece9952c1..4731be0850 100644 --- a/common/locales/da/character.json +++ b/common/locales/da/character.json @@ -52,9 +52,11 @@ "costume": "Kostume", "costumeText": "Hvis du foretrækker udseendet af andet udstyr end hvad du bærer, tjek \"Brug Kostume\"-feltet for at visuelt bære et kostume, mens du bærer dit kampudstyr nedenunder.", "useCostume": "Brug kostume", - "gearAchievement": "Du har vundet \"Det Ultimative Udstyr\"-præstationen for at opgradere til det maksimale udstyrssæt!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Det Ultimative Udstyr", - "ultimGearText": "Har opgraderet til det maksimale våben- og rustningssæt", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Niveau", "levelUp": "Niveau op!", "mana": "Mana", diff --git a/common/locales/da/content.json b/common/locales/da/content.json index 0ed81ab30f..94f90409e0 100644 --- a/common/locales/da/content.json +++ b/common/locales/da/content.json @@ -1,6 +1,10 @@ { "potionText": "Livseliksir", "potionNotes": "Genvind 15 liv (Øjeblikkelig Brug) ", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Ulv", "dropEggWolfAdjective": "loyal", "dropEggTigerCubText": "Tigerunge", diff --git a/common/locales/da/front.json b/common/locales/da/front.json index 849cd50ce9..cbc9b63358 100644 --- a/common/locales/da/front.json +++ b/common/locales/da/front.json @@ -3,21 +3,21 @@ "accept1Terms": "Ved at klikke på knappen herunder indvilliger jeg i at følge HabitRPGs", "accept2Terms": "og", "alexandraQuote": "Kunne ikke undlade at nævne HabitRPG under min tale i Madrid. Et klart must-have værktøj til freelancere, der stadig har brug for en chef.", - "althaireQuote": "Når jeg hele har tiden en quest kørende, bliver jeg konstant motiveret til at gøre alt det daglige arbejde og alle mine to-do's. Min største motivation er ikke at lade mit gruppe i stikken.", - "andeeliaoQuote": "Fedt produkt, er lige startet for et par dage siden og er allerede mere bevidst om og produktiv med min tid.", + "althaireQuote": "Når jeg hele har tiden en quest kørende, bliver jeg konstant motiveret til at gøre alt det daglige arbejde og alle mine To-Dos. Min største motivation er at ikke lade min gruppe i stikken.", + "andeeliaoQuote": "Fedt produkt, er lige startet for et par dage siden og er allerede mere bevidst om og produktiv med min tid!", "autumnesquirrelQuote": "Jeg laver færre overspringshandlinger på arbejde og med det huslige og betaler mine regninger til tiden.", "businessSample1": "Bekræft 1 side i dit Inventar", - "businessSample2": "20 minutters indberetning", - "businessSample3": "Sorter og gennemgå din indbakke", - "businessSample4": "Forbered 1 dokument for en klient", - "businessSample5": "Ring til klienter/Udsæt telefonopkald", + "businessSample2": "20 minutters arkivering", + "businessSample3": "Sortér og gennemgå din indbakke", + "businessSample4": "Forbered 1 dokument til en klient", + "businessSample5": "Ring til klienter/Udsatte telefonopkald", "businessText": "Brug HabitRPG på din arbejdsplads", "choreSample1": "Læg beskidt tøj i vasketøjskurven", - "choreSample2": "20 minutters hjemmearbejde", - "choreSample3": "Vask en omgang opvask", + "choreSample2": "20 minutters husarbejde", + "choreSample3": "Tag opvasken", "choreSample4": "Gør et rum rent", - "choreSample5": "Vask og tør en håndfuld tøj", - "chores": "Opgaver", + "choreSample5": "Vask og tør en maskinfuld tøj", + "chores": "Pligter", "communityBug": "Meddel fejl", "communityExtensions": "Tilføjelser og udvidelser", "communityFacebook": "Facebook", @@ -33,20 +33,20 @@ "companyTerms": "Vilkår", "companyVideos": "Videoer", "contribUse": "HabitRPG contributors use", - "dragonsilverQuote": "Jeg kan ikke beskrive hvor mange tids- og opgaveprioriteringssystemer jeg har prøvet over de sidste årtier... HRPG er det eneste der har hjulpet mig med rent faktisk at få ting gjort i stedet for bare skrevet ned på en liste.", - "dreimQuote": "Da jeg sidste år opdagede HabitRPG, havde jeg lige dumpet omkring halvdelen af mine eksaminer. Takket være de Daglige, har jeg kunne organisere og disciplinere mig selv, og jeg har faktisk bestået alle mine eksaminer med rigtig gode karakterer for en måned siden.", + "dragonsilverQuote": "Jeg kan ikke beskrive hvor mange tids- og opgaveprioriteringssystemer jeg har prøvet over de sidste årtier... HRPG er det eneste, der har hjulpet mig med rent faktisk at få ting gjort, i stedet for bare at skrive dem ned på en liste.", + "dreimQuote": "Da jeg sidste år opdagede HabitRPG, havde jeg lige dumpet omkring halvdelen af mine eksaminer. Takket være de Daglige har jeg kunne organisere og disciplinere mig selv, og jeg har faktisk bestået alle mine eksaminer med rigtig gode karakterer for en måned siden.", "elmiQuote": "Hver morgen ser jeg frem til at stå op, så jeg kan tjene noget guld!", "email": "Email", "emailNewPass": "Send nyt kodeord via email", - "evagantzQuote": "Min aller første aftale med tandlægen, hvor tandlægen faktisk var positivt overrasket over mine børstevaner. Tak, HabitRPG!", + "evagantzQuote": "Min allerførste aftale med tandlægen, hvor tandlægen faktisk var positivt overrasket over mine børstevaner. Tak, HabitRPG!", "examplesHeading": "Players use HabitRPG to manage...", - "featureAchievementByline": "Gør noget fedt? Få et badge og vis det frem!", - "featureAchievementHeading": "Præstationsbadges", + "featureAchievementByline": "Gør noget fedt? Få et emblem og vis det frem!", + "featureAchievementHeading": "Præstationsemblem", "featureEquipByline": "Buy limited edition equipment, potions, and other virtual goodies in our Market with your task rewards!", "featureEquipHeading": "Udstyr og tilbehør", "featurePetByline": "Du får æg og ting, når du færdiggør opgaver. Vær så produktiv som muligt for at samle kæledyr og ridedyr!", - "featurePetHeading": "Kæledyr og ridedyr", - "featureSocialByline": "Slut dig til grupper med samme interesser og tankegange som dig. Lav udfordringer og konkurrer mod andre brugere.", + "featurePetHeading": "Kæledyr og Ridedyr", + "featureSocialByline": "Slut dig til grupper med samme interesser og tankegange som dig. Lav Udfordringer og konkurrér mod andre brugere.", "featureSocialHeading": "Socialt spil", "featuredIn": "Featured in", "featuresHeading": "Vi har også...", diff --git a/common/locales/de/backgrounds.json b/common/locales/de/backgrounds.json index 98a801a938..3ba4643cbe 100644 --- a/common/locales/de/backgrounds.json +++ b/common/locales/de/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Bergsee", "backgroundMountainLakeNotes": "Tauche Deine Füße in einen Bergsee.", "backgroundPagodasText": "Pagoden", - "backgroundPagodasNotes": "Erklimme die Spitze einer Pagode." + "backgroundPagodasNotes": "Erklimme die Spitze einer Pagode.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/de/challenge.json b/common/locales/de/challenge.json index 9f2376020d..1886435ab1 100644 --- a/common/locales/de/challenge.json +++ b/common/locales/de/challenge.json @@ -44,7 +44,7 @@ "selectGroup": "Bitte wähle die Gruppe", "challengeCreated": "Wettbewerb erstellt", "sureDelCha": "Bist du sicher, dass Du den Wettbewerb löschen möchtest?", - "sureDelChaTavern": "Delete challenge, are you sure? Your gems will not be refunded.", + "sureDelChaTavern": "Willst du die Challenge wirklich löschen? Deine Edelsteine werden dir nicht zurückerstattet.", "removeTasks": "Aufgabe entfernen", "keepTasks": "Aufgabe behalten", "closeCha": "Wettbewerb auswählen und...", diff --git a/common/locales/de/character.json b/common/locales/de/character.json index e47b14986d..342e395438 100644 --- a/common/locales/de/character.json +++ b/common/locales/de/character.json @@ -52,9 +52,11 @@ "costume": "Verkleidung", "costumeText": "Wenn Du das Aussehen einer anderen Ausrüstung Deiner Kampfausrüstung vorziehst, dann klicke auf die \"Verkleidung tragen\" Box um über Deiner Kampfausrüstung andere Ausrüstungsgegenstände zu tragen.", "useCostume": "Verkleidung tragen", - "gearAchievement": "Du hast den \"Ultimative Ausrüstung\" Erfolg erlangt, indem du die beste Ausrüstung erworben hast.", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Ultimative Ausrüstung", - "ultimGearText": "Hat das beste Rüstungs- und Waffenset erworben.", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Level", "levelUp": "Aufgestiegen!", "mana": "Mana", diff --git a/common/locales/de/content.json b/common/locales/de/content.json index ca01f9c363..ba6a5a2fb7 100644 --- a/common/locales/de/content.json +++ b/common/locales/de/content.json @@ -1,6 +1,10 @@ { "potionText": "Heiltrank", "potionNotes": "Heilt um 15 Lebenspunkte (wird sofort angewendet)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Wolf", "dropEggWolfAdjective": "ergebener", "dropEggTigerCubText": "Jungtiger", diff --git a/common/locales/de/front.json b/common/locales/de/front.json index 412d61bee8..345f1a69a2 100644 --- a/common/locales/de/front.json +++ b/common/locales/de/front.json @@ -166,17 +166,17 @@ "testimonialHeading": "Was andere sagen…", "tutorials": "Anleitungen", "unlockByline1": "Erreiche deine Ziele und steige Level auf.", - "unlockByline2": "Schalte neue motivierende Dinge frei, wie zum Beispiel Haustiere, zufällige Belohnungen, Zaubersprüche und mehr!", + "unlockByline2": "Schalte neue, motivierende Werkzeuge frei, wie zum Beispiel Haustiere, zufällige Belohnungen, Zaubersprüche und mehr!", "unlockHeadline": "Je mehr du tust, desto mehr neue Inhalte kannst du freigeschalten!", "useUUID": "Benutze UUID / API Token (Für Facebook Benutzer)", "username": "Benutzername", "watchVideos": "Sehen Sie sich die Videos an", "work": "Arbeit", - "zelahQuote": "Dadurch, dass ich Punkte bekomme, wenn ich früh ins Bett gehe und Schaden nehme, wenn ich spät ins Bett gehe, habe ich es mit HabitRPG geschafft, rechtzeitig ins Bett zu gehen.", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", - "generalQuestionsSite": "General Questions about the Site", - "businessInquiries": "Business Inquiries", - "merchandiseInquiries": "Merchandise Inquiries", - "marketingInquiries": "Marketing/Social Media Inquiries" + "zelahQuote": "Dadurch, dass ich Punkte bekomme, wenn ich früh ins Bett gehe und Schaden nehme, wenn ich erst spät ins Bett gehe, habe ich es mit HabitRPG geschafft, mir frühe Bettzeiten anzugewöhnen.", + "reportAccountProblems": "Melde Probleme mit deinem Konto", + "reportCommunityIssues": "Melde Community-Probleme", + "generalQuestionsSite": "Generelle Fragen über die Webseite.", + "businessInquiries": "Geschäftsanfragen.", + "merchandiseInquiries": "Anfragen zu Handelswaren und Vermarktung", + "marketingInquiries": "Marketing-/Soziale Netzwerke Anfragen" } \ No newline at end of file diff --git a/common/locales/de/gear.json b/common/locales/de/gear.json index ef352b9894..5b9eebf81d 100644 --- a/common/locales/de/gear.json +++ b/common/locales/de/gear.json @@ -120,7 +120,7 @@ "weaponMystery201411Notes": "Ersteche deine Feinde oder verschling dein Lieblingsessen - diese flexible Forke ist universell einsetzbar! Gewährt keinen Bonus. November 2014 Abonnenten-Gegenstand.", "weaponMystery201502Text": "Schimmernder Flügelstab der Liebe und auch der Wahrheit", "weaponMystery201502Notes": "Für FLÜGEL! Für die LIEBE! Und AUCH für die WAHRHEIT! Gewährt keinen Bonus. Februar 2015 Abonnentengegenstand.", - "weaponMystery201505Text": "Green Knight Lance", + "weaponMystery201505Text": "Grüne Ritterlanze", "weaponMystery201505Notes": "This green and silver lance has unseated many opponents from their mounts. Confers no benefit. May 2015 Subscriber Item.", "weaponMystery301404Text": "Steampunk Spazierstock", "weaponMystery301404Notes": "Perfekt, um gemütlich durch die Stadt zu spazieren. März 3015 Abonnenten-Gegenstand. Gewährt keinen Bonus.", @@ -372,7 +372,7 @@ "headMystery201412Notes": "Wer ist der Pinguin? Kein Attributbonus. Dezember 2014 Abonnenten-Gegenstand.", "headMystery201501Text": "Sternenhelm", "headMystery201501Notes": "Die Konstellationen der Sterne funkeln in diesem Helm, und verleihen den Träger die Konzentration, seine Aufgaben zu erfüllen.\nDieser Helm gibt keinen Statuspunktebonus. Januar 2015 Abonnenten Gegenstand.", - "headMystery201505Text": "Green Knight Helm", + "headMystery201505Text": "Grüner Ritterhelm", "headMystery201505Notes": "The green plume on this iron helm waves proudly. Confers no benefit. May 2015 Subscriber Item.", "headMystery301404Text": "Schicker Zylinder", "headMystery301404Notes": "Ein schicker Zylinder für die feinsten Gentlemänner und -frauen! Januar 3015 Abonennten-Gegenstand. Kein Attributbonus. ", @@ -470,7 +470,7 @@ "bodySpecialSummerHealerText": "Korallenkragen", "bodySpecialSummerHealerNotes": "Limited Edition 2014 Sommer-Set. Ein stylischer Kragen aus lebendigen Korallen! Gewährt keinen Bonus zu Attributen.", "headAccessory": "Kopfschmuck", - "accessories": "Zubehör", + "accessories": "Accessoires ", "animalEars": "Tierohren", "headAccessoryBase0Text": "Kein Kopfschmuck", "headAccessoryBase0Notes": "Kein Kopfschmuck", @@ -490,22 +490,22 @@ "headAccessorySpecialSpring2015MageNotes": "Diese Ohren lauschen eifrig, falls irgendwo ein Magier Geheimnisse offenbart. Kein Attributbonus. Limited Edition 2015 Frühlingsausrüstung.", "headAccessorySpecialSpring2015HealerText": "Grüne Kätzchenohren", "headAccessorySpecialSpring2015HealerNotes": "Diese süßen Kätzchenohren machen andere grün vor Neid. Kein Attributbonus. Limited Edition 2015 Frühlingsausrüstung.", - "headAccessoryBearEarsText": "Bärenohren", - "headAccessoryBearEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines knuddeligen Bären! Gewährt keinen Attributbonus.", + "headAccessoryBearEarsText": "Bärchenohren", + "headAccessoryBearEarsNotes": "Diese Ohren verleihen dir das Aussehen eines knuffigen Bärchens! Gewährt keinen Attributbonus.", "headAccessoryCactusEarsText": "Kaktusohren", "headAccessoryCactusEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines stacheligen Kaktus! Gewährt keinen Attributbonus.", "headAccessoryFoxEarsText": "Fuchsohren", - "headAccessoryFoxEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines listigen Fuchses! Gewährt keinen Attributbonus.", + "headAccessoryFoxEarsNotes": "Diese Ohren verleihen dir das Aussehen eines listigen Fuchses! Gewährt keinen Attributbonus.", "headAccessoryLionEarsText": "Löwenohren", - "headAccessoryLionEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines königlichen Löwen! Gewährt keinen Attributbonus.", + "headAccessoryLionEarsNotes": "Diese Ohren verleihen dir das Aussehen eines königlichen Löwen! Gewährt keinen Attributbonus.", "headAccessoryPandaEarsText": "Pandaohren", - "headAccessoryPandaEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines sanftmütigen Pandas! Gewährt keinen Attributbonus.", - "headAccessoryPigEarsText": "Schweineohren", - "headAccessoryPigEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines drolligen Schweines! Gewährt keinen Attributbonus.", + "headAccessoryPandaEarsNotes": "Diese Ohren verleihen dir das Aussehen eines sanftmütigen Pandas! Gewährt keinen Attributbonus.", + "headAccessoryPigEarsText": "Schweinchenohren", + "headAccessoryPigEarsNotes": "Diese Ohren verleihen dir das Aussehen eines drolligen Schweinchens! Gewährt keinen Attributbonus.", "headAccessoryTigerEarsText": "Tigerohren", - "headAccessoryTigerEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines wilden Tigers! Gewährt keinen Attributbonus.", + "headAccessoryTigerEarsNotes": "Diese Ohren verleihen dir das Aussehen eines wilden Tigers! Gewährt keinen Attributbonus.", "headAccessoryWolfEarsText": "Wolfsohren", - "headAccessoryWolfEarsNotes": "Diese Ohren verleihen Dir das Aussehen eines ergebenen Wolfes! Gewährt keinen Attributbonus.", + "headAccessoryWolfEarsNotes": "Diese Ohren verleihen dir das Aussehen eines loyalen Wolfes! Gewährt keinen Attributbonus.", "headAccessoryMystery201403Text": "Waldwanderergeweih", "headAccessoryMystery201403Notes": "Diese Geweihe schimmern in Moos und Flechten. Kein Attributbonus. März 2014 Abonennten-Gegenstand.", "headAccessoryMystery201404Text": "Schmetterlingsfühler des Zwielichts", diff --git a/common/locales/de/generic.json b/common/locales/de/generic.json index 7957cd0027..2009f25d29 100644 --- a/common/locales/de/generic.json +++ b/common/locales/de/generic.json @@ -5,20 +5,20 @@ "habitica": "Habitica", "expandToolbar": "Werkzeugleiste erweitern", "collapseToolbar": "Werkzeugleiste minimieren", - "markdownBlurb": "HabitRPG uses markdown for message formatting. See the Markdown Cheat Sheet for more info.", - "showFormattingHelp": "Show formatting help", - "hideFormattingHelp": "Hide formatting help", - "youType": "You type:", - "youSee": "You see:", - "italics": "*Italics*", - "bold": "**Bold**", - "strikethrough": "~~Strikethrough~~", + "markdownBlurb": "HabitRPG nutzt Markdown für das Formatieren von Text. Siehe das Markdown Cheat Sheet für weitere Informationen.", + "showFormattingHelp": "Formatierungshilfe anzeigen", + "hideFormattingHelp": "Formatierungshilfe verbergen", + "youType": "Du schreibst:", + "youSee": "Du siehst:", + "italics": "*Kursiv*", + "bold": "**Fett**", + "strikethrough": "~~Durchgestrichen~~", "emojiExample": ":smile:", - "markdownLinkEx": "[HabitRPG is great!](https://habitrpg.com)", + "markdownLinkEx": "[HabitRPG ist toll!](https://habitrpg.com)", "markdownImageEx": "![mandatory alt text](https://habitrpg.com/cake.png \"optional mouseover title\")", - "unorderedListHTML": "+ First item
+ Second item
+ Third item", - "unorderedListMarkdown": "+ First item\n+ Second item\n+ Third item", - "code": "`code`", + "unorderedListHTML": "+ Erster Gegenstand
+ Zweiter Gegenstand
+ Dritter Gegenstand", + "unorderedListMarkdown": "+ Erster Gegenstand\n+ Zweiter Gegenstand\n+ Dritter Gegenstand", + "code": "`Code`", "achievements": "Erfolge", "modalAchievement": "Erfolg!", "special": "Spezial", diff --git a/common/locales/de/groups.json b/common/locales/de/groups.json index befdabe183..8ec9715572 100644 --- a/common/locales/de/groups.json +++ b/common/locales/de/groups.json @@ -2,7 +2,7 @@ "tavern": "Gasthaus", "innCheckOut": "Das Gasthaus verlassen", "innCheckIn": "Im Gasthaus erholen", - "innText": "Du erholst dich im Gasthaus! Während du dort verweilst, werden dir deine täglichen Aufgaben keinen Schaden bereiten, aber trotzdem täglich aktualisiert. Vorsicht: Wenn du an einem Bosskampf teilnimmst, erhältst du weiterhin Schaden für die verpassten Aufgaben deiner Gruppe, sofern sie sich nicht auch im Gasthaus befinden! Außerdem wird der Schaden, den Du dem Boss zufügst, (und gefundene Gegenstände) erst angewendet, wenn du das Gasthaus verlässt.", + "innText": "Du erholst dich im Gasthaus! Während du dort verweilst, werden dir deine täglichen Aufgaben keinen Schaden zufügen, aber trotzdem täglich aktualisiert werden. Vorsicht: Wenn du an einem Bosskampf teilnimmst, erhältst du weiterhin Schaden für die verpassten Aufgaben deiner Gruppenmitglieder, sofern sich diese nicht auch im Gasthaus befinden! Außerdem wird der Schaden, den Du dem Boss zufügst, (und gefundene Gegenstände) erst angewendet, wenn du das Gasthaus verlässt.", "lfgPosts": "Nach Gruppeneinträgen suchen", "tutorial": "Anleitung", "glossary": "Nomenklatur", @@ -106,15 +106,15 @@ "inviteFriends": "Lade Freunde ein", "inviteAlertInfo": "Lade hier Freunde mit Benutzer ID ein.", "inviteExistUser": "Lade existierenden Nutzer ein", - "inviteByEmail": "Lade Freunde per E-Mail ein. Falls sie über deine E-Mail beitreten, werden sie automatisch dieser Gruppe hinzugefügt.", + "inviteByEmail": "Lade Freunde per Email ein. Falls sie über deine Email beitreten, werden sie automatisch dieser Gruppe hinzugefügt.", "byColon": "Von:", "inviteNewUsers": "Lade neue(n) Benutzer ein.", - "inviteAlertInfo2": "Oder teile diesen Link (kopieren/einfügen)", - "sendGiftHeading": "Send Gift to <%= name %>", - "sendGiftGemsBalance": "From <%= number %> Gems", - "sendGiftCost": "Total: $<%= cost %> USD", - "sendGiftFromBalance": "From Balance", - "sendGiftPurchase": "Purchase", - "sendGiftMessagePlaceholder": "Personal message (optional)", - "sendGiftSubscription": "<%= months %> Month(s): $<%= price %>" + "inviteAlertInfo2": "Oder teile diesen Link (kopieren/einfügen):", + "sendGiftHeading": "Sende Geschenk an <%= name %>", + "sendGiftGemsBalance": "Von <%= number %> Edelsteinen", + "sendGiftCost": "Insgesamt: $<%= cost %> USD", + "sendGiftFromBalance": "Vom Saldo", + "sendGiftPurchase": "Kauf", + "sendGiftMessagePlaceholder": "Persönliche Nachricht (optional)", + "sendGiftSubscription": "<%= months %> Monat(e): $<%= price %>" } \ No newline at end of file diff --git a/common/locales/de/npc.json b/common/locales/de/npc.json index 985b640568..0dacd7dd25 100644 --- a/common/locales/de/npc.json +++ b/common/locales/de/npc.json @@ -2,11 +2,11 @@ "npc": "NPC", "npcText": "Hat die Kickstarter Kampagne auf dem höchsten Level mitgetragen!", "mattBoch": "Matt Boch", - "mattShall": "Shall I bring you your steed, <%= name %>? Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!", - "mattBochText1": "Welcome to the Stable! I'm Matt, the beast master. After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "mattShall": "Soll ich Dir Dein Ross bringen, <%= name %>? Sobald Du einem Haustier so viel Futter gegeben hast, dass es zu einem Reittier werden konnte, wird es hier erscheinen. Klicke auf ein Reittier um aufzusteigen!", + "mattBochText1": "Willkommen im Stall! Ich bin Matt, der Bestienmeister. Ab Level 4 kannst Du mit Hilfe von Eiern und Tränken Haustieren ausbrüten. Wenn Du auf dem Marktplatz ein Haustier schlüpfen lässt, wird es hier erscheinen! Klicke auf das Haustier, um es Deinem Avatar hinzuzufügen. Füttere Deine Tiere mit dem Futter, welches Du ab Level 4 findest, damit sie zu mächtigen Reittieren heranwachsen. ", "daniel": "Daniel", - "danielText": "Willkommen im Gasthaus! Setze dich und triff die Stammgäste. Willst du dich ausruhen (Urlaub? Krankheit?), dann besorge ich dir ein schönes Zimmer. Solange du dort eingecheckt bist, werden deine täglichen Aufgaben dir am Ende des Tages keinen Schaden zufügen, aber du kannst sie trotzdem abhaken.", - "danielText2": "Sei gewarnt: Falls du an einer Boss-Quest teilnimmst, wird dir der Boss immer noch Schaden für die nicht abgehakten Aufgaben deiner Gruppenmitglieder zufügen! Außerdem wird der Schaden, den du dem Boss zufügst, (und gefundene Gegenstände) erst angewendet, wenn du das Gasthaus verlässt.", + "danielText": "Willkommen im Gasthaus! Setz Dich und triff die Einheimischen. Willst Du dich ausruhen (Urlaub? Krankheit?), dann besorge ich Dir ein schönes Zimmer. Solange Du dort eingecheckt bist, werden Deine täglichen Aufgaben Dir am Ende des Tages keinen Schaden zufügen, aber Du kannst sie trotzdem abhaken.", + "danielText2": "Sei gewarnt: Falls Du an einem Boss-Quest teilnimmst, wird Dir der Boss immer noch Schaden für die nicht abgehakten Aufgaben Deiner Gruppenmitglieder zufügen! Außerdem wird der Schaden, den Du dem Boss zufügst (sowie gefundene Gegenstände) erst angewendet, wenn Du das Gasthaus verlässt.", "alexander": "Alexander der Händler", "welcomeMarket": "Willkommen auf dem Marktplatz! Kaufe schwer zu findende Eier und Tränke! Verkaufe Überflüssiges! Gib' wichtige Dienste in Auftrag! Komm' und schau', was wir anzubieten haben.", "sellForGold": "Verkaufe <%= item %> für <%= gold %> Gold", @@ -45,9 +45,9 @@ "tourScrollDown": "Gehe sicher, dass Du auch ganz nach unten scrollst um alle Optionen zu sehen! Klicke erneut auf Deinen Avatar um zur Aufgabenseite zurückzukehren. ", "tourMuchMore": "Wenn Du Aufgaben erledigt hast, kannst Du mit Freunden eine Gruppe gründen, Dich in den Gilden nach Gespräche über verschiedene Themen umsehen, Wettbewerben beitreten und vieles mehr!", "tourStatsPage": "Auf dieser Seite kannst Du Deine Statuswerte im Auge behalten. Erreiche neue Erfolge indem Du die aufgelisteten Aufgaben erledigst.", - "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", + "tourTavernPage": "Willkommen in der Taverne, ein Chatroom für Habiticaner aller Altersgruppen! Falls Du krank oder im Urlaub bist, kannst Du hier verhindern, dass Deine täglichen Aufgaben Dir Schaden zufügen, indem Du auf \"Im Gasthaus erholen\" klickst. Komm rein und sag Hallo! ", "tourPartyPage": "Deine Gruppe wird Dir dabei helfen weiterhin verantwortungsbewusst Deine Aufgaben zu erledigen. Lade Freunde ein um neue Quest Rollen freizuschalten!", "tourGuildsPage": "Gilden sind Gruppen mit gemeinsamen Interessen. Suche nach Begriffen, die Dich interessieren! Wir empfehlen die \"Gilde für Neuankömmlinge\" (Newbies Guild).", - "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", + "tourChallengesPage": "Wettbewerbe sind Aufgabenlisten mit bestimmten Themen, die von Benutzern erstellt wurden. Wenn Du einem Wettbewerb beitrittst, werden seine Aufgaben deinem Aufgabenmenü hinzugefügt. Messe Dich mit anderen Spielern und gewinne Edelsteine! ", "tourMarketPage": "Sobald Du Level 4 erreichst, erhältst Du manchmal als zufällige Belohnung für erledigte Aufgaben Eier und Schlüpftränke. Diese erscheinen hier - nutze sie um Haustiere auszubrüten. Du kannst außerdem Gegenstände vom Marktplatz kaufen." } \ No newline at end of file diff --git a/common/locales/de/quests.json b/common/locales/de/quests.json index 3364f93ff3..f68b764f14 100644 --- a/common/locales/de/quests.json +++ b/common/locales/de/quests.json @@ -19,7 +19,7 @@ "bossStrength": "Boss Stärke", "collect": "Sammle ein", "collected": "Gesammelt", - "bossDmg1": "Each completed Daily and To-Do and each positive Habit hurts the boss. Hurt it more with redder tasks or Brutal Smash and Burst of Flames. The boss will deal damage to every quest participant for every Daily you've missed (multiplied by the boss's Strength) in addition to your regular damage, so keep your party healthy by completing your Dailies! All damage to and from a boss is tallied on cron (your day roll-over).", + "bossDmg1": "Jede erledigte tägliche Aufgabe und Aufgabe und jede positive Gewohnheit fügt dem Boss Schaden zu. Mit roteren Aufgaben, Gewaltschlag oder Flammenstoß kannst du ihm noch stärkeren Schaden zufügen. Für jede tägliche Aufgabe, die du nicht erledigt hast, wird der Boss jedem Teilnehmer der Quest Schaden zufügen (multipliziert mit der Stärke des Bosses), der zu deinem normalen Schaden noch dazukommt. Deshalb sorg dafür, dass deine Gruppe gesund bleibt, indem du deine täglichen Aufgaben erledigst! Jeder Schaden, der dem Boss zugefügt wird und den er zufügt, wird zu Cron berechnet (dein individueller Tagesbeginn).", "bossDmg2": "Nur Teilnehmer kämpfen gegen den Boss und bekommen ihren Anteil an der Beute.", "tavernBossInfo": "Um einem Weltbossmonster Schaden zuzufügen, musst Du Deine täglichen und einmaligen Aufgaben abhaken. Ein höherer Aufgaben Schaden führt zu höherem Bossschaden (rote Aufgaben abhaken, Zaubersprüche, Spezialattacken, usw.). Für jede tägliche Aufgabe, die Du nicht erledigst (multipliziert mit der Stärke des Bossmonsters) wird die Wut des Bossmonsters ansteigen. Hat sie das Maximum erreicht, wird etwas schlimmes passieren - also erledige Deine täglichen Aufgaben! Der Schaden den Du dem Bossmonster zufügst und die Wutpunkte, die Du an das Bossmonster verlierst, werden in der Chronik festgehalten (dort kannst Du den täglichen Fortschritt überprüfen).", "bossColl1": "Um Gegenstände zu sammeln musst Du Deine Aufgaben erfüllen. Quest Gegenstände sind genauso wie normale Gegenstände zu finden, aber Du kannst das Ergebnis erst zum Tageswechsel sehen. Dann wird alles, was jeder Teilnehmer gefunden hat zusammengerechnet und dem Quest zugerechnet.", diff --git a/common/locales/de/questscontent.json b/common/locales/de/questscontent.json index cb2b649d8c..21863d40ae 100644 --- a/common/locales/de/questscontent.json +++ b/common/locales/de/questscontent.json @@ -197,10 +197,10 @@ "questSlimeCompletion": "Mit einem letzten Mopstoß stößt Du den Glibber König in die Falle, einen riesigen Donut, den @Overomega, @LordDarkly und @Shaner, die gewitzten Anführer der Feingebäck-Gilde, herangebracht haben. Anerkennend klopfen Dir die Habitianer auf den Rücken, als Du fühlst, wie Dir jemand etwas in die Tasche rutschen lässt. Es ist die Belohnung für Deinen süßen Erfolg: drei Marshmallow Schleim Eier.", "questSlimeDropSlimeEgg": "Marshmallow Schleim (Ei)", "questSlimeUnlockText": "Schaltet Schleim Eier auf dem Marktplatz zum Kaufen frei", - "questSheepText": "Das Donnerschaf", - "questSheepNotes": "Als du mit deinen Freunden durch das ländliche Aufgabistan wanderst und eine \"kurze Pause\" von deinen Verpflichtungen einlegst, findest du einen gemütlichen Garnladen. Du bist so in deine Aufschieberei vertieft, dass du die Unheil verkündenden Wolken am Horizont kaum bemerkst. \"Ich habe ein schlechtes Gefühl bei diesem Wetter\", murmelt @Misceo und du schaust nach oben. Die stürmischen Wolken brauen sich zusammen und sie sehen fast aus wie... \"Wir haben keine Zeit, in die Wolken zu schauen\", ruft @starsystemic. \"Es greift an!\" Das Donnerschaf rast los und schleudert Blitze direkt auf dich zu!", - "questSheepBoss": "Donnerschaf", - "questSheepCompletion": "Beeindruckt von deinem Fleiß, lässt die Wut des Donnerschafs nach. Es schießt drei riesige Hagelkörner in deine Richtung und verschwindet dann mit leisem Grollen. Bei näherer Betrachtung entdeckst du, dass die Hagelkörner eigentlich drei flauschige Eier sind. Du hebst sie auf und schlenderst unter blauem Himmel nach Hause.", + "questSheepText": "Der Donnerbock", + "questSheepNotes": "Als du mit deinen Freunden durch das ländliche Aufgabistan wanderst und eine \"kurze Pause\" von deinen Verpflichtungen einlegst, findest du einen kleinen Garnladen. Du bist so in deine Aufgabenaufschieberei vertieft, dass du die Unheil verkündenden Wolken am Horizont kaum bemerkst. \"Ich habe ein schlechtes Gefühl bei diesem Wetter\", murmelt @Misceo und du schaust nach oben. Die stürmischen Wolken brauen sich zusammen und sie sehen fast aus wie... \"Wir haben keine Zeit, in die Wolken zu schauen\", ruft @starsystemic. \"Es greift an!\" Der Donnerbock rast los und schleudert Blitze direkt auf dich zu!", + "questSheepBoss": "Donnerbock", + "questSheepCompletion": "Beeindruckt von deinem Fleiß, lässt die Wut des Donnerbocks nach. Er schießt drei riesige Hagelkörner in deine Richtung und verschwindet dann mit leisem Grollen. Bei näherer Betrachtung entdeckst du, dass die Hagelkörner eigentlich drei flauschige Eier sind. Du hebst sie auf und schlenderst unter blauem Himmel nach Hause.", "questSheepDropSheepEgg": "Schaf (Ei)", "questSheepUnlockText": "Ermöglicht den Kauf von Schafseiern auf dem Marktplatz" } \ No newline at end of file diff --git a/common/locales/de/spells.json b/common/locales/de/spells.json index 2ba082c954..62ab678a27 100644 --- a/common/locales/de/spells.json +++ b/common/locales/de/spells.json @@ -8,7 +8,7 @@ "spellWizardFrostText": "Klirrender Frost", "spellWizardFrostNotes": "Eine Eisschicht überzieht deine Aufgaben. Keine Deiner Strähnen wird morgen auf null zurückgesetzt! (Einmal gewirkt wirkt der Effekt auf all Deine Strähnen)", "spellWarriorSmashText": "Gewaltschlag", - "spellWarriorSmashNotes": "Du triffst eine Aufgabe mit aller Kraft. Sie wird blauer/weniger rot, und du fügst Bossen extra Schaden zu! Klicke auf eine Aufgabe, um sie zu verzaubern. (Basiert auf: STR)", + "spellWarriorSmashNotes": "Du triffst eine Aufgabe mit aller Kraft. Sie wird blauer/weniger rot, und du fügst Bossen extra Schaden zu! Klicke auf eine Aufgabe, um sie zu anzugreifen. (Basiert auf: STR)", "spellWarriorDefensiveStanceText": "Verteidigungstellung", "spellWarriorDefensiveStanceNotes": "Du bereitest dich auf den Ansturm deiner Aufgaben vor. Du erhälst einen Ausdauerbonus! (Basiert auf: CON ohne Boni)", "spellWarriorValorousPresenceText": "Tapferer Charakter", @@ -16,9 +16,9 @@ "spellWarriorIntimidateText": "Einschüchternder Blick", "spellWarriorIntimidateNotes": "Dein Blick erfüllt die Herzen Deiner Feinde mit Angst. Deine ganze Gruppe erhält einen Ausdauerbonus! (Basiert auf: CON ohne Boni)", "spellRoguePickPocketText": "Taschendiebstahl", - "spellRoguePickPocketNotes": "Du bestiehlst eine Aufgabe in der Nähe. Du erhältst Gold! Klicke auf eine Aufgabe, um sie zu verzaubern. (Basiert auf: PER)", + "spellRoguePickPocketNotes": "Du bestiehlst eine Aufgabe in der Nähe. Du erhältst Gold! Klicke auf eine Aufgabe, um sie zu bestehlen. (Basiert auf: PER)", "spellRogueBackStabText": "Überraschungsangriff", - "spellRogueBackStabNotes": "Du hältst eine Aufgabe zum Narren. Du erhältst Gold und Erfahrungspunkte! Klicke auf eine Aufgabe, um sie zu verzaubern.(Basiert auf: STR)", + "spellRogueBackStabNotes": "Du betrügst eine törichte Aufgabe. Du erhältst Gold und Erfahrungspunkte! Klicke auf eine Aufgabe, um sie zu betrügen. (Basiert auf: STR)", "spellRogueToolsOfTradeText": "Handwerkszeug", "spellRogueToolsOfTradeNotes": "Du teilst Deine Talente mit Deinen Freunden. Deine ganze Gruppe erhält einen Wahrnehmungsbonus! (Basiert auf: PER ohne Boni)", "spellRogueStealthText": "Schleichen", diff --git a/common/locales/de/tasks.json b/common/locales/de/tasks.json index 358de19044..cf5719adc4 100644 --- a/common/locales/de/tasks.json +++ b/common/locales/de/tasks.json @@ -14,7 +14,7 @@ "save": "Speichern", "addChecklist": "Checkliste hinzufügen", "checklist": "Checkliste", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "Zerlege eine Aufgabe in kleinere Teile! Checklisten erhöhen die Erfahrung und das Gold, das Du für eine Aufgabe bekommst, und verringern den Schaden, den eine tägliche Aufgabe verursacht. ", "expandCollapse": "Auf-/Zuklappen", "text": "Text", "extraNotes": "Extra Notizen", @@ -22,7 +22,7 @@ "advancedOptions": "Erweiterte Optionen", "difficulty": "Schwierigkeit", "difficultyHelpTitle": "Wie schwer ist die Aufgabe?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "Je schwieriger eine Aufgabe ist, umso mehr Erfahrung und Gold bekommst Du, wenn Du sie abhakst... aber auch umso mehr Schaden verursacht sie, wenn es eine tägliche Aufgabe oder schlechte Gewohnheit ist!", "easy": "Einfach", "medium": "Mittel", "hard": "Schwer", @@ -31,9 +31,9 @@ "mental": "Mental", "otherExamples": "z.B. berufliche Unternehmungen, Hobbies, Finanzielles, usw.", "progress": "Fortschritt", - "dailies": "Tägliches", - "newDaily": "Neuer täglicher Eintrag", - "newDailyBulk": "Neue tägliche Einträge (einer pro Zeile)", + "dailies": "Tägliche Aufgaben", + "newDaily": "Neuer tägliche Aufgabe", + "newDailyBulk": "Neue tägliche Aufgaben (eine pro Zeile)", "streakCounter": "Strähnenzähler", "repeat": "Wiederholen", "restoreStreak": "Strähne wiederherstellen", diff --git a/common/locales/en/character.json b/common/locales/en/character.json index befd0d5f9c..885c34799e 100644 --- a/common/locales/en/character.json +++ b/common/locales/en/character.json @@ -7,6 +7,7 @@ "displayName": "Display Name", "displayPhoto": "Photo", "displayBlurb": "Blurb", + "displayBlurbPlaceholder": "Please introduce yourself", "photoUrl": "Photo Url", "imageUrl": "Image Url", "inventory": "Inventory", @@ -111,15 +112,12 @@ "taskAllocationPop": "Assigns points based on the Physical (Strength), Mental (Intelligence), Social (Constitution), and Other (Perception) categories associated with the tasks you complete.", "distributePoints": "Distribute Unallocated Points", "distributePointsPop": "Assigns all unallocated attribute points according to the selected allocation scheme.", - "chooseClass1": "Choose your", - "chooseClass2": "Class!", - "chooseClass3": "Or opt out to choose later.", "warriorText": "Warriors score more and better \"critical hits\", which randomly give bonus Gold, Experience, and drop chance for scoring a task. They also deal heavy damage to boss monsters. Play a Warrior if you find motivation from unpredictable jackpot-style rewards, or want to dish out the hurt in boss Quests!", "mageText": "Mages learn swiftly, gaining Experience and Levels faster than other classes. They also get a great deal of Mana for using special abilities. Play a Mage if you enjoy the tactical game aspects of Habit, or if you are strongly motivated by leveling up and unlocking advanced features!", "rogueText": "Rogues love to accumulate wealth, gaining more Gold than anyone else, and are adept at finding random items. Their iconic Stealth ability lets them duck the consequences of missed Dailies. Play a Rogue if you find strong motivation from Rewards and Achievements, striving for loot and badges!", "healerText": "Healers stand impervious against harm, and extend that protection to others. Missed Dailies and bad Habits don't faze them much, and they have ways to recover Health from failure. Play a Healer if you enjoy assisting others in your Party, or if the idea of cheating Death through hard work inspires you!", "optOut": "Opt Out", - "optOutText": "Can't be bothered with classes? Want to choose later? Opt out - you'll be a warrior and your points handled automatically. You can enable classes later under Settings.", + "optOutText": "Can't be bothered with classes? Want to choose later? Opt out - you'll be a warrior with no special abilities. You can read about the class system later on the wiki and enable classes at any time under User -> Stats.", "select": "Select", "stealth": "Stealth", "stealthNewDay": "When a new day begins, you will avoid damage from this many missed Dailies.", @@ -142,5 +140,11 @@ "unequipBattleGear": "Unequip Battle Gear", "unequipCostume": "Unequip Costume", "unequipPetMountBackground": "Unequip Pet, Mount, Background", - "animalSkins": "Animal Skins" + "animalSkins": "Animal Skins", + "chooseClassHeading": "Choose your Class! Or opt out to choose later.", + "warriorWiki": "Warrior", + "mageWiki": "Mage", + "rogueWiki": "Rogue", + "healerWiki": "Healer", + "chooseClassLearn": "Learn more about classes" } diff --git a/common/locales/en/messages.json b/common/locales/en/messages.json index e4a900c46a..9eb8e49b08 100644 --- a/common/locales/en/messages.json +++ b/common/locales/en/messages.json @@ -1,6 +1,7 @@ { "messageLostItem": "Your <%= itemText %> broke.", "messageTaskNotFound": "Task not found.", + "messageDuplicateTaskID": "A task with that ID already exists.", "messageTagNotFound": "Tag not found.", "messagePetNotFound": ":pet not found in user.items.pets", "messageFoodNotFound": ":food not found in user.items.food", diff --git a/common/locales/en/npc.json b/common/locales/en/npc.json index 72b258ba18..0bd0063cd0 100644 --- a/common/locales/en/npc.json +++ b/common/locales/en/npc.json @@ -18,7 +18,7 @@ "dismissAlert": "Dismiss This Alert", "donateText1": "Adds 20 Gems to your account. Gems are used to buy special in-game items, such as shirts and hairstyles.", "donateText2": "Help support HabitRPG", - "donateText3": "As an open source project, it can use all the help we can get!", + "donateText3": "HabitRPG is an open source project that depends on our users for support. The money you spend on gems helps us keep the servers running, maintain a small staff, develop new features, and provide incentives for our volunteer programmers. Thank you for your generosity!", "donationDesc": "20 Gems, Donation to HabitRPG", "payWithCard": "Pay with Card", "payNote": "Note: PayPal sometimes takes a long time to clear. We recommend paying with card.", diff --git a/common/locales/en/subscriber.json b/common/locales/en/subscriber.json index 4f602a48a3..e6e4876c09 100644 --- a/common/locales/en/subscriber.json +++ b/common/locales/en/subscriber.json @@ -3,17 +3,17 @@ "subscriptions": "Subscriptions", "subDescription": "Disable ads, buy gems with gold, monthly mystery item, retain progress history, double daily drop-caps, supports the devs. Click for more info.", "disableAds": "Disable ads", - "disableAdsText": "Ads will stay disabled while you have an active subscription (original users with disabled ads are grandfathered).", + "disableAdsText": "Ads are disabled while you have an active subscription (original donors are grandfathered).", "buyGemsGold": "Buy Gems with Gold", - "buyGemsGoldText": "(1 Gem costs <%= gemCost %> Gold) Addresses the \"pay to win\" concern, as everything is now achievable through hard work. There's a <%= gemLimit %> Gem monthly conversion cap to prevent farming.", + "buyGemsGoldText": "Alexander the Merchant will sell you gems at a cost of <%= gemCost %> gold per gem. His monthly shipments are initially capped at <%= gemLimit %> gems per month, but this cap increases by 5 gems for every three months of consecutive subscription, up to a maximum of 50 gems per month!", "retainHistory": "Retain full history entries", "retainHistoryText": "Makes your full history available in graphs and export. Non-subscriber histories get consolidated for database optimization.", "doubleDrops": "Daily drop-caps doubled", "doubleDropsText": "Complete your stable faster!", "mysteryItem": "Unique Monthly Subscription Items", - "mysteryItemText": "Each month, all subscribers will get a totally unique cosmetic item for their avatars!", + "mysteryItemText": "Each month you will receive a unique cosmetic item for your avatar! Plus, for every three months of consecutive subscription, the Mysterious Time Travelers will grant you access to historic (and futuristic!) cosmetic items.", "supportDevs": "Supports the developers", - "supportDevsText": "This open source project can use all the help it can get. Help us keep Habit alive!", + "supportDevsText": "Your subscription helps keep Habitica thriving and helps fund the development of new features. Thank you for your generosity!", "monthUSD": "USD / Month", "organization": "Organization", "groupPlans": "Corporate Plans", diff --git a/common/locales/en@pirate/backgrounds.json b/common/locales/en@pirate/backgrounds.json index 14450bc864..62fe19f325 100644 --- a/common/locales/en@pirate/backgrounds.json +++ b/common/locales/en@pirate/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Climb to the top of Pagodas." + "backgroundPagodasNotes": "Climb to the top of Pagodas.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/en@pirate/character.json b/common/locales/en@pirate/character.json index 98967571f2..58ba1b45ab 100644 --- a/common/locales/en@pirate/character.json +++ b/common/locales/en@pirate/character.json @@ -52,9 +52,11 @@ "costume": "Costume", "costumeText": "If ye prefer th' look 'o other gear to what ye have equipped, check th' \"Use Costume\" box to visually don a costume while wearin' ye battle gear underneath.", "useCostume": "Use Costume", - "gearAchievement": "Ye have earned th' \"Ultimate Gear\" Achievement fer upgradin' to th' maximum gear set!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Ultimate Gear", - "ultimGearText": "Has upgraded to th' maximum weapon 'n armor set", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Level", "levelUp": "Level Up!", "mana": "Mana", diff --git a/common/locales/en@pirate/content.json b/common/locales/en@pirate/content.json index c35cec7b6e..67ffdb2446 100644 --- a/common/locales/en@pirate/content.json +++ b/common/locales/en@pirate/content.json @@ -1,6 +1,10 @@ { "potionText": "Health Potion", "potionNotes": "Recover 15 Health (Instant Use)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Wolf", "dropEggWolfAdjective": "loyal", "dropEggTigerCubText": "Tiger Cub", diff --git a/common/locales/en_GB/backgrounds.json b/common/locales/en_GB/backgrounds.json index 3d3255ded6..a8bea3f017 100644 --- a/common/locales/en_GB/backgrounds.json +++ b/common/locales/en_GB/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Climb to the top of Pagodas." + "backgroundPagodasNotes": "Climb to the top of Pagodas.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/en_GB/character.json b/common/locales/en_GB/character.json index 1b6d52285c..3ffb5e5176 100644 --- a/common/locales/en_GB/character.json +++ b/common/locales/en_GB/character.json @@ -52,9 +52,11 @@ "costume": "Costume", "costumeText": "If you prefer the look of other gear to what you have equipped, check the \"Use Costume\" box to visually don a costume while wearing your battle gear underneath.", "useCostume": "Use Costume", - "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Ultimate Gear", - "ultimGearText": "Has upgraded to the maximum weapon and armour set", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Level", "levelUp": "Level Up!", "mana": "Mana", diff --git a/common/locales/en_GB/content.json b/common/locales/en_GB/content.json index f3e86a08ad..1462ae781a 100644 --- a/common/locales/en_GB/content.json +++ b/common/locales/en_GB/content.json @@ -1,6 +1,10 @@ { "potionText": "Health Potion", "potionNotes": "Recover 15 Health (Instant Use)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Wolf", "dropEggWolfAdjective": "loyal", "dropEggTigerCubText": "Tiger Cub", diff --git a/common/locales/es/backgrounds.json b/common/locales/es/backgrounds.json index 23bac4913e..1e94f34af4 100644 --- a/common/locales/es/backgrounds.json +++ b/common/locales/es/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Climb to the top of Pagodas." + "backgroundPagodasNotes": "Climb to the top of Pagodas.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/es/character.json b/common/locales/es/character.json index 5fdb27124e..a96fcfaf6a 100644 --- a/common/locales/es/character.json +++ b/common/locales/es/character.json @@ -52,9 +52,11 @@ "costume": "Disfraz", "costumeText": "Si prefieres el aspecto de otro equipo al que estás usando, marca la casilla «Usar Disfraz» para llevarlo como disfraz mientras usas tu equipo de batalla debajo.", "useCostume": "Llevar Disfraz ", - "gearAchievement": "¡Has conseguido el logro «Equipo Definitivo» por llegar al máximo set de equipo!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Equipo Definitivo", - "ultimGearText": "Ha llegado al máximo set de armadura y arma", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Nivel", "levelUp": "¡Subiste de Nivel!", "mana": "Maná", diff --git a/common/locales/es/content.json b/common/locales/es/content.json index 4bddf4541a..02676b1ba1 100644 --- a/common/locales/es/content.json +++ b/common/locales/es/content.json @@ -1,6 +1,10 @@ { "potionText": "Pócima de Salud", "potionNotes": "Recuperar 15 de Salud (uso instantáneo)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Lobo", "dropEggWolfAdjective": "leal", "dropEggTigerCubText": "Cachorro de tigre", diff --git a/common/locales/es_419/backgrounds.json b/common/locales/es_419/backgrounds.json index 2f105736db..919c6e039d 100644 --- a/common/locales/es_419/backgrounds.json +++ b/common/locales/es_419/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Climb to the top of Pagodas." + "backgroundPagodasNotes": "Climb to the top of Pagodas.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/es_419/character.json b/common/locales/es_419/character.json index 8feaf05c96..eb876ba53b 100644 --- a/common/locales/es_419/character.json +++ b/common/locales/es_419/character.json @@ -52,9 +52,11 @@ "costume": "Disfraz", "costumeText": "Si prefieres el aspecto de otro equipo al que estás usando, marca la casilla \"Usar Disfraz\" para llevarlo como disfraz mientras usas tu equipo de batalla por debajo.", "useCostume": "Llevar disfraz ", - "gearAchievement": "¡Has conseguido el logro \"Equipo definitivo\" por llegar al máximo conjunto de equipo!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Equipo definitivo", - "ultimGearText": "Ha llegado al máximo conjunto de arma y armadura", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Nivel", "levelUp": "¡Subiste de nivel!", "mana": "Maná", @@ -70,7 +72,7 @@ "allocatePerPop": "Añadir un punto a Percepción", "allocateInt": "Puntos asignados a Inteligencia:", "allocateIntPop": "Añadir un punto a Inteligencia", - "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Attribute Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", + "noMoreAllocate": "Ahora que has alcanzado el nivel 100, ya no ganarás más Puntos de Atributo. Puedes seguir subiendo de nivel, o empezar una nueva aventura en el nivel 1 utilizando la Esfera de Renacimiento, que ahora se encuentra disponible gratuitamente en el Mercado.", "stats": "Estadísticas", "strength": "Fuerza", "strengthText": "La Fuerza aumenta la probabilidad de conseguir \"golpes críticos\" aleatorios y el Oro, la Experiencia y la probabilidad de conseguir botín al asestarlos. También ayuda a hacer daño a los monstruos jefe.", @@ -140,5 +142,5 @@ "unequipBattleGear": "Quitar equipo de batalla", "unequipCostume": "Quitar disfraz", "unequipPetMountBackground": "Quitar Mascota, Montura y Fondo", - "animalSkins": "Animal Skins" + "animalSkins": "Pieles de animales" } \ No newline at end of file diff --git a/common/locales/es_419/content.json b/common/locales/es_419/content.json index ee69a21d34..4ce3b68992 100644 --- a/common/locales/es_419/content.json +++ b/common/locales/es_419/content.json @@ -1,6 +1,10 @@ { "potionText": "Poción curativa", "potionNotes": "Recuperar 15 de Salud (Uso instantáneo)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Lobo", "dropEggWolfAdjective": "leal", "dropEggTigerCubText": "Cachorro de tigre", @@ -56,8 +60,8 @@ "questEggBunnyAdjective": "zalamero", "questEggSlimeText": "Marshmallow Slime", "questEggSlimeAdjective": "dulce", - "questEggSheepText": "Sheep", - "questEggSheepAdjective": "woolly", + "questEggSheepText": "Oveja", + "questEggSheepAdjective": "lanuda", "eggNotes": "Encuentra una poción de eclosión para verter sobre este huevo y nacerá un <%= eggText(locale) %> <%= eggAdjective(locale) %>.", "hatchingPotionBase": "Básico", "hatchingPotionWhite": "Blanco", diff --git a/common/locales/es_419/questscontent.json b/common/locales/es_419/questscontent.json index 8a5cab12cf..281fd23bf5 100644 --- a/common/locales/es_419/questscontent.json +++ b/common/locales/es_419/questscontent.json @@ -197,9 +197,9 @@ "questSlimeCompletion": "With a final jab, you trap the Jelly Regent in an over-sized donut, rushed in by @Overomega, @LordDarkly, and @Shaner, the quick-thinking leaders of the pastry club. As everyone is patting you on the back, you feel someone slip something into your pocket. It’s the reward for your sweet success: three Marshmallow Slime eggs.", "questSlimeDropSlimeEgg": "Marshmallow Slime (Egg)", "questSlimeUnlockText": "Unlocks purchasable slime eggs in the Market", - "questSheepText": "The Thunder Ram", - "questSheepNotes": "As you wander the rural Taskan countryside with friends, taking a \"quick break\" from your obligations, you find a cozy yarn shop. You are so absorbed in your procrastination that you hardly notice the ominous clouds creep over the horizon. \"I've got a ba-a-a-ad feeling about this weather,\" mutters @Misceo, and you look up. The stormy clouds are swirling together, and they look a lot like a... \"We don't have time for cloud-gazing!\" @starsystemic shouts. \"It's attacking!\" The Thunder Ram hurtles forward, slinging bolts of lightning right at you!", - "questSheepBoss": "Thunder Ram", + "questSheepText": "El carnero del trueno", + "questSheepNotes": "Mientras deambulas por las campiñas de Taskan con tus amigos, tomando un \"rápido descanso\" de tus obligaciones, encuentras una acogedora tienda de estambre. Estás tan sumergido en tu procastinación que apenas y te das cuenta de las siniestras nubes que cubren el cielo. \"Tengo un ma-a-al presentimiento de este clima\", balbucea @Misceo mientras miras hacia arriba. Las tempestuosas nubes se arremolinan y se parecen mucho a... \"¡No tenemos tiempo para mirar nubes!\" grita @starsystemic. \"¡Está atacando!\" ¡El carnero del trueno se abalanza, lanzando relámpagos y truenos hacia ti!", + "questSheepBoss": "Carnero del trueno", "questSheepCompletion": "Impressed by your diligence, the Thunder Ram is drained of its fury. It launches three huge hailstones in your direction, and then fades away with a low rumble. Upon closer inspection, you discover that the hailstones are actually three fluffy eggs. You gather them up, and then stroll home under a blue sky.", "questSheepDropSheepEgg": "Sheep (Egg)", "questSheepUnlockText": "Unlocks purchasable sheep eggs in the Market" diff --git a/common/locales/es_419/spells.json b/common/locales/es_419/spells.json index d13c44c767..ce60de8d56 100644 --- a/common/locales/es_419/spells.json +++ b/common/locales/es_419/spells.json @@ -1,14 +1,14 @@ { "spellWizardFireballText": "Explosión de llamas", - "spellWizardFireballNotes": "Flames burst from your hands. You gain XP, and you deal extra damage to Bosses! Click on a task to cast. (Based on: INT)", + "spellWizardFireballNotes": "Llamas estallan de tus manos. ¡Ganas EXP y haces daño adicional a los Jefes! Haz click sobre una tarea para invocar el conjuro. (Basado en: INT).", "spellWizardMPHealText": "Corriente etérea", - "spellWizardMPHealNotes": "Sacrificaste maná para ayudar a tus amigos. El resto e tu grupo ganó PM (Basado en: INT)", + "spellWizardMPHealNotes": "Sacrificaste maná para ayudar a tus amigos. ¡El resto de tu grupo recupera PM! (Basado en: INT)", "spellWizardEarthText": "Terremoto", - "spellWizardEarthNotes": "Tu poder mental hace temblar la tierra. Todo tu grupo gana una mejora de inteligencia (Basado en: poca INT )", + "spellWizardEarthNotes": "Tu poder mental hace temblar la tierra. ¡La Inteligencia de tu equipo se ve potenciada! (Basado en: INT no potenciada )", "spellWizardFrostText": "Helada escalofriante", - "spellWizardFrostNotes": "El hielo cubre tus tareas. Ninguna de tus rachas se restablecerá a cero mañana! (Un conjuro afecta a todas las rachas.)", + "spellWizardFrostNotes": "El hielo cubre tus tareas. ¡Ninguna de tus rachas se reiniciará a cero mañana! (Un conjuro afecta a todas las rachas.)", "spellWarriorSmashText": "Golpe brutal", - "spellWarriorSmashNotes": "You hit a task with all of your might. It gets more blue/less red, and you deal extra damage to Bosses! Click on a task to cast. (Based on: STR)", + "spellWarriorSmashNotes": "Golpeas salvajemente a una tarea con toda tu fuerza. ¡La tarea se vuelve más azul/menos roja y haces daño adicional a los Jefes! Haz lick sobre una tarea para invocar el conjuro. (Basado en FRZ).", "spellWarriorDefensiveStanceText": "Postura defensiva", "spellWarriorDefensiveStanceNotes": "You prepare yourself for the onslaught of your tasks. You gain a buff to Constitution! (Based on: Unbuffed CON)", "spellWarriorValorousPresenceText": "Presencia valerosa", @@ -36,11 +36,11 @@ "spellSpecialSaltText": "Sal", "spellSpecialSaltNotes": "Alguien te ha lanzado una bola de nieve. Ja Ja, muy gracioso. ¡Ahora quítame esta nieve de encima!", "spellSpecialSpookDustText": "Brillantina espeluznante", - "spellSpecialSpookDustNotes": "Convierte a un amigo en una sabana flotante con ojos!", + "spellSpecialSpookDustNotes": "¡Convierte a un amigo en una manta flotante con ojos!", "spellSpecialOpaquePotionText": "Poción opaca", "spellSpecialOpaquePotionNotes": "Cancela los efectos de la brillantina espeluznante.", "spellSpecialShinySeedText": "Semilla radiante", - "spellSpecialShinySeedNotes": "Transforma a un amigo en una alegre flor!", + "spellSpecialShinySeedNotes": "¡Transforma a un amigo en una alegre flor!", "spellSpecialPetalFreePotionText": "Poción libre de petalos", - "spellSpecialPetalFreePotionNotes": "Cancela los efectos de una Semilla Radiante" + "spellSpecialPetalFreePotionNotes": "Cancela los efectos de una Semilla radiante" } \ No newline at end of file diff --git a/common/locales/es_419/tasks.json b/common/locales/es_419/tasks.json index 11af681ecf..937b33973f 100644 --- a/common/locales/es_419/tasks.json +++ b/common/locales/es_419/tasks.json @@ -14,7 +14,7 @@ "save": "Guardar", "addChecklist": "Añadir lista de control", "checklist": "Lista de control", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "¡Distribuye una tarea en partes! Las listas de control incrementan la Experiencia y el Oro ganados por completar Pendientes, y reducen el daño causado por una Diaria.", "expandCollapse": "Expandir/Contraer", "text": "Texto", "extraNotes": "Notas adicionales", @@ -22,7 +22,7 @@ "advancedOptions": "Opciones avanzadas", "difficulty": "Dificultad", "difficultyHelpTitle": "¿Qué dificultad tiene esta tarea?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "Entre más difícil sea la tarea, recibirás mayor cantidad de Experiencia y Oro cuando la elimines de la lista... ¡pero hará más daño si es parte de una Diaria o un Mal Hábito!", "easy": "Fácil", "medium": "Intermedio", "hard": "Difícil", @@ -78,5 +78,5 @@ "pushTaskToTop": "Enviar tarea al tope", "pushTaskToBottom": "Enviar tarea al fondo", "emptyTask": "Primero escribe el título de la tarea.", - "dailiesRestingInInn": "You're Resting in the Inn! Your Dailies will NOT hurt you tonight, but they WILL still refresh every day. If you're in a quest, you won't deal damage/collect items until you check out of the Inn, but you can still be injured by a Boss if your Party mates skip their own Dailies." + "dailiesRestingInInn": "¡Estás descansando en la Posada! Tus Diarias no te harán daño esta noche, pero continuarán reiniciándose cada día. Si te encuentras una misión, no harás daño/coleccionarás objetos hasta que hayas salido de la Posada, pero sí recibirás daño de un Jefe si tus compañeros no completan sus Diarias." } \ No newline at end of file diff --git a/common/locales/fr/backgrounds.json b/common/locales/fr/backgrounds.json index 88a762c914..98136c2d3f 100644 --- a/common/locales/fr/backgrounds.json +++ b/common/locales/fr/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Lac en Altitude", "backgroundMountainLakeNotes": "Trempez vos orteils dans un Lac en Altitude.", "backgroundPagodasText": "Pagodes", - "backgroundPagodasNotes": "Grimpez au sommet de Pagodes." + "backgroundPagodasNotes": "Grimpez au sommet de Pagodes.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/fr/challenge.json b/common/locales/fr/challenge.json index 11738adc1b..b2e5519ede 100644 --- a/common/locales/fr/challenge.json +++ b/common/locales/fr/challenge.json @@ -16,7 +16,7 @@ "selectWinner": "Désigner un vainqueur et clore le défi :", "deleteOrSelect": "Supprimer ou désigner un vainqueur", "endChallenge": "Clore le défi", - "challengeDiscription": "These are the Challenge's tasks that will be added to your task dashboard when you join this Challenge. The sample Challenge tasks below will change color and gain graphs to show you the overall progress of the group.", + "challengeDiscription": "Voici les tâches du Défi, qui vont être ajoutées à votre propre tableau de bord lorsque vous rejoindrez ce Défi. Les tâches de Défi ci-dessous changeront alors de couleur et vous pourrez voir des graphiques montrant les progrès du groupe dans son ensemble. ", "hows": "Où en sont les autres ?", "filter": "Filtre", "groups": "Groupes", @@ -33,8 +33,8 @@ "challengeTagPop": "Les défis apparaissent dans la liste des étiquettes et dans l'infobulle des tâches. Utilisez un titre représentatif et une étiquette courte. Par exemple : \"Perdre 5 kilos en 3 mois\" pour le titre et \"-5kg\" pour l'étiquette (Cliquez pour plus d'informations).", "challengeDescr": "Description", "prize": "Récompense", - "prizePop": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later.", - "prizePopTavern": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later and Tavern challenges will not be refunded if the challenge is cancelled.", + "prizePop": "S'il est possible de \"gagner\" votre défi, vous pouvez choisir de récompenser le vainqueur avec des Gemmes. La récompense maximum est le nombre de Gemmes que vous possédez vous-mêmes (auxquelles s'ajoutent les Gemmes de la guilde si vous êtes le créateur de la guilde proposant le défi). Remarque: la récompense ne peut pas être modifiée ultérieurement. ", + "prizePopTavern": "S'il est possible de \"gagner\" votre défi, vous pouvez choisir de récompenser le vainqueur avec des Gemmes. La récompense maximum est le nombre de Gemmes que vous possédez vous-mêmes (auxquelles s'ajoutent les Gemmes de la guilde si vous êtes le créateur de la guilde proposant le défi). Remarque: la récompense ne peut pas être modifiée ultérieurement et récompenses des défis de la Taverne ne peuvent être restituées si le défi est annulé. ", "publicChallenges": "Minimum 1 gemme pour les défis publics (ça aide à lutter contre le spam, pour de vrai).", "officialChallenge": "Défi officiel HabitRPG", "by": "par", @@ -44,7 +44,7 @@ "selectGroup": "Veuillez sélectionner un groupe", "challengeCreated": "Défi créé", "sureDelCha": "Êtes-vous vraiment sûr de vouloir supprimer le défi ?", - "sureDelChaTavern": "Delete challenge, are you sure? Your gems will not be refunded.", + "sureDelChaTavern": "Êtes-vous sûr de vouloir supprimer le défi? Vos Gemmes ne vous seront pas restituées. ", "removeTasks": "Supprimer les tâches", "keepTasks": "Conserver les tâches", "closeCha": "Clore le défi et…", diff --git a/common/locales/fr/character.json b/common/locales/fr/character.json index 9009fcc754..f2183f6790 100644 --- a/common/locales/fr/character.json +++ b/common/locales/fr/character.json @@ -52,9 +52,11 @@ "costume": "Costume", "costumeText": "Si vous préférez l'apparence d'un équipement différent de celui que vous avez équipé, choisissez \"Utiliser un Costume\" pour le porter en costume tout en conservant les bonus de votre équipement.", "useCostume": "Utiliser un Costume", - "gearAchievement": "Vous avez gagné le succès \"Armé jusqu'aux dents\" pour avoir acheté tous les meilleurs équipements ! ", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Armé jusqu'aux dents", - "ultimGearText": "S'est équipé avec les meilleurs armes et les meilleures armures.", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Niveau", "levelUp": "Montée de niveau !", "mana": "Mana", diff --git a/common/locales/fr/communityguidelines.json b/common/locales/fr/communityguidelines.json index 3d3733ab99..bf3ee36e3f 100644 --- a/common/locales/fr/communityguidelines.json +++ b/common/locales/fr/communityguidelines.json @@ -4,7 +4,7 @@ "commGuideHeadingWelcome": "Bienvenue en Habitica !", "commGuidePara001": "Salutations, brave aventurier ! Bienvenue en Habitica, le pays de la productivité, de la vie saine et de l'occasionnel griffon ravageur. Nous sommes une joyeuse communauté faite de personnes serviables qui se soutiennent les unes les autres sur la voie de l’amélioration de soi.", "commGuidePara002": "Afin que tout le monde se sente bien, heureux et productif dans la communauté, nous avons établi quelques règles de conduite. Nous les avons minutieusement forgées afin de les rendre aussi agréables et faciles à lire que possible. Nous vous enjoignons à prendre le temps de les lire.", - "commGuidePara003": "Ces règles s’appliquent à tous les espaces sociaux que nous utilisons, comprenant (mais pas forcément limités à) Trello, GitHub, Transifex et Wikia (c’est-à-dire le wiki). Parfois, des situations imprévues surgiront, comme une nouvelle source de conflit ou un nécromancien perfide. Si cela arrive, les modérateurs et modératrices (Mods) pourront y faire face en éditant ces règles de conduite afin de protéger la communauté de nouvelles menaces. Soyez sans crainte : vous serez prévenu·es par une annonce de Bailey si cela devait être le cas.", + "commGuidePara003": "Ces règles s’appliquent à tous les espaces sociaux que nous utilisons, comprenant (mais pas forcément limités à) Trello, GitHub, Transifex et Wikia (c’est-à-dire le wiki). Parfois, des situations inattendues surgiront, comme une nouvelle source de conflit ou un vicieux nécromancien. Si cela arrive, les modérateurs et modératrices (Mods) pourront y faire face en éditant ces règles de conduite afin de protéger la communauté de nouvelles menaces. Soyez sans crainte : vous serez prévenu·es par une annonce de Bailey si cela devait être le cas.", "commGuidePara004": "Et maintenant, à vos plumes et parchemins pour la prise de notes : commençons !", "commGuideHeadingBeing": "Être Habiticien·ne", "commGuidePara005": "HabitRPG est d’abord et avant tout un site internet dédié à l’amélioration de soi. Résultat : nous avons la chance d’avoir attiré l’une des communautés les plus chaleureuses, sympathiques, courtoises et solidaires de l’internet. Divers traits caractérisent les Habiticien·nes. Certains des plus courants et des plus marquants sont :", @@ -40,7 +40,7 @@ "commGuideList02F": "Obtempérez immédiatement si un Modérateur vous demande de cesser une conversation ou de la déplacer dans l'Arrière-Boutique. Les derniers mots et tirades finales devraient être lancés (courtoisement) à votre \"table\" dans l'Arrière-Boutique, si vous en avez la permission.", "commGuideList02G": "Prenez le temps de la réflexion plutôt que de répondre de manière impulsive si quelqu'un vous dit qu'une de vos propos ou actions l'ont gêné. Il faut une une grande force pour être capable de présenter des excuses sincères. Si vous trouvez qu'une personne vous a répondu de manière inappropriée, contactez un-e Mod plutôt que de l'interpeller en public.", "commGuideList02H": "Les conversations polémiques/contentieuses devraient être rapportées à la modération. Si vous trouvez qu’une conversation devient trop animée, trop passionnée ou offensante, cessez d’y participer. À la place, envoyez un courriel à leslie@habitrpg.com pour nous prévenir. C’est notre travail de vous protéger.", - "commGuideList02I": "Ne spammez pas Le spam peut inclure, sans y être limité : poster le même commentaire ou la même demande dans de multiples endroits, poster des liens sans explication ou contexte, poster des messages incohérents, ou poster le même message à la chaîne. Les demandes répétées de gemmes ou d'abonnements peuvent aussi être considérées comme du spam.", + "commGuideList02I": "Ne spammez pas Le spam peut inclure, sans être limité à : poster le même commentaire ou la même demande dans de multiples endroits, poster des liens sans explication ou contexte, poster des messages incohérents, ou poster le même message à la chaîne. Les demandes répétées de gemmes ou d'abonnements peuvent aussi être considérées comme du spam.", "commGuidePara019": "Dans les espaces privés, une plus grande liberté est accordée pour discuter de ce dont vous avez envie, mais vous êtes toujours soumis aux Conditions d'Utilisation et ne devez pas les enfreindre : pas de contenu discriminatoire, violent ou menaçant.", "commGuidePara020": "Les Message Privés (MP) ont quelques règles additionnelles. Si une personne vous a bloqué, ne la contactez pas par un autre biais pour lui demander de vous débloquer. Vous ne devriez également pas envoyer des MPs à quelqu'un en lui demandant de l'aide (dans la mesure où les réponses publiques aux questions sont utiles à la communauté). Enfin, n'envoyez à personne de messages les priant de vous offrir des gemmes ou un abonnement, ce qui peut être considéré comme du spam.", "commGuidePara021": "De plus, certains lieux publics d’Habitica ont des règles supplémentaires.", @@ -68,7 +68,7 @@ "commGuideList03E": "Le Forum Wiki est une place pour améliorer le contenu du nouveau Wiki, en discuter et demander de nouvelles pages.", "commGuidePara042": "Tous ont leurs propres règles, et les règles d’Espace Public s’appliquent toujours. Il vaut mieux éviter de dériver du sujet principal sur le tableau ou les fiches. Croyez-nous, les tableaux sont bien assez encombrés comme cela ! Les conversations prolongées devraient être déplacées dans le Coin du Fond.", "commGuideHeadingGitHub": "GitHub", - "commGuidePara043": "HabitRPG utilise GitHub pour traquer les bugs et contribuer au code. C’est la forge où nos infatigables Forgeron·ne·s façonnent les options ! Toutes les règles d’Espace Public s’appliquent. Soyez très poli avec les artisans – ils ont beaucoup de travail, à faire fonctionner le site ! Bravo les Forgeron·ne·s !", + "commGuidePara043": "HabitRPG utilise GitHub pour traquer les bugs et contribuer au code. C’est la forge où nos infatigables Forgeron·ne·s façonnent les options ! Toutes les règles d’Espace Public s’appliquent. Soyez très poli avec les Forgeron·ne·s – ils ont beaucoup de travail, à faire fonctionner le site ! Bravo les Forgeron·ne·s !", "commGuidePara044": "Les personnes suivantes sont membres du coin HabitRPG : ", "commGuideHeadingWiki": "Wiki", "commGuidePara045": "Le wiki HabitRPG rassemble des informations à propos du site. Il héberge également quelques forums similaires aux guildes de HabitRPG. Ainsi, les règles d’Espace Public s’appliquent.", diff --git a/common/locales/fr/content.json b/common/locales/fr/content.json index fe8a605c98..26993e8926 100644 --- a/common/locales/fr/content.json +++ b/common/locales/fr/content.json @@ -1,6 +1,10 @@ { "potionText": "Potion de Santé", "potionNotes": "Rend 15 points de Santé (effet immédiat)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Loup", "dropEggWolfAdjective": "loyal", "dropEggTigerCubText": "Tigreau", diff --git a/common/locales/fr/front.json b/common/locales/fr/front.json index 2dceb8d303..7a8e91a860 100644 --- a/common/locales/fr/front.json +++ b/common/locales/fr/front.json @@ -173,10 +173,10 @@ "watchVideos": "Regarder les vidéos", "work": "Travailler", "zelahQuote": "Avec HabitRPG, j'envisage même d'aller au lit à l'heure rien qu'à la pensée d'obtenir des points pour m'être couché de bonne heure ou de perdre de la santé pour m'être couché tard!", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", - "generalQuestionsSite": "General Questions about the Site", - "businessInquiries": "Business Inquiries", - "merchandiseInquiries": "Merchandise Inquiries", - "marketingInquiries": "Marketing/Social Media Inquiries" + "reportAccountProblems": "Signaler un problème sur votre compte", + "reportCommunityIssues": "Signaler un problème au niveau de la Communauté", + "generalQuestionsSite": "Questions d'ordre général sur le Site", + "businessInquiries": "Demandes pour les entreprises", + "merchandiseInquiries": "Demandes commerciales", + "marketingInquiries": "Demandes pour le marketing/les réseaux sociaux" } \ No newline at end of file diff --git a/common/locales/fr/gear.json b/common/locales/fr/gear.json index b6784c51ef..f311c89f21 100644 --- a/common/locales/fr/gear.json +++ b/common/locales/fr/gear.json @@ -120,8 +120,8 @@ "weaponMystery201411Notes": "Embrochez vos ennemis ou plantez-la dans votre nourriture préférée : cette fourche multi-fonctions peut tout faire ! N'apporte aucun bonus. Équipement d'Abonné de Novembre 2014.", "weaponMystery201502Text": "Bâton Chatoyant Ailé d'Amour et Aussi de Vérité", "weaponMystery201502Notes": "Pour les AILES ! Pour l'AMOUR ! Et AUSSI pour la VÉRITÉ ! N'apporte aucun bonus. Équipement d'Abonné de Février 2015.", - "weaponMystery201505Text": "Green Knight Lance", - "weaponMystery201505Notes": "This green and silver lance has unseated many opponents from their mounts. Confers no benefit. May 2015 Subscriber Item.", + "weaponMystery201505Text": "Lance du Chevalier Vert", + "weaponMystery201505Notes": "Cette lance verte et argent a désarçonné de nombreux adversaires! N'apporte aucun bonus. Équipement d'Abonné de Mai 2015.", "weaponMystery301404Text": "Canne Steampunk", "weaponMystery301404Notes": "Parfaite pour faire un tour en ville. N'apporte aucun bonus. Équipement d'Abonné de Mars 3015.", "armor": "armure", @@ -372,8 +372,8 @@ "headMystery201412Notes": "Qui est un pingouin ? N'apporte aucun bonus. Équipement d'Abonné de Décembre 2014.", "headMystery201501Text": "Heaume Stellaire", "headMystery201501Notes": "Les constellations de ce casque scintillent et tourbillonnent, canalisant les pensées de son porteur. N'apporte aucun bonus. Équipement d'Abonné de Janvier 2015.", - "headMystery201505Text": "Green Knight Helm", - "headMystery201505Notes": "The green plume on this iron helm waves proudly. Confers no benefit. May 2015 Subscriber Item.", + "headMystery201505Text": "Heaume du Chevalier Vert", + "headMystery201505Notes": "La plume verte au sommet de ce heaume ondule fièrement. N'apport aucun bonus. Équipement d'Abonné de Mai 2015.", "headMystery301404Text": "Haut-de-forme Fantaisiste", "headMystery301404Notes": "Un couvre-chef fantaisiste pour les gens de bonne famille les plus élégants ! N'apporte aucun bonus. Équipement d'Abonné de Janvier 3015.", "headMystery301405Text": "Haut-de-forme Classique", diff --git a/common/locales/fr/generic.json b/common/locales/fr/generic.json index e1d68bc013..a022230d2d 100644 --- a/common/locales/fr/generic.json +++ b/common/locales/fr/generic.json @@ -5,19 +5,19 @@ "habitica": "Habitica", "expandToolbar": "Montrer la barre d'outlis", "collapseToolbar": "Cacher la barre d'outils", - "markdownBlurb": "HabitRPG uses markdown for message formatting. See the Markdown Cheat Sheet for more info.", - "showFormattingHelp": "Show formatting help", - "hideFormattingHelp": "Hide formatting help", - "youType": "You type:", - "youSee": "You see:", - "italics": "*Italics*", - "bold": "**Bold**", - "strikethrough": "~~Strikethrough~~", + "markdownBlurb": "HabitRPG utilise le balisage markdown dans les espaces de discussion. Voir le Mémo de Markdownt pour de plus amples informations.", + "showFormattingHelp": "Afficher l'aide pour l'utilisation des balises. ", + "hideFormattingHelp": "Masquer l'aide pour l'utilisation des balises.", + "youType": "Lorsque vous tapez: ", + "youSee": "Vous voyez:", + "italics": "*Italique*", + "bold": "**Gras**", + "strikethrough": "~~Barré~~", "emojiExample": ":smile:", - "markdownLinkEx": "[HabitRPG is great!](https://habitrpg.com)", - "markdownImageEx": "![mandatory alt text](https://habitrpg.com/cake.png \"optional mouseover title\")", - "unorderedListHTML": "+ First item
+ Second item
+ Third item", - "unorderedListMarkdown": "+ First item\n+ Second item\n+ Third item", + "markdownLinkEx": "[Habit RPG, c'est la classe!](https://habitrpg.com)", + "markdownImageEx": "![texte alternatif obligatoire](https://habitrpg.com/cake.png \"facultatif: titre affiché en passant la souris\")", + "unorderedListHTML": "+ Premier article
+ Second article
+ Troisième article", + "unorderedListMarkdown": "+ Premier article\n+ Second article\n+ Troisième article", "code": "`code`", "achievements": "Succès", "modalAchievement": "Succès !", diff --git a/common/locales/fr/groups.json b/common/locales/fr/groups.json index 956ac537cd..d2dae1a9fe 100644 --- a/common/locales/fr/groups.json +++ b/common/locales/fr/groups.json @@ -110,11 +110,11 @@ "byColon": "Invité par: ", "inviteNewUsers": "Inviter un/plusieurs nouveau(x) utilisateur(s)", "inviteAlertInfo2": "Ou partagez ce lien (copier/coller):", - "sendGiftHeading": "Send Gift to <%= name %>", - "sendGiftGemsBalance": "From <%= number %> Gems", - "sendGiftCost": "Total: $<%= cost %> USD", - "sendGiftFromBalance": "From Balance", - "sendGiftPurchase": "Purchase", - "sendGiftMessagePlaceholder": "Personal message (optional)", - "sendGiftSubscription": "<%= months %> Month(s): $<%= price %>" + "sendGiftHeading": "Envoyer un cadeau à <%= name %>", + "sendGiftGemsBalance": "De vos <%= number %> Gemmes", + "sendGiftCost": "Total: <%= cost %>$ (USD)", + "sendGiftFromBalance": "Offrir vos propres Gemmes", + "sendGiftPurchase": "Acheter les Gemmes", + "sendGiftMessagePlaceholder": "Message personnel (facultatif)", + "sendGiftSubscription": "<%= months %> mois: <%= price %>$ (USD)" } \ No newline at end of file diff --git a/common/locales/fr/npc.json b/common/locales/fr/npc.json index 44fdad38be..ae53dddd4f 100644 --- a/common/locales/fr/npc.json +++ b/common/locales/fr/npc.json @@ -2,8 +2,8 @@ "npc": "PNJ", "npcText": "A soutenu le projet Kickstarter à son niveau maximum ! ", "mattBoch": "Matt Boch", - "mattShall": "Shall I bring you your steed, <%= name %>? Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!", - "mattBochText1": "Welcome to the Stable! I'm Matt, the beast master. After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "mattShall": "Dois-je préparer votre coursier, <%= name %>? Lorsque vous avez assez nourri un animal pour qu'il devienne une fière monture, il apparaîtra ici. Cliquez sur une monture pour monter en selle!", + "mattBochText1": "Bienvenue à l'Écurie! Je suis Matt, le Maître des Bêtes. Après avoir passé le niveau 4, vous pouvez faire éclore vos familiers grâce à vos œufs et potions. Lorsque vous faites éclore un animal au Marché, il apparaîtra ici! Cliquez sur l'image d'un animal pour le faire rejoindre votre avatar. Donnez-leur la nourriture que vous trouvez dès la fin du niveau 4, et ils deviendront de puissantes montures. ", "daniel": "Daniel", "danielText": "Bienvenue à la Taverne ! Restez un moment et rencontrez les habitants. Si vous avez besoin de vous reposer (vacances ? maladie ?), je vous installerai à l'Auberge. Pendant votre séjour, vos tâches Quotidiennes ne vous infligeront pas de dommages à la fin de la journée, mais vous pourrez quand même les réaliser.", "danielText2": "Prenez garde : si vous êtes au milieu d'une quête contre un boss, celui-ci vous infligera tout de même des blessures en fonction des Quotidiennes manquées des membres de votre groupe ! De façon identique, vos propres dégâts au Boss (ou les objets récoltés) ne seront pas appliquez tant que vous ne quitterez pas l'Auberge.", @@ -45,9 +45,9 @@ "tourScrollDown": "Faites attention à bien aller tout en bas de la page pour voir toutes les options ! Cliquez sur votre avatar à nouveau pour retourner à la page des tâches.", "tourMuchMore": "Quand vous aurez fini avec vos tâches, vous pourrez former une équipe avec vos amis, discuter dans les guildes liées à vos centres d'intérêts, participer à des défis, et bien plus !", "tourStatsPage": "Ceci est votre page de statistiques ! Remportez des succès en complétant les tâches listées.", - "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", + "tourTavernPage": "Bienvenue à la Taverne, un lieu de discussion pour tous! Vous pouvez vous protéger des dégâts causés par vos Quotidiennes en cas de maladie ou de voyage en cliquant sur \"Se reposer à l'Auberge\". Venez dire bonjour!", "tourPartyPage": "Votre équipe vous aidera à rester responsable. Invitez des amis pour déverrouiller un parchemin de quête !", "tourGuildsPage": "Les Guildes sont des groupes de personnes avec des centres d'intérêts communs. Recherchez les sujets qui vous plaisent ! Nous vous recommandons la guilde des nouveaux arrivants.", - "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", + "tourChallengesPage": "Les Défis sont des listes de tâches créées par des membres! Rejoindre un défi ajoutera ses tâches à votre compte. Rivalisez avec d'autres membres pour gagner des gemmes!", "tourMarketPage": "A partir du niveau 4, des œufs et des potions d'éclosion apparaitront au hasard comme butin lorsque vous réaliserez vos tâches. Ils apparaissent ici - utilisez-les pour faire éclore des Familiers ! Vous pouvez aussi acheter des objets au Marché." } \ No newline at end of file diff --git a/common/locales/fr/quests.json b/common/locales/fr/quests.json index c656ced567..887cb68b70 100644 --- a/common/locales/fr/quests.json +++ b/common/locales/fr/quests.json @@ -19,7 +19,7 @@ "bossStrength": "Force du Boss", "collect": "Collecter", "collected": "Récolté", - "bossDmg1": "Each completed Daily and To-Do and each positive Habit hurts the boss. Hurt it more with redder tasks or Brutal Smash and Burst of Flames. The boss will deal damage to every quest participant for every Daily you've missed (multiplied by the boss's Strength) in addition to your regular damage, so keep your party healthy by completing your Dailies! All damage to and from a boss is tallied on cron (your day roll-over).", + "bossDmg1": "Chaque tâche Quotidienne ou À Faire et chaque Habitude positive inflige des dommages au boss. Frappez plus fort avec des tâches plus rouges ou avec les sorts Frappe Brutale et Eplosion de Flammes. Le boss infligera des dommages à chacun des participants de la quête pour chaque Quotidienne que vous aurez manquée (multipliés par la Force du boss) en plus des dommages normaux. Alors protégez votre équipe en effectuant vos Quotidiennes! Tout dommage causé par vous et par le boss est pris en compte au cron (la réinitialisation de votre journée).", "bossDmg2": "Seuls les participants pourront combattre le boss et partager le butin de la quête.", "tavernBossInfo": "Pour blesser un boss mondial, complétez vos tâches Quotidiennes et À faire. Plus vous infligez de dommages à une tâche, plus vous en infligerez au boss en conséquence (tâches rouges, sorts de Mage, attaques de Guerrier, etc). Pour chaque Quotidienne que vous avez manqué (multiplié par la Force du boss), la barre de Rage du boss augmentera. Lorsque sa Rage atteindra son maximum, quelque chose de terrible arrivera, donc complétez vos Quotidiennes ! Tous les dommages infligés au boss et par lui seront pris en compte au cron (le passage d'une journée à l'autre).", "bossColl1": "Pour obtenir des objets, accomplissez vos tâches positives. Vous trouvez les objets de quêtes de la même façon que vous trouvez les objets normaux mais vous ne les verrez que le jour suivant. À ce moment, tous les objets de quêtes que vous aurez trouvés seront comptabilisés et s'ajouteront à la pile.", diff --git a/common/locales/fr/tasks.json b/common/locales/fr/tasks.json index 358cc652a4..7e7ca9d0b1 100644 --- a/common/locales/fr/tasks.json +++ b/common/locales/fr/tasks.json @@ -14,7 +14,7 @@ "save": "Enregistrer", "addChecklist": "Ajouter une Liste de vérification", "checklist": "Liste de vérification", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "Morcelez vos tâches! Les listes de vérification augmentent le gain d'Expérience et d'Or pour les tâches À Faire, et réduisent les dommages infligés par les Quotidiennes. ", "expandCollapse": "Développer/Réduire", "text": "Texte", "extraNotes": "Notes supplémentaires", @@ -22,7 +22,7 @@ "advancedOptions": "Options avancées", "difficulty": "Difficulté", "difficultyHelpTitle": "Quelle est la difficulté de cette tâche ?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "Plus une tâche est difficile, plus vous gagnez d'Expérience et d'Or lorsque vous la cochez... mais elle vous blesse d'autant plus si c'est une Quotidienne ou une Mauvaise Habitude!", "easy": "Facile", "medium": "Moyen", "hard": "Difficile", diff --git a/common/locales/he/backgrounds.json b/common/locales/he/backgrounds.json index 32b768095c..93556d690d 100644 --- a/common/locales/he/backgrounds.json +++ b/common/locales/he/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "אגם לנוף הרים", "backgroundMountainLakeNotes": "לשכשך רגליים באגם לנוף הרים", "backgroundPagodasText": "מקדש במזרח הרחוק", - "backgroundPagodasNotes": "לטפס לראש המקדש." + "backgroundPagodasNotes": "לטפס לראש המקדש.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/he/character.json b/common/locales/he/character.json index dfa73485de..fe881d4ed6 100644 --- a/common/locales/he/character.json +++ b/common/locales/he/character.json @@ -52,9 +52,11 @@ "costume": "תחפושת", "costumeText": "אם אתה מעדיף להיראות אחרת מהדרך בה ציידת את דמותך, סמן את האפשרות \"השתמש בתחפושת\" כדי לעטות תחפושת מגניבה ומטריפת חושים, בעוד שהציוד האמיתי שלך יישאר חבוי מתחתיה.", "useCostume": "שימוש בתחפושת", - "gearAchievement": "הרווחת את התג ״ציוד מקסימלי\" על השגת הציוד הטוב ביותר למקצוע שלך!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "ציוד מקסימלי", - "ultimGearText": "שדרג את נשקיו ושריונו לדרגה הגבוהה ביותר", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "דרגה", "levelUp": "עלית דרגה!", "mana": "מאנה", diff --git a/common/locales/he/content.json b/common/locales/he/content.json index a78720fee9..245af9d0b7 100644 --- a/common/locales/he/content.json +++ b/common/locales/he/content.json @@ -1,6 +1,10 @@ { "potionText": "שיקוי ריפוי", "potionNotes": "מרפא 15 נק\"פ (שימוש מיידי)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "זאב", "dropEggWolfAdjective": "נאמן", "dropEggTigerCubText": "גור נמרים", diff --git a/common/locales/hu/backgrounds.json b/common/locales/hu/backgrounds.json index 7cdab6e2f9..254e912dbc 100644 --- a/common/locales/hu/backgrounds.json +++ b/common/locales/hu/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Hegyi tó", "backgroundMountainLakeNotes": "Mártsd bele a lábujjad egy hegyi tóba", "backgroundPagodasText": "Pagodák", - "backgroundPagodasNotes": "Mássz fel a csúcsra a Pagodákig" + "backgroundPagodasNotes": "Mássz fel a csúcsra a Pagodákig", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/hu/challenge.json b/common/locales/hu/challenge.json index 0ecd9d9ebe..787e6938f8 100644 --- a/common/locales/hu/challenge.json +++ b/common/locales/hu/challenge.json @@ -16,7 +16,7 @@ "selectWinner": "Válassz győztest és zárd le a kihívást:", "deleteOrSelect": "Győztes törlése vagy kiválasztása", "endChallenge": "Kihívás befejezése", - "challengeDiscription": "These are the Challenge's tasks that will be added to your task dashboard when you join this Challenge. The sample Challenge tasks below will change color and gain graphs to show you the overall progress of the group.", + "challengeDiscription": "Ezek a kihívás feladatai, amik a feladataid közé kerülnek, amikor a kihíváshoz csatlakozol. Lent, a kihíváshoz tartozó feladatok színe meg fog változni és grafikonokat is kapnak, hogy láthasd az egész csoport teljesítményét.", "hows": "Hogy haladtok?", "filter": "Szűrő", "groups": "Csoportok", @@ -33,8 +33,8 @@ "challengeTagPop": "A kihívások cimkékben és tippekben jellennek meg, tehát kell egy bő és egy rövid leírás pl: \"Fogyj 10 kilót 3 hónap alatt\"-ból \"-10kg\" lesz (Kattints bővebb infókért).", "challengeDescr": "Leírás", "prize": "Jutalom", - "prizePop": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later.", - "prizePopTavern": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later and Tavern challenges will not be refunded if the challenge is cancelled.", + "prizePop": "Ha valaki meg tudja \"nyerni\" a kihívásodat, akkor opcionálisan ajándékozhatsz neki Drágakövet. Max = drágaköveid száma (+ céh drágaköveinek száma, ha te hoztad létre a kihívás céhét). Megjegyzés: A díjat nem tudod később megváltoztatni.", + "prizePopTavern": "Ha valaki meg tudja \"nyerni\" a kihívásodat, akkor opcionálisan ajándékozhatsz neki Drágakövet. Max = drágaköveid száma (+ céh drágaköveinek száma, ha te hoztad létre a kihívás céhét). Megjegyzés: A díjat nem tudod később megváltoztatni, és a Fogadós kihívások esetén akkor sem kapod vissza, ha a kihívást visszavonod.", "publicChallenges": "Legalább 1 Drágakő nyílvános kihívásoknak . Segít megakadályozni a spamelést (valóban segít).", "officialChallenge": "Hivatalos HabitRPG kihívás", "by": "által", @@ -44,7 +44,7 @@ "selectGroup": "Válassz csoportot", "challengeCreated": "Kihívás létrehozva", "sureDelCha": "Biztosan törlöd a kihívást?", - "sureDelChaTavern": "Delete challenge, are you sure? Your gems will not be refunded.", + "sureDelChaTavern": "Biztosan törlöd a kihívást? A drágaköveket nem kapod vissza.", "removeTasks": "Feladatok eltávolítása", "keepTasks": "Feladatok megtartása", "closeCha": "Kihívás bezárása és ...", diff --git a/common/locales/hu/character.json b/common/locales/hu/character.json index 258d7b06f9..7b707dca4f 100644 --- a/common/locales/hu/character.json +++ b/common/locales/hu/character.json @@ -52,9 +52,11 @@ "costume": "Ruha", "costumeText": "Ha tetszenek a ruhák, amiket hordasz, akkor pipáld ki a \"Ruha használata\" gombot, hogy felöltsd őket és a harci felszereléseid felett látszódjanak.", "useCostume": "Ruha használata", - "gearAchievement": "Elérted a \"Tökéletes harci felszerelés\" Kitűntetést, amiért a maximumra fejlesztetted a felszerelésedet.", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Tökéletes harci felszerelés", - "ultimGearText": "Már felfejlesztetted a maximálisra a fegyeredet és a páncéljaidat", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Szint", "levelUp": "Szintet léptél!", "mana": "Mana", diff --git a/common/locales/hu/content.json b/common/locales/hu/content.json index f14f57816f..3b90e71a62 100644 --- a/common/locales/hu/content.json +++ b/common/locales/hu/content.json @@ -1,6 +1,10 @@ { "potionText": "Gyógyital", "potionNotes": "Helyreállít 15 életerő pontot (azonnali használat)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Farkas", "dropEggWolfAdjective": "hűséges", "dropEggTigerCubText": "Tigriskölyök", diff --git a/common/locales/hu/front.json b/common/locales/hu/front.json index a779de52ce..59ec4293a1 100644 --- a/common/locales/hu/front.json +++ b/common/locales/hu/front.json @@ -34,48 +34,48 @@ "companyVideos": "Videók", "contribUse": "Eszközök, amiket a HabitRPG közreműködök használnak", "dragonsilverQuote": "El sem tudom mondani, mennyi idő- és folyamatmenedzsment rendszert próbáltam ki az elmúlt évtizedekben... A HRPG az egyetlen olyan, ami gyakorlatilag segít abban, hogy megcsináljam a dolgaim és ne csak felírjam őket ", - "dreimQuote": "When I discovered HabitRPG last summer, I had just failed about half of my exams. Thanks to the Dailies… I was able to organize and discipline myself, and I actually passed all my exams with really good grades a month ago.", + "dreimQuote": "Éppen megbuktam a vizsgáim felén tavaly nyáron, amikor felfedeztem a HabitRPG-t. Hála a Napi feladatoknak… sikerült összeszerveznem és fegyelmeznem magam, és gyakorlatilag minden vizsgámon nagyon jó jegyekkel mentem át.", "elmiQuote": "Minden reggel várom, hogy felkelhessek, hogy elkezdhessek aranyat gyűjteni!", "email": "Email", "emailNewPass": "Új jelszó kérése", - "evagantzQuote": "My very first dentist appointment where the hygienist was actually excited about my flossing habits. Thanks Habitrpg!", + "evagantzQuote": "A legelső fogorvosi látogatásom, ahol a fogászom gyakorlatilag izgatott volt a fogápolási szokásaim miatt. Köszi HabitRPG!", "examplesHeading": "Mire is használják a játékosok a HabitRPG-t...", "featureAchievementByline": "Valami állatit csináltál? Szerezz egy jelvényt és dicsekedj vele!", - "featureAchievementHeading": "Achievement Badges", - "featureEquipByline": "Buy limited edition equipment, potions, and other virtual goodies in our Market with your task rewards!", + "featureAchievementHeading": "Kitüntetések", + "featureEquipByline": "Vegyél magadnak a feladataid jutalmából korlátozott kiadású felszereléseket, italokat, és más virtuális cuccokat a Piacon.", "featureEquipHeading": "Felszerelés és extrák", - "featurePetByline": "Eggs and items drop when you complete your tasks. Be as productive as possible to collect pets and mounts!", + "featurePetByline": "Tojásokat és tárgyakat találhatsz, amikor teljesíted a feladataid. Légy a lehető legproduktívabb, hogy összegyűjtsd az állatokat és a hátasokat.", "featurePetHeading": "Állatok és hátasok", - "featureSocialByline": "Join common-interest groups with like-minded people. Create Challenges to compete against other users.", - "featureSocialHeading": "Social play", - "featuredIn": "Featured in", - "featuresHeading": "We also feature...", + "featureSocialByline": "Csatlakozz közös érdeklődésű csoportba hasonló gondolkodású emberekkel. Hozz létre kihívásokat, így versenyezhetsz másik felhasználókkal.", + "featureSocialHeading": "Közösségi élmény", + "featuredIn": "Megjelent", + "featuresHeading": "További lehetőségek...", "footerCommunity": "Közösség", "footerCompany": "Cég", "footerMobile": "Mobil", "footerSocial": "Közösség", "forgotPass": "Elfelejtettem a jelszavam", - "frabjabulousQuote": "HabitRPG is the reason I got a killer, high-paying job... and even more miraculous, I'm now a daily flosser!", + "frabjabulousQuote": "A HabitRPG az, amiért egy király, nagyon jól fizető állást kaptam... és ami még csodálatosabb, naponta használok fogselymet.", "free": "Játssz ingyen", - "gamifyButton": "Gamify your life today!", + "gamifyButton": "Tedd játékká az életed ma!", "goalSample1": "1 óra zongora gyakorlás", - "goalSample2": "Work on article for publication", - "goalSample3": "Work on blog post", + "goalSample2": "Egy cikk a publikálashoz", + "goalSample3": "Blog cikk írása", "goalSample4": "Japán lecke a Duolinguo-n", - "goalSample5": "Read an Informative Article", + "goalSample5": "Hasznos cikk elolvasása", "goals": "Célok", "health": "Egészség", "healthSample1": "Víz/Üdítő ivás", "healthSample2": "Rágózás/Dohányzás", "healthSample3": "Lépcsőzés/Liftezés", "healthSample4": "Egészséges étel/Gyorskaja", - "healthSample5": "Break a Sweat for 1 hr", + "healthSample5": "1 óra edzés", "history": "Előzmények", - "infhQuote": "HabitRPG has really helped me impart structure to my life in graduate school.", + "infhQuote": "HabitRPG tényleg segített szervezettséget vinni az egyetemi életembe.", "invalidEmail": "A jelszó resethez érvényes email cím szükséges.", - "irishfeet123Quote": "I've had horrible habits with clearing my place completely after meals and leaving cups all over the place. HabitRPG has cured that!", - "joinOthers": "Join 200,000 people making it fun to achieve goals!", - "kazuiQuote": "Before HabitRPG, I was stuck with my thesis, as well as dissatisfied with my personal discipline regarding housework and things like learning vocabulary and studying Go theory. It turns out breaking down these tasks into smaller manageable checklists is quite the thing to keep me motivated and constantly working.", + "irishfeet123Quote": "Szörnyű szokásom volt, hogy nem takarítottam el az étkezések után és mindenhol poharakat hagytam. HabitRPG megjavította ezt!", + "joinOthers": "Csatlakozz ahhoz a 200.000 emberhez, akik szórakozva érik el céljukat.", + "kazuiQuote": "A HabitRPG előtt megragadtam a diplomamunkámmal, ezenkívül elégedetlen voltam az olyan dolgokhoz való hozzáállásommal, mint a házimunka, a szótanulás vagy a Go elméletének tanulmányozása. Végül kiderült, hogy motivál és folyamatosan tudok dolgozni, hogyha ezeket a feladatokat kisebb, könnyen kezelhető listába rendezem.", "landingadminlink": "adminisztratív csomagunkat", "landingend": "Nem győzött még meg?", "landingend2": "Lásd részletesebb listánkat", @@ -89,7 +89,7 @@ "landingp3header": "Következmények", "landingp4": "A HabitRPG aktív közössége megadja azt az elszámolási kötelezettséget, ami segít neked a feladataidra fókuszálni. A csapat rendszerrel magaddal hozhatod a közeli barátaid csoportját, hogy segítsenek. A céh rendszer lehetővé teszi, hogy olyan embereket találj, akiknek hasonló az érdeklődése, vagy hasonló problémákkal küzdenek, így megoszthatjátok a céljaitokat és ötleteket cserélhettek a problémáitok megoldásához. A HabitRPG-n a közösség azt jelenti, hogy rendelkezésedre áll a támogatás és az elszámoltathatóság, ami ahhoz kell, hogy sikeres légy.", "landingp4header": "Elszámolási kötelezettség", - "leadText": "HabitRPG is a free habit building and productivity app that treats your real life like a game. With in-game rewards and punishments to motivate you and a strong social network to inspire you, HabitRPG can help you achieve your goals to become healthy, hard-working, and happy.", + "leadText": "A HabitRPG egy szokás kiépítő és termelékenységnövelő ingyenes alkalmazás, ami az életet játékként kezeli. Beépített jutalmakkal, büntetésekkel és erős közösségi hálózattal inspirálva, a HabitRPG segíteni tud neked elérni a céljaidat, hogy egészséges, szorgalmas és boldog legyél.", "login": "Belépés", "loginAndReg": "Belépés / Regisztráció", "loginFacebookAlt": "Belépés / Regisztráció Facebookal", @@ -120,8 +120,8 @@ "mobileAndroid": "Android", "mobileIOS": "iOS", "motivate": "Motiváld magad és a csapatod!", - "motivate1": "Motivate yourself to do anything.", - "motivate2": "Get Organized. Get Motivated. Get Gold.", + "motivate1": "Motiváld magad, hogy csinálj valamit.", + "motivate2": "Szerezz szervezettséget. Szerezz motivációt. Szerezz aranyat.", "passConfirm": "Jelszó megerősítése", "passMan": "Ha egy jelszó karbantartót használsz (mint az 1Password) és problémát okoz a belépés, akkor próbáld meg beírni a felhasználónevedet és a jelszavadat kézzel.", "password": "Jelszó", @@ -132,51 +132,51 @@ "presskitText": "Köszönjük érdeklődését a HabitRPG iránt! Amennyiben cikket ír vagy videót készít a HabitRPG-ről használja az alábbi képeket. További információkért kérjük lépjen kapcsolatba Siena Leeslie-vel a leslie@habitrpg.com címen. ", "privacy": "Adatvédelmi nyilatkozat", "psst": "Psszt", - "punishByline": "Break bad habits and procrastination cycles with immediate consequences.", + "punishByline": "Szakíts a rossz szokásokkal és halogatással azonnali következményekkel.", "punishHeading1": "Kihagytál egy napi feladatot?", "punishHeading2": "Veszíts életerőt!", - "questByline1": "Playing with your friends keeps you accountable for your tasks.", - "questByline2": "Issue each other Challenges to complete a goal together!", - "questHeading1": "Battle monsters with your friends!", - "questHeading2": "If you slack off, they all get hurt!", + "questByline1": "Ha barátokkal játszol felelős tudsz maradni a feladataidért.", + "questByline2": "Készítsetek kihívásokat egymásnak, hogy hamarabb elérjétek a céljaitokat.", + "questHeading1": "Harcolj szörnyek ellen a barátaiddal.", + "questHeading2": "Ha hanyag vagy, akkor mindenki megsérül.", "register": "Regisztráció", - "rewardByline1": "Spend gold on virtual and real-life rewards.", - "rewardByline2": "Instant rewards keep you motivated!", - "rewardHeading": "Complete a task to earn gold!", - "sampleDailies": "Sample Dailies", - "sampleHabits": "Sample Habits", - "sampleToDo": "Sample To-Dos", + "rewardByline1": "Költsd el az aranyat virtuális és valós jutalmakra.", + "rewardByline2": "Azonnali jutalmak motiválnak folyamatosan.", + "rewardHeading": "Teljesítsd a feladatod és szerezz aranyat!", + "sampleDailies": "Minta napi feladatok", + "sampleHabits": "Minta szokások", + "sampleToDo": "Minta Tennivalók", "school": "Iskola", - "schoolSample1": "Finish 1 Assignment", + "schoolSample1": "Befejezni 1 megbízást", "schoolSample2": "1 óra tanulás", - "schoolSample3": "Meet with Study Group", - "schoolSample4": "Notes for 1 Chapter", + "schoolSample3": "Találkozni a tanulócsoporttal", + "schoolSample4": "1 fejezetet kijegyzetelni", "schoolSample5": "1 fejezet elolvasása", - "sixteenBitFilQuote": "I'm getting my jobs and tasks done in record time thanks to HabitRPG. I'm just always so eager to reach my next level-up!", - "skysailorQuote": "My party and our quests keep me engaged in the game, which keeps me motivated to get things done and change my life in positive ways", + "sixteenBitFilQuote": "Rekord idő alatt végzek a munkámmal és a feladataimmal hála a HabitRPG-nel. Alig bírom kivárni, hogy újra szintet léphessek.", + "skysailorQuote": "A csoportom és a küldetésünk a játékban tartanak, ami motivál a feladataim elvégzésében és jó irányban változtatja meg az életem", "socialTitle": "HabitRPG | Játszd az életed", "supermouse35Quote": "Többet edzek és már hónapok óta nem felejtettem el bevenni a gyógyszereimet! Köszi, Habit. :D", "sync": "Szinkronizálás", "tasks": "Feladatok", - "teamSample1": "Outline Meeting Itinerary for Tuesday", + "teamSample1": "Megbeszélés vázlat előkészítése keddre", "teamSample2": "Brainstorm Growth Hacking", "teamSample3": "Heti KPI megbeszélése", - "teams": "Teams", + "teams": "Csoportok", "terms": "Általános Szerződési Feltételeket", "testimonialHeading": "Játékosok véleménye...", "tutorials": "Oktatóanyagok", "unlockByline1": "Érd el a céljaid és lépj szintet.", - "unlockByline2": "Unlock new motivational tools, such as pet collecting, random rewards, spell-casting, and more!", - "unlockHeadline": "As you stay productive, you unlock new content!", + "unlockByline2": "Oldj fel újabb motivációs eszközöket, mint például állat gyűjtés, véletlenszerű jutalmak, varázslás, és még sok más!", + "unlockHeadline": "Minél tovább maradsz produktív, annál több új tartalmat érhetsz el!", "useUUID": "Használj UUID / API Kulcs (Facebook felhasználóknak) párost", "username": "Felhasználónév", "watchVideos": "Nézz videókat", "work": "Munka", - "zelahQuote": "With HabitRPG, I can be persuaded to go to bed on time by the thought of gaining points for an early night or losing health for a late one!", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", - "generalQuestionsSite": "General Questions about the Site", - "businessInquiries": "Business Inquiries", - "merchandiseInquiries": "Merchandise Inquiries", - "marketingInquiries": "Marketing/Social Media Inquiries" + "zelahQuote": "A HabitRPG-vel, rá tudom venni magam, hogy időben menjek az ágyba; azzal az egyszerű gondolattal, hogy ha időben ágyba megyek, akkor pontot kapok, ha pedig későn, akkor életet vesztek.", + "reportAccountProblems": "Fiók problémák jelentése", + "reportCommunityIssues": "Közösségi problémák jelentése", + "generalQuestionsSite": "Általános kérdések az oldalról", + "businessInquiries": "Üzleti információk", + "merchandiseInquiries": "Termék információk", + "marketingInquiries": "Marketing/Közösségi média információk" } \ No newline at end of file diff --git a/common/locales/hu/gear.json b/common/locales/hu/gear.json index b8ddd1bc98..645802ab31 100644 --- a/common/locales/hu/gear.json +++ b/common/locales/hu/gear.json @@ -120,8 +120,8 @@ "weaponMystery201411Notes": "Szúrd le az ellenségeidet vagy túrj bele kedvenc eledeleidbe - ezzel a sokoldalú vasvillával mindent megtehetsz! Nem ad bónuszt. 2014 Novemberi előfizetői tárgy.", "weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth", "weaponMystery201502Notes": "For WINGS! For LOVE! For ALSO TRUTH! Confers no benefit. February 2015 Subscriber Item.", - "weaponMystery201505Text": "Green Knight Lance", - "weaponMystery201505Notes": "This green and silver lance has unseated many opponents from their mounts. Confers no benefit. May 2015 Subscriber Item.", + "weaponMystery201505Text": "Zöld lovagi lándzsa", + "weaponMystery201505Notes": "Ez a zöld-ezüst lándzsa sok lovagot ütött már ki a nyergéből. Nem ad semmi előnyt. 2015 májusi előfizetői tárgy", "weaponMystery301404Text": "Steampunk sétabot", "weaponMystery301404Notes": "Kiváló arra, hogy tegyél egy sétát a városban vele. 3015 Márciusi előfizetői tárgy. Nem ad bónuszt.", "armor": "páncél", @@ -346,7 +346,7 @@ "headSpecialWinter2015MageNotes": "E sapka anyaga változik és világít amikor a viselője tanul. Növeli az észlelésedet <%= per %> ponttal. Korlátozott Példányszámú 2014-2015-ös Téli felszerelés!", "headSpecialWinter2015HealerText": "Körülölelő Fülvédő", "headSpecialWinter2015HealerNotes": "Ezek a meleg fülvédők megvédenek a hidegrázástól és a zavaró hangoktól. Növeli az intelligenciát <%= int %> ponttal. Korlátozott Példányszámú 2014-2015-ös Téli felszerelés.", - "headSpecialSpring2015RogueText": "Fireproof Helm", + "headSpecialSpring2015RogueText": "Tűzálló sisak", "headSpecialSpring2015RogueNotes": "Fire? HAH! You squeak fiercely in the face of fire! Increases Perception by <%= per %>. Limited Edition 2015 Spring Gear.", "headSpecialSpring2015WarriorText": "Beware Helm", "headSpecialSpring2015WarriorNotes": "Beware the Helm! Only a fierce doggy can wear it. Stop laughing. Increases Strength by <%= str %>. Limited Edition 2015 Spring Gear.", @@ -372,8 +372,8 @@ "headMystery201412Notes": "Na ki a pingvin? Nem ad bónuszt. 2014 decemberi előfizetői tárgy.", "headMystery201501Text": "Csillagos Sisak", "headMystery201501Notes": "A csillagképek hunyorognak és kavarognak ebben a sisakban, fókuszálva a viselő gondolatait. Nem ad semmi előnyt. 2015 januári előfizetői tárgy.", - "headMystery201505Text": "Green Knight Helm", - "headMystery201505Notes": "The green plume on this iron helm waves proudly. Confers no benefit. May 2015 Subscriber Item.", + "headMystery201505Text": "Zöld lovag sisak", + "headMystery201505Notes": "A zöld tollazat büszkén hullámzik ezen a vas sisakon. Nem ad semmi előnyt. 2015 májusi előfizetői tárgy", "headMystery301404Text": "Elegáns Cilinder", "headMystery301404Notes": "Egy elegáns cilinder a legnemesebb előkelőségeknek! 3015 januári előfizetői tárgy. Nem ad semmi előnyt.", "headMystery301405Text": "Egyszerű Cilinder", @@ -470,8 +470,8 @@ "bodySpecialSummerHealerText": "Korall nyaklánc", "bodySpecialSummerHealerNotes": "Stílusos nyaklánc élő korallból. Nem ad bónuszt. Korlátozott Példányszámú 2014 Nyári Felszerelés.", "headAccessory": "head accessory", - "accessories": "Accessories", - "animalEars": "Animal Ears", + "accessories": "Kiegészítők", + "animalEars": "Állat fülek", "headAccessoryBase0Text": "Nincs fej kiegészítő", "headAccessoryBase0Notes": "Nincs fej kiegészítő.", "headAccessorySpecialSpringRogueText": "Lila macskafülek", @@ -482,11 +482,11 @@ "headAccessorySpecialSpringMageNotes": "Ezek a kerek egérfülek pihepuhák. Nem ad bónuszt. Korlátozott példányszámú 2014-es Tavaszi Felszerelés.", "headAccessorySpecialSpringHealerText": "Sárga kutya fülek", "headAccessorySpecialSpringHealerNotes": "Lecsüngenek, de cukik. Akarsz játszani? Nem ad bónuszt. Korlátozott példányszámú 2014-es Tavaszi Felszerelés.", - "headAccessorySpecialSpring2015RogueText": "Yellow Mouse Ears", + "headAccessorySpecialSpring2015RogueText": "Sárga egér fülek", "headAccessorySpecialSpring2015RogueNotes": "These ears steel themselves against the sound of explosions. Confers no benefit. Limited Edition 2015 Spring Gear.", - "headAccessorySpecialSpring2015WarriorText": "Purple Dog Ears", + "headAccessorySpecialSpring2015WarriorText": "Lila kutya fülek", "headAccessorySpecialSpring2015WarriorNotes": "They are purple. They are dog ears. Do not waste your time with further foolishness. Confers no benefit. Limited Edition 2015 Spring Gear.", - "headAccessorySpecialSpring2015MageText": "Blue Bunny Ears", + "headAccessorySpecialSpring2015MageText": "Kék nyuszifülek", "headAccessorySpecialSpring2015MageNotes": "These ears listen keenly, in case somewhere a magician is revealing secrets. Confers no benefit. Limited Edition 2015 Spring Gear.", "headAccessorySpecialSpring2015HealerText": "Green Kitty Ears", "headAccessorySpecialSpring2015HealerNotes": "These cute kitty ears will make others green with envy. Confers no benefit. Limited Edition 2015 Spring Gear.", diff --git a/common/locales/hu/settings.json b/common/locales/hu/settings.json index 4e2b9773ac..3d4126a673 100644 --- a/common/locales/hu/settings.json +++ b/common/locales/hu/settings.json @@ -98,7 +98,7 @@ "invitedParty": "Meghívva egy csapatba", "invitedGuild": "Meghívva egy céhbe", "inactivityEmails": "A fiókod inaktiv", - "weeklyRecaps": "Summaries of your account activity in the past week", + "weeklyRecaps": "Összefoglaló az elmúlt heti fiók aktivitásodról", "questStarted": "A küldetésed elkezdődött", "invitedQuest": "Meghívva egy küldetésre", "kickedGroup": "Kirúgtak a csoportból", @@ -113,10 +113,10 @@ "benefits": "Előnyök", "coupon": "Kupon", "couponPlaceholder": "Írd be a Kupon kódodat", - "couponText": "We sometimes have events and give out promo codes for special gear. (eg, those who stop by our Wondercon booth)", + "couponText": "Néha eseményeket tartunk és promóciós kódokat adunk különleges felszerelésekért (például azoknak, akik megállnak a standunknál a Wondercon-on)", "apply": "Alkalmaz", - "resubscribe": "Resubscribe", + "resubscribe": "Újra feliratkozás", "promoCode": "Promóciós kód", "promoCodeApplied": "Promóciós kód elfogadva! Ellenőrizd le a tárgylistád", - "promoPlaceholder": "Enter Promotion Code" + "promoPlaceholder": "Írd be a Promóciós kódodat" } \ No newline at end of file diff --git a/common/locales/it/backgrounds.json b/common/locales/it/backgrounds.json index 6afba0fd6a..8de55d6221 100644 --- a/common/locales/it/backgrounds.json +++ b/common/locales/it/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Lago di montagna", "backgroundMountainLakeNotes": "Immergi i tuoi piedi in un lago montano.", "backgroundPagodasText": "Pagode", - "backgroundPagodasNotes": "Arrampicati sulla cima delle pagode." + "backgroundPagodasNotes": "Arrampicati sulla cima delle pagode.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/it/challenge.json b/common/locales/it/challenge.json index 877e98595e..bcd1db6cd5 100644 --- a/common/locales/it/challenge.json +++ b/common/locales/it/challenge.json @@ -16,7 +16,7 @@ "selectWinner": "Scegli un vincitore e chiudi la sfida:", "deleteOrSelect": "Elimina o scegli il vincitore", "endChallenge": "Fine Sfida", - "challengeDiscription": "These are the Challenge's tasks that will be added to your task dashboard when you join this Challenge. The sample Challenge tasks below will change color and gain graphs to show you the overall progress of the group.", + "challengeDiscription": "Queste sono le attività della Sfida che verranno aggiunte alla tua pagina delle attività quando parteciperai a questa Sfida. Le attività esempio della Sfida qui sotto cambieranno colore e appariranno dei grafici per mostrarti il progresso complessivo del gruppo.", "hows": "Come se la cavano gli altri?", "filter": "Filtro", "groups": "Gruppi", @@ -33,8 +33,8 @@ "challengeTagPop": "Le sfide compaiono nelle liste dei tag (etichette), quindi oltre al titolo descrittivo avrai bisogno anche di un nome breve e facilmente riconoscibile. Per esempio, 'Perdi 10 kg in 3 mesi' potrebbe diventare '-10kg' (Clicca il '?' per saperne di più).", "challengeDescr": "Descrizione", "prize": "Premio", - "prizePop": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later.", - "prizePopTavern": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later and Tavern challenges will not be refunded if the challenge is cancelled.", + "prizePop": "Se qualcuno può 'vincere' questa sfida, hai l'opzione di ricompensarlo con un premio in Gemme. Il premio massimo equivale al numero di gemme che possiedi (+ le gemme della gilda, se sei tu il creatore della gilda di questa sfida). Nota: Questo premio non potrà essere successivamente modificato.", + "prizePopTavern": "Se qualcuno può 'vincere' questa sfida, hai l'opzione di ricompensarlo con un premio in Gemme. Il premio massimo equivale al numero di gemme che possiedi (+ le gemme della gilda, se sei tu il creatore della gilda di questa sfida). Nota: Questo premio non potrà essere successivamente modificato e le sfide della Taverna non verranno rimborsate in caso siano cancellate.", "publicChallenges": "Serve un minimo di 1 Gemma per le sfide pubbliche (aiuta a prevenire lo spam, lo fa davvero).", "officialChallenge": "Sfida Ufficiale HabitRPG", "by": "di ", @@ -44,7 +44,7 @@ "selectGroup": "Seleziona un gruppo", "challengeCreated": "Sfida creata", "sureDelCha": "Vuoi davvero eliminare questa sfida?", - "sureDelChaTavern": "Delete challenge, are you sure? Your gems will not be refunded.", + "sureDelChaTavern": "Sei sicuro di voler cancellare questa sfida? Le tue gemme non verranno rimborsate.", "removeTasks": "Rimuovi attività", "keepTasks": "Tieni attività", "closeCha": "Chiudi sfida e...", diff --git a/common/locales/it/character.json b/common/locales/it/character.json index aba4183015..d61c33c6a7 100644 --- a/common/locales/it/character.json +++ b/common/locales/it/character.json @@ -52,9 +52,11 @@ "costume": "Costume", "costumeText": "Se preferisci il look di oggetti diversi da quelli equipaggiati, metti una spunta su \"Usa costume\" per visualizzare un costume anzichè l'equipaggiamento da battaglia (nonostante il cambio di aspetto, rimangono tutti i bonus delle armi e delle armature).", "useCostume": "Usa costume ", - "gearAchievement": "Hai ottenuto il Trofeo \"Armato Fino Ai Denti\" per aver potenziato al massimo livello il tuo equipaggiamento!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Armato Fino Ai Denti", - "ultimGearText": "Ha potenziato al massimo l'arma e il set dell'armatura", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Livello", "levelUp": "Livello aumentato!", "mana": "Mana", diff --git a/common/locales/it/content.json b/common/locales/it/content.json index 66b652afe5..995fd70400 100644 --- a/common/locales/it/content.json +++ b/common/locales/it/content.json @@ -1,6 +1,10 @@ { "potionText": "Pozione di Salute", "potionNotes": "Ripristina 15 punti Salute (utilizzo immediato)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Lupo", "dropEggWolfAdjective": "un leale", "dropEggTigerCubText": "Cucciolo di Tigre", diff --git a/common/locales/it/front.json b/common/locales/it/front.json index 3631e5c18a..247e2e91d2 100644 --- a/common/locales/it/front.json +++ b/common/locales/it/front.json @@ -173,10 +173,10 @@ "watchVideos": "Guarda i video", "work": "Lavoro", "zelahQuote": "Con HabitRPG riesco a persuadermi ad andare a letto in tempo con il pensiero di guadagnare punti per essere andata a dormire presto o perdere salute per esserci andata tardi!", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", - "generalQuestionsSite": "General Questions about the Site", - "businessInquiries": "Business Inquiries", - "merchandiseInquiries": "Merchandise Inquiries", - "marketingInquiries": "Marketing/Social Media Inquiries" + "reportAccountProblems": "Segnala un problema con l'Account", + "reportCommunityIssues": "Segnala un problema con la Community", + "generalQuestionsSite": "Domande generiche sul Sito", + "businessInquiries": "Informazioni sul Business", + "merchandiseInquiries": "Informazioni sui Prodotti", + "marketingInquiries": "Informazioni su Marketing e Social Media" } \ No newline at end of file diff --git a/common/locales/it/gear.json b/common/locales/it/gear.json index 06adeb3034..e19b3568b8 100644 --- a/common/locales/it/gear.json +++ b/common/locales/it/gear.json @@ -120,8 +120,8 @@ "weaponMystery201411Notes": "Infilza i tuoi nemici o inforca i tuoi cibi preferiti - questo versatile forcone può fare di tutto! Non conferisce alcun bonus. Oggetto per abbonati, novembre 2014.", "weaponMystery201502Text": "Scintillante Scettro Alato dell'Amore e anche della Verità", "weaponMystery201502Notes": "Per le ALI! Per l'AMORE! E anche per la VERITA'! Non conferisce alcun bonus. Oggetto per abbonati, febbraio 2015.", - "weaponMystery201505Text": "Green Knight Lance", - "weaponMystery201505Notes": "This green and silver lance has unseated many opponents from their mounts. Confers no benefit. May 2015 Subscriber Item.", + "weaponMystery201505Text": "Lancia del Cavaliere Verde", + "weaponMystery201505Notes": "Questa lancia verde e argento ha disarcionato molti avversari dai propri destrieri. Non conferisce alcun bonus. Oggetto per abbonati: maggio 2015.", "weaponMystery301404Text": "Bastone Steampunk", "weaponMystery301404Notes": "Eccellente per fare un giro in città. Oggetto per abbonati, marzo 3015. Non conferisce alcun bonus.", "armor": "armatura", @@ -372,8 +372,8 @@ "headMystery201412Notes": "Chi è questo pinguino? Non conferisce alcun bonus. Oggetto per abbonati, dicembre 2014.", "headMystery201501Text": "Elmo Stellato", "headMystery201501Notes": "Le costellazioni brillano in questo elmo, guidando i pensieri di chi lo indossa verso la concentrazione. Non conferisce alcun bonus. Oggetto per abbonati, gennaio 2015.", - "headMystery201505Text": "Green Knight Helm", - "headMystery201505Notes": "The green plume on this iron helm waves proudly. Confers no benefit. May 2015 Subscriber Item.", + "headMystery201505Text": "Elmo del Cavaliere Verde", + "headMystery201505Notes": "La verde piuma su questo elmo di ferro sventola con orgoglio. Non conferisce alcun bonus. Oggetto per abbonati: maggio 2015.", "headMystery301404Text": "Cilindro Elegante", "headMystery301404Notes": "Un cilindro per i più fini gentiluomini! Oggetto per abbonati, gennaio 3015. Non conferisce alcun bonus.", "headMystery301405Text": "Cilindro Base", diff --git a/common/locales/it/generic.json b/common/locales/it/generic.json index 84704626a7..8d9231e87e 100644 --- a/common/locales/it/generic.json +++ b/common/locales/it/generic.json @@ -5,20 +5,20 @@ "habitica": "Habitica", "expandToolbar": "Mostra barra", "collapseToolbar": "Nascondi barra", - "markdownBlurb": "HabitRPG uses markdown for message formatting. See the Markdown Cheat Sheet for more info.", - "showFormattingHelp": "Show formatting help", - "hideFormattingHelp": "Hide formatting help", - "youType": "You type:", - "youSee": "You see:", - "italics": "*Italics*", - "bold": "**Bold**", - "strikethrough": "~~Strikethrough~~", + "markdownBlurb": "HabitRPG usa il metodo di formattazione markdown. Consulta la Tabella riassuntiva del markdown per maggiori informazioni.", + "showFormattingHelp": "Mostra guida per la formattazione", + "hideFormattingHelp": "Nascondi guida per la formattazione", + "youType": "Digiti:", + "youSee": "Vedi:", + "italics": "*Corsivo*", + "bold": "**Grassetto**", + "strikethrough": "~~Sbarrato~~", "emojiExample": ":smile:", - "markdownLinkEx": "[HabitRPG is great!](https://habitrpg.com)", - "markdownImageEx": "![mandatory alt text](https://habitrpg.com/cake.png \"optional mouseover title\")", - "unorderedListHTML": "+ First item
+ Second item
+ Third item", - "unorderedListMarkdown": "+ First item\n+ Second item\n+ Third item", - "code": "`code`", + "markdownLinkEx": "[HabitRPG è fantastico!](https://habitrpg.com)", + "markdownImageEx": "![testo alt obbligatorio](https://habitrpg.com/cake.png \"titolo facoltativo al passaggio del mouse\")", + "unorderedListHTML": "+ Primo elemento
+ Secondo elemento
+ Terzo elemento", + "unorderedListMarkdown": "+ Primo elemento\n+ Secondo elemento\n+ Terzo elemento", + "code": "`codice`", "achievements": "Trofei", "modalAchievement": "Trofeo!", "special": "Speciale", diff --git a/common/locales/it/groups.json b/common/locales/it/groups.json index 98f9dbcac0..3b4a371c39 100644 --- a/common/locales/it/groups.json +++ b/common/locales/it/groups.json @@ -110,11 +110,11 @@ "byColon": "Da:", "inviteNewUsers": "Invita nuovi utenti", "inviteAlertInfo2": "Oppure condividi questo link (copia/incolla):", - "sendGiftHeading": "Send Gift to <%= name %>", - "sendGiftGemsBalance": "From <%= number %> Gems", - "sendGiftCost": "Total: $<%= cost %> USD", - "sendGiftFromBalance": "From Balance", - "sendGiftPurchase": "Purchase", - "sendGiftMessagePlaceholder": "Personal message (optional)", - "sendGiftSubscription": "<%= months %> Month(s): $<%= price %>" + "sendGiftHeading": "Invia Regalo a <%= name %>", + "sendGiftGemsBalance": "Da <%= number %> Gemme", + "sendGiftCost": "Totale: $<%= cost %> USD", + "sendGiftFromBalance": "Dal Bilancio", + "sendGiftPurchase": "Acquisto", + "sendGiftMessagePlaceholder": "Messaggio personale (facoltativo)", + "sendGiftSubscription": "<%= months %> Mese(/i): $<%= price %>" } \ No newline at end of file diff --git a/common/locales/it/npc.json b/common/locales/it/npc.json index 291614183f..5260884f1d 100644 --- a/common/locales/it/npc.json +++ b/common/locales/it/npc.json @@ -2,8 +2,8 @@ "npc": "NPC", "npcText": "Ha contribuito al progetto Kickstarter al massimo livello!", "mattBoch": "Matt Boch", - "mattShall": "Shall I bring you your steed, <%= name %>? Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!", - "mattBochText1": "Welcome to the Stable! I'm Matt, the beast master. After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "mattShall": "Devo portarti il tuo destriero, <%= name %>? Una volta che avrai dato abbastanza cibo al tuo animale da trasformarlo in una cavalcatura, apparirà qui. Fai click su una cavalcatura per montare in sella!", + "mattBochText1": "Benvenuto alla Scuderia! Io sono Matt, il domatore. Dopo il livello 4, puoi far nascere degli animali utilizzando uova e pozioni. Quando fai schiudere un uovo nel Mercato, apparirà qui! Fai click sull'immagine di un animale per aggiungerlo al tuo avatar. Dagli da mangiare il cibo che troverai dopo il livello 4, e crescerà fino a diventare una potente cavalcatura!", "daniel": "Daniel", "danielText": "Benvenuto nella Taverna! Resta per un po' e incontra la gente del posto. Se hai bisogno di riposare (vacanza? malattia?), ti sistemerò nella Locanda. Mentre riposi, le tue Daily non ti danneggeranno alla fine del giorno, ma potrai comunque spuntarle.", "danielText2": "Fai attenzione: se stai partecipando ad una missione Boss, il boss ti danneggerà comunque per le Daily non completate dei tuoi compagni di squadra! Inoltre, il tuo danno al Boss (o la raccolta di oggetti) non avrà effetto finchè non lasci la Locanda.", @@ -45,9 +45,9 @@ "tourScrollDown": "Assicurati di scorrere la pagina fino alla fine per vedere tutte le opzioni! Fai di nuovo click sul tuo avatar per tornare alla pagina delle attività.", "tourMuchMore": "Quando hai finito con le attività, puoi creare una Squadra insieme ai tuoi amici, chattare nelle Gilde di interessi comuni, partecipare alle Sfide, e tanto altro ancora!", "tourStatsPage": "Questa è la pagina delle tue Statistiche! Guadagna delle medaglie compiendo le azioni elencate.", - "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", + "tourTavernPage": "Benvenuto alla Taverna, una chat pubblica per tutte le età! Puoi fare in modo che le tue Daily non ti danneggino in caso di malattia o di viaggio facendo click su \"Riposa nella Locanda\". Vieni a farci un saluto!", "tourPartyPage": "La tua Squadra ti aiuterà a restare in riga. Invita degli amici per sbloccare una Pergamena!", "tourGuildsPage": "Le Gilde sono gruppi con interessi comuni. Cerca gli argomenti che più ti piacciono! Se conosci l'inglese, ti raccomandiamo la gilda \"The Newbies\".", - "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", + "tourChallengesPage": "Le Sfide sono delle liste di attività a tema create dagli utenti! Quando ti unisci ad una sfida le sue attività verranno aggiunte al tuo account. Competi con gli altri utenti per vincere premi in gemme!", "tourMarketPage": "A partire dal livello 4, potrai ricevere dei \"drop\" casuali di uova e pozioni di schiusura quando completi le tue attività. Appariranno qui - usale per far nascere degli animali! Puoi anche comprare degli oggetti nel Mercato." } \ No newline at end of file diff --git a/common/locales/it/quests.json b/common/locales/it/quests.json index d4dadefba2..79cf486f11 100644 --- a/common/locales/it/quests.json +++ b/common/locales/it/quests.json @@ -19,7 +19,7 @@ "bossStrength": "Forza del Boss", "collect": "Raccogli", "collected": "Collezionati", - "bossDmg1": "Each completed Daily and To-Do and each positive Habit hurts the boss. Hurt it more with redder tasks or Brutal Smash and Burst of Flames. The boss will deal damage to every quest participant for every Daily you've missed (multiplied by the boss's Strength) in addition to your regular damage, so keep your party healthy by completing your Dailies! All damage to and from a boss is tallied on cron (your day roll-over).", + "bossDmg1": "Ogni Daily e To-Do completata e ogni Habit positivo danneggiano il boss. Puoi fare danni maggiori con le attività più rosse, con Attacco Brutale e con Fiammata. I boss danneggeranno ogni partecipante per le Daily mancate (moltiplicate per la Forza del boss) oltre al loro normale danno, quindi tieni in forze la tua squadra completando le tue Daily! I danni inflitti e ricevuti dal boss sono calcolati al cambio di giorno (all'ora da te impostata).", "bossDmg2": "Solo i partecipanti potranno combattere il boss e condividere il bottino della missione.", "tavernBossInfo": "Per ferire un boss mondiale, completa le tue Daily e i tuoi To-Do. Maggiore è il valore dell'attività, maggiore sarà il danno inflitto al boss (attività di colore rosso, gli incantesimi dei Maghi, gli attacchi dei Guerrieri, ecc.). La Furia del boss aumenterà per ogni Daily incompleta (moltiplicate per la Forza del boss). Quando la Furia raggiunge il massimo, accadrà qualcosa di davvero brutto - quindi completa le tue Daily! Tutto il danno inflitto e ricevuto da un boss viene calcolato al cambio di giorno (che avviene all'ora da te scelta nelle impostazioni).", "bossColl1": "Per ottenere gli oggetti, completa delle attività positive. Gli oggetti delle missioni compaiono come quelli normali; non li vedrai però fino al giorno dopo, quando tutto quello che hai trovato verrà raccolto e aggiunto agli oggetti già trovati.", diff --git a/common/locales/it/tasks.json b/common/locales/it/tasks.json index 57e6078652..f693498a6a 100644 --- a/common/locales/it/tasks.json +++ b/common/locales/it/tasks.json @@ -14,7 +14,7 @@ "save": "Salva", "addChecklist": "Aggiungi Checklist", "checklist": "Checklist", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "Dividi un'attività in parti più piccole! Le checklist aumentano la quantità di Esperienza e Oro guadagnati da una To-Do, e riducono il danno causato da una Daily.", "expandCollapse": "Espandi/Comprimi", "text": "Testo", "extraNotes": "Note", @@ -22,7 +22,7 @@ "advancedOptions": "Avanzate", "difficulty": "Difficoltà", "difficultyHelpTitle": "Quanto è difficile questa attività?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "Più è difficile un'attività, più Esperienza e Oro ti darà quando la completi... Ma ti danneggerà di più se è una Daily o un Habit Negativo!", "easy": "Facile", "medium": "Medio", "hard": "Difficile", diff --git a/common/locales/ja/backgrounds.json b/common/locales/ja/backgrounds.json index 014774d492..682c2b7991 100644 --- a/common/locales/ja/backgrounds.json +++ b/common/locales/ja/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "山の湖", "backgroundMountainLakeNotes": "慎重に山の湖につま先を浸す", "backgroundPagodasText": "仏塔", - "backgroundPagodasNotes": "仏塔の頂上に登る" + "backgroundPagodasNotes": "仏塔の頂上に登る", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/ja/challenge.json b/common/locales/ja/challenge.json index 34f3b150a2..11cd6b9c0b 100644 --- a/common/locales/ja/challenge.json +++ b/common/locales/ja/challenge.json @@ -16,7 +16,7 @@ "selectWinner": "優勝者を選び、チャレンジを終了する", "deleteOrSelect": "消すか優勝者を選ぶ", "endChallenge": "チャレンジを終了する", - "challengeDiscription": "These are the Challenge's tasks that will be added to your task dashboard when you join this Challenge. The sample Challenge tasks below will change color and gain graphs to show you the overall progress of the group.", + "challengeDiscription": "これはチャレンジのタスクです。ユーザーが参加すると色が変わり、グループの進行過程を示すグラフが提示されます。", "hows": "みんな元気かい?", "filter": "フィルター", "groups": "グループ", diff --git a/common/locales/ja/character.json b/common/locales/ja/character.json index 84dd1e76ff..1e3f19f65e 100644 --- a/common/locales/ja/character.json +++ b/common/locales/ja/character.json @@ -52,9 +52,11 @@ "costume": "衣装", "costumeText": "もし装備中のギアより他のギアがお好みでしたら、「衣装をつける」のボックスをチェックしてください。そうすると、バトルギアを下に見えながら衣装だけが表れます。", "useCostume": "衣装をつける", - "gearAchievement": "おめでとうございます!最高級のギアセットにアップグレードして「アルティメットギア」を獲得しました!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "アルティメットギア", - "ultimGearText": "さんは最高級の武器と鎧セットにアップグレードしました!", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "レベル", "levelUp": "レベルアップ!", "mana": "MP", diff --git a/common/locales/ja/content.json b/common/locales/ja/content.json index dd76c82725..6b18047217 100644 --- a/common/locales/ja/content.json +++ b/common/locales/ja/content.json @@ -1,6 +1,10 @@ { "potionText": "体力回復ポーション", "potionNotes": "体力を15回復(瞬時)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "狼", "dropEggWolfAdjective": "忠実な", "dropEggTigerCubText": "トラの子", diff --git a/common/locales/ja/front.json b/common/locales/ja/front.json index 9ae26018e4..c1422777f2 100644 --- a/common/locales/ja/front.json +++ b/common/locales/ja/front.json @@ -173,8 +173,8 @@ "watchVideos": "ビデオを見る", "work": "Work", "zelahQuote": "With HabitRPG, I can be persuaded to go to bed on time by the thought of gaining points for an early night or losing health for a late one!", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", + "reportAccountProblems": "アカウントの問題を報告する", + "reportCommunityIssues": "コミュニティの問題を報告する", "generalQuestionsSite": "General Questions about the Site", "businessInquiries": "Business Inquiries", "merchandiseInquiries": "Merchandise Inquiries", diff --git a/common/locales/ja/generic.json b/common/locales/ja/generic.json index 5547ae3914..7a26571bc5 100644 --- a/common/locales/ja/generic.json +++ b/common/locales/ja/generic.json @@ -10,9 +10,9 @@ "hideFormattingHelp": "Hide formatting help", "youType": "You type:", "youSee": "You see:", - "italics": "*Italics*", - "bold": "**Bold**", - "strikethrough": "~~Strikethrough~~", + "italics": "*イタリック体*", + "bold": "**太字**", + "strikethrough": "~~取り消し線~~", "emojiExample": ":smile:", "markdownLinkEx": "[HabitRPG is great!](https://habitrpg.com)", "markdownImageEx": "![mandatory alt text](https://habitrpg.com/cake.png \"optional mouseover title\")", diff --git a/common/locales/ja/npc.json b/common/locales/ja/npc.json index da750f6a94..14efec95c2 100644 --- a/common/locales/ja/npc.json +++ b/common/locales/ja/npc.json @@ -2,8 +2,8 @@ "npc": "NPC", "npcText": "最大のレベルで Kickstarterプロジェクトを後援する!", "mattBoch": "マット・バック", - "mattShall": "Shall I bring you your steed, <%= name %>? Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!", - "mattBochText1": "Welcome to the Stable! I'm Matt, the beast master. After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "mattShall": "マウントを連れてきましょか、<%= name %>?ペットに十分なエサを与えたら、そのペットはマウントになって、ここに現れます。マウントをクリックして乗ってみたらどうですか?", + "mattBochText1": "ステーブルへようこそ!私はマット、獣のマスターだよ。レベルが4になったら、タマゴとポーションを使って、ペットを孵化させることができる。ペットをクリックして、アバターを飾ることもできる。エサを与えれば、強いマウントになるだろう。", "daniel": "ダニエル", "danielText": "酒場へようこそ!しばらく滞在して、地元の人と会いましょう。あなたに休息が必要な場合 (休暇? 病気?)、私が宿であなたを元気にします。チェックインしている間、あなたの日課は未実施でも一日の終わりにあなたを傷つけませんが、印を付けて実施済みにできます。", "danielText2": "注意してください: あなたがボスの冒険に参加している場合は、あなたのパーティーの仲間が日課を逃したことで、ボスはまだあなたを傷つけます! また、あなたがボスに与えるダメージ(もしくは集めたアイテム)は宿をチェックアウトするまでt適用されません。", @@ -45,9 +45,9 @@ "tourScrollDown": "必ず一番下までスクロールして全てのオプションを見よう!アバターをもう一度クリックしてタスクページに戻ろう。", "tourMuchMore": "タスクを実行したら、友達とパーティーを組んだり、共通の趣味のギルドでチャットしたり、チャレンジに参加できたり、他にもできます!", "tourStatsPage": "これはあなたのステータスページです!タスクを完了して実績を受け取りましょう。", - "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", + "tourTavernPage": "全年齢大正のチャットルームである酒場へようこそ!病気や旅行の場合には「宿で休む」をクリックすることで日課をしなくても痛い目に遭わなくてすみますよ。挨拶してみてください!", "tourPartyPage": "パーティーはあなたが責任を果たす事を助けてくれるでしょう。友達を招待してクエストスクロールをアンロックしましょう!", "tourGuildsPage": "ギルドは共通のテーマを持つ社会的グループです。興味のある件名で検索しましょう!我々は初心者ギルドをおすすめします。", - "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", + "tourChallengesPage": "チャレンジはユーザーが作ったテーマのあるタスクリストです!チャレンジへ参加するとあなたのアカウントにタスクが追加されます。他のユーザーと競争して賞品のジェムを勝ち取りましょう!", "tourMarketPage": "レベル4の始めから、タスクを完了するとたまごと孵化ポーションがランダムにドロップします。それらはここに表示され、ペットを孵化するのに使いましょう!市場でアイテムを買う事もできます。" } \ No newline at end of file diff --git a/common/locales/ja/spells.json b/common/locales/ja/spells.json index e4b0116cbd..c5bc77d571 100644 --- a/common/locales/ja/spells.json +++ b/common/locales/ja/spells.json @@ -26,7 +26,7 @@ "spellHealerHealText": "ヒール", "spellHealerHealNotes": "Light covers your body, healing your wounds. You regain health! (Based on: CON and INT)", "spellHealerBrightnessText": "焼けるように輝度", - "spellHealerBrightnessNotes": "A burst of light dazzles your tasks. They become more blue and less red! (Based on: INT)", + "spellHealerBrightnessNotes": "あなたはすべてのタスクを隠す光のバーストを投げかけます。あなたのタスクの赤みが軽減されます。(知性に基づく)", "spellHealerProtectAuraText": "防護のオーラ", "spellHealerProtectAuraNotes": "You shield your party from damage. Your whole party gains a buff to Constitution! (Based on: Unbuffed CON)", "spellHealerHealAllText": "恵み", diff --git a/common/locales/ja/tasks.json b/common/locales/ja/tasks.json index 2c823e9ba6..3df9805e3e 100644 --- a/common/locales/ja/tasks.json +++ b/common/locales/ja/tasks.json @@ -14,7 +14,7 @@ "save": "保存", "addChecklist": "チェックリストを追加", "checklist": "チェックリスト", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "タスクをより小さく分割しよう! チェックリストはToDoリストから得られる経験値とゴールドを増加し、日課を実行しなかった場合のダメージを減少させます。", "expandCollapse": "展開する/折り畳む", "text": "テキスト", "extraNotes": "追記", @@ -22,7 +22,7 @@ "advancedOptions": "拡張オプション", "difficulty": "難易度", "difficultyHelpTitle": "このタスクはどれくらい難しいですか?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "より難しいタスクを実施済みにすると、より多くの経験値とゴールドを得ることができますが... それが未実施の日課や悪い習慣の場合には、より多くのダメージを受けます。", "easy": "かんたん", "medium": "ふつう", "hard": "むずかしい", diff --git a/common/locales/nl/backgrounds.json b/common/locales/nl/backgrounds.json index dee1301408..f26288a323 100644 --- a/common/locales/nl/backgrounds.json +++ b/common/locales/nl/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Bergmeer", "backgroundMountainLakeNotes": "Dompel je tenen in een Bergmeer", "backgroundPagodasText": "Pagodes", - "backgroundPagodasNotes": "Klim naar de top van de Pagodes" + "backgroundPagodasNotes": "Klim naar de top van de Pagodes", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/nl/character.json b/common/locales/nl/character.json index fa6c3ed92f..7bf64613fc 100644 --- a/common/locales/nl/character.json +++ b/common/locales/nl/character.json @@ -52,9 +52,11 @@ "costume": "Kostuum", "costumeText": "Als een andere uitrusting mooier vindt dan de uitrusting die je gebruikt, vink dan \"Kostuum gebruiken\" aan om een andere uitrusting zichtbaar te maken terwijl je je strijduitrusting eronder draagt.", "useCostume": "Kostuum gebruiken", - "gearAchievement": "Je hebt de pretatie \"Hoogst haalbare uitrusting\" behaald door de hoogst haalbare uitrusting aan te schaffen!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Hoogst haalbare uitrusting", - "ultimGearText": "Heeft de hoogst haalbare uitrustings- en wapenset aangeschaft", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Niveau", "levelUp": "Niveau erbij!", "mana": "Mana", diff --git a/common/locales/nl/content.json b/common/locales/nl/content.json index de99970ce2..255a57026c 100644 --- a/common/locales/nl/content.json +++ b/common/locales/nl/content.json @@ -1,6 +1,10 @@ { "potionText": "Gezondheidsdrankje", "potionNotes": "Herwin 15 gezondheidspunten (direct gebruik)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Wolf", "dropEggWolfAdjective": "loyale", "dropEggTigerCubText": "Tijgerwelp", diff --git a/common/locales/pl/backgrounds.json b/common/locales/pl/backgrounds.json index faf34ccd98..4938f982f2 100644 --- a/common/locales/pl/backgrounds.json +++ b/common/locales/pl/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Górskie jezioro", "backgroundMountainLakeNotes": "Zanurz palce w górskim jeziorze.", "backgroundPagodasText": "Pagody", - "backgroundPagodasNotes": "Wspinaj się na szczyty pagód." + "backgroundPagodasNotes": "Wspinaj się na szczyty pagód.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/pl/challenge.json b/common/locales/pl/challenge.json index 200e44b098..586b4d8866 100644 --- a/common/locales/pl/challenge.json +++ b/common/locales/pl/challenge.json @@ -16,7 +16,7 @@ "selectWinner": "Wybierz zwycięzcę i zakończ wyzwanie:", "deleteOrSelect": "Usuń lub wybierz zwycięzcę", "endChallenge": "Zakończ wyzwanie", - "challengeDiscription": "These are the Challenge's tasks that will be added to your task dashboard when you join this Challenge. The sample Challenge tasks below will change color and gain graphs to show you the overall progress of the group.", + "challengeDiscription": "Oto zadania, które zostaną dodane do twojej tablicy zadań, gdy dołączysz do wyzwania. Ogólny postęp grupy będzie pokazywany przez zmianę koloru poniższych przykładowych zadań oraz wzrost wykresów.", "hows": "Jak wam idzie?", "filter": "Filtruj", "groups": "Grupy", @@ -33,8 +33,8 @@ "challengeTagPop": "Wyzwania pojawiają się na liście tagów oraz w opisach zadań. Dlatego oprócz pełnej nazwy, wpisanej wyżej, potrzebny będzie także jej \"skrót\". Na przykład \"Schudnąć 5 kilogramów w 3 miesiące\" może dostać skrót \"−5kg\" (Kliknij, by dowiedzieć się więcej).", "challengeDescr": "Opis", "prize": "Nagroda", - "prizePop": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later.", - "prizePopTavern": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later and Tavern challenges will not be refunded if the challenge is cancelled.", + "prizePop": "Jeśli twoje wyzwanie można wygrać, możesz opcjonalnie nagrodzić zwycięzcę klejnotami. Maksymalna nagroda to liczba posiadanych przez ciebie klejnotów (plus liczba klejnotów w banku gildii, jeśli to ty stworzyłeś gildię przypisaną do wyzwania). Uwaga: Raz ogłoszonej nagrody nie można później zmienić.", + "prizePopTavern": "Jeśli twoje wyzwanie można wygrać, możesz opcjonalnie nagrodzić zwycięzcę klejnotami. Maksymalna nagroda to liczba posiadanych przez ciebie klejnotów (plus liczba klejnotów w banku gildii, jeśli to ty stworzyłeś gildię przypisaną do wyzwania). Uwaga: Raz ogłoszonej nagrody nie można później zmienić, a klejnoty w wyzwaniach Karczmy nie zostaną zwrócone w przypadku anulowania wyzwania.", "publicChallenges": "Przy publicznych wyzwaniach minimalna nagroda to 1 klejnot (metoda antyspamowa, naprawdę działa).", "officialChallenge": "Oficjalne wyzwanie HabitRPG", "by": "stworzone przez", @@ -44,7 +44,7 @@ "selectGroup": "Wybierz grupę", "challengeCreated": "Wyzwanie zostało stworzone", "sureDelCha": "Jesteś pewien, że chcesz usunąć wyzwanie?", - "sureDelChaTavern": "Delete challenge, are you sure? Your gems will not be refunded.", + "sureDelChaTavern": "Czy na pewno usunąć wyzwanie? Twoje klejnoty nie zostaną zwrócone.", "removeTasks": "Usuń zadania", "keepTasks": "Zachowaj zadania", "closeCha": "Zakończ wyzwanie i...", diff --git a/common/locales/pl/character.json b/common/locales/pl/character.json index f3b16bb6e6..541c25b8d5 100644 --- a/common/locales/pl/character.json +++ b/common/locales/pl/character.json @@ -52,9 +52,11 @@ "costume": "Kostium", "costumeText": "Jeśli podoba Ci się inny strój, niż ten, w którym chcesz walczyć, zaznacz \"Załóż kostium\". Odziana w kostium, Twoja postać będzie nadal miała pod spodem wybrany strój bojowy.", "useCostume": "Załóż kostium", - "gearAchievement": "Zdobyłeś osiągnięcie \"Uzbrojony po zęby\" za ulepszenie wyposażenia do najwyższego poziomu!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Uzbrojony po zęby", - "ultimGearText": "Ulepszył maksymalnie broń i zbroję", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Poziom", "levelUp": "Zyskujesz poziom!", "mana": "Mana", diff --git a/common/locales/pl/content.json b/common/locales/pl/content.json index ed48af8141..e106837f2e 100644 --- a/common/locales/pl/content.json +++ b/common/locales/pl/content.json @@ -1,6 +1,10 @@ { "potionText": "Eliksir uzdrawiający", "potionNotes": "Odnawia 15 punktów zdrowia (działa natychmiastowo)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "wilk", "dropEggWolfAdjective": "lojalnego", "dropEggTigerCubText": "tygrysiątko", diff --git a/common/locales/pl/front.json b/common/locales/pl/front.json index ba77f06fbc..d661a8b1ac 100644 --- a/common/locales/pl/front.json +++ b/common/locales/pl/front.json @@ -173,10 +173,10 @@ "watchVideos": "Obejrzyj wideo", "work": "Pracą", "zelahQuote": "Dzięki HabitRPG przez myśl o zdobyciu punktów mogę siebie przekonać do wczesnego pójścia spać lub stracić zdrowie za późne pójście!", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", - "generalQuestionsSite": "General Questions about the Site", - "businessInquiries": "Business Inquiries", - "merchandiseInquiries": "Merchandise Inquiries", - "marketingInquiries": "Marketing/Social Media Inquiries" + "reportAccountProblems": "Zgłoś problem z kontem", + "reportCommunityIssues": "Zgłoś problem społecznościowy", + "generalQuestionsSite": "Ogólne pytania na temat strony", + "businessInquiries": "Zapytania biznesowe", + "merchandiseInquiries": "Zapytania handlowe", + "marketingInquiries": "Zapytania marketingowe/społecznościowe" } \ No newline at end of file diff --git a/common/locales/pl/gear.json b/common/locales/pl/gear.json index 0342ac6913..c598a3b8cc 100644 --- a/common/locales/pl/gear.json +++ b/common/locales/pl/gear.json @@ -120,8 +120,8 @@ "weaponMystery201411Notes": "Dźgaj swoich wrogów lub rzuć się na ulubione potrawy - te wielofunkcyjne widły nadają się do wszystkiego! Brak dodatkowych korzyści. Listopad 2014 Przedmiot abonencki", "weaponMystery201502Text": "Lśniąca Skrzydlata Laska Miłości oraz Prawdy", "weaponMystery201502Notes": "Za SKRZYDŁA! Za MIŁOŚĆ! Za PRAWDĘ RÓWNIEŻ! Nie daje żadnych korzyści. Luty 2015 Przedmiot abonencki.", - "weaponMystery201505Text": "Green Knight Lance", - "weaponMystery201505Notes": "This green and silver lance has unseated many opponents from their mounts. Confers no benefit. May 2015 Subscriber Item.", + "weaponMystery201505Text": "Lanca zielonego rycerza", + "weaponMystery201505Notes": "Ta zielona i srebrna lanca zdjęła z siodeł ich wierzchowców wielu przeciwników. Brak dodatkowych korzyści. Przedmiot Abonencki maj 2015.", "weaponMystery301404Text": "Steampunkowa laska", "weaponMystery301404Notes": "Doskonały by stać się światowcem. Przedmiot Abonencki Marzec 3015. Brak dodatkowych korzyści.", "armor": "zbroja", @@ -372,8 +372,8 @@ "headMystery201412Notes": "Kto jest pingwinem? Brak dodatkowych korzyści. Przedmiot Abonencki Grudzien 2014.", "headMystery201501Text": "Gwiaździsty Hełm", "headMystery201501Notes": "Konstelacje migoczą i wirują na tym hełmie, prowadząc myśli noszącego w kierunku skupienia. Brak dodatkowych korzyści. Przedmiot Abonencki styczeń 2015.", - "headMystery201505Text": "Green Knight Helm", - "headMystery201505Notes": "The green plume on this iron helm waves proudly. Confers no benefit. May 2015 Subscriber Item.", + "headMystery201505Text": "Hełm zielonego rycerza", + "headMystery201505Notes": "Zielony pióropusz dumnie powiewa na tym żelaznym hełmie. Brak dodatkowych korzyści. Przedmiot Abonencki maj 2015.", "headMystery301404Text": "Szykowny cylinder", "headMystery301404Notes": "Fantazyjny cylinder dla najwyżej urodzonych. Przedmiot Abonencki Styczeń 3015. Brak dodatkowych korzyści.", "headMystery301405Text": "Klasyczny cylinder", diff --git a/common/locales/pl/generic.json b/common/locales/pl/generic.json index 66cdce95c9..334aa07073 100644 --- a/common/locales/pl/generic.json +++ b/common/locales/pl/generic.json @@ -5,20 +5,20 @@ "habitica": "Habitica", "expandToolbar": "Rozwiń pasek narzędzi", "collapseToolbar": "Zwiń pasek narzędzi", - "markdownBlurb": "HabitRPG uses markdown for message formatting. See the Markdown Cheat Sheet for more info.", - "showFormattingHelp": "Show formatting help", - "hideFormattingHelp": "Hide formatting help", - "youType": "You type:", - "youSee": "You see:", - "italics": "*Italics*", - "bold": "**Bold**", - "strikethrough": "~~Strikethrough~~", + "markdownBlurb": "Przy formatowaniu wiadomości, HabitRPG używa języka markdown. Więcej informacji znajdziesz na ściądze markdown.", + "showFormattingHelp": "Pokaż pomoc do formatowania", + "hideFormattingHelp": "Ukryj pomoc do formatowania", + "youType": "Piszesz:", + "youSee": "Widzisz:", + "italics": "*Kursywa*", + "bold": "**Pogrubienie**", + "strikethrough": "~~Skreślenie~~", "emojiExample": ":smile:", - "markdownLinkEx": "[HabitRPG is great!](https://habitrpg.com)", - "markdownImageEx": "![mandatory alt text](https://habitrpg.com/cake.png \"optional mouseover title\")", - "unorderedListHTML": "+ First item
+ Second item
+ Third item", - "unorderedListMarkdown": "+ First item\n+ Second item\n+ Third item", - "code": "`code`", + "markdownLinkEx": "[HabitRPG jest super!](https://habitrpg.com)", + "markdownImageEx": "![obowiązkowy alt text](https://habitrpg.com/cake.png \"dodatkowy tekst po najechaniu myszą\")", + "unorderedListHTML": "+ Pierwszy punkt
+ Drugi punkt
+ Trzeci punkt", + "unorderedListMarkdown": "+ Pierwszy punkt\n+ Drugi punkt\n+ Trzeci punkt", + "code": "`kod`", "achievements": "Osiągnięcia", "modalAchievement": "Osiągnięcie!", "special": "Specjalne", @@ -52,7 +52,7 @@ "delete": "Usuń", "gemsPopoverTitle": "Klejnoty", "gems": "Klejnoty", - "gemButton": "Masz <%= number %> klejnotów.", + "gemButton": "Masz <%= number %> Klejnotów.", "moreInfo": "Więcej informacji", "gemsWhatFor": "Kupione za prawdziwe pieniądze. Są używane do kupowania specjalnych przedmiotów i usług (jaja, eliksiry wyklucia, Wzmocnienie itp.). Musisz najpierw odblokować te funkcje zanim będziesz w stanie użyć Klejnotów.", "veteran": "Weteran", diff --git a/common/locales/pl/groups.json b/common/locales/pl/groups.json index 513007ba7d..0fb57f6979 100644 --- a/common/locales/pl/groups.json +++ b/common/locales/pl/groups.json @@ -110,11 +110,11 @@ "byColon": "Przez:", "inviteNewUsers": "Zaproś nowych użytkowników", "inviteAlertInfo2": "Lub podziel się tym odnośnikiem (kopiuj/wklej):", - "sendGiftHeading": "Send Gift to <%= name %>", - "sendGiftGemsBalance": "From <%= number %> Gems", - "sendGiftCost": "Total: $<%= cost %> USD", - "sendGiftFromBalance": "From Balance", - "sendGiftPurchase": "Purchase", - "sendGiftMessagePlaceholder": "Personal message (optional)", - "sendGiftSubscription": "<%= months %> Month(s): $<%= price %>" + "sendGiftHeading": "Wyślij prezent dla <%= name %> ", + "sendGiftGemsBalance": "Posiadanych Klejnotów: <%= number %>", + "sendGiftCost": "Suma: <%= cost %> $", + "sendGiftFromBalance": "Z posiadanych", + "sendGiftPurchase": "Kup nowe", + "sendGiftMessagePlaceholder": "Osobista wiadomość (opcjonalnie)", + "sendGiftSubscription": "<%= months %> miesięcy: <%= price %> $" } \ No newline at end of file diff --git a/common/locales/pl/limited.json b/common/locales/pl/limited.json index ae2063d8e7..ea9bc26aff 100644 --- a/common/locales/pl/limited.json +++ b/common/locales/pl/limited.json @@ -6,7 +6,7 @@ "annoyingFriendsText": "Dostał <%= snowballs %> razy śnieżką od członków Drużyny.", "alarmingFriends": "Niepokojący przyjaciele", "alarmingFriendsText": "Przestraszony <%= spookDust %> razy przez członków drużyny.", - "agriculturalFriends": "Rolniczy Przyjaciele", + "agriculturalFriends": "Rolniczy przyjaciele", "agriculturalFriendsText": "Został przemieniony w kwiata <%= seeds %> razy przez członków drużyny.", "valentineCard": "Kartka Walentynkowa", "valentineCardNotes": "Wyślij Kartkę Walentynkową do członka drużyny.", @@ -20,7 +20,7 @@ "turkey": "Indor", "polarBearPup": "Niedźwiadek polarny", "jackolantern": "Jack-O-Lantern", - "seasonalShop": "Sklepik Sezonowy", + "seasonalShop": "Sklepik sezonowy", "seasonalShopClosedTitle": "<%= linkStart %>Siena Leslie<%= linkEnd %>", "seasonalShopTitle": "<%= linkStart %>Sezonowe Czary<%= linkEnd %>", "seasonalShopClosedText": "Sklepik sezonowy jest zamknięty! Nie wiemy gdzie obecnie znajduje się Sezonowa Wróżka, ale na pewno zjawi się na kolejną <%= linkStart %>Wielką Galę<%= linkEnd %>!", @@ -38,11 +38,11 @@ "newYear0": "Szczęśliwego Nowego Roku! Obyś zgładził wiele złych Nawyków.", "newYear1": "Szczęśliwego Nowego Roku! Obyś zebrał wiele Nagród.", "newYear2": "Szczęśliwego Nowego Roku! Obyś zdobył wiele Doskonałych Dni.", - "newYear3": "Szczęśliwego Nowego Roku! Niech twoja lista zadań Do-Zrobienie pozostanie krótka.", + "newYear3": "Szczęśliwego Nowego Roku! Niech twoja lista zadań Do-Zrobienia pozostanie krótka.", "newYear4": "Szczęśliwego Nowego Roku! Obyś nie został zaatakowany przez rozwścieczonego hipogryfa.", "holidayCard": "Dostałeś Wakacyjną Kartkę!", - "mightyBunnySet": "Poteżny Króliczek (Wojownik)", + "mightyBunnySet": "Poteżny króliczek (Wojownik)", "magicMouseSet": "Magiczna myszka (Mag)", - "lovingPupSet": "Kochane Szczenię (Uzdrowiciel)", - "stealthyKittySet": "Skradająca się Kotka (Łotrzyk)" + "lovingPupSet": "Kochane szczenię (Uzdrowiciel)", + "stealthyKittySet": "Skradający się kotek (Łotrzyk)" } \ No newline at end of file diff --git a/common/locales/pl/npc.json b/common/locales/pl/npc.json index 555a26d5e7..932c2dd54e 100644 --- a/common/locales/pl/npc.json +++ b/common/locales/pl/npc.json @@ -2,8 +2,8 @@ "npc": "NPC", "npcText": "Wsparł projekt Kickstarter na maksymalnym poziomie!", "mattBoch": "Matt Boch", - "mattShall": "Shall I bring you your steed, <%= name %>? Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!", - "mattBochText1": "Welcome to the Stable! I'm Matt, the beast master. After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "mattShall": "Czy przyprowadzić wierzchowca, <%= name %>? Gdy nakarmisz chowańca wystarczającą ilością jedzenia, by zamienił się w wierzchowca, to pojawi się tutaj. Kliknij wybranego wierzchowca, by go osiodłać.", + "mattBochText1": "Witaj w stajni! Mam na imię Matt i jestem władcą chowańców. Od poziomu 4 możesz za pomocą jaj i eliksirów wykluwać chowańce. Gdy na Targu wyklujesz chowańca, to pojawi się on tutaj! Kliknij na obrazek jednego z nich, by pojawił się na twoim awatarze. Karm chowańce jedzeniem znajdowanym od poziomu 4, by wyrosły z nich potężne wierzchowce.", "daniel": "Daniel", "danielText": "Witaj w Karczmie! Zostań na chwilę i porozmawiaj z mieszkańcami. Jeśli potrzebujesz odpoczynku (wakacje? choroba?), znajdę dla Ciebie pokój w Gospodzie. Kiedy odpoczywasz, twoje Codzienne nie skrzywdzą ciebie na koniec dnia, jednak nadal możesz je odhaczać.", "danielText2": "Uważaj: Jeśli uczestniczysz w walce z bossem, wciąż może on zadać tobie obrażenia, jeśli członkowie twojej drużyny ominą Codzienne! Również twoje obrażenia dla bossa (lub zebrane przedmioty) nie zostaną zaaplikowane, dopóki nie zakończysz odpoczynku w Gospodzie.", @@ -45,9 +45,9 @@ "tourScrollDown": "Zobacz całą stronę aby upewnić się, że widziałeś wszystkie opcje! Kliknij ponownie na swój awatar aby wrócić do strony zadań.", "tourMuchMore": "Gdy zakończysz zadania, możesz wraz z przyjaciółmi stworzyć Drużynę, czatować o wspólnych zainteresowaniach w Gildiach, dołączyć do Wyzwań i więcej!", "tourStatsPage": "To jest twoja strona Statystyki! Zdobądź osiągnięcia wykonując wymienione zadania.", - "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", + "tourTavernPage": "Witaj w Karczmie, wielowiekowym czacie! W przypadku choroby lub podróży możesz tutaj powstrzymać swoje Codzienne od zadawania ci obrażeń klikając \"Odpoczywaj w Gospodzie\". Przywitaj się!", "tourPartyPage": "Twoja drużyna pomoże Ci zostać odpowiedzialnym. Zaproś przyjaciół aby odblokować zwój misji!", "tourGuildsPage": "Gildie to grupy społeczne ze wspólnym motywem. Szukaj tematu, który Cię interesuje! Polecamy Gildię Świeżaków.", - "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", + "tourChallengesPage": "Wyzwania są to tematyczne listy zadań stworzone przez użytkowników! Dołączenie do wyzwania doda je do listy zadań na twoim koncie. Rywalizuj z innymi użytkownikami, by wygrywać nagrody w postaci klejnotów!", "tourMarketPage": "Od poziomu 4, jaja i eliksiry wyklucia zdobywasz losowo po ukończeniu zadań. Pojawiają się one tutaj - użyj ich, a wyklują się chowańce! Możesz także kupować przedmioty na Targu." } \ No newline at end of file diff --git a/common/locales/pl/quests.json b/common/locales/pl/quests.json index 9eb8eb9ada..6d476f4a7a 100644 --- a/common/locales/pl/quests.json +++ b/common/locales/pl/quests.json @@ -19,7 +19,7 @@ "bossStrength": "Siła bossa", "collect": "Zebrano", "collected": "Zebrano", - "bossDmg1": "Each completed Daily and To-Do and each positive Habit hurts the boss. Hurt it more with redder tasks or Brutal Smash and Burst of Flames. The boss will deal damage to every quest participant for every Daily you've missed (multiplied by the boss's Strength) in addition to your regular damage, so keep your party healthy by completing your Dailies! All damage to and from a boss is tallied on cron (your day roll-over).", + "bossDmg1": "Każde zakończone Codzienne i Do-Zrobienia oraz każdy pozytywny Nawyk rani bossa. Zrań go bardziej czerwieńszymi zadaniami lub Brutalnym uderzeniem i Eksplozją płomieni. Boss zada obrażenia każdemu uczestnikowi misji za każde pominięte Codzienne (pomnożone przez siłę bossa) jako dodatek do standardowych obrażeń, więc utrzymuj swoją drużynę w zdrowiu przez wypełnianie swoich Codziennych! Wszystkie obrażenia zadane bossowi i przez niego będą podsumowane przez crona (twoje przejście do następnego dnia).", "bossDmg2": "Tylko uczestnicy będą mogli walczyć z bossem i brać udział w podziale łupów.", "tavernBossInfo": "Aby zranić światowego bossa, wykonuj swoje Codzienne oraz Do-Zrobienia. Wyższe obrażenia od zadań oznaczają wyższe obrażenia zadane bossowi (wypełnianie czerwonych zadań, zaklęcia Czarodzieja, ataki Wojownika, itd). Za każdy Codzienny obowiązek, który pominiesz (pomnożony przez Siłę bossa), jego Furia wzrośnie. Kiedy Furia osiągnie maksimum, stanie się coś złego ­– więc wypełniaj swoje Codzienne! Wszystkie obrażenia zadane bossowi i przez niego, będą podsumowane przy cronie (podczas zmiany twojego dnia).", "bossColl1": "Aby zbierać przedmioty, wykonuj pozytywne zadania. Przedmioty misyjne znajdujesz tak samo jak zwykłe, jednakże nie zobaczysz łupów aż do końca dnia – wtedy to wszystkie przedmioty zostaną wyszczególnione i dodane do sterty.", diff --git a/common/locales/pl/spells.json b/common/locales/pl/spells.json index 1f2fb641ea..1c1174e072 100644 --- a/common/locales/pl/spells.json +++ b/common/locales/pl/spells.json @@ -40,7 +40,7 @@ "spellSpecialOpaquePotionText": "Nieprzejrzysty eliksir", "spellSpecialOpaquePotionNotes": "Anuluje efekt strasznych iskierek.", "spellSpecialShinySeedText": "Lśniące nasiono", - "spellSpecialShinySeedNotes": "Zamień przyjaciela w radosnego kwiata!", + "spellSpecialShinySeedNotes": "Zamień przyjaciela w radosnego kwiatka!", "spellSpecialPetalFreePotionText": "Eliksir antypłatkowy", "spellSpecialPetalFreePotionNotes": "Anuluj skutki lśniącego nasiona." } \ No newline at end of file diff --git a/common/locales/pl/tasks.json b/common/locales/pl/tasks.json index bb03dedfa4..c09a2d9692 100644 --- a/common/locales/pl/tasks.json +++ b/common/locales/pl/tasks.json @@ -7,14 +7,14 @@ "addsingle": "Dodaj pojedyncze", "habits": "Nawyki", "newHabit": "Nowy Nawyk", - "newHabitBulk": "Nowe Przyzwyczajenia (jedno na linię)", + "newHabitBulk": "Nowe Nawyki (po jednym na linię)", "yellowred": "Słabe", "greenblue": "Mocne", "edit": "Edytuj", "save": "Zapisz", "addChecklist": "Dodaj Listę", "checklist": "Lista", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "Rozbij zadanie na mniejsze części! Listy kontrolne zwiększają zdobyte w Do-Zrobienia doświadczenie i złoto, a także redukują obrażenia powodowane przez Codzienne.", "expandCollapse": "Rozwiń/zwiń", "text": "Treść", "extraNotes": "Dodatkowe notatki", @@ -22,7 +22,7 @@ "advancedOptions": "Zaawansowane opcje", "difficulty": "Trudność", "difficultyHelpTitle": "Jak trudne jest to zadane?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "Im trudniejsze zadanie, tym więcej doświadczenia i złota otrzymasz, gdy je odhaczysz... jednak otrzymasz więcej obrażeń, jeśli jest to Codzienne lub zły Nawyk!", "easy": "Łatwe", "medium": "Średnie", "hard": "Trudne", @@ -33,13 +33,13 @@ "progress": "Postęp", "dailies": "Codzienne", "newDaily": "Nowe Codzienne", - "newDailyBulk": "Nowe Zadania Codzienne (jedno na linię)", + "newDailyBulk": "Nowe Codzienne (po jednym na linię)", "streakCounter": "Licznik serii", "repeat": "Powtórz", "restoreStreak": "Przywróć serię", "todos": "Do-Zrobienia", "newTodo": "Nowe Do-Zrobienia", - "newTodoBulk": "Nowe Zadania Do Zrobienia (jedno na linię)", + "newTodoBulk": "Nowe Do-Zrobienia (po jednym na linię)", "dueDate": "Planowana data", "remaining": "Aktywne", "complete": "Skończone", @@ -52,7 +52,7 @@ "gold": "Złoto", "silver": "Srebro (100 srebra = 1 złota)", "newReward": "Nowa Nagroda", - "newRewardBulk": "Nowe Wynagrodzenia (jedno na linię)", + "newRewardBulk": "Nowe Nagrody (po jednej na linię)", "price": "Cena", "tags": "Tagi", "editTags": "Edytuj", diff --git a/common/locales/pt/backgrounds.json b/common/locales/pt/backgrounds.json index c5b115a94d..7b1b777b5c 100644 --- a/common/locales/pt/backgrounds.json +++ b/common/locales/pt/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Lago da Montanha", "backgroundMountainLakeNotes": "Molhe seus dedos num Lago da Montanha", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Escale até o topo das Pagodas" + "backgroundPagodasNotes": "Escale até o topo das Pagodas", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/pt/challenge.json b/common/locales/pt/challenge.json index 555fc3353e..310091b85f 100644 --- a/common/locales/pt/challenge.json +++ b/common/locales/pt/challenge.json @@ -16,7 +16,7 @@ "selectWinner": "Selecione um vencedor e termine o desafio:", "deleteOrSelect": "Deletar ou selecionar vencedor", "endChallenge": "Terminar Desafio", - "challengeDiscription": "These are the Challenge's tasks that will be added to your task dashboard when you join this Challenge. The sample Challenge tasks below will change color and gain graphs to show you the overall progress of the group.", + "challengeDiscription": "Estas são as tarefas do desafio que serão adicionadas ao seu painel de tarefas quando você começá-lo. As amostras de tarefas de Desafio abaixo mudarão de cor e ganharão gráficos para lhe mostrar o progresso geral do grupo.", "hows": "Como Todos Estão Indo?", "filter": "Filtro", "groups": "Grupos", @@ -33,8 +33,8 @@ "challengeTagPop": "Desafios aparecem nas listas de etiqueta e descrições de tarefa. Então, mesmo querendo um título descritivo acima, você também precisará de um 'nome curto'. Ex.: 'Perder 10 kilos em 3 meses' pode virar '-10kg' (Clique para mais informações).", "challengeDescr": "Descrição", "prize": "Prêmio", - "prizePop": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later.", - "prizePopTavern": "If someone can 'win' your challenge, you can optionally award that winner a Gem prize. Max = #gems you own (+ guild.gems, if you created this challenge's guild). Note: This prize can't be changed later and Tavern challenges will not be refunded if the challenge is cancelled.", + "prizePop": "Se alguém conseguir 'vencer' o seu Desafio, você pode escolher recompensar esta pessoa com Gemas. Máximo = #gemas que possui (+ gemas da guilda, se você criou este desafio para a guilda). Nota: Este prêmio não pode ser alterado depois.", + "prizePopTavern": "Se alguém conseguir 'vencer' o seu Desafio, você pode escolher recompensar esta pessoa com Gemas. Máximo = #gemas que possui (+ gemas da guilda, se você criou este desafio para a guilda). Nota: Este prêmio não pode ser alterado depois e desafios da Taverna não poderão ser reembolsados se o desafio for cancelado.", "publicChallenges": "Mínimo de 1 Gema para desafios públicos (realmente ajuda a prevenir spam).", "officialChallenge": "Desafio Oficial do HabitRPG", "by": "por", @@ -44,7 +44,7 @@ "selectGroup": "Favor selecionar grupo", "challengeCreated": "Desafio criado", "sureDelCha": "Tem certeza de que deseja deletar o desafio?", - "sureDelChaTavern": "Delete challenge, are you sure? Your gems will not be refunded.", + "sureDelChaTavern": "Tem certeza que quer deletar este Desafio? Suas gemas não serão reembolsadas.", "removeTasks": "Remover Tarefas", "keepTasks": "Manter Tarefas", "closeCha": "Terminar desafio e...", diff --git a/common/locales/pt/character.json b/common/locales/pt/character.json index 28db1ffbf5..d07a4042e6 100644 --- a/common/locales/pt/character.json +++ b/common/locales/pt/character.json @@ -52,9 +52,11 @@ "costume": "Traje", "costumeText": "Se preferir a aparência de outro equipamento em vez do que estiver usando, marque a opção \"Usar Traje\" para vestir um traje enquanto usa seu equipamento de batalha por baixo.", "useCostume": "Usar Traje ", - "gearAchievement": "Você ganhou a conquista \"Equipamento Final\" por evoluir seu equipamento até o último conjunto!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Equipamento Final", - "ultimGearText": "Evoluiu até a última arma e último conjunto de equipamento", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Nível", "levelUp": "Subiu de Nível!", "mana": "Mana", diff --git a/common/locales/pt/communityguidelines.json b/common/locales/pt/communityguidelines.json index 5f774acfb8..f6f42b1721 100644 --- a/common/locales/pt/communityguidelines.json +++ b/common/locales/pt/communityguidelines.json @@ -115,8 +115,8 @@ "commGuidePara059": "Similarmente, todas infrações tem consequências diretas.alguns exemplos de consequências estão listados abaixo.", "commGuidePara060": "Se a sua infração tiver uma consequencia moderada ou severa, você vai receber um email explicando:", "commGuideList08A": "Qual foi sua infração", - "commGuideList08B": "Qual será a consequência", - "commGuideList08C": "O que fazer para corrigir sua situação e restaurar seu status, se possível.", + "commGuideList08B": "Qual é a consequência", + "commGuideList08C": "O que fazer para corrigir a situação e restaurar seu status, se possível.", "commGuideHeadingSevereConsequences": "Exemplos de Consequências Severas", "commGuideList09A": "Banimento de Conta", "commGuideList09B": "Anulação de Conta", diff --git a/common/locales/pt/content.json b/common/locales/pt/content.json index 272418373e..78694a37be 100644 --- a/common/locales/pt/content.json +++ b/common/locales/pt/content.json @@ -1,6 +1,10 @@ { "potionText": "Poção de Vida", "potionNotes": "Recupera 15 de Vida (Uso instantâneo)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Lobo", "dropEggWolfAdjective": "leal", "dropEggTigerCubText": "Tigre Filhote", @@ -57,7 +61,7 @@ "questEggSlimeText": "Gosma de Marshmallow", "questEggSlimeAdjective": "doce", "questEggSheepText": "Ovelha", - "questEggSheepAdjective": "peluda", + "questEggSheepAdjective": "felpuda", "eggNotes": "Ache uma poção de eclosão para usá-la nesse ovo, e ele irá eclodir em um <%= eggAdjective(locale) %> <%= eggText(locale) %>.", "hatchingPotionBase": "Base", "hatchingPotionWhite": "Branco", diff --git a/common/locales/pt/front.json b/common/locales/pt/front.json index 665c778ca3..5fb24f6a64 100644 --- a/common/locales/pt/front.json +++ b/common/locales/pt/front.json @@ -173,10 +173,10 @@ "watchVideos": "Veja Vídeos", "work": "Trabalhe", "zelahQuote": "Com o HabitRPG eu sou persuadido a ir para a cama na hora pelos pontos que ganho por dormir cedo ou pela vida que perco dormindo tarde!", - "reportAccountProblems": "Report Account Problems", - "reportCommunityIssues": "Report Community Issues", - "generalQuestionsSite": "General Questions about the Site", - "businessInquiries": "Business Inquiries", - "merchandiseInquiries": "Merchandise Inquiries", - "marketingInquiries": "Marketing/Social Media Inquiries" + "reportAccountProblems": "Reportar Problemas com Conta", + "reportCommunityIssues": "Reportar Problemas com a Comunidade", + "generalQuestionsSite": "Perguntas Gerais sobre o Site", + "businessInquiries": "Consultas de Negócios", + "merchandiseInquiries": "Consultas de Merchandise", + "marketingInquiries": "Consultas de Marketing/Mídias Sociais" } \ No newline at end of file diff --git a/common/locales/pt/gear.json b/common/locales/pt/gear.json index 1be3adaf95..9990abc1d4 100644 --- a/common/locales/pt/gear.json +++ b/common/locales/pt/gear.json @@ -120,8 +120,8 @@ "weaponMystery201411Notes": "Apunhale seus inimigos ou cave pelas suas comidas favoritas - esse garfo versátil faz de tudo! Não confere benefícios. Item de Assinante de Novembro 2014.", "weaponMystery201502Text": "Cajado Brilhante Alado do Amor e Também Verdade.", "weaponMystery201502Notes": "Por ASAS! Por AMOR! Por VERDADE TAMBÉM! Não concede benefícios. Item de Assinante de Fevereiro 2015.", - "weaponMystery201505Text": "Green Knight Lance", - "weaponMystery201505Notes": "This green and silver lance has unseated many opponents from their mounts. Confers no benefit. May 2015 Subscriber Item.", + "weaponMystery201505Text": "Lança do Cabaleiro Verde", + "weaponMystery201505Notes": "Esta lança verde e prateada já derrubou muitos oponentes de suas montarias. Não concede benefícios. Item de Assinante de Maio de 2015.", "weaponMystery301404Text": "Bengala Steampunk", "weaponMystery301404Notes": "Excelente para dar uma volta pela cidade. Item de Assinante de Março 3015. Não concede benefícios.", "armor": "armadura", @@ -372,8 +372,8 @@ "headMystery201412Notes": "Quem é um Pinguim? Não concede benefícios. Item de Assinante de Dezembro 2014.", "headMystery201501Text": "Elmo Estrelado", "headMystery201501Notes": "As constelações brilham e rodopiam neste elmo, guiando o foco dos pensamentos de quem o vestir. Não confere benefício. Item de Assinante de Janeiro de 2015.", - "headMystery201505Text": "Green Knight Helm", - "headMystery201505Notes": "The green plume on this iron helm waves proudly. Confers no benefit. May 2015 Subscriber Item.", + "headMystery201505Text": "Elmo do Cavaleiro Verde", + "headMystery201505Notes": "A pluma verde neste elmo de ferro balança orgulhosamente. Não concede benefícios. Item de Assinante de Maio de 2015.", "headMystery301404Text": "Cartola Chique", "headMystery301404Notes": "Uma cartola chique para as damas e cavalheiros mais finos! Item de Assinante de Janeiro 3015. Não concede benefícios.", "headMystery301405Text": "Cartola Básica", diff --git a/common/locales/pt/generic.json b/common/locales/pt/generic.json index bf3dcfb478..cfe1942487 100644 --- a/common/locales/pt/generic.json +++ b/common/locales/pt/generic.json @@ -5,20 +5,20 @@ "habitica": "Habitica", "expandToolbar": "Expandir Barra de Ferramentas", "collapseToolbar": "Retrair Barra de Ferramentas", - "markdownBlurb": "HabitRPG uses markdown for message formatting. See the Markdown Cheat Sheet for more info.", - "showFormattingHelp": "Show formatting help", - "hideFormattingHelp": "Hide formatting help", - "youType": "You type:", - "youSee": "You see:", - "italics": "*Italics*", - "bold": "**Bold**", - "strikethrough": "~~Strikethrough~~", + "markdownBlurb": "O HabitRPG usa markdown para formatar as mensagens. Veja a Planilha de Códigos Markdown para mais informações.", + "showFormattingHelp": "Mostrar ajuda de formatação", + "hideFormattingHelp": "Esconder ajuda de formatação", + "youType": "Você digita:", + "youSee": "Você vê:", + "italics": "*Itálico*", + "bold": "**Negrito**", + "strikethrough": "~~Riscar~~", "emojiExample": ":smile:", - "markdownLinkEx": "[HabitRPG is great!](https://habitrpg.com)", - "markdownImageEx": "![mandatory alt text](https://habitrpg.com/cake.png \"optional mouseover title\")", - "unorderedListHTML": "+ First item
+ Second item
+ Third item", - "unorderedListMarkdown": "+ First item\n+ Second item\n+ Third item", - "code": "`code`", + "markdownLinkEx": "[O HabitRPG é incrível!](https://habitrpg.com)", + "markdownImageEx": "![texto alternativo obrigatório](https://habitrpg.com/cake.png \"título opcional de passar o mouse sobre\")", + "unorderedListHTML": "+ Primeiro item
+ Segundo item
+ Terceiro item", + "unorderedListMarkdown": "+ Primeiro item\n+ Segundo item\n+ Terceiro item", + "code": "`código`", "achievements": "Conquistas", "modalAchievement": "Conquista!", "special": "Especial", diff --git a/common/locales/pt/groups.json b/common/locales/pt/groups.json index 3cca1d014a..457d0537ff 100644 --- a/common/locales/pt/groups.json +++ b/common/locales/pt/groups.json @@ -110,11 +110,11 @@ "byColon": "Por:", "inviteNewUsers": "Convidar Novo Utilizador(es)", "inviteAlertInfo2": "Ou partilhe este link (copiar/colar):", - "sendGiftHeading": "Send Gift to <%= name %>", - "sendGiftGemsBalance": "From <%= number %> Gems", + "sendGiftHeading": "Enviar Presente para <%= name %>", + "sendGiftGemsBalance": "De <%= number %> Gemas", "sendGiftCost": "Total: $<%= cost %> USD", - "sendGiftFromBalance": "From Balance", - "sendGiftPurchase": "Purchase", - "sendGiftMessagePlaceholder": "Personal message (optional)", - "sendGiftSubscription": "<%= months %> Month(s): $<%= price %>" + "sendGiftFromBalance": "Do Saldo", + "sendGiftPurchase": "Compra", + "sendGiftMessagePlaceholder": "Mensagem Pessoal (opcional)", + "sendGiftSubscription": "<%= months %> Mês(es): $<%= price %>" } \ No newline at end of file diff --git a/common/locales/pt/npc.json b/common/locales/pt/npc.json index 9b7d6b473f..e6f8cf5b6f 100644 --- a/common/locales/pt/npc.json +++ b/common/locales/pt/npc.json @@ -2,8 +2,8 @@ "npc": "NPC", "npcText": "Apoiou o projeto do Kickstarter ao nível máximo!", "mattBoch": "Matt Boch", - "mattShall": "Shall I bring you your steed, <%= name %>? Once you've fed a pet enough food to turn it into a mount, it will appear here. Click a mount to saddle up!", - "mattBochText1": "Welcome to the Stable! I'm Matt, the beast master. After level 4, you can hatch pets using eggs and potions. When you hatch a pet in the Market, it will appear here! Click a pet's image to add it to your avatar. Feed them with the food you find after level 4, and they'll grow into powerful mounts.", + "mattShall": "Devo trazer seu corcel, <%= name %>? Uma vez que você alimentou o seu mascote o suficiente para torná-lo uma montaria, ele aparecerá aqui. Clique em uma montaria para montá-la.", + "mattBochText1": "Bem-vindo ao meu Estábulo! Sou Matt, o mestre das bestas. Depois do nível 4, você pode chocar mascotes usando ovos e poções. Quanto você choca um mascote no Mercado, ele aparecerá aqui! Clique na imagem de um mascote para adicioná-lo ao seu avatar. Alimente-os usando a comida que você encontrar depois do nível 4 e eles se transformarão em poderosas montarias.", "daniel": "Daniel", "danielText": "Bem vindo à Taverna! Fique um pouco e conheça os locais. Se precisares descansar (férias? problemas de saúde?), eu me encarregarei de deixá-lo à vontade na Pousada. Enquanto descansa, suas Tarefas Diárias não lhe causarão dano na virada do dia, mas você ainda pode marcá-las como realizadas.", "danielText2": "Tenha cuidado: Se estiver participando de uma missão contra um Chefão, ele ainda lhe causará danos pelas Tarefas Diárias perdidas dos seus companheiros de equipe! Além disso, o seu dano no chefão (ou itens coletados) não serão aplicados até que você saia da Pousada.", @@ -45,9 +45,9 @@ "tourScrollDown": "Certifique-se de rolar a página até o final para ver todas as opções! Clique no seu avatar novamente para retornar à página de tarefas.", "tourMuchMore": "Quando tiver terminado suas tarefas, você pode formar uma equipe com amigos, conversar as guildas temáticas, participar de desafios, e mais!", "tourStatsPage": "Essa é a página de Atributos! Conquiste medalhas completando as tarefas listadas,", - "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", + "tourTavernPage": "Bem vindo à Taverna, uma sala de bate-papo para todas as idades! Você pode congelar sua conta no caso de doença ou viagem clicando em \"Descansar na Pousada\". Venha dizer oi!", "tourPartyPage": "Sua Equipe vai te ajudar a se manter responsável. Convide amigos para destravar um Pergaminho de Missão!", "tourGuildsPage": "Guildas são grupos sociais com temas em comum. Procure por assuntos que te interessam! Nós recomendamos a Guilda dos Novatos.", - "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", + "tourChallengesPage": "Desafios são listas de tarefas temáticas criadas por usuários! Participar de um Desafio adicionará tarefas à sua conta. Compita contra outros usuários para ganhar prêmios em gemas!", "tourMarketPage": "A partir do level 4, você pode encontrar ovos e poções de eclosão aleatoriamente quando você completa tarefas. Elas aparecem aqui - use-as para chocar mascotes! Você também pode comprar items do Mercado." } \ No newline at end of file diff --git a/common/locales/pt/quests.json b/common/locales/pt/quests.json index da0bd5eb29..a9fd483cbf 100644 --- a/common/locales/pt/quests.json +++ b/common/locales/pt/quests.json @@ -19,7 +19,7 @@ "bossStrength": "Força do Chefão", "collect": "Coletar", "collected": "Coletado", - "bossDmg1": "Each completed Daily and To-Do and each positive Habit hurts the boss. Hurt it more with redder tasks or Brutal Smash and Burst of Flames. The boss will deal damage to every quest participant for every Daily you've missed (multiplied by the boss's Strength) in addition to your regular damage, so keep your party healthy by completing your Dailies! All damage to and from a boss is tallied on cron (your day roll-over).", + "bossDmg1": "Todos os Afazeres e Tarefas Diárias completadas e cada Hábito positivo causa dando no Chefão. Cause mais dano com tarefas mais vermelhas, com Destruição Brutal ou com Explosão de Chamas. O Chefão causará dano em todos os participantes da missão por cada Tarefa Diária perdida (multiplicada pela Força do Chefão) em adição ao seu dano normal, então mantenha a saúde da sua equipe completando suas Tarefas Diárias. Todo o dano recebido ou inflingido ao Chefão é computado no seu Cron (virada do dia).", "bossDmg2": "Apenas participantes lutarão contra o chefão e dividirão as recompensas da missão.", "tavernBossInfo": "Para ferir um chefão de mundo, complete suas Tarefas Diárias e Afazeres. Dano alto de tarefa significa maior dano ao chefão (completar tarefas vermelhas, feitiços de Magos, ataques de Guerreiros, etc). Para cada Tarefa Diária que você perder (multiplicada pela Força do chefão), a Ira do chefão irá aumentar. Uma vez que sua Ira chegar ao máximo, alguma coisa ruim irá acontecer - então, complete suas Tarefas Diárias! Todo dano causado para e pelo chefão é registrado no cron (na sua virada do dia).", "bossColl1": "Para coletar itens, complete suas tarefas positivas. Itens de missão aparecem assim como itens normais; entretanto, você não verá a coleta até o dia seguinte, então tudo que você encontrou será registrado e contribuído à pilha.", diff --git a/common/locales/pt/tasks.json b/common/locales/pt/tasks.json index 93023c89ac..de8208fa92 100644 --- a/common/locales/pt/tasks.json +++ b/common/locales/pt/tasks.json @@ -14,7 +14,7 @@ "save": "Salvar", "addChecklist": "Adicionar Lista", "checklist": "Lista", - "checklistText": "Break a task into smaller pieces! Checklists increase the Experience and Gold gained from a To-Do, and reduce the damage caused by a Daily.", + "checklistText": "Divida uma tarefa em partes menores! Listas aumentam a Experiência e Ouro recebidos de um Afazer e reduzem o dano causado por uma Tarefa Diária.", "expandCollapse": "Expandir/Fechar", "text": "Texto", "extraNotes": "Notas Extras", @@ -22,7 +22,7 @@ "advancedOptions": "Opções Avançadas", "difficulty": "Dificuldade", "difficultyHelpTitle": "Quão difícil é essa tarefa?", - "difficultyHelpContent": "The harder a task, the more Experience and Gold it awards you when you check it off... but the more it damages you if it is a Daily or Bad Habit!", + "difficultyHelpContent": "Quanto mais difícil é uma tarefa, mais Experiência e Ouro dará quando você a completa... mas lhe causará mais dano se for uma Tarefa Diária ou Hábito Ruim.", "easy": "Fácil", "medium": "Médio", "hard": "Difícil", diff --git a/common/locales/ro/backgrounds.json b/common/locales/ro/backgrounds.json index 3498a30cc9..49d987891e 100644 --- a/common/locales/ro/backgrounds.json +++ b/common/locales/ro/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Climb to the top of Pagodas." + "backgroundPagodasNotes": "Climb to the top of Pagodas.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/ro/character.json b/common/locales/ro/character.json index be8017cca0..ea48d13947 100644 --- a/common/locales/ro/character.json +++ b/common/locales/ro/character.json @@ -52,9 +52,11 @@ "costume": "Costum", "costumeText": "Dacă preferi aspectul altui echipament în loc de ce ai echipat, bifează cutiuța \"Poartă Costum\" ca să îmbraci la vedere un costum în timp ce porți îmbrăcămintea de luptă pe dedesubt.", "useCostume": "Poartă costum", - "gearAchievement": "Ai obţinut titlul \"Armură Maximală\" pentru achiziţionarea setului maxim posibil de armură!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Armură Maximală", - "ultimGearText": "A achiziţionat setul maxim posibil de arme şi armură.", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Nivel", "levelUp": "Creştere de nivel!", "mana": "Mana", diff --git a/common/locales/ro/content.json b/common/locales/ro/content.json index c0a41e9727..7e3a78862b 100644 --- a/common/locales/ro/content.json +++ b/common/locales/ro/content.json @@ -1,6 +1,10 @@ { "potionText": "Poțiune de sănătate", "potionNotes": "Vindecă 15 puncte de sănătate (instantaneu)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Lup", "dropEggWolfAdjective": "loial", "dropEggTigerCubText": "Pui de tigru", diff --git a/common/locales/ro/spells.json b/common/locales/ro/spells.json index bb9d4ea371..999a0f3d01 100644 --- a/common/locales/ro/spells.json +++ b/common/locales/ro/spells.json @@ -1,6 +1,6 @@ { "spellWizardFireballText": "Rafală de flăcări", - "spellWizardFireballNotes": "Flames burst from your hands. You gain XP, and you deal extra damage to Bosses! Click on a task to cast. (Based on: INT)", + "spellWizardFireballNotes": "Flăcări ţâşnesc din mâinile tale. Obţii experienţă şi răneşti mai puternic Boşii. Apasă pe o sarcină pentru a o vrăji. (Bazat pe:INT)", "spellWizardMPHealText": "Val eteric", "spellWizardMPHealNotes": "You sacrifice mana to help your friends. The rest of your party gains MP! (Based on: INT)", "spellWizardEarthText": "Cutremur", diff --git a/common/locales/ru/backgrounds.json b/common/locales/ru/backgrounds.json index 35979bd2c1..0f267940ab 100644 --- a/common/locales/ru/backgrounds.json +++ b/common/locales/ru/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Горное озеро", "backgroundMountainLakeNotes": "Проверьте, как водичка в Горном озере.", "backgroundPagodasText": "Пагоды", - "backgroundPagodasNotes": "Заберитесь на вершины Пагод." + "backgroundPagodasNotes": "Заберитесь на вершины Пагод.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/ru/character.json b/common/locales/ru/character.json index ef1dc01704..cc2696db70 100644 --- a/common/locales/ru/character.json +++ b/common/locales/ru/character.json @@ -17,7 +17,7 @@ "bodySize": "Телосложение", "bodySlim": "Стройное", "bodyBroad": "Тучное", - "unlockSet": "Разблокировать набор - <%= cost %>", + "unlockSet": "Разблокировать набор – <%= cost %>", "locked": "закрытые", "shirts": "Рубашки", "specialShirts": "Особые рубашки", @@ -52,9 +52,11 @@ "costume": "Костюм", "costumeText": "Если внешний вид какой-либо экипировки вам нравится больше, чем надетой сейчас, можете отметить «Использовать костюм» для того, чтобы визуально предстать в желаемом костюме поверх боевой экипировки.", "useCostume": "Использовать костюм", - "gearAchievement": "Вы заработали достижение «Превосходная экипировка» за усовершенствование экипировки до комплекта максимального уровня!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Превосходная экипировка", - "ultimGearText": "Оружие и комплект экипировки усовершенствованы до максимального уровня", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Уровень", "levelUp": "Новый уровень!", "mana": "Мана", diff --git a/common/locales/ru/communityguidelines.json b/common/locales/ru/communityguidelines.json index 1a9c020de6..b69bf5f4d1 100644 --- a/common/locales/ru/communityguidelines.json +++ b/common/locales/ru/communityguidelines.json @@ -52,30 +52,30 @@ "commGuideHeadingPublicGuilds": "Открытые гильдии", "commGuidePara029": "Публичные гильдии в отличие от Таверны сосредоточены на определенной теме в обсуждениях. Чат гильдии должен быть сфокусирован именно на ней. Например, члены гильдии писателей не должны обсуждать садоводство вместо писательства, а Драконоборцы не должны интересоваться расшифровкой древних рун. Некоторые гильдии менее строги на этот счет, другие более, но всё же, старайтесь не отдаляться от темы!", "commGuidePara031": "В некоторых публичных гильдиях обсуждаются деликатные темы, такие как депрессия, религия, политика и т.д. Это нормально до тех пор, пока участники обсуждений не нарушают Правила и Условия или Нормы Поведения в Общественных Местах, и до тех пор, пока они не отвлекаются от основной темы.", - "commGuidePara033": "Публичные гильдии не должны содержать контент 18+. Если планируется регулярно обсуждать деликатные темы, это должно быть отражено в названии гильдии. Это нужно для спокойствия и комфорта каждого в стране Habitica. Если в гильдии обсуждаются разного рода деликатные вопросы, то следует предупреждать ваших сограждан (например, «Внимание: контент не для слабонервных!»). Более того, такой контент должен быть уместен -- например в гильдии для борьбы с депрессией подходит по основную тему то, что явно не подойдет гильдии музыкантов. Если Вы видите, что кто-то систематически нарушает это правило, даже после просьб прекратить это делать, сообщите об этом на email leslie@habitrpg.com и приложите скриншоты.", + "commGuidePara033": "Публичные гильдии не должны содержать контент 18+. Если планируется регулярно обсуждать деликатные темы, это должно быть отражено в названии гильдии. Это нужно для спокойствия и комфорта каждого в стране Habitica. Если в гильдии обсуждаются разного рода деликатные вопросы, то следует предупреждать ваших сограждан (например, «Внимание: контент не для слабонервных!»). Более того, такой контент должен быть уместен – например в гильдии для борьбы с депрессией подходит по основную тему то, что явно не подойдет гильдии музыкантов. Если Вы видите, что кто-то систематически нарушает это правило, даже после просьб прекратить это делать, сообщите об этом на email leslie@habitrpg.com и приложите скриншоты.", "commGuidePara035": "Гильдии, открытые или закрытые, не должны создаваться с целью нападок на любую группу или индивидуума. Создание подобной Гильдии будет служить основанием для немедленного бана аккаунта. Сражайтесь с плохими привычками, а с не другими искателями приключений!", "commGuidePara037": "Все Вызовы в Таверне и Вызовы Открытых гильдий также должны подчиняться этим правилам.", "commGuideHeadingBackCorner": "Задний Угол", "commGuidePara038": "Иногда разговоры становятся слишком длинными, развязными и деликатными и начинают раздражать посетителей общественных мест. В таком случае обсуждение перенаправляется в гильдию Задний Угол. Обратите внимание, что отправка в Угол не является наказанием в полном смысле слова. Фактически, многие граждане страны Habitica любят потусоваться там и поразглагольствовать.", "commGuidePara039": "В гильдии Задний Угол любой может свободно обсуждать любые темы и сколько угодно долго. Это место тщательно модерируется. Все Правила и Условия, а также Публичные Инструкции работают здесь как и в любом другом месте. То, что мы носим длинные плащи и кучкуемся за углом, еще не говорит о том, что всё дозволено! А теперь передайте мне эту тусклую свечу, будьте любезны.", "commGuideHeadingTrello": "Доски Trello", - "commGuidePara040": "Trello служит открытым форумом для предложений и обсуждений возможностей сайта. Habitica управляется ее народом в форме совместного участия -- все мы создаем этот сайт вместе. Trello - это система, которая позволяет нам излить все свои мысли. Исходя из этого, постарайтесь умещать все свои мысли в один комментарий, не нужно много раз комментировать одну и ту же карточку. Если Вам в голову пришло что-то новое, не стесняйтесь редактировать свои старые комментарии. Пожалуйста, пожалейте тех, кому приходят оповещения о каждом новом комментарии. Наши почтовые ящики от этого чудом не ломятся.", + "commGuidePara040": "Trello служит открытым форумом для предложений и обсуждений возможностей сайта. Habitica управляется ее народом в форме совместного участия – все мы создаем этот сайт вместе. Trello – это система, которая позволяет нам излить все свои мысли. Исходя из этого, постарайтесь умещать все свои мысли в один комментарий, не нужно много раз комментировать одну и ту же карточку. Если Вам в голову пришло что-то новое, не стесняйтесь редактировать свои старые комментарии. Пожалуйста, пожалейте тех, кому приходят оповещения о каждом новом комментарии. Наши почтовые ящики от этого чудом не ломятся.", "commGuidePara041": "HabitRPG использует пять разных досок Trello:", - "commGuideList03A": "Главная доска - это место для просьб о новых функциях сайта и голосования по ним.", - "commGuideList03B": "Мобильная доска - это место для просьб о новых функциях мобильного приложения и голосования по ним.", - "commGuideList03C": "Доска пиксель арта - это место для обсуждения и размещения вашей пиксельной графики.", - "commGuideList03D": "Доска квестов - это место для обсуждения и предложения квестов.", - "commGuideList03E": "Wiki-доска - это место для улучшения, обсуждения и запроса нового контента wiki.", + "commGuideList03A": "Главная доска – это место для просьб о новых функциях сайта и голосования по ним.", + "commGuideList03B": "Мобильная доска – это место для просьб о новых функциях мобильного приложения и голосования по ним.", + "commGuideList03C": "Доска пиксель арта – это место для обсуждения и размещения вашей пиксельной графики.", + "commGuideList03D": "Доска квестов – это место для обсуждения и предложения квестов.", + "commGuideList03E": "Wiki-доска – это место для улучшения, обсуждения и запроса нового контента wiki.", "commGuidePara042": "Всем изложены основные принципы и правила поведения в общественных местах. Пользователи не должны отклоняться от темы на любой доске или карточке. Поверьте на слово, там и так базар-вокзал! Затянувшиеся обсуждения должны быть перенесены в Задний Угол.", "commGuideHeadingGitHub": "GitHub", - "commGuidePara043": "HabitRPG использует GitHub для отслеживания багов и доработки кода. Это своего рода кузница, где неутомимые Кузнецы куют новый функционал! Здесь действуют все правила поведения в публичных местах. Будьте вежливы с Кузнецами - у них очень много работы по поддержанию сайта! Ура, Кузнецам!", + "commGuidePara043": "HabitRPG использует GitHub для отслеживания багов и доработки кода. Это своего рода кузница, где неутомимые Кузнецы куют новый функционал! Здесь действуют все правила поведения в публичных местах. Будьте вежливы с Кузнецами – у них очень много работы по поддержанию сайта! Ура, Кузнецам!", "commGuidePara044": "Пользователи, которые являются членами репозитория HabitRPG:", "commGuideHeadingWiki": "Wiki", "commGuidePara045": "HabitRPG wiki собирает информацию об этом сайте. Также там размещаются несколько форумов аналогичных форумам гильдий в HabitRPG. Следовательно, здесь также действуют все правила поведения в Публичных местах.", "commGuidePara046": "Wiki HabitRPG может рассматриваться, как единая база данных всех вещей, которые существуют в HabitRPG. Она обеспечивает информацию о функционале сайта, руководства по игре, советы о том, как вы можете внести вклад в HabitRPG, а также дает вам возможность продвигать вашу гильдию или партию, и участвовать в опросах.", "commGuidePara047": "Так как хостинг для wiki обеспечивается сервисом Wikia, то условия использования сервиса Wika также обязательные к соблюдению в дополнение к правилам действующим в HabitRPG и в wiki HabitRPG.", "commGuidePara048": "Вики — это прежде всего сотрудничество между всеми ее редакторами, поэтому вот некоторые дополнительные правила:", - "commGuideList04A": "Чтобы открыть новую страницу или кардинально изменить старую - оставьте запрос на доске Wiki Trello.", + "commGuideList04A": "Чтобы открыть новую страницу или кардинально изменить старую – оставьте запрос на доске Wiki Trello.", "commGuideList04B": "Будьте готовы принять мнения других людей по поводу вашего редакторского труда.", "commGuideList04C": "Обсуждение любого спорного вопроса по редактированию конкретной страницы должно проходить на специальной странице обсуждений для этой самой страницы.", "commGuideList04D": "Любой нерешенный естественным путем вопрос предоставляется на рассмотрение вики-администраторам.", @@ -135,11 +135,11 @@ "commGuideList11D": "Удаления (Модератор/Сотрудники могут удалить проблемный контент)", "commGuideList11E": "Правки (Модераторы/Сотрудники могут редактировать проблемный контент)", "commGuideHeadingRestoration": "Восстановление", - "commGuidePara061": "Habitica - это страна самосовершенствования и здесь верят во второй шанс. Если Вы совершили нарушение и получили наказание, воспринимайте это как второй шанс осознать свои поступки и улучшить свое положение в сообществе.", + "commGuidePara061": "Habitica – это страна самосовершенствования и здесь верят во второй шанс. Если Вы совершили нарушение и получили наказание, воспринимайте это как второй шанс осознать свои поступки и улучшить свое положение в сообществе.", "commGuidePara062": "Последствия Ваших нарушений разъясняются Вам через email или через сообщение от модератора или админа (в случае мелких нарушений). Примите наложенные на Вас ограничения и прилагайте усилия, чтобы Вам простили ваши огрехи.", "commGuidePara063": "Если Вы не понимаете последствий ваших действий или природу нарушений, попросите модераторов или админов вам это разъяснить, дабы не нарушать в будущем.", "commGuideHeadingContributing": "Вклад в развитие страны Habitica", - "commGuidePara064": "HabitRPG - это открытый проект, что означает возможность любому участнику внести свой вклад! Те, кто хорошо с этим справляются, получают вознаграждение в соответствии с рангом:", + "commGuidePara064": "HabitRPG – это открытый проект, что означает возможность любому участнику внести свой вклад! Те, кто хорошо с этим справляются, получают вознаграждение в соответствии с рангом:", "commGuideList12A": "Значок участника HabitRPG, плюс 3 самоцвета", "commGuideList12B": "Броня участника HabitRPG, плюс 3 самоцвета", "commGuideList12C": "Шлем участника HabitRPG, плюс 3 самоцвета", @@ -151,10 +151,10 @@ "commGuidePara066": "О рангах участников стоит сказать несколько важных вещей:", "commGuideList13A": "Ранги присваиваются не просто так. Они устанавливаются по усмотрению модераторов. На их решение влияют разные факторы, включая их восприятие Вашей работы и ее значимости для сайта и сообщества. Мы оставляем за собой право менять специальные уровни, звания и награды по своему усмотрению.", "commGuideList13B": "Чем выше ранг, тем сложнее получить следующий. Если Вы создали одного монстра или исправили один баг, то этого может быть достаточно для присвоения Вам первого ранга участника, но не достаточно для следующего. Как и в любой хорошей RPG при повышении уровня повышается и сложность!", - "commGuideList13C": "Ранги - общее понятие, присвоение ранга не зависит от той сферы, в которой участник оставил свой вклад. Для оценки сложности мы смотрим на все Ваши заслуги, чтобы люди, которые сначала что-то нарисовали, потом пофиксили маленький баг, а затем написали пару строк в вики, не развивались быстрее, чем те, которые долго работают в одном деле. Так достигается справедливость!", + "commGuideList13C": "Ранги – общее понятие, присвоение ранга не зависит от той сферы, в которой участник оставил свой вклад. Для оценки сложности мы смотрим на все Ваши заслуги, чтобы люди, которые сначала что-то нарисовали, потом пофиксили маленький баг, а затем написали пару строк в вики, не развивались быстрее, чем те, которые долго работают в одном деле. Так достигается справедливость!", "commGuideList13D": "Пользователи на испытательном сроке не могут быть подняты в ранге. Модераторы имеют право замораживать достижения пользователя из-за его нарушений. В этом случае пользователя оповестят о принятом решении и о том, как исправить положение. Ранг может быть и вовсе снят благодаря нарушениям и испытательному сроку.", "commGuideHeadingFinal": "Заключительный раздел", - "commGuidePara067": "Вот ты и прочел это, храбрый житель страны Habitica - Руководство по использованию сообщества! Утри этот пот со своих бровей и вознагради себя опытом за то, что прочел все от начала и до конца. Если у тебя есть любые вопросы или беспокойства насчет Руководства по использованию сообщества, то пожалуйста напиши письмо Lemoness (leslie@habitrpg.com) и она будет рада помочь тебе их прояснить.", + "commGuidePara067": "Вот ты и прочел это, храбрый житель страны Habitica – Руководство по использованию сообщества! Утри этот пот со своих бровей и вознагради себя опытом за то, что прочел все от начала и до конца. Если у тебя есть любые вопросы или беспокойства насчет Руководства по использованию сообщества, то пожалуйста напиши письмо Lemoness (leslie@habitrpg.com) и она будет рада помочь тебе их прояснить.", "commGuidePara068": "А сейчас вперёд, храбрый искатель приключений, повергни несколько Ежедневных заданий!", "commGuideHeadingLinks": "Полезные ссылки", "commGuidePara069": "Ниже приведены имена талантливых художников, участвовавших в создании иллюстраций к данной статье", diff --git a/common/locales/ru/content.json b/common/locales/ru/content.json index 4f6974ef7b..546a3bb2d2 100644 --- a/common/locales/ru/content.json +++ b/common/locales/ru/content.json @@ -1,6 +1,10 @@ { "potionText": "Эликсир здоровья", "potionNotes": "Восстанавливает 15 здоровья (мгновенно)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Волк", "dropEggWolfAdjective": "преданный", "dropEggTigerCubText": "Тигренок", diff --git a/common/locales/ru/contrib.json b/common/locales/ru/contrib.json index e31910b9be..8eb91ed65d 100644 --- a/common/locales/ru/contrib.json +++ b/common/locales/ru/contrib.json @@ -7,7 +7,7 @@ "eliteFourth": "Когда будет принят ваш четвертый вклад, в лавке наград вам станет доступен для покупки хрустальный меч. В качестве вознаграждения за ваши труды вы также получите 4 самоцвета.", "champion": "Подвижник", "championFifth": "Когда ваш пятый вклад будет принят, вам станет доступен для покупки в лавке наград хрустальный щит. В качестве вознаграждения за продолжение работы вы также получите 4 самоцвета.", - "championSixth": "Когда ваш шестой вклад будет принят, вы получите нового питомца - Гидру. Также вы получите 4 самоцвета.", + "championSixth": "Когда ваш шестой вклад будет принят, вы получите нового питомца – Гидру. Также вы получите 4 самоцвета.", "legendary": "Легенда", "legSeventh": "Когда ваш седьмой вклад будет принят, вы получите 4 самоцвета и станете членом почетной Гильдии участников, т.е. будете допущены в закулисье HabitRPG! Дальнейший вклад не будет увеличивать ваш ранг, но вы можете продолжить получать в дар самоцветы и титулы.", "moderator": "Модератор", diff --git a/common/locales/ru/defaulttasks.json b/common/locales/ru/defaulttasks.json index e9e21c86c5..0cba6eac14 100644 --- a/common/locales/ru/defaulttasks.json +++ b/common/locales/ru/defaulttasks.json @@ -2,7 +2,7 @@ "defaultHabit1Text": "Полезная привычка", "defaultHabit1Notes": "Примеры полезных привычек: + Съесть овощ +15 минут полезной работы", "defaultHabit2Text": "Вредная привычка", - "defaultHabit2Notes": "Примеры вредных привычек: - Курить - Прокрастинировать", + "defaultHabit2Notes": "Примеры вредных привычек: – Курить – Прокрастинировать", "defaultHabit3Text": "Полезная или вредная привычка", "defaultHabit3Notes": "Примеры полезных или вредных привычек: +/- Подняться по лестнице/поехать на лифте; +/- Выпить воду/газировку", "defaultDaily1Text": "1 час работы над личным проектом", diff --git a/common/locales/ru/front.json b/common/locales/ru/front.json index c67902b771..33b9b2c9d7 100644 --- a/common/locales/ru/front.json +++ b/common/locales/ru/front.json @@ -3,7 +3,7 @@ "accept1Terms": "Нажимая кнопку ниже, я принимаю ", "accept2Terms": " и ", "alexandraQuote": "Не мог НЕ рассказать о HabitRPG во время выступления в Мадриде. Незаменимый инструмент для фрилансеров, кому еще нужен босс.", - "althaireQuote": "Постоянное участие в квестах мотивирует меня на выполнение всех ежедневных заданий и задач. Самый сильный стимул для меня - не подвести мою команду.", + "althaireQuote": "Постоянное участие в квестах мотивирует меня на выполнение всех ежедневных заданий и задач. Самый сильный стимул для меня – не подвести мою команду.", "andeeliaoQuote": "Супер! Только начал несколько дней назад и уже более сознательно и продуктивно отношусь к моему времени!", "autumnesquirrelQuote": "Я меньше откладываю на потом на работе и дома и вовремя плачу по счетам.", "businessSample1": "Подтвердить 1 стр. инвентаря", @@ -33,12 +33,12 @@ "companyTerms": "Условия использования", "companyVideos": "Видео", "contribUse": "Участники, помогающие развитию HabitRPG, используют", - "dragonsilverQuote": "Не могу сказать вам, сколько планировщиков времени и задач я испробовал за десятилетия... HRPG - единственная система из тех, что я использовал, которая действительно помогает мне выполнять задачи, а не просто вносить их в список дел.", + "dragonsilverQuote": "Не могу сказать вам, сколько планировщиков времени и задач я испробовал за десятилетия... HRPG – единственная система из тех, что я использовал, которая действительно помогает мне выполнять задачи, а не просто вносить их в список дел.", "dreimQuote": "Когда я открыл для себя HabitRPG прошлым летом, я только что провалил где-то половину своих экзаменов. Благодаря ежедневным заданиям… я смог организовать и дисциплинировать себя и месяц назад все-таки сдал все экзамены с хорошими оценками.", "elmiQuote": "Каждое утро я встаю в нетерпении, предвкушая, что смогу заработать немного золота!", "email": "Email", "emailNewPass": "Отправить новый пароль по Email", - "evagantzQuote": "Мой первый прием у дантиста, когда ассистент - специалист по гигиене полости рта - был поражен результаты моей привычки пользоваться зубной нитью. Спасибо Habitrpg!", + "evagantzQuote": "Мой первый прием у дантиста, когда ассистент - специалист по гигиене полости рта – был поражен результаты моей привычки пользоваться зубной нитью. Спасибо Habitrpg!", "examplesHeading": "Игроки используют HabitRPG, чтобы организовывать работу...", "featureAchievementByline": "Делаете что-то по-настоящему потрясающе? Получите значок и похвастайтесь им!", "featureAchievementHeading": "Значки достижений", @@ -75,7 +75,7 @@ "invalidEmail": "Для изменения пароля необходимо указать существующий адрес электронной почты.", "irishfeet123Quote": "У меня была ужасная привычка после еды повсюду оставлять посуду. HabitRPG меня от этого полностью избавила!", "joinOthers": "Присоединяйтесь к 200.000 человек, превращающим движение к цели в развлечение!", - "kazuiQuote": "До HabitRPG я никак не продвигался с диссертацией. Кроме того, вызывала недовольство моя недисциплинированность в отношении работы по дому и таких задач, как изучение новых слов и обучение игре Го. Оказывается, разбивка этих задач на контрольные списки небольших заданий - как раз то, что нужно, чтобы сохранять мою мотивацию и постоянную работоспособность.", + "kazuiQuote": "До HabitRPG я никак не продвигался с диссертацией. Кроме того, вызывала недовольство моя недисциплинированность в отношении работы по дому и таких задач, как изучение новых слов и обучение игре Го. Оказывается, разбивка этих задач на контрольные списки небольших заданий – как раз то, что нужно, чтобы сохранять мою мотивацию и постоянную работоспособность.", "landingadminlink": "административные пакеты,", "landingend": "Еще не уверены?", "landingend2": "Читайте более подробный список ", @@ -89,7 +89,7 @@ "landingp3header": "Последствия", "landingp4": "С помощью активного сообщества, HabitRPG стимулирует индивидуальную ответственность, которая нужна, чтобы завершать задания. Благодаря возможности создавать команды, вы можете пригласить группу своих близких друзей, которые будут поддерживать вас. Система гильдий позволяет находить людей с похожими интересами или затруднениями, чтобы вы могли делиться своими целями и обмениваться советами по решению ваших проблем. В HabitRPG сообщество — это и поддержка, и индивидуальная ответственность, которые нужны для достижения успеха.", "landingp4header": "Ответственность", - "leadText": "HabitRPG - бесплатное приложение для выработки привычек и повышения личной эффективности, которое превратит вашу жизнь в игру. Игровые награды и наказания мотивируют, а сильная социальная составляющая вдохновляет – благодаря этому HabitRPG поможет вам стать здоровым, трудолюбивым и счастливым.", + "leadText": "HabitRPG – бесплатное приложение для выработки привычек и повышения личной эффективности, которое превратит вашу жизнь в игру. Игровые награды и наказания мотивируют, а сильная социальная составляющая вдохновляет – благодаря этому HabitRPG поможет вам стать здоровым, трудолюбивым и счастливым.", "login": "Вход", "loginAndReg": "Вход / Регистрация", "loginFacebookAlt": "Вход / Регистрация с помощью Facebook", diff --git a/common/locales/ru/gear.json b/common/locales/ru/gear.json index 5bf30fc062..cd202f6bc7 100644 --- a/common/locales/ru/gear.json +++ b/common/locales/ru/gear.json @@ -109,7 +109,7 @@ "weaponSpecialWinter2015HealerText": "Скипетр успокоения", "weaponSpecialWinter2015HealerNotes": "Этот скипетр согревает больные мышцы и успокаивает от стресса. Увеличивает интеллект на <%= int %>. Экипировка ограниченного выпуска зимы 2014-2015", "weaponSpecialSpring2015RogueText": "Взрывной Писк", - "weaponSpecialSpring2015RogueNotes": "Не дайте звуку обмануть вас - эта взрывчатка просто сбивает с ног. Увеличивает силу на <%= str %>. Экипировка ограниченного выпуска весны 2015.", + "weaponSpecialSpring2015RogueNotes": "Не дайте звуку обмануть вас – эта взрывчатка просто сбивает с ног. Увеличивает силу на <%= str %>. Экипировка ограниченного выпуска весны 2015.", "weaponSpecialSpring2015WarriorText": "Костяная дубина", "weaponSpecialSpring2015WarriorNotes": "Настоящая костяная дубина для настоящих яростных псов! Нет-нет, это совершенно точно не жевательная игрушка, которую Сезонная Волшебница дала вам потому что... а кто тут славный песик? Кто славный песик? Вы! Вы славный песик! Увеличивает силу на <%= str %>. Экипировка ограниченного выпуска весны 2015.", "weaponSpecialSpring2015MageText": "Волшебная палочка фокусника", @@ -117,7 +117,7 @@ "weaponSpecialSpring2015HealerText": "Кошачья Погремушка", "weaponSpecialSpring2015HealerNotes": "Стоит только взмахнуть погремушкой, и чарующий треск этой штуки займет КОГО УГОДНО очень надолго. Увеличивает интеллект на <%= int %>. Экипировка ограниченного выпуска весны 2015.", "weaponMystery201411Text": "Вилы пиршества", - "weaponMystery201411Notes": "Многофункциональные вилы - вонзайте их во врагов, или в свои любимые блюда! Преимуществ не дают. Подарок подписчикам ноября 2014.", + "weaponMystery201411Notes": "Многофункциональные вилы – вонзайте их во врагов, или в свои любимые блюда! Преимуществ не дают. Подарок подписчикам ноября 2014.", "weaponMystery201502Text": "Сверкающий крылатый посох Любви-а-также-Правды", "weaponMystery201502Notes": "Ради КРЫЛЬЕВ! Ради ЛЮБВИ! Ради ТАКЖЕ-ПРАВДЫ! Преимуществ не дает. Подарок подписчикам в феврале 2015.", "weaponMystery201505Text": "Green Knight Lance", @@ -236,7 +236,7 @@ "armorMystery201406Text": "Мантия осьминога.", "armorMystery201406Notes": "Эта гибкая мантия позволит ее носителю пролезать через мельчайшие трещины. Преимуществ не дает. Подарок подписчикам июня 2014.", "armorMystery201407Text": "Костюм исследователя морских глубин", - "armorMystery201407Notes": "Известный также, как \"хлюпкий\", \"слишком плотный\" и \"честно говоря, довольно громоздкий\", этот костюм -- лучший друг любого бесстрашного исследователя морских глубин. Преимуществ не дает. Подарок подписчикам июля 2014.", + "armorMystery201407Notes": "Известный также, как \"хлюпкий\", \"слишком плотный\" и \"честно говоря, довольно громоздкий\", этот костюм – лучший друг любого бесстрашного исследователя морских глубин. Преимуществ не дает. Подарок подписчикам июля 2014.", "armorMystery201408Text": "Солнечная Мантия", "armorMystery201408Notes": "Эта мантия соткана из золота и солнечного света. Преимуществ не дает. Подарок подписчикам августа 2014.", "armorMystery201409Text": "Жилет Странника", @@ -436,7 +436,7 @@ "shieldSpecialWinter2015HealerText": "Щит успокоения", "shieldSpecialWinter2015HealerNotes": "Этот щит отражает леденящий ветер. Увеличивает телосложение на <%= con %>. Экипировка ограниченного выпуска зимы 2014-2015.", "shieldSpecialSpring2015RogueText": "Взрывной Писк", - "shieldSpecialSpring2015RogueNotes": "Не дайте звуку обмануть вас - эта взрывчатка просто сбивает с ног. Увеличивает силу на <%= str %>. Экипировка ограниченного выпуска весны 2015.", + "shieldSpecialSpring2015RogueNotes": "Не дайте звуку обмануть вас – эта взрывчатка просто сбивает с ног. Увеличивает силу на <%= str %>. Экипировка ограниченного выпуска весны 2015.", "shieldSpecialSpring2015WarriorText": "Метательная Тарелка", "shieldSpecialSpring2015WarriorNotes": "Швырните ей во врага! Ну или оставьте себе, потому что к обеду в ней будет полно вкусного корма. Увеличивает телосложение на <%= con %>. Экипировка ограниченного выпуска весны 2015.", "shieldSpecialSpring2015HealerText": "Узорчатая подушка", diff --git a/common/locales/ru/generic.json b/common/locales/ru/generic.json index 51606b0017..9c07450249 100644 --- a/common/locales/ru/generic.json +++ b/common/locales/ru/generic.json @@ -67,7 +67,7 @@ "costumeContest": "Конкурс костюмов 2014", "costumeContestText": "Участвовал в Костюмированном Фестивале на Хэллоуине 2014. Вы можете увидеть некоторые из записей в blog.habitrpg.com/tagged/cosplay!", "memberSince": " - Участник с ", - "lastLoggedIn": " - Последний вход", + "lastLoggedIn": "- Последний вход", "notPorted": "Эта функция еще не перенесена со старого сайта.", "buyThis": "Купить <%= text %> за <%= price %> из ваших <%= gems %> самоцветов?", "untilNoFace": "Пока мы не добавим Facebook, используйте ваш UUID и API Token для входа (смотрите https://habitrpg.com > Опции > Настройки).", diff --git a/common/locales/ru/limited.json b/common/locales/ru/limited.json index 639e252eed..8dca3d250f 100644 --- a/common/locales/ru/limited.json +++ b/common/locales/ru/limited.json @@ -3,17 +3,17 @@ "seasonalEdition": "Сезонный выпуск", "winterColors": "Зимние цвета", "annoyingFriends": "Вредные друзья", - "annoyingFriendsText": "Прилетело снежков в спину от членов команды: <%= snowballs %>.", + "annoyingFriendsText": "Прилетело снежков от членов команды: <%= snowballs %>.", "alarmingFriends": "Пугающие друзья", - "alarmingFriendsText": "Напуган членами команды <%= spookDust %> раз.", + "alarmingFriendsText": "Напуган членами команды <%= spookDust %> раз(а).", "agriculturalFriends": "Сельскохозяйственные друзья", - "agriculturalFriendsText": "Превращен в цветок членами команды <%= seeds %> раз.", + "agriculturalFriendsText": "Превращен в цветок членами команды <%= seeds %> раз(а).", "valentineCard": "Валентинка", "valentineCardNotes": "Отправьте валентинку члену команды.", - "valentine0": "Розы красны <%= lineBreak %> \"Ежедневные\" сини.<%= lineBreak %>Тем, кто со мною в команде, - <%= lineBreak %>Спасибо!", - "valentine1": "Розы алеют, <%= lineBreak %> Белеет сирень<%= lineBreak %>Вместе поборем<%= lineBreak %>Пороки и лень!", - "valentine2": "Розы красны. <%= lineBreak %>Этот старый куплет,<%= lineBreak %>Надеюсь, оценишь - <%= lineBreak %>Он стоил десять монет!", - "valentine3": "Розы красны,<%= lineBreak %>Синь Дракон Ледяной,<%= lineBreak %>Нет лучше сокровищ,<%= lineBreak %>Чем время с тобой!", + "valentine0": "«Розы ярко-алые,<%= lineBreak %>А мои задачи – синие,<%= lineBreak %>Мы друзья в команде славные –<%= lineBreak %>Вот такое мое мнение!»", + "valentine1": "«Розы алеют,<%= lineBreak %>Белеет сирень,<%= lineBreak %>Вместе поборем<%= lineBreak %>Пороки и лень!»", + "valentine2": "«Розы алеют –<%= lineBreak %>Это старый куплет<%= lineBreak %>Надеюсь, оценишь –<%= lineBreak %>Он стоит десять монет!»", + "valentine3": "«Розы алеют,<%= lineBreak %>Синь Дракон Ледяной,<%= lineBreak %>Нет лучше сокровищ,<%= lineBreak %>Чем время с тобой!»", "adoringFriends": "Любимые друзья", "adoringFriendsText": "Вы так внимательны друг к другу! Отправлено и получено валентинок: <%= cards %>.", "polarBear": "Белый медведь", @@ -25,9 +25,9 @@ "seasonalShopTitle": "<%= linkStart %>Сезонная Волшебница<%= linkEnd %>", "seasonalShopClosedText": "Сезонная лавка сейчас закрыта!! Я не знаю где сейчас Сезонная Чародейка, но она уж точно вернется к следующему большому празднику.", "seasonalShopText": "Добро пожаловать в Сезонную лавку! Сейчас мы предлагаем товары весеннего сезонного выпуска. Товары будут доступны ежегодно в дни Весенней Веселухи, но мы открыты только до 30 апреля, так что спешите закупиться сейчас, иначе придется ждать целый год!", - "seasonalShopRebirth": "Использовав шар возрождения, вы сможете повторно купить это снаряжение в колонке наград после того, как разблокируете лавку предметов. Изначально вы сможете купить только предметы для вашего текущего класса (класс по умолчанию - воин), но не волнуйтесь: после смены класса вам станут доступны другие классовые предметы.", + "seasonalShopRebirth": "Использовав шар возрождения, вы сможете повторно купить это снаряжение в колонке наград после того, как разблокируете лавку предметов. Изначально вы сможете купить только предметы для вашего текущего класса (класс по умолчанию – воин), но не волнуйтесь: после смены класса вам станут доступны другие классовые предметы.", "candycaneSet": "Карамельная палочка (Маг)", - "skiSet": "Лыжник-ассасин (Жулик)", + "skiSet": "Лыжник-ассасин (Разбойник)", "snowflakeSet": "Снежинка (Знахарь)", "yetiSet": "Укротитель Йети (Воин)", "nyeCard": "Новогодняя открытка", diff --git a/common/locales/ru/npc.json b/common/locales/ru/npc.json index dd606fd809..998b012974 100644 --- a/common/locales/ru/npc.json +++ b/common/locales/ru/npc.json @@ -47,7 +47,7 @@ "tourStatsPage": "Это страница характеристик. Достижения можно заработать, выполняя задания из списка.", "tourTavernPage": "Welcome to the Tavern, an all-ages chatroom! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Rest in the Inn.\" Come say hi!", "tourPartyPage": "Команда поможет вам быть ответственней. Пригласите друзей, чтобы разблокировать свиток квеста.", - "tourGuildsPage": "Гильдии - это группы для общения по интересам. Выбирайте тематики, которые вас интересуют. Рекомендуем изучить Гильдию новичков.", + "tourGuildsPage": "Гильдии – это группы для общения по интересам. Выбирайте тематики, которые вас интересуют. Рекомендуем изучить Гильдию новичков.", "tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win gem prizes!", "tourMarketPage": "Начиная с уровня 4, после завершения заданий вы можете получить случайным образом выпавшее яйцо или инкубационный эликсир. Используйте их для того, чтобы вырастить питомцев! Также эти предметы можно купить на рынке." } \ No newline at end of file diff --git a/common/locales/ru/pets.json b/common/locales/ru/pets.json index 10e50497ba..dd9f9f2ad1 100644 --- a/common/locales/ru/pets.json +++ b/common/locales/ru/pets.json @@ -56,8 +56,8 @@ "petKeyBegin": "Ключ от Вольеров: поборитесь за звание <%= title %> ещё раз!", "petKeyInfo": "Пропал восторг от собирания питомцев? Теперь вы можете отпустить их и вновь привнести смысл в получение предметов!", "petKeyInfo2": "Используйте Ключ от Вольеров, чтобы сбросить количество ваших неквестовых питомцев и/или скакунов до нуля. (Квестовые и Редкие питомцы и скакуны не сбрасываются)", - "petKeyInfo3": "Существует три разных Ключа от Вольеров, которые позволяют: выпустить только питомцев (за 4 самоцвета), выпустить только скакунов (за 4 самоцвета) или выпустить и питомцев, и скакунов одновременно (за 6 самоцветов). Использование ключа позволит вам повторить достижения Властелин зверей и Повелитель скакунов. Для того, чтобы повторить достижение Тройное Бинго, используйте ключ \"Освободить и питомцев, и скакунов\", и соберите все 90 питомцев во второй раз. Покажите миру, что Вы - настоящий мастер - коллекционер! Но принимайте решение мудро: открыв вольеры или стойла, вы уже не сможете вернуть своих питомцев кроме, как собрав их всех заново...", - "petKeyInfo4": "Существует три разных Ключа от Вольеров, которые позволяют: выпустить только питомцев (за 4 самоцвета), выпустить только скакунов (за 4 самоцвета) или выпустить и питомцев, и скакунов одновременно. Использование ключа позволит вам повторить достижения Властелин зверей и Повелитель скакунов. Для того, чтобы повторить достижение Тройное Бинго, используйте ключ \"Освободить и питомцев, и скакунов\", и соберите все 90 питомцев во второй раз. Покажите миру, что Вы - настоящий мастер - коллекционер! Но принимайте решение мудро: открыв вольеры или стойла, вы уже не сможете вернуть своих питомцев кроме, как собрав их всех заново...", + "petKeyInfo3": "Существует три разных Ключа от Вольеров, которые позволяют: выпустить только питомцев (за 4 самоцвета), выпустить только скакунов (за 4 самоцвета) или выпустить и питомцев, и скакунов одновременно (за 6 самоцветов). Использование ключа позволит вам повторить достижения Властелин зверей и Повелитель скакунов. Для того, чтобы повторить достижение Тройное Бинго, используйте ключ \"Освободить и питомцев, и скакунов\", и соберите все 90 питомцев во второй раз. Покажите миру, что Вы – настоящий мастер - коллекционер! Но принимайте решение мудро: открыв вольеры или стойла, вы уже не сможете вернуть своих питомцев кроме, как собрав их всех заново...", + "petKeyInfo4": "Существует три разных Ключа от Вольеров, которые позволяют: выпустить только питомцев (за 4 самоцвета), выпустить только скакунов (за 4 самоцвета) или выпустить и питомцев, и скакунов одновременно. Использование ключа позволит вам повторить достижения Властелин зверей и Повелитель скакунов. Для того, чтобы повторить достижение Тройное Бинго, используйте ключ \"Освободить и питомцев, и скакунов\", и соберите все 90 питомцев во второй раз. Покажите миру, что Вы – настоящий мастер - коллекционер! Но принимайте решение мудро: открыв вольеры или стойла, вы уже не сможете вернуть своих питомцев кроме, как собрав их всех заново...", "petKeyPets": "Освободить моих питомцев", "petKeyMounts": "Освободить моих скакунов", "petKeyBoth": "Освободить всех", diff --git a/common/locales/ru/questscontent.json b/common/locales/ru/questscontent.json index 45911ad747..6f5b01a5d5 100644 --- a/common/locales/ru/questscontent.json +++ b/common/locales/ru/questscontent.json @@ -54,7 +54,7 @@ "questRoosterUnlockText": "Позволяет покупать на рынке петуха в яйце.", "questSpiderText": "Ледяной Арахнид", "questSpiderNotes": "На улице становится все прохладнее, аккуратный морозец уже украшает инеевыми узорами окна Хаббитанцев... Кроме @Arcosine, чьи окна полностью заморожены Ледяным Пауком, который обосновался в его доме. О, Господи.", - "questSpiderCompletion": "Ледяной паук рассыпается на кусочки, оставляя за собой небольшую кучку снежинок и несколько зачарованных яиц. @Arcosine поспешно предлагает вам их в качестве награды - возможно, вы сможете самостоятельно вырастить немного неопасных пауков в качестве своих питомцев?", + "questSpiderCompletion": "Ледяной паук рассыпается на кусочки, оставляя за собой небольшую кучку снежинок и несколько зачарованных яиц. @Arcosine поспешно предлагает вам их в качестве награды – возможно, вы сможете самостоятельно вырастить немного неопасных пауков в качестве своих питомцев?", "questSpiderBoss": "Паук", "questSpiderDropSpiderEgg": "Паук (яйцо)", "questSpiderUnlockText": "Позволяет покупать на рынке паука в яйце.", @@ -74,16 +74,16 @@ "questVice3DropDragonEgg": "Дракон (яйцо)", "questVice3DropShadeHatchingPotion": "Сумрачный инкубационный эликсир", "questMoonstone1Text": "Ожерелье Лунных камней", - "questMoonstone1Notes": "

Страшная болезнь поразила Хаббитанцев. Давно забытые плохие Привычки растут с удвоенной силой. Тарелки лежат немытые, учебники не прочитаны и прокрастинация достигает угрожающего размаха!


Вы проследили, как некоторые из ваших плохих привычек вернулись на Болота Застоя и обнаружили виновника: призрачная Некромантша, Рецидивина. Вы ринулись вперед, размахивая оружием, но они их удары не причиняют призраку вреда.


\"Не беспокоить\", - прошипела она с сухим треском. \"Без ожеоелья лунных камней, ничто не может причинить мне вред, а мастер-ювелир @aurakami давно разбросал все лунные камни по Хаббитике!\" Задыхаясь, вы отступаете... но вы знаете, что нужно сделать.

", + "questMoonstone1Notes": "

Страшная болезнь поразила Хаббитанцев. Давно забытые плохие Привычки растут с удвоенной силой. Тарелки лежат немытые, учебники не прочитаны и прокрастинация достигает угрожающего размаха!


Вы проследили, как некоторые из ваших плохих привычек вернулись на Болота Застоя и обнаружили виновника: призрачная Некромантша, Рецидивина. Вы ринулись вперед, размахивая оружием, но они их удары не причиняют призраку вреда.


\"Не беспокоить\", – прошипела она с сухим треском. \"Без ожеоелья лунных камней, ничто не может причинить мне вред, а мастер-ювелир @aurakami давно разбросал все лунные камни по Хаббитике!\" Задыхаясь, вы отступаете... но вы знаете, что нужно сделать.

", "questMoonstone1CollectMoonstone": "Лунные камни", "questMoonstone1DropMoonstone2Quest": "Ожерелье лунных камней, часть 2: Некромант Рецидивина (Свиток)", "questMoonstone2Text": "Некромант Рецидивина", - "questMoonstone2Notes": "

Отважный оружейник @Inventrix помог вам сковать зачарованные лунные камни в ожерелье. Теперь вы готовы противостоять Рецидивине, но как только вы зашли в Болота Застоя, страшный холод окутал вас.


Гнилое дыхание прошептало вам на ухо. \"Вернулся? Какая прелесть...\" Вы попятились и сделали выпод, под светом ожерелья лунных камней, ваше оружие поразило твердую плоть. \"Вы еще призовете меня обратно в мир\", - огрызнулась Рецидивина, - \"но сейчас твое время распрощаться с ним!\"

", + "questMoonstone2Notes": "

Отважный оружейник @Inventrix помог вам сковать зачарованные лунные камни в ожерелье. Теперь вы готовы противостоять Рецидивине, но как только вы зашли в Болота Застоя, страшный холод окутал вас.


Гнилое дыхание прошептало вам на ухо. \"Вернулся? Какая прелесть...\" Вы попятились и сделали выпод, под светом ожерелья лунных камней, ваше оружие поразило твердую плоть. \"Вы еще призовете меня обратно в мир\", – огрызнулась Рецидивина, – \"но сейчас твое время распрощаться с ним!\"

", "questMoonstone2Boss": "Некромант", "questMoonstone2DropMoonstone3Quest": "Ожерелье лунных камней, часть 3: Рецидивина трансформировалась (Свиток)", "questMoonstone3Text": "Рецидивина трансформировалась", - "questMoonstone3Notes": "

Рецидивина упала на землю, и вы ударили ее ожерельем лунным камней. К вашему ужасу Рецидивина схватила самоцветы, ее взгляд наполнился торжеством.


\"Глупое создание из плоти!\"- закричала она. \"Эти лунные камни восстановят физическую оболочку, правда, не так, как ты себе представляешь. Как только полная луна появится из темноты - это наполнит меня силой. Из теней я призываю призрак твоего самого страшного врага!\"


Болезненный зеленый туман поднимается из болота, и тело Рецидивины содрогается, принимая форму, которая поднимает в вас волну ужаса, - неживое тело Вайса, ужасного возрожденного.

", - "questMoonstone3Completion": "

Вам становится сложнее дышать, пот щиплет глаза, когда умирает восставший Змей. Остатки Рецидивины рассеиваются в прозрачный серый туман, который быстро уносит освежающий ветерок. Вы слышите отдаленные восторженные крики Хаббитанцев, которые победили свои вредные Привычки раз и навсегда.


@Baconsaur Повелитель зверей приземляется на грифоне. \"Я видел конец вашей битвы с неба, и я был глубоко тронут. Пожалуйста, примите эту зачарованную тунику - ваша храбрость говорит о благородном сердце, и я верю, что вы должны получить ее\".

", + "questMoonstone3Notes": "

Рецидивина упала на землю, и вы ударили ее ожерельем лунным камней. К вашему ужасу Рецидивина схватила самоцветы, ее взгляд наполнился торжеством.


\"Глупое создание из плоти!\" – закричала она. \"Эти лунные камни восстановят физическую оболочку, правда, не так, как ты себе представляешь. Как только полная луна появится из темноты – это наполнит меня силой. Из теней я призываю призрак твоего самого страшного врага!\"


Болезненный зеленый туман поднимается из болота, и тело Рецидивины содрогается, принимая форму, которая поднимает в вас волну ужаса, – неживое тело Вайса, ужасного возрожденного.

", + "questMoonstone3Completion": "

Вам становится сложнее дышать, пот щиплет глаза, когда умирает восставший Змей. Остатки Рецидивины рассеиваются в прозрачный серый туман, который быстро уносит освежающий ветерок. Вы слышите отдаленные восторженные крики Хаббитанцев, которые победили свои вредные Привычки раз и навсегда.


@Baconsaur Повелитель зверей приземляется на грифоне. \"Я видел конец вашей битвы с неба, и я был глубоко тронут. Пожалуйста, примите эту зачарованную тунику – ваша храбрость говорит о благородном сердце, и я верю, что вы должны получить ее\".

", "questMoonstone3Boss": "Некро-Вайс", "questMoonstone3DropRottenMeat": "Тухлое мясо (еда)", "questMoonstone3DropZombiePotion": "Зомби Инкубационный эликсир", @@ -96,8 +96,8 @@ "questGoldenknight2Boss": "Золотой Рыцарь", "questGoldenknight2DropGoldenknight3Quest": "Золотой Рыцарь, часть 3: Железный Рыцарь (Свиток)", "questGoldenknight3Text": "Железный Рыцарь", - "questGoldenknight3Notes": "

@Jon Arinbjorn пытается привлечь ваше внимание. После битвы новая фигура предстает пред вашим взором. Это закованный в черную сталь рыцарь с обнаженным мечом в руке. И он медленно приближается. \"Нет, отец!\"- кричит ему Золотой Рыцарь, но без толку - новый противник движется вперед. \n\"Прости меня, герой,- сокрушенно говорит Золотой Рыцарь,- я не осознавала, что обратила свои добрые помыслы в жестокость. Но пред тобой мой отец - рыцарь с самым черным и жестоким сердцем. Если ты не сразишь его, то все мы обречены! Вот! Возьми мой верный моргенштерн и победи Железного Рыцаря!\"

", - "questGoldenknight3Completion": "

С лязгом и звоном Железный Рыцарь падает на колени. \"Ты силён,- выдыхает он,- я сражен и унижен.\" Золотой Рыцарь приближается к вам. \"Благодарю тебя, герой. Мы извлекли урок из этих событий. Я переговорю с отцом. И, возможно, нам стоит принести свои извинения обитателям страны Habitica.\" Золотой Рыцарь на мгновение задумывается и принимает решение. \"Возьми мой моргенштерн. Он служил мне верой и правдой, так пусть же теперь у него будет более достойный владелец!\"

", + "questGoldenknight3Notes": "

@Jon Arinbjorn пытается привлечь ваше внимание. После битвы новая фигура предстает пред вашим взором. Это закованный в черную сталь рыцарь с обнаженным мечом в руке. И он медленно приближается. \"Нет, отец!\" – кричит ему Золотой Рыцарь, но без толку – новый противник движется вперед. \n\"Прости меня, герой, – сокрушенно говорит Золотой Рыцарь, – я не осознавала, что обратила свои добрые помыслы в жестокость. Но пред тобой мой отец – рыцарь с самым черным и жестоким сердцем. Если ты не сразишь его, то все мы обречены! Вот! Возьми мой верный моргенштерн и победи Железного Рыцаря!\"

", + "questGoldenknight3Completion": "

С лязгом и звоном Железный Рыцарь падает на колени. \"Ты силён, – выдыхает он, – я сражен и унижен.\" Золотой Рыцарь приближается к вам. \"Благодарю тебя, герой. Мы извлекли урок из этих событий. Я переговорю с отцом. И, возможно, нам стоит принести свои извинения обитателям страны Habitica.\" Золотой Рыцарь на мгновение задумывается и принимает решение. \"Возьми мой моргенштерн. Он служил мне верой и правдой, так пусть же теперь у него будет более достойный владелец!\"

", "questGoldenknight3Boss": "Железный Рыцарь", "questGoldenknight3DropHoney": "Мёд (Еда)", "questGoldenknight3DropGoldenPotion": "Золотой Инкубационный эликсир", @@ -112,7 +112,7 @@ "questEggHuntCollectPlainEgg": "Неокрашенные яйца", "questEggHuntDropPlainEgg": "Неокрашенное яйцо", "questDilatoryText": "Ужасный Дракон Промедления", - "questDilatoryNotes": "

Мы были слепы к предзнаменованиям.


Иссиня-черные сверкающие глаза. Древняя чешуя. Массивные челюсти и острые зубы. Мы пробудили что-то ужасающее, что никогда не должно было покидать своей расщелины:Ужасный Дракон Промедления! Кричащие жители Habitica рассыпаются во всех направлениях, когда его извивающаяся шея длиной в десятки метров рассекает водную гладью, а дикий рёв заставляет дрожать окна близлежащих домов.


«Мы должны положить конец Промедлению!», — кричит Lemoness. «Именно откладываемые задачи и красные ежедневные задания привлекли его внимание!»


«Он излучает магическую энергию!» — кричит @Baconsaur. «Живя так долго, он научился исцелять себя! Как мы сможем побороть его?»


Очень просто: так же, как и всех Боссов -- продуктивностью! Быстрее, Habitica, объединяйся и сражай свои задачи, вместе мы победим этого монстра. (Нет нужды бросать начатые квесты, мы уверены в ваших возможностях сражаться на двух фронтах). Он не нападет на мирных жителей, но чем больше ежедневных заданий мы пропускаем, тем больше сил он получает для Незамедлительной Атаки! И мне не нравится, как он поглядывает на Таверну...", + "questDilatoryNotes": "

Мы были слепы к предзнаменованиям.


Иссиня-черные сверкающие глаза. Древняя чешуя. Массивные челюсти и острые зубы. Мы пробудили что-то ужасающее, что никогда не должно было покидать своей расщелины:Ужасный Дракон Промедления! Кричащие жители Habitica рассыпаются во всех направлениях, когда его извивающаяся шея длиной в десятки метров рассекает водную гладью, а дикий рёв заставляет дрожать окна близлежащих домов.


«Мы должны положить конец Промедлению!», — кричит Lemoness. «Именно откладываемые задачи и красные ежедневные задания привлекли его внимание!»


«Он излучает магическую энергию!» — кричит @Baconsaur. «Живя так долго, он научился исцелять себя! Как мы сможем побороть его?»


Очень просто: так же, как и всех Боссов – продуктивностью! Быстрее, Habitica, объединяйся и сражай свои задачи, вместе мы победим этого монстра. (Нет нужды бросать начатые квесты, мы уверены в ваших возможностях сражаться на двух фронтах). Он не нападет на мирных жителей, но чем больше ежедневных заданий мы пропускаем, тем больше сил он получает для Незамедлительной Атаки! И мне не нравится, как он поглядывает на Таверну...", "questDilatoryBoss": "Ужасный Дракон Промедления", "questDilatoryBossRageTitle": "Незамедлительная атака", "questDilatoryBossRageDescription": "Как только эта полоса заполнится полностью, Ужасный Дракон Промедления обрушит свою ярость на местность Habitica.", @@ -143,18 +143,18 @@ "questAtom3DropPotion": "Простой инкубационный эликсир", "questOwlText": "Сова-Полуночник", "questOwlNotes": "В Таверне свет горит всю ночь.
Но вдруг пропал! Как тут помочь?
Как друга друг теперь найдет?
Но @Twitching уж бойцов зовет:
Сова, враг звезд, закрыла свет.
Сражайтесь! Времени ждать нет!
Сову прогоним от дверей,
Чтоб снова стала ночь светлей!\"", - "questOwlCompletion": "С рассветом прочь летит Сова,
Герои ж - на ногах едва.
Пора, пожалуй, и поспать...
Но кто гнездо принес в кровать?
Мы часто любим, как Сова,
Сидеть всю ночь и до утра.
Но тихий писк совят даст знать:
Пора заканчивать и спать.", + "questOwlCompletion": "С рассветом прочь летит Сова,
Герои ж – на ногах едва.
Пора, пожалуй, и поспать...
Но кто гнездо принес в кровать?
Мы часто любим, как Сова,
Сидеть всю ночь и до утра.
Но тихий писк совят даст знать:
Пора заканчивать и спать.", "questOwlBoss": "Сова-Полуночник", "questOwlDropOwlEgg": "Филин (яйцо)", "questOwlUnlockText": "Позволяет покупать на рынке сову в яйце.", "questPenguinText": "Птичий холод", - "questPenguinNotes": "Хотя южная часть страны Habitica и наслаждается жарким летним днем, на окрестности Жизнерадостного Озера опустился неестественный холод. И вот уже сильный морозный ветер поднимается над замерзшим побережьем. Ледяные пики как будто вырастают из земли. @Melynnrose и @Breadstrings бегут к вам.

\"Помогите!\" - восклицает @Melynnrose. \"Мы завели гигантского пингвина, чтобы он заморозил озеро и сделал из него каток, но у нас кончилась рыба, которую он ел!\"

\"Теперь он и зол и замораживает все вокруг своим ледяным дыханием!\" - вторит @Breadstrings. - \"Пожалуйста, усмирите его, пока он тут нас всех не заморозил!\" Похоже, пора помочь этому пингвину немного... остыть.", - "questPenguinCompletion": "Пингвин повержен, и лед начинает таять. Гигантский пингвин устраивается на солнышке, заглатывая целое ведро рыбы, что вы собрали. Прокатываясь вдоль озера, он слегка дует на него, создавая гладкую, сверкающую ледяную поверхность. Что за странная птица! \"Похоже, он оставил несколько яиц\", - говорит @Painter de Cluster.

@Rattify смеется. \"Может, хоть эти пингвины окажутся... с холодной головой?\"", + "questPenguinNotes": "Хотя южная часть страны Habitica и наслаждается жарким летним днем, на окрестности Жизнерадостного Озера опустился неестественный холод. И вот уже сильный морозный ветер поднимается над замерзшим побережьем. Ледяные пики как будто вырастают из земли. @Melynnrose и @Breadstrings бегут к вам.

\"Помогите!\" – восклицает @Melynnrose. \"Мы завели гигантского пингвина, чтобы он заморозил озеро и сделал из него каток, но у нас кончилась рыба, которую он ел!\"

\"Теперь он и зол и замораживает все вокруг своим ледяным дыханием!\" – вторит @Breadstrings. – \"Пожалуйста, усмирите его, пока он тут нас всех не заморозил!\" Похоже, пора помочь этому пингвину немного... остыть.", + "questPenguinCompletion": "Пингвин повержен, и лед начинает таять. Гигантский пингвин устраивается на солнышке, заглатывая целое ведро рыбы, что вы собрали. Прокатываясь вдоль озера, он слегка дует на него, создавая гладкую, сверкающую ледяную поверхность. Что за странная птица! \"Похоже, он оставил несколько яиц\", – говорит @Painter de Cluster.

@Rattify смеется. \"Может, хоть эти пингвины окажутся... с холодной головой?\"", "questPenguinBoss": "Морозный пингвин", "questPenguinDropPenguinEgg": "Пингвин (яйцо)", "questPenguinUnlockText": "Позволяет покупать на рынке пингвина в яйце.", "questStressbeastText": "Отвратительный Стрессозверь из Стойкальмских степей", - "questStressbeastNotes": "Выполняйте ежедневные задания и задачи, чтобы наносить урон Мировому боссу! Незавершенные ежедневные задания заполняют полоску Стрессового удара. Когда индикатор полностью заполнится, Мировой босс атакует неигрового персонажа. Мировой босс никогда не наносит вреда отдельным игрокам и никак не влияет на их аккаунты. Учитываются только достижения активных игроков, которые не отдыхают в Гостинице.

~*~

Первое, что мы слышим, – это шаги, напоминающие шум спасающегося бегством стада, но более медленные и грохочущие. Один за другим, жители страны Habitica выглядывают из своих домов и не находят слов, чтобы описать увиденное.

Мы все уже, конечно, видели Стрессозверей – мелких злобных существ, которые атакуют в непростое время. Но это? Эта громадина возвышается над зданиями. Лапы же существа моли бы с легкостью раздавить дракона. От его зловонного меха веет холодом, а его рык превращается в ледяной порыв, срывающий крыши домов. Монстры такой величины раньше никогда не покидали пределы старинных легенд.

«Берегитесь, жители страны Habitica! – кричит SabreCat – Забаррикадируйтесь внутри домов, это сам Ужасный Стрессозверь!»

«Этот зверь, наверняка, сделан из веков стресса», - говорит Kiwibot, крепко запирая дверь Таверны и захлопывая ставни.

«Стойкальмские степи, – говорит Lemoness мрачно – всё это время мы думали, что там все спокойно и безмятежно, но они, наверное, скрывали свой стресс где-то. Поколения спустя, он вырос в этого зверя, который сейчас вырвался на свободу и атаковал их – и нас!»

Есть только один способ отогнать Стрессозверя, Ужасного или любого другого, – и это атаковать его выполненными ежедневными заданиями и задачами! Давайте объединимся и отобьёмся от этого зловещего супостата – но убедитесь в том, что не дадите слабину, разбираясь с задачами, или же невыполненные ежедневные задания могут взбесить его настолько, что он может вскипеть и выплеснуть гнев…", + "questStressbeastNotes": "Выполняйте ежедневные задания и задачи, чтобы наносить урон Мировому боссу! Незавершенные ежедневные задания заполняют полоску Стрессового удара. Когда индикатор полностью заполнится, Мировой босс атакует неигрового персонажа. Мировой босс никогда не наносит вреда отдельным игрокам и никак не влияет на их аккаунты. Учитываются только достижения активных игроков, которые не отдыхают в Гостинице.

~*~

Первое, что мы слышим, – это шаги, напоминающие шум спасающегося бегством стада, но более медленные и грохочущие. Один за другим, жители страны Habitica выглядывают из своих домов и не находят слов, чтобы описать увиденное.

Мы все уже, конечно, видели Стрессозверей – мелких злобных существ, которые атакуют в непростое время. Но это? Эта громадина возвышается над зданиями. Лапы же существа моли бы с легкостью раздавить дракона. От его зловонного меха веет холодом, а его рык превращается в ледяной порыв, срывающий крыши домов. Монстры такой величины раньше никогда не покидали пределы старинных легенд.

«Берегитесь, жители страны Habitica! – кричит SabreCat – Забаррикадируйтесь внутри домов, это сам Ужасный Стрессозверь!»

«Этот зверь, наверняка, сделан из веков стресса», – говорит Kiwibot, крепко запирая дверь Таверны и захлопывая ставни.

«Стойкальмские степи, – говорит Lemoness мрачно – всё это время мы думали, что там все спокойно и безмятежно, но они, наверное, скрывали свой стресс где-то. Поколения спустя, он вырос в этого зверя, который сейчас вырвался на свободу и атаковал их – и нас!»

Есть только один способ отогнать Стрессозверя, Ужасного или любого другого, – и это атаковать его выполненными ежедневными заданиями и задачами! Давайте объединимся и отобьёмся от этого зловещего супостата – но убедитесь в том, что не дадите слабину, разбираясь с задачами, или же невыполненные ежедневные задания могут взбесить его настолько, что он может вскипеть и выплеснуть гнев…", "questStressbeastBoss": "Отвратительный Стрессозверь", "questStressbeastBossRageTitle": "Стресс-атака", "questStressbeastBossRageDescription": "Когда этот датчик заполнится, Отвратительный Стрессозверь выпустит на страну Habitica ярость своей стресс-атаки!", @@ -163,7 +163,7 @@ "questStressbeastBossRageStables": "`Ужасный Стрессозверь использует СТРЕССОВЫЙ УДАР!`\n\nВсплеск стресса восстанавливает здоровье Ужасного Стрессозверя!\n\nО, нет! Несмотря на все наши старания, мы упустили некоторые ежедневные задания из виду и их красный цвет привел Ужасного Стрессозверя в ярость, восполнив его здоровье! Вселяющее ужас создание бросается к Стойлам, но Мэтт, повелитель зверей, по-геройски бросается на защиту питомцев и скакунов. Стрессозверь стискивает Мэтта жесткой хваткой, но, по крайней мере, он отвлекся на какой-то момент. Скорей! Давайте держать наши ежедневные задания в порядке, чтобы победить этого монстра, пока он не атаковал вновь!", "questStressbeastBossRageBailey": "`Отвратительный Стрессозверь применяет СТРЕСС-АТАКУ!`\n\nНарастающий стресс исцеляет Отвратительного Стрессозверя!\n\nААААА!!! Наши незаверешенные ежедневные задания раздражают Стрессозверя больше обычного и он восстанавливает часть здоровья! Глашатай Бэйли раздавала горожанам указания по безопасности, но зверь схватил ее свободной рукой. Только посмотрите, как отважно она сообщает последние новости, пока Стрессозверь вращает ее по кругу... Давайте докажем, что достойны подобной смелости и сделаем все, что в наших силах, чтобы спасти наших NPC!", "questStressbeastBossRageGuide": "`Отвратительный Стрессозверь применяет СТРЕСС-АТАКУ!`\n\nНарастающий стресс исцеляет Отвратительного Стрессозверя!\n\nОсторожнее! Проводник Justin пытается отвлечь Стрессозверя, бегая вокруг его лодыжек и выкрикивая полезные советы по повышению работоспособности! Отвратительный Стрессозверь бешено топчется на месте, но похоже, мы его действительно измотали. Сомневаюсь, что ему хватит сил на очередной удар. Не сдавайтесь... скоро мы с ним разберемся!", - "questStressbeastDesperation": "`Здоровье Ужасного Стрессозверя достигает 500 тыс.! Ужасный Стрессозверь использует Отчаянную защиту!`\n\nМы почти у цели, жители страны Habitica! Благодаря усердию и выполенным ежедневным заданиям мы опустили здоровье Стрессозверя до 500 тыс.! Существо рычит и бьется в отчаянии, его ярость растет, как никогда. Бэйли и Мэтт кричат в ужасе - зверь поднял их в воздух и крутит с ужасающей скоростью, вызывая снежную бурю. Теперь наносить ему удары его гораздо сложнее.\n\nМы должны удвоить наши усилия, но не унывайте - это знак того, что Стрессозверь понимает, что вот-вот будет побежден. Не время сдаваться!", + "questStressbeastDesperation": "`Здоровье Ужасного Стрессозверя достигает 500 тыс.! Ужасный Стрессозверь использует Отчаянную защиту!`\n\nМы почти у цели, жители страны Habitica! Благодаря усердию и выполенным ежедневным заданиям мы опустили здоровье Стрессозверя до 500 тыс.! Существо рычит и бьется в отчаянии, его ярость растет, как никогда. Бэйли и Мэтт кричат в ужасе – зверь поднял их в воздух и крутит с ужасающей скоростью, вызывая снежную бурю. Теперь наносить ему удары его гораздо сложнее.\n\nМы должны удвоить наши усилия, но не унывайте – это знак того, что Стрессозверь понимает, что вот-вот будет побежден. Не время сдаваться!", "questStressbeastCompletion": "Ужасный Стрессозверь ПОБЕЖДЁН!

Мы это сделали! Издав последний вопль, Ужасный Стрессозверь рассеивается облаком снега. Снежинки, сверкая, опускаются на землю, а воодушевленные жители страны Habitica обнимаются со своими питомцами и скакунами. Наши животные и наши неигровые персонажи вновь в безопасности

Стойкальм спасён!

SabreCat мягко говорит маленькому саблезубику: «Пожалуйста, найди жителей Стойкальма и приведи их к нам». Спустя несколько часов саблезубик возвращается с группой наездников мамонтов, которые следуют за ним. Вы узнаете в первом наезднике Lady Glaciate, главу Стойкальма.

«Могущественные жители страны Habitica – говорит она – мои люди и я должны от души вас поблагодарить и принести глубочайшие извинения. Пытаясь защитить наши Степи от паники, мы стали скрытно изгонять весь наш стресс в ледяные горы. Мы даже не представляли, что за поколения он превратится в Стрессозверя, которого вы видели! Когда он вырвался на свободу, он загнал нас в ловушку в горах, в своей вотчине и стал срывать ярость на наших любимых животных». Её грустный взгляд следит за падающим снегом. «Своей глупостью мы подвергли всех опасности. Будьте уверены, что в будущем мы придем к вам при появлении проблем до того, как наши проблемы придут к вам.»

Она поворачивается туда, где @Baconsaur удобно устроился с некоторыми мамонтятами. «Мы пришли с предложением еды для ваших животных в качестве извинений за ужас, который они испытали. Также, как символ доверия, мы оставим некоторых наших питомцев и скакунов у вас. Мы уверены, что вы хорошо о них позаботитесь».", "questStressbeastCompletionChat": "`Ужасный Стрессозверь ПОБЕЖДЁН!`\n\nМы это сделали! Издав последний вопль, Ужасный Стрессозверь рассеивается облаком снега. Снежинки, сверкая, опускаются на землю, а воодушевленные жители страны Habitica обнимаются со своими питомцами и скакунами. Наши животные и наши неигровые персонажи вновь в безопасности!\n\n`Стойкальм спасён!`\n\nSabreCat мягко говорит маленькому саблезубику: «Пожалуйста, найди жителей Стойкальма и приведи их к нам». Спустя несколько часов саблезубик возвращается с группой наездников мамонтов, которые следуют за ним. Вы узнаете в первом наезднике Lady Glaciate, главу Стойкальма.\n\n«Могущественные жители страны Habitica – говорит она – мои люди и я должны от души вас поблагодарить и принести глубочайшие извинения. Пытаясь защитить наши Степи от паники, мы стали скрытно изгонять весь наш стресс в ледяные горы. Мы даже не представляли, что за поколения он превратится в Стрессозверя, которого вы видели! Когда он вырвался на свободу, он загнал нас в ловушку в горах, в своей вотчине и стал срывать ярость на наших любимых животных». Её грустный взгляд следит за падающим снегом. «Своей глупостью мы подвергли всех опасности. Будьте уверены, что в будущем мы придем к вам при появлении проблем до того, как наши проблемы придут к вам.»\n\nОна поворачивается туда, где @Baconsaur удобно устроился с некоторыми мамонтятами. «Мы пришли с предложением еды для ваших животных в качестве извинений за ужас, который они испытали. Также, как символ доверия, мы оставим некоторых наших питомцев и скакунов у вас. Мы уверены, что вы хорошо о них позаботитесь».", "questTRexText": "Король динозавров", @@ -172,7 +172,7 @@ "questTRexBoss": "Огромный Тиранозавр", "questTRexUndeadText": "Динозавра раскопали!", "questTRexUndeadNotes": "Пока древние динозавры из Стойкальмских степей разбегаются по Habit City, из Большого Музея доносится вопль ужаса. @Baconsaur кричит: \"Скелет тираннозавра в музее шевелится! Должно быть, он почуял сородичей!\" Костлявое чудище обнажает зубы и бросается, гремя костями, в вашу сторону. Как убить того, кто уже мертв? Бейте, пока он не исцелился!", - "questTRexUndeadCompletion": "Блеск в глазах тираннозавра гаснет, и он взбирается обратно на свой пьедестал. Все облегченно вздыхают. \"Смотрите! - говорит @Baconsaur. - Некоторые из окаменелых яиц теперь блестящие и новые. Может, из них кто-то вылупится?\"", + "questTRexUndeadCompletion": "Блеск в глазах тираннозавра гаснет, и он взбирается обратно на свой пьедестал. Все облегченно вздыхают. \"Смотрите! – говорит @Baconsaur. – Некоторые из окаменелых яиц теперь блестящие и новые. Может, из них кто-то вылупится?\"", "questTRexUndeadBoss": "Костяной тираннозавр", "questTRexUndeadRageTitle": "Костяное лечение", "questTRexUndeadRageDescription": "Эта полоска заполняется, когда вы не выполняете ежедневные задания. Когда полоска заполнится, Костяной тираннозавр восстановится на 30% oт своего оставшегося здоровья!", @@ -180,15 +180,15 @@ "questTRexDropTRexEgg": "Тираннозавр (яйцо)", "questTRexUnlockText": "Позволяет покупать на рынке тираннозавра в яйце.", "questRockText": "Побег от пещерного чудища", - "questRockNotes": "Пересекая с друзьями Бесцельные Горы страны Habitica, вы остановились на ночь в прекрасной пещере, усыпанной сверкающими минералами. Однако, проснувшись утром, вы обнаруживаете, что вход исчез, а пол под вами движется!

\"Гора живая!\" - кричит ваш спутник @pfeffernusse. - \"Это не кристаллы - это зубы!\"

@Painter de Cluster хватает вас за руку. \"Нужно найти другой путь наружу - не отходи от меня и не отвлекайся, иначе мы застрянем тут навечно!\"", + "questRockNotes": "Пересекая с друзьями Бесцельные Горы страны Habitica, вы остановились на ночь в прекрасной пещере, усыпанной сверкающими минералами. Однако, проснувшись утром, вы обнаруживаете, что вход исчез, а пол под вами движется!

\"Гора живая!\" – кричит ваш спутник @pfeffernusse. – \"Это не кристаллы – это зубы!\"

@Painter de Cluster хватает вас за руку. \"Нужно найти другой путь наружу – не отходи от меня и не отвлекайся, иначе мы застрянем тут навечно!\"", "questRockBoss": "Кристальный колосс", "questRockCompletion": "Благодаря усердию вы отыскали безопасный путь через живую гору. Выйдя на свет, ваш друг @intune замечает странный блеск на земле возле выхода из пещеры. Остановившись, вы подбираете небольшой камень с золотой прожилкой. Вокруг много других камней довольно необычной формы. Они похожи на... яйца?", "questRockDropRockEgg": "Камень (яйцо)", "questRockUnlockText": "Позволяет покупать на рынке камень в яйце.", "questBunnyText": "Крольчиха-убийца", - "questBunnyNotes": "Много непростых дней спустя вы достигли вершины Пика Прокрастинации и теперь стоите перед внушительными дверьми Крепости Пренебрежения. Надпись на камне гласит: \"Внутри обитает чудовище, воплощающее ваши самые большие страхи - причина вашего бездействия. Стучите и встретьтесь с ним лицом к лицу!\" Вы дрожите, представляя ужас, ожидающий внутри, и готовы вот-вот сбежать, как уже делали не раз. @Draayder удерживает вас. \"Спокойно, друг мой! Время пришло. Вы должны это сделать!\"

Вы стучите, и двери открываются внутрь. Из темноты доносится оглушительный рев. Вы обнажаете оружие.", + "questBunnyNotes": "Много непростых дней спустя вы достигли вершины Пика Прокрастинации и теперь стоите перед внушительными дверьми Крепости Пренебрежения. Надпись на камне гласит: \"Внутри обитает чудовище, воплощающее ваши самые большие страхи – причина вашего бездействия. Стучите и встретьтесь с ним лицом к лицу!\" Вы дрожите, представляя ужас, ожидающий внутри, и готовы вот-вот сбежать, как уже делали не раз. @Draayder удерживает вас. \"Спокойно, друг мой! Время пришло. Вы должны это сделать!\"

Вы стучите, и двери открываются внутрь. Из темноты доносится оглушительный рев. Вы обнажаете оружие.", "questBunnyBoss": "Крольчиха-убийца", - "questBunnyCompletion": "С последним ударом крольчиха-убийца падает навзничь. Искрящийся туман поднимается от ее тела, которое сжимается до размеров крольчонка - ничего общего с ужасным монстром, с которым вы только что сразились. Крольчиха очаровательно морщит носик и прыгает прочь, оставив несколько яиц. @Gully смеется. \"Пик Прокрастинации даже простые задачи заставляет казаться непреодолимыми. Собирайте яйца, и пойдем домой\".", + "questBunnyCompletion": "С последним ударом крольчиха-убийца падает навзничь. Искрящийся туман поднимается от ее тела, которое сжимается до размеров крольчонка – ничего общего с ужасным монстром, с которым вы только что сразились. Крольчиха очаровательно морщит носик и прыгает прочь, оставив несколько яиц. @Gully смеется. \"Пик Прокрастинации даже простые задачи заставляет казаться непреодолимыми. Собирайте яйца, и пойдем домой\".", "questBunnyDropBunnyEgg": "Кролик (яйцо)", "questBunnyUnlockText": "Позволяет покупать на рынке кролика в яйце.", "questSlimeText": "Желейный Регент", diff --git a/common/locales/sk/backgrounds.json b/common/locales/sk/backgrounds.json index 9f3223159c..d2e5ab9435 100644 --- a/common/locales/sk/backgrounds.json +++ b/common/locales/sk/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Mountain Lake", "backgroundMountainLakeNotes": "Dip your toes in a Mountain Lake.", "backgroundPagodasText": "Pagodas", - "backgroundPagodasNotes": "Climb to the top of Pagodas." + "backgroundPagodasNotes": "Climb to the top of Pagodas.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/sk/character.json b/common/locales/sk/character.json index fb1d8350b8..60ec3d5934 100644 --- a/common/locales/sk/character.json +++ b/common/locales/sk/character.json @@ -52,9 +52,11 @@ "costume": "Kostým", "costumeText": "Ak chceš radšej vyzerať inak, než vyzeráš so svojou aktuálnou bojovou výzbrojou, zaškrtni \"použiť kostým\", aby si si mohol zvoliť oblečenie, ktoré sa ti páči, no zároveň získavať bonusy za svoju najlepšiu bojovú výzbroj.", "useCostume": "Použiť kostým", - "gearAchievement": "Získal si odznak \"Najúžasnejší výstroj\" za zakúpenie najlepšieho a najdrahšieho výstroja pre svoje povolanie!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Najúžasnejší výstroj", - "ultimGearText": "Vlastní najlepšiu zbraň a brnenie.", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Level", "levelUp": "Získal si nový level!", "mana": "Mana", diff --git a/common/locales/sk/content.json b/common/locales/sk/content.json index 342f2dd80a..c419731b7a 100644 --- a/common/locales/sk/content.json +++ b/common/locales/sk/content.json @@ -1,6 +1,10 @@ { "potionText": "Elixír zdravia", "potionNotes": "Vylieči 15 bodov zdravia (okamžité použitie)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Vlk", "dropEggWolfAdjective": "verný", "dropEggTigerCubText": "Tigríček", diff --git a/common/locales/sr/backgrounds.json b/common/locales/sr/backgrounds.json index 57aee14d69..03cd18bacc 100644 --- a/common/locales/sr/backgrounds.json +++ b/common/locales/sr/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Planinsko jezero", "backgroundMountainLakeNotes": "Uživajte u lepoti planinskog jezera.", "backgroundPagodasText": "Pagode", - "backgroundPagodasNotes": "Popnite se na vrh pagode." + "backgroundPagodasNotes": "Popnite se na vrh pagode.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/sr/character.json b/common/locales/sr/character.json index a4667b1f79..1bbed76942 100644 --- a/common/locales/sr/character.json +++ b/common/locales/sr/character.json @@ -52,9 +52,11 @@ "costume": "Kostim", "costumeText": "Ako niste zadovoljni izgledom svoje opreme, izaberite „Koristi kostim“ da biste obukli kostim preko borbene opreme.", "useCostume": "Kostim", - "gearAchievement": "Osvojili ste odlikovanje „Vrhunska oprema“ jer ste obukli najjaču opremu.", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Vrhunska oprema", - "ultimGearText": "Unapredili ste oružje i oklop do maksimalnog nivoa.", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Nivo", "levelUp": "Novi nivo!", "mana": "Mana", @@ -70,7 +72,7 @@ "allocatePerPop": "Dodaj poen Opažanju", "allocateInt": "Poeni dodeljeni Inteligenciji:", "allocateIntPop": "Dodaj poen Inteligenciji", - "noMoreAllocate": "Now that you've hit level 100, you won't gain any more Attribute Points. You can continue leveling up, or start a new adventure at level 1 by using the Orb of Rebirth, now available for free in the Market.", + "noMoreAllocate": "Dostigli ste 100. nivo, i više nećete dobijati poene koje biste dodeljivali svojim osobinama. Možete i dalje da dobijate nivoe, ili da upotrebite Sferu za Reinkarnaciju, koju ćete naći na Pijaci, i da započnete novu avanturu od 1. nivoa.", "stats": "Karakteristike", "strength": "Snaga", "strengthText": "Snaga povećava šansu da zadate kritični udarac, kao i Zlato, Iskustvo i predmete koje od takvih udaraca dobijate. Takođe pomaže u borbi protiv bosova.", diff --git a/common/locales/sr/content.json b/common/locales/sr/content.json index 77cdee69ce..2381dc523d 100644 --- a/common/locales/sr/content.json +++ b/common/locales/sr/content.json @@ -1,6 +1,10 @@ { "potionText": "Napitak zdravlja", "potionNotes": "Vraća 15 poena zdravlja (koristi se odmah)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Vuk", "dropEggWolfAdjective": "odani", "dropEggTigerCubText": "Mladunče tigra", diff --git a/common/locales/sr/quests.json b/common/locales/sr/quests.json index 6fba2a7b74..446fa6beaa 100644 --- a/common/locales/sr/quests.json +++ b/common/locales/sr/quests.json @@ -19,7 +19,7 @@ "bossStrength": "Snaga Bosa", "collect": "Sakupiti", "collected": "Sakupljeno", - "bossDmg1": "Each completed Daily and To-Do and each positive Habit hurts the boss. Hurt it more with redder tasks or Brutal Smash and Burst of Flames. The boss will deal damage to every quest participant for every Daily you've missed (multiplied by the boss's Strength) in addition to your regular damage, so keep your party healthy by completing your Dailies! All damage to and from a boss is tallied on cron (your day roll-over).", + "bossDmg1": "Završavajte svoje Svakodnevne i Jednokratne zadatke da biste naneli štetu bosu. Crveni zadaci, Vatra, i Divlji udarac načiniće još veću štetu. Za svaki propušten Svakodnevni zadatak bos nanosi štetu svakom učesniku misije (šteta od zadatka pomnožena sa snagom bosa) povrh normalne štete od zadatka. Završavajte Svakodnevne zadatke kako bi vaša družina bila zdrava. Sva šteta koju bos primi i nanese obračunava se na kraju dana.(odnosno u trenutku smene između dva dana).", "bossDmg2": "Samo učesnici će se boriti protiv bosa i dobiti deo plena.", "tavernBossInfo": "Završavajte svoje Svakodnevne i Jednokrate zadatke da biste naneli štetu bosu. Zadaci sa većom štetom više će povrediti bosa (crveni zadaci, magije Čarobnjaka, napadi Ratnika, itd). Bos dobija Bes za svaki propušten Svakodnevni zadatak (pomnoženo sa snagom bosa). Kad Bes dostigne maksimalnu vrednost, desiće se nešto loše. Zato završavajte Svakodnevne zadatke. Sva šteta koju bos primi i nanese obračunava se na kraju dana.(odnosno u trenutku smene između dva dana).", "bossColl1": "Da biste dobili predmete, radite pozitivne zadatke.Na misiji predmeti padaju na isti način kao i inače, ali nećete moći da ih vidite do sledećeg dana, kad će svi nađeni predmeti biti sakupljeni na gomilu.", diff --git a/common/locales/sv/backgrounds.json b/common/locales/sv/backgrounds.json index 101b12a9f1..3054553781 100644 --- a/common/locales/sv/backgrounds.json +++ b/common/locales/sv/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Bergsjö", "backgroundMountainLakeNotes": "Doppa tårna i Bergssjön.", "backgroundPagodasText": "Pagoder", - "backgroundPagodasNotes": "Klättra till toppen av Pagoderna." + "backgroundPagodasNotes": "Klättra till toppen av Pagoderna.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/sv/character.json b/common/locales/sv/character.json index ec778cb128..ce81825644 100644 --- a/common/locales/sv/character.json +++ b/common/locales/sv/character.json @@ -52,9 +52,11 @@ "costume": "Dräkt", "costumeText": "Om du föredrar utseendet på annan utrustning än den du har på dig, kryssa i rutan \"Använd Dräkt\" för att visa upp din favoritdräkt medan du har på dig din stridsutrustning undertill.", "useCostume": "Använd Dräkt", - "gearAchievement": "Du har förtjänat prestationen \"Ultimat Urustning\" för att ha uppgraderat din utrustning till max!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Ultimat Utrustning", - "ultimGearText": "Har uppgraderat till den maximala vapen- och rustningsuppsättningen.", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Level", "levelUp": "Level upp!", "mana": "Mana", diff --git a/common/locales/sv/content.json b/common/locales/sv/content.json index 4f30d3207e..7152b78c1f 100644 --- a/common/locales/sv/content.json +++ b/common/locales/sv/content.json @@ -1,6 +1,10 @@ { "potionText": "Hälsodryck", "potionNotes": "Återställ 15 Hälsopoäng (Omedelbar Användning)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Varg", "dropEggWolfAdjective": "lojal", "dropEggTigerCubText": "Tigerunge", diff --git a/common/locales/uk/backgrounds.json b/common/locales/uk/backgrounds.json index b927173dd9..a70d7de7fd 100644 --- a/common/locales/uk/backgrounds.json +++ b/common/locales/uk/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "Гірське озеро", "backgroundMountainLakeNotes": "Перевірте, як водичка в Гірському озері.", "backgroundPagodasText": "Пагоди", - "backgroundPagodasNotes": "Вилізьте на вершини Пагод." + "backgroundPagodasNotes": "Вилізьте на вершини Пагод.", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/uk/character.json b/common/locales/uk/character.json index 9d345b7d4d..38ccc92ea6 100644 --- a/common/locales/uk/character.json +++ b/common/locales/uk/character.json @@ -52,9 +52,11 @@ "costume": "Костюм", "costumeText": "Якщо зовнішній вигляд іншого спорядженням Вам подобається більше, оберіть „Надягти костюм“, аби зовні постати у костюмі, допоки бойове спорядження вдягнене під низ.", "useCostume": "Надягти костюм", - "gearAchievement": "Ви отримали досягнення „Найкраще спорядження“ за вдосконалення до набору максимального рівня!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "Найкраще спорядження", - "ultimGearText": "Зброя та набір спорядження вдосконалено до максимального рівня", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "Рівень", "levelUp": "Новий рівень!", "mana": "Мана", diff --git a/common/locales/uk/content.json b/common/locales/uk/content.json index f783ed44dd..e43a6cdfaf 100644 --- a/common/locales/uk/content.json +++ b/common/locales/uk/content.json @@ -1,6 +1,10 @@ { "potionText": "Цілюще зілля", "potionNotes": "Відновлює 15 здоров'я (Необмежене використання)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "Вовк", "dropEggWolfAdjective": "вірний", "dropEggTigerCubText": "Тигрик", diff --git a/common/locales/zh/backgrounds.json b/common/locales/zh/backgrounds.json index 98491cad62..4dc230ee30 100644 --- a/common/locales/zh/backgrounds.json +++ b/common/locales/zh/backgrounds.json @@ -83,5 +83,12 @@ "backgroundMountainLakeText": "高山湖泊", "backgroundMountainLakeNotes": "用脚趾沾沾冰凉的湖水", "backgroundPagodasText": "宝塔", - "backgroundPagodasNotes": "欲穷千里目,更上一层楼" + "backgroundPagodasNotes": "欲穷千里目,更上一层楼", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/zh/character.json b/common/locales/zh/character.json index d5e273cfd5..06e4208a55 100644 --- a/common/locales/zh/character.json +++ b/common/locales/zh/character.json @@ -52,9 +52,11 @@ "costume": "服装", "costumeText": "如果你更喜欢其它装备的样子,勾选\"显示服装\"的按钮,在装备战斗装备的情况下换一个造型。", "useCostume": "显示服装", - "gearAchievement": "因为你已升级到最高等级的装备,你获得了”终极装备“这个成就!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "终极装备", - "ultimGearText": "已升级到最高级的武器和装甲", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "级", "levelUp": "升级了!", "mana": "魔法值", diff --git a/common/locales/zh/content.json b/common/locales/zh/content.json index 5e82629882..cf8db5a4e2 100644 --- a/common/locales/zh/content.json +++ b/common/locales/zh/content.json @@ -1,6 +1,10 @@ { "potionText": "治疗药水", "potionNotes": "回复15点生命值 (立即生效)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "狼", "dropEggWolfAdjective": "忠诚的", "dropEggTigerCubText": "老虎幼崽", diff --git a/common/locales/zh/settings.json b/common/locales/zh/settings.json index e5d166a624..0ef595532f 100644 --- a/common/locales/zh/settings.json +++ b/common/locales/zh/settings.json @@ -41,7 +41,7 @@ "json": "(JSON)", "customDayStart": "自定义起始日期", "24HrClock": "24小时表", - "customDayStartInfo1": "HabitRPG defaults to check and reset your Dailies at midnight in your own time zone each day. It is recommended that you read the following information before changing it:", + "customDayStartInfo1": "HabitRPG默认在午夜时分(当然是在你所在地区的时区内)检查并且重置你的日常事项。我们推荐你在改变它之前先读读下面这些信息:", "customDayStartInfo2": "(展开)", "customDayStartInfo3": "(收起)", "customDayStartInfo4": "Complete all your Dailies before changing the Custom Day Start or Rest in the Inn that day. Changing your Custom Day Start may cause Cron to run immediately, but after the first day it works as expected.

Allow a window of two hours for the change to take effect. For example, if it is currently set to 0 (midnight), change it before 10pm; if you want to set it to 9pm, change it before 7pm.

Enter an hour from 0 to 23 (it uses a 24 hour clock). Typing is more effective than arrow keys. Once set, reload the page to confirm that the new value is being displayed.", @@ -93,12 +93,12 @@ "wonChallenge": "你赢得了挑战", "newPM": "收到悄悄话", "giftedGems": "自然宝石", - "giftedGemsInfo": "<%= amount %> Gems - by <%= name %>", + "giftedGemsInfo": "<%= amount %> 宝石 - 来自 <%= name %>", "giftedSubscription": "捐助有礼", "invitedParty": "队伍邀请", "invitedGuild": "公会邀请", "inactivityEmails": "你的账号处于失效状态", - "weeklyRecaps": "Summaries of your account activity in the past week", + "weeklyRecaps": "过去几周内你账户活动的总结", "questStarted": "你的任务已经开始", "invitedQuest": "任务邀请", "kickedGroup": "从小组踢出", @@ -114,8 +114,8 @@ "coupon": "优惠券", "couponPlaceholder": "输入优惠券代码", "couponText": "We sometimes have events and give out promo codes for special gear. (eg, those who stop by our Wondercon booth)", - "apply": "Apply", - "resubscribe": "Resubscribe", + "apply": "申请", + "resubscribe": "重新订阅", "promoCode": "优惠码", "promoCodeApplied": "优惠码已生效!请查看物品栏", "promoPlaceholder": "输入优惠码" diff --git a/common/locales/zh_TW/backgrounds.json b/common/locales/zh_TW/backgrounds.json index f4bd1d1780..680d722abf 100644 --- a/common/locales/zh_TW/backgrounds.json +++ b/common/locales/zh_TW/backgrounds.json @@ -81,7 +81,14 @@ "backgroundMarbleTempleText": "大理石神廟", "backgroundMarbleTempleNotes": "展現在大理石神廟之前", "backgroundMountainLakeText": "山脈之湖", - "backgroundMountainLakeNotes": "把你的腳指浸在山脈之湖裹面", + "backgroundMountainLakeNotes": "把你的腳指浸在山脈之湖裡面", "backgroundPagodasText": "佛塔", - "backgroundPagodasNotes": "爬到佛塔的頂端" + "backgroundPagodasNotes": "爬到佛塔的頂端", + "backgrounds062015": "SET 13: Released June 2015", + "backgroundDriftingRaftText": "Drifting Raft", + "backgroundDriftingRaftNotes": "Paddle a Drifting Raft.", + "backgroundShimmeryBubblesText": "Shimmery Bubbles", + "backgroundShimmeryBubblesNotes": "Float through a sea of Shimmery Bubbles.", + "backgroundIslandWaterfallsText": "Island Waterfalls", + "backgroundIslandWaterfallsNotes": "Picnic near Island Waterfalls." } \ No newline at end of file diff --git a/common/locales/zh_TW/character.json b/common/locales/zh_TW/character.json index ff29900e7f..d487acccfd 100644 --- a/common/locales/zh_TW/character.json +++ b/common/locales/zh_TW/character.json @@ -52,9 +52,11 @@ "costume": "服裝", "costumeText": "如果你喜歡其他裝備的外觀更勝於你現在的裝備,勾選\"使用服裝\"框穿上想被看到的服裝,而你的戰鬥裝備會穿在裡面。", "useCostume": "使用服裝", - "gearAchievement": "你已達成「終極裝備」成就:升級到最高裝備!", + "gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:", + "moreGearAchievements": "To attain more Ultimate Gear badges, change classes on your stats page and buy up your new class's gear!", + "armoireUnlocked": "You've also unlocked the Enchanted Armoire! Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.", "ultimGearName": "終極裝備", - "ultimGearText": "已升級到最高武器和盔甲", + "ultimGearText": "Has upgraded to the maximum weapon and armor set for the following classes:", "level": "等級", "levelUp": " 升級了!", "mana": "魔力", diff --git a/common/locales/zh_TW/communityguidelines.json b/common/locales/zh_TW/communityguidelines.json index da0f482040..c150f0df2f 100644 --- a/common/locales/zh_TW/communityguidelines.json +++ b/common/locales/zh_TW/communityguidelines.json @@ -174,5 +174,5 @@ "commGuideLink07description": "用於提交像素畫。", "commGuideLink08": "Quest Trello", "commGuideLink08description": "提交任務作品。", - "lastUpdated": "Last updated" + "lastUpdated": "最後更新" } \ No newline at end of file diff --git a/common/locales/zh_TW/content.json b/common/locales/zh_TW/content.json index 7f26847278..7e3684d454 100644 --- a/common/locales/zh_TW/content.json +++ b/common/locales/zh_TW/content.json @@ -1,6 +1,10 @@ { "potionText": "治療藥水", "potionNotes": "回復15點生命值(立即使用)", + "armoireText": "Enchanted Armoire", + "armoireNotesFull": "Open the Armoire to randomly receive special Equipment, Experience, or food! Equipment pieces remaining:", + "armoireLastItem": "You've found the last piece of rare Equipment in the Enchanted Armoire.", + "armoireNotesEmpty": "The Armoire will have new Equipment every month. Until then, keep clicking for Experience and Food!", "dropEggWolfText": "狼", "dropEggWolfAdjective": "忠誠的", "dropEggTigerCubText": "小老虎", diff --git a/common/locales/zh_TW/spells.json b/common/locales/zh_TW/spells.json index b6ff8afd4d..7c6fb57408 100644 --- a/common/locales/zh_TW/spells.json +++ b/common/locales/zh_TW/spells.json @@ -1,6 +1,6 @@ { "spellWizardFireballText": "火焰爆轟", - "spellWizardFireballNotes": "Flames burst from your hands. You gain XP, and you deal extra damage to Bosses! Click on a task to cast. (Based on: INT)", + "spellWizardFireballNotes": "你的手中冒出爆裂火焰。你會獲得經驗值,並且額外對Boss造成傷害!在任務上點擊後施放(加成:智力 )", "spellWizardMPHealText": "澎湃靈泉", "spellWizardMPHealNotes": "你犧牲魔力來幫助你的朋友。隊伍的其他人會獲得MP!(加成:智力)", "spellWizardEarthText": "地震", @@ -8,7 +8,7 @@ "spellWizardFrostText": "極寒霜凍", "spellWizardFrostNotes": "以冰雪覆蓋任務。沒任何的連擊會在明天變成零!(使用後套用全部的任務)", "spellWarriorSmashText": "致命一擊", - "spellWarriorSmashNotes": "You hit a task with all of your might. It gets more blue/less red, and you deal extra damage to Bosses! Click on a task to cast. (Based on: STR)", + "spellWarriorSmashNotes": "你盡全力打一個任務。它變得更藍或更不紅,並且額外對Boss造成傷害!在任務上點擊後施放(加成:力量 )", "spellWarriorDefensiveStanceText": "防禦姿態", "spellWarriorDefensiveStanceNotes": "你準備好受到未完任務的反衝。你獲得一個體質的增益效果!(加成:體質-不加增益效果)", "spellWarriorValorousPresenceText": "英勇現身", @@ -16,9 +16,9 @@ "spellWarriorIntimidateText": "威懾凝視", "spellWarriorIntimidateNotes": "你用目光恐嚇你的敵人。全隊獲得一個體質的增益效果!(加成:體質-不加增益效果)", "spellRoguePickPocketText": "扒竊", - "spellRoguePickPocketNotes": "You rob a nearby task. You gain gold! Click on a task to cast. (Based on: PER)", + "spellRoguePickPocketNotes": "你偷了附近的任務以獲得金幣!在任務上點擊後施放(加成:感知)", "spellRogueBackStabText": "背刺", - "spellRogueBackStabNotes": "You betray a foolish task. You gain gold and XP! Click on a task to cast. (Based on: STR)", + "spellRogueBackStabNotes": "你背叛了一個愚蠢的任務。你獲得金幣和經驗值!在任務上點擊後施放(加成:力量)", "spellRogueToolsOfTradeText": "社交手段", "spellRogueToolsOfTradeNotes": "你與朋友分享自己的才華。你隊伍獲得一個感知的增益效果!(加成:感知-不加增益效果)", "spellRogueStealthText": "潛行", diff --git a/common/script/index.coffee b/common/script/index.coffee index e0717343a8..9d70016185 100644 --- a/common/script/index.coffee +++ b/common/script/index.coffee @@ -620,6 +620,7 @@ api.wrap = (user, main=true) -> addTask: (req, cb) -> task = api.taskDefaults(req.body) + return cb?({code:409,message:i18n.t('messageDuplicateTaskID', req.language)}) if user.tasks[task.id]? user["#{task.type}s"].unshift(task) if user.preferences.newTaskEdit then task._editing = true if user.preferences.tagsCollapsed then task._tags = true @@ -874,7 +875,11 @@ api.wrap = (user, main=true) -> user.stats.hp += 15 user.stats.hp = 50 if user.stats.hp > 50 else if item.key is 'armoire' - armoireResult = user.fns.predictableRandom() + armoireResult = user.fns.predictableRandom(user.stats.gp) + # We use a different seed to choose the Armoire action than we use + # to choose the sub-action, otherwise only some of the foods can + # be given. E.g., if a seed gives armoireResult < .5 (food) then + # the same seed would give one of the first five foods only. eligibleEquipment = _.filter(content.gear.flat, ((i)->i.klass is 'armoire' and !user.items.gear.owned[i.key])) if !_.isEmpty(eligibleEquipment) and (armoireResult < .6 or !user.flags.armoireOpened) drop = user.fns.randomVal(eligibleEquipment) @@ -1712,10 +1717,11 @@ api.wrap = (user, main=true) -> owned = if window? then user.items.gear.owned else user.items.gear.owned.toObject() user.achievements.ultimateGearSets ?= {healer: false, wizard: false, rogue: false, warrior: false} content.classes.forEach (klass) -> - user.achievements.ultimateGearSets[klass] = _.reduce ['armor', 'shield', 'head', 'weapon'], (soFarGood, type) -> - found = _.find content.gear.tree[type][klass], {last:true} - soFarGood and (!found or owned[found.key]==true) #!found only true when weapon is two-handed (mages) - , true # start with true, else `and` will fail right away + if user.achievements.ultimateGearSets[klass] is not true + user.achievements.ultimateGearSets[klass] = _.reduce ['armor', 'shield', 'head', 'weapon'], (soFarGood, type) -> + found = _.find content.gear.tree[type][klass], {last:true} + soFarGood and (!found or owned[found.key]==true) #!found only true when weapon is two-handed (mages) + , true # start with true, else `and` will fail right away user.markModified? 'achievements.ultimateGearSets' if _.contains(user.achievements.ultimateGearSets, true) and user.flags.armoireEnabled != true user.flags.armoireEnabled = true diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000000..cfb10a3e9e --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,11 @@ +/* + * Note: You probably don't need to edit this file. Instead, add your gulp + * tasks with the ./tasks directory, where tasks are grouped by their + * particular purpose. If you feel like your task doesn't fit within the + * existing files, feel free to create a "gulp-thing.js" file within that + * directory, and it will automatically be included. + */ + +require('babel/register'); +require('glob').sync('./tasks/gulp-*').forEach(require); +require('gulp').task('default', ['test']); diff --git a/karma.conf.js b/karma.conf.js index 98136061be..0b79578199 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -53,7 +53,16 @@ module.exports = function(config) { "website/public/js/filters/filters.js", - "website/public/js/directives/directives.js", + "website/public/js/directives/focus-me.directive.js", + "website/public/js/directives/from-now.directive.js", + "website/public/js/directives/habitrpg-tasks.directive.js", + "website/public/js/directives/hrpg-sort-checklist.directive.js", + "website/public/js/directives/hrpg-sort-tags.directive.js", + "website/public/js/directives/hrpg-sort-tasks.directive.js", + "website/public/js/directives/popover-html-popup.directive.js", + "website/public/js/directives/popover-html.directive.js", + "website/public/js/directives/task-focus.directive.js", + "website/public/js/directives/when-scrolled.directive.js", "website/public/js/controllers/authCtrl.js", "website/public/js/controllers/notificationCtrl.js", @@ -70,7 +79,7 @@ module.exports = function(config) { "website/public/js/controllers/hallCtrl.js", 'test/spec/mock/**/*.js', 'test/spec/specHelper.js', - 'test/spec/*.js' + 'test/spec/**/*.js' ], // list of files / patterns to exclude @@ -98,8 +107,17 @@ module.exports = function(config) { // - IE (only Windows) browsers: ['PhantomJS'], + preprocessors: { + 'website/public/js/**/*.js': ['coverage'] + }, + + coverageReporter: { + type: 'lcov', + dir: 'coverage/karma' + }, + // Enable mocha-style reporting, for better test visibility - reporters: ['mocha'], + reporters: ['mocha', 'coverage'], // Continuous Integration mode // if true, it capture browsers, run tests and exit diff --git a/migrations/20150604_ultimateGearSets.js b/migrations/20150604_ultimateGearSets.js index d446ac1232..2a060dcb68 100644 --- a/migrations/20150604_ultimateGearSets.js +++ b/migrations/20150604_ultimateGearSets.js @@ -10,8 +10,9 @@ var authorUuid = process.env.AUTHOR_UUID || '7f14ed62-5408-4e1b-be83-ada62d50493 * grant the new ultimateGearSets achievement for existing users' collected equipment */ -var dbserver = process.env.DB_SERVER || 'localhost:27017'; // CHANGE THIS FOR PRODUCTION DATABASE -var dbname = process.env.DB_NAME || 'habitrpg'; +var dbserver = 'localhost:27017' // FOR TEST DATABASE +// var dbserver = 'username:password@ds031379-a0.mongolab.com:31379' // FOR PRODUCTION DATABASE +var dbname = 'habitrpg'; var mongo = require('mongoskin'); var _ = require('lodash'); diff --git a/package.json b/package.json index d9089d2c73..8ba1ff5cb2 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "dependencies": { "async": "~0.9.0", "aws-sdk": "^2.0.25", + "babel": "^5.5.4", "bower": "~1.3.12", "browserify": "~3.30.2", "coffee-script": "1.6.x", @@ -30,6 +31,7 @@ "grunt-karma": "~0.6.2", "grunt-nodemon": "~0.3.0", "grunt-spritesmith": "~3.5.0", + "gulp": "^3.9.0", "icalendar": "git://github.com/lefnire/node-icalendar#master", "image-size": "~0.3.2", "in-app-purchase": "^0.2.0", @@ -52,7 +54,9 @@ "paypal-ipn": "2.1.0", "paypal-rest-sdk": "^1.2.1", "pretty-data": "git://github.com/vkiryukhin/pretty-data#master", + "ps-tree": "^1.0.0", "push-notify": "^1.1.1", + "q": "^1.4.1", "qs": "^2.3.2", "request": "~2.44.0", "s3-upload-stream": "^1.0.6", @@ -74,7 +78,7 @@ "node": "0.10.x" }, "scripts": { - "test": "./node_modules/coffee-script/bin/coffee ./test/runTests.coffee -n", + "test": "./node_modules/.bin/gulp test", "start": "grunt run:dev", "postinstall": "./node_modules/bower/bin/bower --config.interactive=false install -f; ./node_modules/.bin/grunt;", "coverage": "COVERAGE=true mocha --require register-handlers.js --reporter html-cov > coverage.html; open coverage.html" @@ -82,15 +86,18 @@ "devDependencies": { "chai": "^2.3.0", "coffee-coverage": "~0.4.2", + "coveralls": "^2.11.2", "csv": "~0.3.6", "deep-diff": "~0.1.4", "event-stream": "^3.2.2", "expect.js": "~0.2.0", "glob": "^4.3.5", + "istanbul": "^0.3.14", "karma": "~0.10.2", "karma-chai-plugins": "~0.1.0", "karma-chrome-launcher": "~0.1.0", "karma-coffee-preprocessor": "~0.1.0", + "karma-coverage": "^0.3.1", "karma-firefox-launcher": "~0.1.0", "karma-html2js-preprocessor": "~0.1.0", "karma-jasmine": "~0.1.3", @@ -100,6 +107,7 @@ "karma-phantomjs-launcher": "~0.1.0", "karma-requirejs": "~0.2.0", "karma-script-launcher": "~0.1.0", + "lcov-result-merger": "^1.0.2", "mocha": "~1.12.1", "mongoskin": "~0.6.1", "phantomjssmith": "~0.5.4", diff --git a/protractor.conf.js b/protractor.conf.js index 024aab666c..ab91fc074b 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -19,6 +19,8 @@ exports.config = { // Options to be passed to Jasmine-node. jasmineNodeOpts: { showColors: true, - defaultTimeoutInterval: 90000 + defaultTimeoutInterval: 90000, + isVerbose: true, + displayPendingSpec: true } }; diff --git a/tasks/gulp-tests.js b/tasks/gulp-tests.js new file mode 100644 index 0000000000..f6ce872271 --- /dev/null +++ b/tasks/gulp-tests.js @@ -0,0 +1,157 @@ +import { pipe, awaitPort, kill } from './taskHelper'; +import { server as karma } from 'karma'; +import mongoose from 'mongoose'; +import { exec } from 'child_process'; +import psTree from 'ps-tree'; +import gulp from 'gulp'; +import Q from 'q'; + +const TEST_SERVER_PORT = 3001 +const TEST_DB = 'habitrpg_test' + +const TEST_DB_URI = `mongodb://localhost/${TEST_DB}` + +/* Helper methods for reporting test summary */ +let testResults = []; +let testCount = (stdout, regexp) => { + let match = stdout.match(regexp); + return parseInt(match && match[1] || 0); +} + +let testBin = (string) => { + return `NODE_ENV=testing ./node_modules/.bin/${string}`; +}; + +gulp.task('test:prepare:mongo', (cb) => { + mongoose.connect(TEST_DB_URI, () => { + mongoose.connection.db.dropDatabase(); + mongoose.connection.close(); + cb(); + }); +}); + +gulp.task('test:prepare:build', (cb) => { + exec(testBin('grunt build:test'), cb); +}); + +gulp.task('test:prepare:webdriver', (cb) => { + exec('./node_modules/protractor/bin/webdriver-manager update', cb); +}); + +gulp.task('test:prepare', [ + 'test:prepare:build', + 'test:prepare:mongo', + 'test:prepare:webdriver' +]); + +gulp.task('test:common', ['test:prepare:build'], (cb) => { + let runner = exec( + testBin('mocha test/common'), + (err, stdout, stderr) => { + testResults.push({ + suite: 'Common Specs\t', + pass: testCount(stdout, /(\d+) passing/), + fail: testCount(stderr, /(\d+) failing/), + pend: testCount(stdout, /(\d+) pending/) + }); + cb(err); + } + ); + pipe(runner); +}); + + +gulp.task('test:api', ['test:prepare:mongo'], (cb) => { + let runner = exec( + testBin("istanbul cover -i 'website/src/**' --dir coverage/api ./node_modules/.bin/_mocha -- test/api"), + (err, stdout, stderr) => { + testResults.push({ + suite: 'API Specs\t', + pass: testCount(stdout, /(\d+) passing/), + fail: testCount(stderr, /(\d+) failing/), + pend: testCount(stdout, /(\d+) pending/) + }); + cb(err); + } + ); + pipe(runner); +}); + +gulp.task('test:karma', ['test:prepare:build'], (cb) => { + let runner = exec( + testBin('karma start --single-run'), + (err, stdout) => { + testResults.push({ + suite: 'Karma Specs\t', + pass: testCount(stdout, /(\d+) tests completed/), + fail: testCount(stdout, /(\d+) tests failed/), + pend: testCount(stdout, /(\d+) tests skipped/) + }); + cb(err); + } + ); + pipe(runner); +}); + +gulp.task('test:e2e', ['test:prepare'], (cb) => { + let support = [ + 'Xvfb :99 -screen 0 1024x768x24 -extension RANDR', + `NODE_DB_URI="${TEST_DB_URI}" PORT="${TEST_SERVER_PORT}" node ./website/src/server.js`, + './node_modules/protractor/bin/webdriver-manager start', + ].map(exec); + + Q.all([ + awaitPort(3001), + awaitPort(4444) + ]).then(() => { + let runner = exec( + 'DISPLAY=:99 NODE_ENV=testing ./node_modules/protractor/bin/protractor protractor.conf.js', + (err, stdout, stderr) => { + /* + * Note: As it stands, protractor wont report pending specs + */ + let match = stdout.match(/(\d+) tests?.*(\d) failures?/); + testResults.push({ + suite: 'End-to-End Specs', + pass: parseInt(match[1]) - parseInt(match[2]), + fail: parseInt(match[2]), + pend: 0 + }); + support.forEach(kill); + cb(err); + } + ); + pipe(runner); + }); +}); + +gulp.task('test', [ + 'test:common', + 'test:karma', + 'test:api', + 'test:e2e' +], () => { + let totals = [0,0,0]; + + console.log('\n\x1b[36m\x1b[4mHabitica Test Summary\x1b[0m\n'); + testResults.forEach((s) => { + totals[0] = totals[0] + s.pass; + totals[1] = totals[1] + s.fail; + totals[2] = totals[2] + s.pend; + console.log( + `\x1b[33m\x1b[4m${s.suite}\x1b[0m\t`, + `\x1b[32mPassing: ${s.pass},\t`, + `\x1b[31mFailed: ${s.fail},\t`, + `\x1b[36mPending: ${s.pend}\t` + ); + }); + + console.log( + '\n\x1b[33m\x1b[4mTotal:\x1b[0m\t\t\t', + `\x1b[32mPassing: ${totals[0]},\t`, + `\x1b[31mFailed: ${totals[1]},\t`, + `\x1b[36mPending: ${totals[2]}\t` + ); + + console.log('\n\x1b[36mThanks for helping keep Habitica clean!\x1b[0m'); +}); diff --git a/tasks/taskHelper.js b/tasks/taskHelper.js new file mode 100644 index 0000000000..177b3b9f6f --- /dev/null +++ b/tasks/taskHelper.js @@ -0,0 +1,60 @@ +import { exec } from 'child_process'; +import psTree from 'ps-tree'; +import net from 'net'; +import Q from 'q'; + +/* + * Kill a child process and any sub-children that process may have spawned. + * This is necessary to ensure that Gulp will terminate when it has completed + * its tasks. + */ +export function kill(proc) { + ((pid) => { + psTree(pid, (_, pids) => { + if(pids.length) { + pids.forEach(kill); return + } + try { + exec(/^win/.test(process.platform) + ? `taskkill /PID ${pid} /T /F` + : `kill -9 ${pid}`) + } + catch(e) { console.log(e) } + }); + }(proc.PID || proc.pid)); +}; + +/* + * Return a promise that will execute when Node is able to connect on a + * specific port. For example, this can be used to halt tasks until Selenium + * has fully spun up. Optionally provide a maximum number of seconds to wait + * before failing. + */ +export function awaitPort(port, max=60) { + let socket, timeout, interval; + let deferred = Q.defer(); + + timeout = setTimeout(() => { + clearInterval(interval); + deferred.reject(`Timed out after ${max} seconds`); + }, max * 1000); + + interval = setInterval(() => { + socket = net.connect({port: port}, () => { + clearInterval(interval); + clearTimeout(timeout); + socket.destroy(); + deferred.resolve(); + }).on('error', () => { socket.destroy }); + }, 1000); + + return deferred.promise +}; + +/* + * Pipe the child's stdin and stderr to the parent process. + */ +export function pipe(child) { + child.stdout.on('data', (data) => { process.stdout.write(data) }); + child.stderr.on('data', (data) => { process.stderr.write(data) }); +}; diff --git a/test/api/chat.coffee b/test/api/chat.coffee new file mode 100644 index 0000000000..62d60d9b64 --- /dev/null +++ b/test/api/chat.coffee @@ -0,0 +1,100 @@ +'use strict' + +diff = require("deep-diff") + +Group = require("../../website/src/models/group").model +app = require("../../website/src/server") + +describe "Chat", -> + group = undefined + before (done) -> + async.waterfall [ + (cb) -> + registerNewUser(cb, true) + + (user, cb) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "party" + ).end (res) -> + expectCode res, 200 + group = res.body + expect(group.members.length).to.equal 1 + expect(group.leader).to.equal user._id + cb() + + ], done + + chat = undefined + it "posts a message to party chat", (done) -> + msg = "TestMsg" + request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).end (res) -> + expectCode res, 200 + chat = res.body.message + expect(chat.id).to.be.ok + expect(chat.text).to.equal msg + expect(chat.timestamp).to.be.exist + expect(chat.likes).to.be.empty + expect(chat.flags).to.be.empty + expect(chat.flagCount).to.equal 0 + expect(chat.uuid).to.be.exist + expect(chat.contributor).to.be.empty + expect(chat.backer).to.be.empty + expect(chat.uuid).to.equal user._id + expect(chat.user).to.equal user.profile.name + done() + + it "does not post an empty message", (done) -> + msg = "" + request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).send( + ).end (res) -> + expectCode res, 400 + expect(res.body.err).to.equal 'You cannot send a blank message' + done() + + it "can not like own chat message", (done) -> + request.post(baseURL + "/groups/" + group._id + "/chat/" + chat.id + "/like").send( + ).end (res) -> + expectCode res, 401 + body = res.body + expect(body.err).to.equal "Can't like your own message. Don't be that person." + done() + + it "can not flag own message", (done) -> + request.post(baseURL + "/groups/" + group._id + "/chat/" + chat.id + "/flag").send( + ).end (res) -> + expectCode res, 401 + body = res.body + expect(body.err).to.equal "Can't report your own message." + done() + + it "gets chat messages from party chat", (done) -> + request.get(baseURL + "/groups/" + group._id + "/chat").send( + ).end (res) -> + expectCode res, 200 + message = res.body[0] + expect(message.id).to.equal chat.id + expect(message.timestamp).to.equal chat.timestamp + expect(message.likes).to.deep.equal chat.likes + expect(message.flags).to.deep.equal chat.flags + expect(message.flagCount).to.equal chat.flagCount + expect(message.uuid).to.equal chat.uuid + expect(message.contributor).to.deep.equal chat.contributor + expect(message.backer).to.deep.equal chat.backer + expect(message.user).to.equal chat.user + done() + + it "deletes a chat messages from party chat", (done) -> + request.del(baseURL + "/groups/" + group._id + "/chat/" + chat.id).send( + ).end (res) -> + expectCode res, 204 + expect(res.body).to.be.empty + done() + + it "can not delete already deleted message", (done) -> + request.del(baseURL + "/groups/" + group._id + "/chat/" + chat.id).send( + ).end (res) -> + expectCode res, 404 + body = res.body + expect(body.err).to.equal "Message not found!" + done() diff --git a/test/api/groups.coffee b/test/api/groups.coffee index 23d79fcf98..40de0e4077 100644 --- a/test/api/groups.coffee +++ b/test/api/groups.coffee @@ -5,560 +5,283 @@ diff = require("deep-diff") Group = require("../../website/src/models/group").model app = require("../../website/src/server") -describe "Groups", -> - - describe "Guilds", -> - - before (done) -> - registerNewUser -> - User.findByIdAndUpdate user._id, - $set: - "balance": 4 - , (err, _user) -> - done() - , true - - describe "Private Guilds", -> - guild = undefined - before (done) -> - request.post(baseURL + "/groups").send( - name: "TestPrivateGroup" - type: "guild" - privacy: "private" - ).end (res) -> - expectCode res, 200 - guild = res.body - expect(guild.members.length).to.equal 1 - expect(guild.leader).to.equal user._id - #Add members to guild - async.waterfall [ - (cb) -> - registerManyUsers 15, cb - - (_members, cb) -> - members = _members - - joinGuild = (member, callback) -> - request.post(baseURL + "/groups/" + guild._id + "/join") - .set("X-API-User", member._id) - .set("X-API-Key", member.apiToken) - .end -> - callback(null, null) - - async.map members, joinGuild, (err, results) -> cb() - - ], done - - it "includes user in private group member list when user is a member", (done) -> - - request.get(baseURL + "/groups/" + guild._id) - .end (res) -> - g = res.body - userInGroup = _.find g.members, (member) -> return member._id == user._id - expect(userInGroup).to.exist +describe "Guilds", -> + before (done) -> + registerNewUser -> + User.findByIdAndUpdate user._id, + $set: + "balance": 10 + , (err, _user) -> done() + , true - it "excludes user from viewing private group member list when user is not a member", (done) -> - - request.post(baseURL + "/groups/" + guild._id + "/leave") - .end (res) -> - request.get(baseURL + "/groups/" + guild._id) - .end (res) -> - expect res, 404 - done() - - describe "Public Guilds", -> - guild = undefined - before (done) -> - request.post(baseURL + "/groups").send( - name: "TestPublicGroup" - type: "guild" - privacy: "public" - ).end (res) -> - expectCode res, 200 - guild = res.body - expect(guild.members.length).to.equal 1 - expect(guild.leader).to.equal user._id - #Add members to guild - async.waterfall [ - (cb) -> - registerManyUsers 15, cb - - (_members, cb) -> - members = _members - - joinGuild = (member, callback) -> - request.post(baseURL + "/groups/" + guild._id + "/join") - .set("X-API-User", member._id) - .set("X-API-Key", member.apiToken) - .end -> - callback(null, null) - - async.map members, joinGuild, (err, results) -> cb() - ], done - - context "is a member", -> - before (done) -> - registerNewUser -> - request.post(baseURL + "/groups/" + guild._id + "/join") - .end -> - done() - , true - - it "includes user in public group member list", (done) -> - - request.get(baseURL + "/groups/" + guild._id) - .end (res) -> - g = res.body - expect(g.members.length).to.equal 15 - userInGroup = _.find g.members, (member) -> return member._id == user._id - expect(userInGroup).to.be.ok - done() - - - context "is not a member", -> - - before (done) -> - registerNewUser done, true - - it "excludes user in public group member list", (done) -> - request.get(baseURL + "/groups/" + guild._id) - .end (res) -> - g = res.body - expect(g.members.length).to.equal 15 - userInGroup = _.find g.members, (member) -> return member._id == user._id - expect(userInGroup).to.not.be.ok - done() - - describe "Party", -> - - group = undefined - before (done) -> - async.waterfall [ - (cb) -> - registerNewUser(cb, true) - , (user, cb) -> - request.post(baseURL + "/groups").send( - name: "TestGroup" - type: "party" - ).end (res) -> - expectCode res, 200 - group = res.body - expect(group.members.length).to.equal 1 - expect(group.leader).to.equal user._id - done() - ] - - it "can be found by querying for party", (done) -> - request.get(baseURL + "/groups/").send( - type: "party" + context "creating groups", -> + it "can create a public guild", (done) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "guild", + privacy: "public" ).end (res) -> expectCode res, 200 - - party = res.body[0] - expect(party._id).to.equal group._id - expect(party.leader).to.equal user._id - expect(party.name).to.equal group.name - expect(party.quest).to.deep.equal { progress: {} } - expect(party.memberCount).to.equal group.memberCount + guild = res.body + expect(guild.members.length).to.equal 1 + expect(guild.leader).to.equal user._id done() - describe "Chat", -> - chat = undefined - it "Posts a message to party chat", (done) -> - msg = "TestMsg" - request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).send( - ).end (res) -> - expectCode res, 200 - chat = res.body.message - expect(chat.id).to.be.ok - expect(chat.text).to.equal msg - expect(chat.timestamp).to.be.ok - expect(chat.likes).to.be.empty - expect(chat.flags).to.be.empty - expect(chat.flagCount).to.equal 0 - expect(chat.uuid).to.be.ok - expect(chat.contributor).to.be.empty - expect(chat.backer).to.be.empty - expect(chat.uuid).to.equal user._id - expect(chat.user).to.equal user.profile.name - done() + it "can create a private guild", (done) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "guild", + privacy: "private" + ).end (res) -> + expectCode res, 200 + guild = res.body + expect(guild.members.length).to.equal 1 + expect(guild.leader).to.equal user._id + done() - it "Does not post an empty message", (done) -> - msg = "" - request.post(baseURL + "/groups/" + group._id + "/chat?message=" + msg).send( - ).end (res) -> - expectCode res, 400 - expect(res.body.err).to.equal 'You cannot send a blank message' - done() - - it "can not like own chat message", (done) -> - request.post(baseURL + "/groups/" + group._id + "/chat/" + chat.id + "/like").send( - ).end (res) -> + it "prevents user from creating a guild when the user has 0 gems", (done) -> + registerNewUser (err, user_with_0_gems) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "guild", + ) + .set("X-API-User", user_with_0_gems._id) + .set("X-API-Key", user_with_0_gems.apiToken) + .end (res) -> expectCode res, 401 - body = res.body - expect(body.err).to.equal "Can't like your own message. Don't be that person." done() + , false - it "can not flag own message", (done) -> - request.post(baseURL + "/groups/" + group._id + "/chat/" + chat.id + "/flag").send( - ).end (res) -> - expectCode res, 401 - body = res.body - expect(body.err).to.equal "Can't report your own message." - done() - - it "Gets chat messages from party chat", (done) -> - request.get(baseURL + "/groups/" + group._id + "/chat").send( - ).end (res) -> + context "finding groups", -> + it "can find a guild", (done) -> + guild = undefined + request.post(baseURL + "/groups").send( + name: "TestGroup2" + type: "guild" + ).end (res) -> + guild = res.body + request.get(baseURL + "/groups/" + guild._id) + .send() + .end (res) -> expectCode res, 200 - message = res.body[0] - expect(message.id).to.equal chat.id - expect(message.timestamp).to.equal chat.timestamp - expect(message.likes).to.deep.equal chat.likes - expect(message.flags).to.deep.equal chat.flags - expect(message.flagCount).to.equal chat.flagCount - expect(message.uuid).to.equal chat.uuid - expect(message.contributor).to.deep.equal chat.contributor - expect(message.backer).to.deep.equal chat.backer - expect(message.user).to.equal chat.user + expect(guild._id).to.equal res.body._id done() - it "Deletes a chat messages from party chat", (done) -> - request.del(baseURL + "/groups/" + group._id + "/chat/" + chat.id).send( - ).end (res) -> + it "can list guilds", (done) -> + request.get(baseURL + "/groups").send() + .end (res) -> + expectCode res, 200 + guild = res.body[0] + expect(guild).to.exist + done() + + context "updating groups", -> + groupToUpdate = undefined + before (done) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "guild" + description: "notUpdatedDesc" + ).end (res) -> + groupToUpdate = res.body + done() + + it "prevents user from updating a party when they aren't the leader", (done) -> + registerNewUser (err, tmpUser) -> + request.post(baseURL + "/groups/" + groupToUpdate._id).send( + name: "TestGroupName" + description: "updatedDesc" + ) + .set("X-API-User", tmpUser._id) + .set("X-API-Key", tmpUser.apiToken) + .end (res) -> + expectCode res, 401 + expect(res.body.err).to.equal "Only the group leader can update the group!" + done() + , false + + it "allows user to update a group", (done) -> + request.post(baseURL + "/groups/" + groupToUpdate._id).send( + description: "updatedDesc" + ) + .end (res) -> + expectCode res, 204 + request.get(baseURL + "/groups/" + groupToUpdate._id).send() + .end (res) -> + updatedGroup = res.body + expect(updatedGroup.description).to.equal "updatedDesc" + done() + + context "leaving groups", -> + it "can leave a guild", (done) -> + guildToLeave = undefined + request.post(baseURL + "/groups").send( + name: "TestGroupToLeave" + type: "guild" + ).end (res) -> + guildToLeave = res.body + request.post(baseURL + "/groups/" + guildToLeave._id + "/leave") + .send() + .end (res) -> expectCode res, 204 - expect(res.body).to.be.empty done() - it "Can not delete already deleted message", (done) -> - request.del(baseURL + "/groups/" + group._id + "/chat/" + chat.id).send( - ).end (res) -> - expectCode res, 404 - body = res.body - expect(body.err).to.equal "Message not found!" - done() - - describe "Quests", -> - party = undefined - participating = [] - notParticipating = [] - before (done) -> - # Tavern boss, side-by-side - Group.update( - _id: "habitrpg" - , - $set: - quest: - key: "dilatory" - active: true - progress: - hp: shared.content.quests.dilatory.boss.hp - rage: 0 - ).exec() - - # Tally some progress for later. Later we want to test that progress made before the quest began gets - # counted after the quest starts + context "removing users groups", -> + it "allows guild leaders to remove a member", (done) -> + guildToRemoveMember = undefined + members = undefined + userToRemove = undefined + request.post(baseURL + "/groups").send( + name: "TestGuildToRemoveMember" + type: "guild" + ).end (res) -> + guildToRemoveMember = res.body + #Add members to guild async.waterfall [ (cb) -> - request.post(baseURL + '/user/tasks').send({ - type: 'daily' - text: 'daily one' - }).end (res) -> + registerManyUsers 1, cb + + (_members, cb) -> + userToRemove = _members[0] + members = _members + inviteURL = baseURL + "/groups/" + guildToRemoveMember._id + "/invite" + request.post(inviteURL).send( + uuids: [userToRemove._id] + ) + .end -> cb() + (cb) -> - request.post(baseURL + '/user/tasks').send({ - type: 'daily' - text: 'daily two' - }).end (res) -> + request.post(baseURL + "/groups/" + guildToRemoveMember._id + "/join") + .set("X-API-User", userToRemove._id) + .set("X-API-Key", userToRemove.apiToken) + .end (res) -> + cb() + + (cb) -> + request.post(baseURL + "/groups/" + guildToRemoveMember._id + "/removeMember?uuid=" + userToRemove._id) + .send().end (res) -> + expectCode res, 204 cb() + (cb) -> - User.findByIdAndUpdate user._id, - $set: - "stats.lvl": 50 - , (err, _user) -> - cb(null, _user) - (_user, cb) -> - user = _user - request.post(baseURL + "/user/batch-update").send([ - { - op: "score" - params: - direction: "up" - id: user.dailys[0].id - } - { - op: "score" - params: - direction: "up" - id: user.dailys[0].id - } - { - op: "update" - body: - "stats.lvl": 50 - } - ]).end (res) -> - user = res.body - expect(user.party.quest.progress.up).to.be.above 0 + request.get(baseURL + "/groups/" + guildToRemoveMember._id) + .send() + .end (res) -> + g = res.body + userInGroup = _.find g.members, (member) -> return member._id == userToRemove._id + expect(userInGroup).to.not.exist + cb() - # Invite some members - async.waterfall [ + ], done - # Register new users - (cb) -> - registerManyUsers 3, cb + describe "Private Guilds", -> + guild = undefined + before (done) -> + request.post(baseURL + "/groups").send( + name: "TestPrivateGroup" + type: "guild" + privacy: "private" + ).end (res) -> + expectCode res, 200 + guild = res.body + expect(guild.members.length).to.equal 1 + expect(guild.leader).to.equal user._id + #Add members to guild + async.waterfall [ + (cb) -> + registerManyUsers 15, cb - # Send them invitations - (_party, cb) -> - party = _party - inviteURL = baseURL + "/groups/" + group._id + "/invite" - async.parallel [ - (cb2) -> - request.post(inviteURL).send( - uuids: [party[0]._id] - ).end -> - cb2() - (cb2) -> - request.post(inviteURL).send( - uuids: [party[1]._id] - ).end -> - cb2() - (cb2) -> - request.post(inviteURL).send( - uuids: [party[2]._id] - ).end (res)-> - cb2() - ], cb + (_members, cb) -> + members = _members - # Accept / Reject - (results, cb) -> + joinGuild = (member, callback) -> + request.post(baseURL + "/groups/" + guild._id + "/join") + .set("X-API-User", member._id) + .set("X-API-Key", member.apiToken) + .end -> + callback(null, null) - # series since they'll be modifying the same group record - series = _.reduce(party, (m, v, i) -> - m.push (cb2) -> - request.post(baseURL + "/groups/" + group._id + "/join").set("X-API-User", party[i]._id).set("X-API-Key", party[i].apiToken).end -> - cb2() - m - , []) - async.series series, cb + async.map members, joinGuild, (err, results) -> cb() - # Make sure the invites stuck - (whatever, cb) -> - Group.findById group._id, (err, g) -> - group = g - expect(g.members.length).to.equal 4 - cb() + ], done - ], -> + it "includes user in private group member list when user is a member", (done) -> - # Start the quest - async.waterfall [ - (cb) -> - request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end (res) -> - expectCode res, 400 - User.findByIdAndUpdate user._id, - $set: - "items.quests.vice3": 1 - , cb + request.get(baseURL + "/groups/" + guild._id) + .end (res) -> + g = res.body + userInGroup = _.find g.members, (member) -> return member._id == user._id + expect(userInGroup).to.exist + done() - (_user, cb) -> - request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end (res) -> - expectCode res, 200 - Group.findById group._id, cb + it "excludes user from viewing private group member list when user is not a member", (done) -> - (_group, cb) -> - expect(_group.quest.key).to.equal "vice3" - expect(_group.quest.active).to.equal false - request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[0]._id).set("X-API-Key", party[0].apiToken).end -> - request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[1]._id).set("X-API-Key", party[1].apiToken).end (res) -> - request.post(baseURL + "/groups/" + group._id + "/questReject").set("X-API-User", party[2]._id).set("X-API-Key", party[2].apiToken).end (res) -> - group = res.body - expect(group.quest.active).to.equal true - cb() + request.post(baseURL + "/groups/" + guild._id + "/leave") + .end (res) -> + request.get(baseURL + "/groups/" + guild._id) + .end (res) -> + expect res, 404 + done() - ], done - ] + describe "Public Guilds", -> + guild = undefined + before (done) -> + request.post(baseURL + "/groups").send( + name: "TestPublicGroup" + type: "guild" + privacy: "public" + ).end (res) -> + expectCode res, 200 + guild = res.body + expect(guild.members.length).to.equal 1 + expect(guild.leader).to.equal user._id + #Add members to guild + async.waterfall [ + (cb) -> + registerManyUsers 15, cb - it "Casts a spell", (done) -> - mp = user.stats.mp - request.get(baseURL + "/members/" + party[0]._id).end (res) -> - party[0] = res.body - request.post(baseURL + "/user/class/cast/snowball?targetType=user&targetId=" + party[0]._id).end (res) -> + (_members, cb) -> + members = _members - #expect(res.body.stats.mp).to.be.below(mp); - request.get(baseURL + "/members/" + party[0]._id).end (res) -> - member = res.body - expect(member.achievements.snowball).to.equal 1 - expect(member.stats.buffs.snowball).to.exist - difference = diff(member, party[0]) - expect(_.size(difference)).to.equal 2 + joinGuild = (member, callback) -> + request.post(baseURL + "/groups/" + guild._id + "/join") + .set("X-API-User", member._id) + .set("X-API-Key", member.apiToken) + .end -> + callback(null, null) - # level up user so str is > 0 - request.put(baseURL + "/user").send("stats.lvl": 5).end (res) -> + async.map members, joinGuild, (err, results) -> cb() + ], done - # Refill mana so user can cast - request.put(baseURL + "/user").send("stats.mp": 100).end (res) -> - request.post(baseURL + "/user/class/cast/valorousPresence?targetType=party").end (res) -> - request.get(baseURL + "/members/" + member._id).end (res) -> - expect(res.body.stats.buffs.str).to.be.above 0 - expect(diff(res.body, member).length).to.equal 1 - done() + context "is a member", -> + before (done) -> + registerNewUser -> + request.post(baseURL + "/groups/" + guild._id + "/join") + .end -> + done() + , true - it "Doesn't include people who aren't participating", (done) -> - request.get(baseURL + "/groups/" + group._id).end (res) -> - expect(_.size(res.body.quest.members)).to.equal 3 - done() + it "includes user in public group member list", (done) -> + request.get(baseURL + "/groups/" + guild._id) + .end (res) -> + g = res.body + expect(g.members.length).to.equal 15 + userInGroup = _.find g.members, (member) -> return member._id == user._id + expect(userInGroup).to.exist + done() - xit "Hurts the boss", (done) -> - request.post(baseURL + "/user/batch-update").end (res) -> - user = res.body - up = user.party.quest.progress.up - expect(up).to.be.above 0 - #{op:'score',params:{direction:'up',id:user.dailys[3].id}}, // leave one daily undone so Trapper hurts party - # set day to yesterday, cron will then be triggered on next action - request.post(baseURL + "/user/batch-update").send([ - { - op: "score" - params: - direction: "up" - id: user.dailys[0].id - } - { - op: "update" - body: - lastCron: moment().subtract(1, "days") - } - ]).end (res) -> - expect(res.body.party.quest.progress.up).to.be.above up - request.post(baseURL + "/user/batch-update").end -> - request.get(baseURL + "/groups/party").end (res) -> + context "is not a member", -> + before (done) -> + registerNewUser done, true - # Check boss damage - async.waterfall [ - (cb) -> - async.parallel [ - - #tavern boss - (cb2) -> - Group.findById "habitrpg", - quest: 1 - , (err, tavern) -> - expect(tavern.quest.progress.hp).to.be.below shared.content.quests.dilatory.boss.hp - expect(tavern.quest.progress.rage).to.be.above 0 - cb2() - - # party boss - (cb2) -> - expect(res.body.quest.progress.hp).to.be.below shared.content.quests.vice3.boss.hp - _party = res.body.members - expect(_.find(_party, - _id: party[0]._id - ).stats.hp).to.be.below 50 - expect(_.find(_party, - _id: party[1]._id - ).stats.hp).to.be.below 50 - expect(_.find(_party, - _id: party[2]._id - ).stats.hp).to.be 50 - cb2() - ], cb - - # Kill the boss - (whatever, cb) -> - async.waterfall [ - - # tavern boss - (cb2) -> - expect(user.items.pets["MantisShrimp-Base"]).to.not.be.ok() - Group.update - _id: "habitrpg" - , - $set: - "quest.progress.hp": 0 - , cb2 - - # party boss - (arg1, arg2, cb2) -> - expect(user.items.gear.owned.weapon_special_2).to.not.be.ok() - Group.findByIdAndUpdate group._id, - $set: - "quest.progress.hp": 0 - , cb2 - ], cb - (_group, cb) -> - # set day to yesterday, cron will then be triggered on next action - request.post(baseURL + "/user/batch-update").send([ - { - op: "score" - params: - direction: "up" - id: user.dailys[1].id - } - { - op: "update" - body: - lastCron: moment().subtract(1, "days") - } - ]).end -> - cb() - - (cb) -> - request.post(baseURL + "/user/batch-update").end (res) -> - cb null, res.body - - (_user, cb) -> - - # need to load the user again, since tavern boss does update after user's cron - User.findById _user._id, cb - (_user, cb) -> - user = _user - Group.findById group._id, cb - (_group, cb) -> - cummExp = shared.content.quests.vice3.drop.exp + shared.content.quests.dilatory.drop.exp - cummGp = shared.content.quests.vice3.drop.gp + shared.content.quests.dilatory.drop.gp - - #//FIXME check that user got exp, but user is leveling up making the exp check difficult - # expect(user.stats.exp).to.be.above(cummExp); - # expect(user.stats.gp).to.be.above(cummGp); - async.parallel [ - - # Tavern Boss - (cb2) -> - Group.findById "habitrpg", (err, tavern) -> - - #use an explicit get because mongoose wraps the null in an object - expect(_.isEmpty(tavern.get("quest"))).to.equal true - expect(user.items.pets["MantisShrimp-Base"]).to.equal 5 - expect(user.items.mounts["MantisShrimp-Base"]).to.equal true - expect(user.items.eggs.Dragon).to.equal 2 - expect(user.items.hatchingPotions.Shade).to.equal 2 - cb2() - - # Party Boss - (cb2) -> - - #use an explicit get because mongoose wraps the null in an object - expect(_.isEmpty(_group.get("quest"))).to.equal true - expect(user.items.gear.owned.weapon_special_2).to.equal true - expect(user.items.eggs.Dragon).to.equal 2 - expect(user.items.hatchingPotions.Shade).to.equal 2 - - # need to fetch users to get updated data - async.parallel [ - (cb3) -> - User.findById party[0].id, (err, mbr) -> - expect(mbr.items.gear.owned.weapon_special_2).to.equal true - cb3() - (cb3) -> - User.findById party[1].id, (err, mbr) -> - expect(mbr.items.gear.owned.weapon_special_2).to.equal true - cb3() - (cb3) -> - User.findById party[2].id, (err, mbr) -> - expect(mbr.items.gear.owned.weapon_special_2).to.not.be.ok() - cb3() - ], cb2 - ], cb - ], done + it "excludes user in public group member list", (done) -> + request.get(baseURL + "/groups/" + guild._id) + .end (res) -> + g = res.body + expect(g.members.length).to.equal 15 + userInGroup = _.find g.members, (member) -> return member._id == user._id + expect(userInGroup).to.not.exist + done() diff --git a/test/api/party.coffee b/test/api/party.coffee new file mode 100644 index 0000000000..152ac98ab9 --- /dev/null +++ b/test/api/party.coffee @@ -0,0 +1,464 @@ +'use strict' + +diff = require("deep-diff") + +Group = require("../../website/src/models/group").model +app = require("../../website/src/server") + +describe "Party", -> + context "creating a party", -> + it "creates a party", (done) -> + async.waterfall [ + (cb) -> + registerNewUser(cb, true) + + (user, cb) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "party" + ).end (res) -> + expectCode res, 200 + group = res.body + expect(group.members.length).to.equal 1 + expect(group.leader).to.equal user._id + cb() + ], done + + it "prevents user from creating a second party", (done) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "party" + ).end (res) -> + expectCode res, 400 + expect(res.body.err).to.equal "Already in a party, try refreshing." + done() + + context "Searching for a party", -> + group = undefined + beforeEach (done) -> + async.waterfall [ + (cb) -> + registerNewUser(cb, true) + + (user, cb) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "party" + ).end (res) -> + expectCode res, 200 + group = res.body + expect(group.members.length).to.equal 1 + expect(group.leader).to.equal user._id + cb() + ], done + + it "can be found by querying for group type party", (done) -> + request.get(baseURL + "/groups/").send( + type: "party" + ).end (res) -> + expectCode res, 200 + party = _.find res.body, (g) -> return g._id == group._id + expect(party._id).to.equal group._id + expect(party.leader).to.equal user._id + expect(party.name).to.equal group.name + expect(party.quest).to.deep.equal { progress: {} } + expect(party.memberCount).to.equal group.memberCount + done() + + context "joining a party", -> + group = undefined + beforeEach (done) -> + async.waterfall [ + (cb) -> + registerNewUser(cb, true) + + (user, cb) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "party" + ).end (res) -> + expectCode res, 200 + group = res.body + expect(group.members.length).to.equal 1 + expect(group.leader).to.equal user._id + cb() + ], done + + it "prevents user from joining a party when they haven't been invited", (done) -> + registerNewUser (err, user) -> + request.post(baseURL + "/groups/" + group._id + "/join").send() + .set("X-API-User", user._id) + .set("X-API-Key", user.apiToken) + .end (res) -> + expectCode res, 401 + expect(res.body.err).to.equal "Can't join a group you're not invited to." + done() + , false + + it "allows users to join a party when they have been invited", (done) -> + tmpUser = undefined + async.waterfall [ + (cb) -> + registerNewUser(cb, false) + + (user, cb) -> + tmpUser = user + inviteURL = baseURL + "/groups/" + group._id + "/invite" + request.post(inviteURL).send( + uuids: [tmpUser._id] + ) + .end -> + cb() + + (cb) -> + request.post(baseURL + "/groups/" + group._id + "/join") + .set("X-API-User", tmpUser._id) + .set("X-API-Key", tmpUser.apiToken) + .end (res) -> + expectCode res, 200 + cb() + + (cb) -> + Group.findById group._id, (err, grp) -> + expect(grp.members).to.include(tmpUser._id) + cb() + ], done + + context "Quests", -> + party = undefined + group = undefined + participating = [] + notParticipating = [] + before (done) -> + # Tavern boss, side-by-side + Group.update( + _id: "habitrpg" + , + $set: + quest: + key: "dilatory" + active: true + progress: + hp: shared.content.quests.dilatory.boss.hp + rage: 0 + ).exec() + + # Tally some progress for later. Later we want to test that progress made before the quest began gets + # counted after the quest starts + async.waterfall [ + (cb) -> + registerNewUser(cb, true) + + (user, cb) -> + request.post(baseURL + "/groups").send( + name: "TestGroup" + type: "party" + ).end (res) -> + expectCode res, 200 + group = res.body + expect(group.members.length).to.equal 1 + expect(group.leader).to.equal user._id + cb() + + (cb) -> + request.post(baseURL + '/user/tasks').send({ + type: 'daily' + text: 'daily one' + }).end (res) -> + cb() + (cb) -> + request.post(baseURL + '/user/tasks').send({ + type: 'daily' + text: 'daily two' + }).end (res) -> + cb() + (cb) -> + User.findByIdAndUpdate user._id, + $set: + "stats.lvl": 50 + , (err, _user) -> + cb(null, _user) + (_user, cb) -> + user = _user + request.post(baseURL + "/user/batch-update").send([ + { + op: "score" + params: + direction: "up" + id: user.dailys[0].id + } + { + op: "score" + params: + direction: "up" + id: user.dailys[0].id + } + { + op: "update" + body: + "stats.lvl": 50 + } + ]).end (res) -> + user = res.body + expect(user.party.quest.progress.up).to.be.above 0 + + # Invite some members + async.waterfall [ + + # Register new users + (cb) -> + registerManyUsers 3, cb + + # Send them invitations + (_party, cb) -> + party = _party + inviteURL = baseURL + "/groups/" + group._id + "/invite" + async.parallel [ + (cb2) -> + request.post(inviteURL).send( + uuids: [party[0]._id] + ).end -> + cb2() + (cb2) -> + request.post(inviteURL).send( + uuids: [party[1]._id] + ).end -> + cb2() + (cb2) -> + request.post(inviteURL).send( + uuids: [party[2]._id] + ).end (res)-> + cb2() + ], cb + + # Accept / Reject + (results, cb) -> + + # series since they'll be modifying the same group record + series = _.reduce(party, (m, v, i) -> + m.push (cb2) -> + request.post(baseURL + "/groups/" + group._id + "/join").set("X-API-User", party[i]._id).set("X-API-Key", party[i].apiToken).end -> + cb2() + m + , []) + async.series series, cb + + # Make sure the invites stuck + (whatever, cb) -> + Group.findById group._id, (err, g) -> + group = g + expect(g.members.length).to.equal 4 + cb() + + ], -> + + # Start the quest + async.waterfall [ + (cb) -> + request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end (res) -> + expectCode res, 400 + User.findByIdAndUpdate user._id, + $set: + "items.quests.vice3": 1 + , cb + + (_user, cb) -> + request.post(baseURL + "/groups/" + group._id + "/questAccept?key=vice3").end (res) -> + expectCode res, 200 + Group.findById group._id, cb + + (_group, cb) -> + expect(_group.quest.key).to.equal "vice3" + expect(_group.quest.active).to.equal false + request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[0]._id).set("X-API-Key", party[0].apiToken).end -> + request.post(baseURL + "/groups/" + group._id + "/questAccept").set("X-API-User", party[1]._id).set("X-API-Key", party[1].apiToken).end (res) -> + request.post(baseURL + "/groups/" + group._id + "/questReject").set("X-API-User", party[2]._id).set("X-API-Key", party[2].apiToken).end (res) -> + group = res.body + expect(group.quest.active).to.equal true + cb() + + ], done + ] + + it "Casts a spell", (done) -> + mp = user.stats.mp + request.get(baseURL + "/members/" + party[0]._id).end (res) -> + party[0] = res.body + request.post(baseURL + "/user/class/cast/snowball?targetType=user&targetId=" + party[0]._id).end (res) -> + + #expect(res.body.stats.mp).to.be.below(mp); + request.get(baseURL + "/members/" + party[0]._id).end (res) -> + member = res.body + expect(member.achievements.snowball).to.equal 1 + expect(member.stats.buffs.snowball).to.exist + difference = diff(member, party[0]) + expect(_.size(difference)).to.equal 2 + + # level up user so str is > 0 + request.put(baseURL + "/user").send("stats.lvl": 5).end (res) -> + + # Refill mana so user can cast + request.put(baseURL + "/user").send("stats.mp": 100).end (res) -> + request.post(baseURL + "/user/class/cast/valorousPresence?targetType=party").end (res) -> + request.get(baseURL + "/members/" + member._id).end (res) -> + expect(res.body.stats.buffs.str).to.be.above 0 + expect(diff(res.body, member).length).to.equal 1 + done() + + it "Doesn't include people who aren't participating", (done) -> + request.get(baseURL + "/groups/" + group._id).end (res) -> + expect(_.size(res.body.quest.members)).to.equal 3 + done() + + xit "Hurts the boss", (done) -> + request.post(baseURL + "/user/batch-update").end (res) -> + user = res.body + up = user.party.quest.progress.up + expect(up).to.be.above 0 + + #{op:'score',params:{direction:'up',id:user.dailys[3].id}}, // leave one daily undone so Trapper hurts party + # set day to yesterday, cron will then be triggered on next action + request.post(baseURL + "/user/batch-update").send([ + { + op: "score" + params: + direction: "up" + id: user.dailys[0].id + } + { + op: "update" + body: + lastCron: moment().subtract(1, "days") + } + ]).end (res) -> + expect(res.body.party.quest.progress.up).to.be.above up + request.post(baseURL + "/user/batch-update").end -> + request.get(baseURL + "/groups/party").end (res) -> + + # Check boss damage + async.waterfall [ + (cb) -> + async.parallel [ + + #tavern boss + (cb2) -> + Group.findById "habitrpg", + quest: 1 + , (err, tavern) -> + expect(tavern.quest.progress.hp).to.be.below shared.content.quests.dilatory.boss.hp + expect(tavern.quest.progress.rage).to.be.above 0 + cb2() + + # party boss + (cb2) -> + expect(res.body.quest.progress.hp).to.be.below shared.content.quests.vice3.boss.hp + _party = res.body.members + expect(_.find(_party, + _id: party[0]._id + ).stats.hp).to.be.below 50 + expect(_.find(_party, + _id: party[1]._id + ).stats.hp).to.be.below 50 + expect(_.find(_party, + _id: party[2]._id + ).stats.hp).to.be 50 + cb2() + ], cb + + # Kill the boss + (whatever, cb) -> + async.waterfall [ + + # tavern boss + (cb2) -> + expect(user.items.pets["MantisShrimp-Base"]).to.not.be.ok() + Group.update + _id: "habitrpg" + , + $set: + "quest.progress.hp": 0 + , cb2 + + # party boss + (arg1, arg2, cb2) -> + expect(user.items.gear.owned.weapon_special_2).to.not.be.ok() + Group.findByIdAndUpdate group._id, + $set: + "quest.progress.hp": 0 + , cb2 + ], cb + (_group, cb) -> + # set day to yesterday, cron will then be triggered on next action + request.post(baseURL + "/user/batch-update").send([ + { + op: "score" + params: + direction: "up" + id: user.dailys[1].id + } + { + op: "update" + body: + lastCron: moment().subtract(1, "days") + } + ]).end -> + cb() + + (cb) -> + request.post(baseURL + "/user/batch-update").end (res) -> + cb null, res.body + + (_user, cb) -> + + # need to load the user again, since tavern boss does update after user's cron + User.findById _user._id, cb + (_user, cb) -> + user = _user + Group.findById group._id, cb + (_group, cb) -> + cummExp = shared.content.quests.vice3.drop.exp + shared.content.quests.dilatory.drop.exp + cummGp = shared.content.quests.vice3.drop.gp + shared.content.quests.dilatory.drop.gp + + #//FIXME check that user got exp, but user is leveling up making the exp check difficult + # expect(user.stats.exp).to.be.above(cummExp); + # expect(user.stats.gp).to.be.above(cummGp); + async.parallel [ + + # Tavern Boss + (cb2) -> + Group.findById "habitrpg", (err, tavern) -> + + #use an explicit get because mongoose wraps the null in an object + expect(_.isEmpty(tavern.get("quest"))).to.equal true + expect(user.items.pets["MantisShrimp-Base"]).to.equal 5 + expect(user.items.mounts["MantisShrimp-Base"]).to.equal true + expect(user.items.eggs.Dragon).to.equal 2 + expect(user.items.hatchingPotions.Shade).to.equal 2 + cb2() + + # Party Boss + (cb2) -> + + #use an explicit get because mongoose wraps the null in an object + expect(_.isEmpty(_group.get("quest"))).to.equal true + expect(user.items.gear.owned.weapon_special_2).to.equal true + expect(user.items.eggs.Dragon).to.equal 2 + expect(user.items.hatchingPotions.Shade).to.equal 2 + + # need to fetch users to get updated data + async.parallel [ + (cb3) -> + User.findById party[0].id, (err, mbr) -> + expect(mbr.items.gear.owned.weapon_special_2).to.equal true + cb3() + (cb3) -> + User.findById party[1].id, (err, mbr) -> + expect(mbr.items.gear.owned.weapon_special_2).to.equal true + cb3() + (cb3) -> + User.findById party[2].id, (err, mbr) -> + expect(mbr.items.gear.owned.weapon_special_2).to.not.be.ok() + cb3() + ], cb2 + ], cb + ], done diff --git a/test/api/todos.coffee b/test/api/todos.coffee index 78271134ae..b5f8d7fe3e 100644 --- a/test/api/todos.coffee +++ b/test/api/todos.coffee @@ -97,6 +97,27 @@ describe "Todos", -> expect(todo.value).to.equal 0 done() + it "Does not create a todo with an id that already exists", (done) -> + original_todo = { + type: "todo" + text: "original todo" + id: "custom-id" + } + duplicate_id_todo = { + type: "todo" + text: "not original todo" + id: "custom-id" + } + request.post(baseURL + "/user/tasks").send( + original_todo + ).end (res) -> + request.post(baseURL + "/user/tasks").send( + duplicate_id_todo + ).end (res) -> + expectCode res, 409 + expect(res.body.err).to.eql('A task with that ID already exists.') + done() + describe "Updating todos", -> it "Does not update id of todo", (done) -> request.put(baseURL + "/user/tasks/" + todo.id).send( diff --git a/test/common/algos.mocha.coffee b/test/common/algos.mocha.coffee index 1b550d31e1..44ff5d0f72 100644 --- a/test/common/algos.mocha.coffee +++ b/test/common/algos.mocha.coffee @@ -24,6 +24,7 @@ newUser = (addTasks=true)-> gear: equipped: {} costume: {} + owned: {} party: quest: progress: @@ -598,6 +599,14 @@ describe 'User', -> xit 'gets ultimateGear ' + klass, -> expect(user.achievements.ultimateGearSets[klass]).to.be.ok() + it 'does not remove existing Ultimate Gear achievements', -> + user = newUser() + user.achievements.ultimateGearSets = {'healer':true,'wizard':true,'rogue':true,'warrior':true} + user.items.gear.owned.shield_warrior_5 = false + user.items.gear.owned.weapon_rogue_6 = false + user.ops.buy {params:'shield_warrior_5'} + expect(user.achievements.ultimateGearSets).to.eql {'healer':true,'wizard':true,'rogue':true,'warrior':true} + it 'does not get beastMaster if user has less than 90 drop pets', -> user = newUser() user.items.pets = {'Wolf-White': 1, 'Wolf-Desert': 1, 'Wolf-Red': 1, 'Wolf-Shade': 1, 'Wolf-Skeleton': 1, 'Wolf-Zombie': 1, 'Wolf-CottonCandyPink': 1, 'Wolf-CottonCandyBlue': 1, 'Wolf-Golden': 1, 'TigerCub-Base': 1, 'TigerCub-White': 1, 'TigerCub-Desert': 1, 'TigerCub-Red': 1, 'TigerCub-Shade': 1, 'TigerCub-Skeleton': 1, 'TigerCub-Zombie': 1, 'TigerCub-CottonCandyPink': 1, 'TigerCub-CottonCandyBlue': 1, 'TigerCub-Golden': 1, 'PandaCub-Base': 1, 'PandaCub-White': 1, 'PandaCub-Desert': 1, 'PandaCub-Red': 1, 'PandaCub-Shade': 1, 'PandaCub-Skeleton': 1, 'PandaCub-Zombie': 1, 'PandaCub-CottonCandyPink': 1, 'PandaCub-CottonCandyBlue': 1, 'PandaCub-Golden': 1, 'LionCub-Base': 1, 'LionCub-White': 1, 'LionCub-Desert': 1, 'LionCub-Red': 1, 'LionCub-Shade': 1, 'LionCub-Skeleton': 1, 'LionCub-Zombie': 1, 'LionCub-CottonCandyPink': 1, 'LionCub-CottonCandyBlue': 1, 'LionCub-Golden': 1, 'Fox-Base': 1, 'Fox-White': 1, 'Fox-Desert': 1, 'Fox-Red': 1, 'Fox-Shade': 1, 'Fox-Skeleton': 1, 'Fox-Zombie': 1, 'Fox-CottonCandyPink': 1, 'Fox-CottonCandyBlue': 1, 'Fox-Golden': 1, 'FlyingPig-Base': 1, 'FlyingPig-White': 1, 'FlyingPig-Desert': 1, 'FlyingPig-Red': 1, 'FlyingPig-Shade': 1, 'FlyingPig-Skeleton': 1, 'FlyingPig-Zombie': 1, 'FlyingPig-CottonCandyPink': 1, 'FlyingPig-CottonCandyBlue': 1, 'FlyingPig-Golden': 1, 'Dragon-Base': 1, 'Dragon-White': 1, 'Dragon-Desert': 1, 'Dragon-Red': 1, 'Dragon-Shade': 1, 'Dragon-Skeleton': 1, 'Dragon-Zombie': 1, 'Dragon-CottonCandyPink': 1, 'Dragon-CottonCandyBlue': 1, 'Dragon-Golden': 1, 'Cactus-Base': 1, 'Cactus-White': 1, 'Cactus-Desert': 1, 'Cactus-Red': 1, 'Cactus-Shade': 1, 'Cactus-Skeleton': 1, 'Cactus-Zombie': 1, 'Cactus-CottonCandyPink': 1, 'Cactus-CottonCandyBlue': 1, 'Cactus-Golden': 1, 'BearCub-Base': 1, 'BearCub-White': 1, 'BearCub-Desert': 1, 'BearCub-Red': 1, 'BearCub-Shade': 1, 'BearCub-Skeleton': 1, 'BearCub-Zombie': 1, 'BearCub-CottonCandyPink': 1, 'BearCub-CottonCandyBlue': 1, 'BearCub-Golden': 1 } diff --git a/test/runTests.coffee b/test/runTests.coffee deleted file mode 100644 index a1cbec49f0..0000000000 --- a/test/runTests.coffee +++ /dev/null @@ -1,99 +0,0 @@ -sh = require('shelljs') -async = require('async') -TEST_DB = 'habitrpg_test' -TEST_DB_URI = "mongodb://localhost/#{TEST_DB}" -TEST_SERVER_PORT = 3001 -MAX_WAIT = 60 - -announce = (msg) -> - sh.echo '\x1b[36m%s\x1b[0m', "TEST SUITE: #{msg}" - -Suite = - # Primary Task - run: -> - announce "Preparing the test environment." - Suite.prepareEnvironment -> - announce "Test prep complete. Waiting for server availability." - Suite.awaitServers -> - announce "Servers are ready. Beginning tests." - Suite.summarize - "API Specs": Suite.runApiSpecs() - "Common Specs": Suite.runCommonSpecs() - "End-to-End Specs": Suite.runE2ESpecs() - "Karma Specs": Suite.runKarmaSpecs() - - # Output summary report when tests are done. - summarize: (results) -> - anyFailed = 0 - sh.echo "" - announce "Tests complete!\n\nSummary\n-------\n" - for name, result of results - if result is 0 - sh.echo '\x1b[36m%s\x1b[0m', "#{name}: \x1b[32mpassing" - else - anyFailed = 1 - sh.echo '\x1b[36m%s\x1b[0m', "#{name}: \x1b[31mfailing" - sh.echo "" - announce "Thanks for helping keep Habitica clean!" - process.exit(anyFailed) - - # Prepare files, db, and spin up servers. - prepareEnvironment: (cb) -> - sh.exec "grunt build:test" - sh.exec "mongo \"#{TEST_DB}\" --eval \"db.dropDatabase()\"" - sh.exec "./node_modules/protractor/bin/webdriver-manager update" - - # Spin this up even if we're not in a headless environment. Shouldn't matter. - sh.exec "Xvfb :99 -screen 0 1024x768x24 -extension RANDR", silent: true, async: true - - sh.exec "./node_modules/protractor/bin/webdriver-manager start", silent: true, async: true - sh.exec "NODE_DB_URI=\"#{TEST_DB_URI}\" PORT=\"#{TEST_SERVER_PORT}\" node ./website/src/server.js", silent: true, async: true - cb() - - # Ensure both the selenium and node servers are available - awaitServers: (cb) -> - async.parallel [Suite.awaitSelenium, Suite.awaitNode], (err, results) -> - throw err if err? - cb() - - awaitSelenium: (cb) -> - waited = 0 - interval = setInterval -> - if sh.exec('nc -z localhost 4444').code is 0 - clearInterval(interval) - cb() - waited += 1 - if waited > MAX_WAIT - clearInterval(interval) - cb(new Error("Timed out waiting for Selenium")) - , 1000 - - awaitNode: (cb) -> - waited = 0 - interval = setInterval -> - if sh.exec('nc -z localhost 3001').code is 0 - clearInterval(interval) - cb() - waited += 1 - if waited > MAX_WAIT - clearInterval(interval) - cb(new Error("Timed out waiting for Node server")) - , 1000 - - runApiSpecs: -> - announce "Running API Specs (Mocha)" - sh.exec("NODE_ENV=testing ./node_modules/mocha/bin/mocha test/api").code - - runCommonSpecs: -> - announce "Running Common Specs (Mocha)" - sh.exec("NODE_ENV=testing ./node_modules/mocha/bin/mocha test/common").code - - runE2ESpecs: -> - announce "Running End-to-End Specs (Protractor)" - sh.exec("DISPLAY=:99 NODE_ENV=testing ./node_modules/protractor/bin/protractor protractor.conf.js").code - - runKarmaSpecs: -> - announce "Running Karma Specs" - sh.exec("NODE_ENV=testing grunt karma:continuous").code - -Suite.run() diff --git a/test/spec/app.js b/test/spec/app.js new file mode 100644 index 0000000000..6567bf9ef6 --- /dev/null +++ b/test/spec/app.js @@ -0,0 +1,36 @@ +'use strict'; + +describe('AppJS', function() { + describe('Automatic page refresh', function(){ + var clock; + beforeEach(function () { + clock = sinon.useFakeTimers(); + sinon.stub(window, "refresher", function(){return true}); + }); + + afterEach(function () { + clock.restore(); + window.refresher.restore(); + }); + + it('should not call refresher if idle time is less than 6 hours', function() { + window.awaitIdle(); + clock.tick(21599999); + expect(window.refresher).to.not.be.called; + }); + + it('should not call refresher if awaitIdle is called within 6 hours', function() { + window.awaitIdle(); + clock.tick(21500000); + window.awaitIdle(); + clock.tick(21500000); + expect(window.refresher).to.not.be.called; + }); + + it('should call refresher if idle time is 6 hours or greater', function() { + window.awaitIdle(); + clock.tick(21600000); + expect(window.refresher).to.be.called; + }); + }); +}); diff --git a/test/spec/directives/focus-me.directive.spec.js b/test/spec/directives/focus-me.directive.spec.js new file mode 100644 index 0000000000..ed016949c3 --- /dev/null +++ b/test/spec/directives/focus-me.directive.spec.js @@ -0,0 +1,28 @@ +'use strict'; + +describe('focusMe Directive', function() { + var element, scope; + + beforeEach(module('habitrpg')); + + beforeEach(inject(function($rootScope, $compile) { + scope = $rootScope.$new(); + + element = ""; + + element = $compile(element)(scope); + scope.$digest(); + })); + + it('focuses the element when appended to the DOM', function() { + inject(function($timeout) { + var focusSpy = sinon.spy(); + + element.appendTo(document.body); + element.on('focus', focusSpy); + + $timeout.flush(); + expect(focusSpy).to.have.been.called; + }); + }); +}); diff --git a/test/spec/directives/from-now.directive.spec.js b/test/spec/directives/from-now.directive.spec.js new file mode 100644 index 0000000000..a197f2c331 --- /dev/null +++ b/test/spec/directives/from-now.directive.spec.js @@ -0,0 +1,89 @@ +'use strict'; + +describe('fromNow Directive', function() { + var element, scope; + var fromNow = 'recently'; + var diff = 0; + + beforeEach(module('habitrpg')); + + beforeEach(inject(function($rootScope, $compile) { + scope = $rootScope.$new(); + scope.message = {}; + + sinon.stub(window, 'moment').returns({ + fromNow: function() { return fromNow }, + diff: function() { return diff } + }); + + element = "

"; + + element = $compile(element)(scope); + scope.$digest(); + })); + + afterEach(function() { + window.moment.restore(); + }); + + it('sets the element text to the elapsed time', function() { + expect(element.text()).to.eql('recently'); + }); + + describe('when the elapsed time is less than an hour', function() { + beforeEach(inject(function($compile) { + fromNow = 'recently'; + diff = 0; + + element = $compile('

')(scope); + scope.$digest(); + })); + + it('updates the elapsed time every minute', inject(function($interval) { + fromNow = 'later'; + + expect(element.text()).to.eql('recently'); + $interval.flush(60001); + + expect(element.text()).to.eql('later'); + })); + + it('moves to hourly updates after an hour', inject(function($timeout, $interval) { + diff = 61; + + $timeout.flush(); + $interval.flush(60001); + + fromNow = 'later'; + + $interval.flush(60001); + expect(element.text()).to.eql('recently'); + + $interval.flush(3600000); + expect(element.text()).to.eql('later'); + })); + }); + + describe('when the elapsed time is more than an hour', function() { + beforeEach(inject(function($compile) { + fromNow = 'recently'; + diff = 65; + + element = $compile('

')(scope); + scope.$digest(); + })); + + it('updates the elapsed time every hour', inject(function($interval) { + fromNow = 'later'; + + expect(element.text()).to.eql('recently'); + + $interval.flush(60001); + expect(element.text()).to.eql('recently'); + + $interval.flush(3600000); + expect(element.text()).to.eql('later'); + })); + }); + +}); diff --git a/website/public/js/app.js b/website/public/js/app.js index 94bcb81b3c..fae2f42e42 100644 --- a/website/public/js/app.js +++ b/website/public/js/app.js @@ -1,5 +1,21 @@ "use strict"; +/* Refresh page if idle > 6h */ +var REFRESH_FREQUENCY = 21600000; +var refresh; +var refresher = function() { + window.location.reload(true); +}; + +var awaitIdle = function() { + if(refresh) clearTimeout(refresh); + refresh = setTimeout(refresher, REFRESH_FREQUENCY); +}; + +awaitIdle(); +$(document).on('mousemove keydown mousedown touchstart', awaitIdle); +/* Refresh page if idle > 6h */ + window.habitrpg = angular.module('habitrpg', ['ui.bootstrap', 'ui.keypress', 'ui.router', 'chieffancypants.loadingBar', 'At', 'infinite-scroll', 'ui.select2', 'angular.filter', 'ngResource', 'ngSanitize']) diff --git a/website/public/js/controllers/challengesCtrl.js b/website/public/js/controllers/challengesCtrl.js index 5f1f23980a..24985e85ac 100644 --- a/website/public/js/controllers/challengesCtrl.js +++ b/website/public/js/controllers/challengesCtrl.js @@ -94,15 +94,14 @@ habitrpg.controller("ChallengesCtrl", ['$rootScope','$scope', 'Shared', 'User', challenge.$save(function(_challenge){ if (isNew) { Notification.text(window.env.t('challengeCreated')); - $state.go('options.social.challenges.detail', {cid: _challenge._id}); - $scope.discard(); - $scope.challenges = Challenges.Challenge.query(); + $state.transitionTo('options.social.challenges.detail', {cid: challenge._id}, { + reload: true, inherit: false, notify: true + }); User.sync(); } else { - // TODO figure out a more elegant way about this - //challenge._editing = false; - challenge._locked = true; - getChallenges(); + $state.transitionTo('options.social.challenges.detail', {cid: challenge._id}, { + reload: true, inherit: false, notify: true + }); } }); }; diff --git a/website/public/js/directives/directives.js b/website/public/js/directives/directives.js deleted file mode 100644 index 55f2627c10..0000000000 --- a/website/public/js/directives/directives.js +++ /dev/null @@ -1,198 +0,0 @@ -'use strict'; - -/** - * Directive that places focus on the element it is applied to when the expression it binds to evaluates to true. - */ -habitrpg.directive('taskFocus', - ['$timeout', - function($timeout) { - return function(scope, elem, attrs) { - scope.$watch(attrs.taskFocus, function(newval) { - if ( newval ) { - $timeout(function() { - elem[0].focus(); - }, 0, false); - } - }); - }; - } -]); - -habitrpg.directive('whenScrolled', function() { - return function(scope, elm, attr) { - var raw = elm[0]; - - elm.bind('scroll', function() { - if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) { - scope.$apply(attr.whenScrolled); - } - }); - }; -}); - -habitrpg - .directive('habitrpgTasks', ['$rootScope', 'User', function($rootScope, User) { - return { - restrict: 'EA', - templateUrl: 'templates/habitrpg-tasks.html', - //transclude: true, - //scope: { - // main: '@', // true if it's the user's main list - // obj: '=' - //}, - controller: ['$scope', '$rootScope', function($scope, $rootScope){ - $scope.editTask = function(task){ - task._editing = !task._editing; - task._tags = User.user.preferences.tagsCollapsed; - task._advanced = User.user.preferences.advancedCollapsed; - task._tempDateForPicker = moment(task.startDate).format('YYYY-MM-DD'); - if($rootScope.charts[task.id]) $rootScope.charts[task.id] = false; - }; - }], - link: function(scope, element, attrs) { - // $scope.obj needs to come from controllers, so we can pass by ref - scope.main = attrs.main; - scope.modal = attrs.modal; - var dailiesView; - if(User.user.preferences.dailyDueDefaultView) { - dailiesView = "remaining"; - } else { - dailiesView = "all"; - } - $rootScope.lists = [ - { - header: window.env.t('habits'), - type: 'habit', - placeHolder: window.env.t('newHabit'), - placeHolderBulk: window.env.t('newHabitBulk'), - view: "all" - }, { - header: window.env.t('dailies'), - type: 'daily', - placeHolder: window.env.t('newDaily'), - placeHolderBulk: window.env.t('newDailyBulk'), - view: dailiesView - }, { - header: window.env.t('todos'), - type: 'todo', - placeHolder: window.env.t('newTodo'), - placeHolderBulk: window.env.t('newTodoBulk'), - view: "remaining" - }, { - header: window.env.t('rewards'), - type: 'reward', - placeHolder: window.env.t('newReward'), - placeHolderBulk: window.env.t('newRewardBulk'), - view: "all" - } - ]; - - } - } - }]); - -habitrpg.directive('fromNow', ['$interval', function($interval){ - return function(scope, element, attr){ - var updateText = function(){ element.text(moment(scope.message.timestamp).fromNow()) }; - updateText(); - // Update the counter every 60secs if was sent less than one hour ago otherwise every hour - // OPTIMIZATION, every time the interval is run, update the interval time - var intervalTime = moment().diff(scope.message.timestamp, 'minute') < 60 ? 60000 : 3600000; - var interval = $interval(function(){ updateText() }, intervalTime, false); - scope.$on('$destroy', function() { - $interval.cancel(interval); - }); - } -}]); - -habitrpg.directive('hrpgSortTasks', ['User', function(User) { - return function($scope, element, attrs, ngModel) { - $(element).sortable({ - axis: "y", - distance: 5, - start: function (event, ui) { - ui.item.data('startIndex', ui.item.index()); - }, - stop: function (event, ui) { - var task = angular.element(ui.item[0]).scope().task, - startIndex = ui.item.data('startIndex'); - User.user.ops.sortTask({ params: {id: task.id}, query: {from: startIndex, to: ui.item.index()} }); - } - }); - } -}]); - -habitrpg.directive('hrpgSortChecklist', ['User', function(User) { - return function($scope, element, attrs, ngModel) { - $(element).sortable({ - axis: "y", - distance: 5, - start: function (event, ui) { - ui.item.data('startIndex', ui.item.index()); - }, - stop: function (event, ui) { - var task = angular.element(ui.item[0]).scope().task, - startIndex = ui.item.data('startIndex'); - //$scope.saveTask(task, true); - $scope.swapChecklistItems(task, startIndex, ui.item.index()); - } - }); - } -}]); - -habitrpg.directive('hrpgSortTags', ['User', function(User) { - return function($scope, element, attrs, ngModel) { - $(element).sortable({ - start: function (event, ui) { - ui.item.data('startIndex', ui.item.index()); - }, - stop: function (event, ui) { - User.user.ops.sortTag({query:{ from: ui.item.data('startIndex'), to:ui.item.index() }}); - } - }); - } -}]); - -habitrpg - .directive( 'popoverHtmlPopup', ['$sce', function($sce) { - return { - restrict: 'EA', - replace: true, - scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, - link: function(scope, element, attrs) { - scope.$watch('content', function(value, oldValue) { - scope.unsafeContent = $sce.trustAsHtml(scope.content); - }); - }, - templateUrl: 'template/popover/popover-html.html' - }; - }]) - .directive( 'popoverHtml', [ '$compile', '$timeout', '$parse', '$window', '$tooltip', - function ( $compile, $timeout, $parse, $window, $tooltip ) { - return $tooltip( 'popoverHtml', 'popover', 'click' ); - } - ]) - .run(["$templateCache", function($templateCache) { - $templateCache.put("template/popover/popover-html.html", - "
\n" + - "
\n" + - "\n" + - "
\n" + - "

\n" + - "
\n" + - "
\n" + - "
\n"); - }]); - -habitrpg.directive('focusMe', ['$timeout', '$parse', function($timeout, $parse) { - return { - link: function(scope, element, attrs) { - var model = $parse(attrs.focusMe); - scope.$watch(model, function(value) { - $timeout(function() { - element[0].focus(); - }); - }); - } - }; -}]); diff --git a/website/public/js/directives/focus-me.directive.js b/website/public/js/directives/focus-me.directive.js new file mode 100644 index 0000000000..e2fd96657c --- /dev/null +++ b/website/public/js/directives/focus-me.directive.js @@ -0,0 +1,23 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('focusMe', focusMe); + +focusMe.$inject = [ + '$timeout', + '$parse' +]; + +function focusMe($timeout, $parse) { + return { + link: function(scope, element, attrs) { + var model = $parse(attrs.focusMe); + scope.$watch(model, function(value) { + $timeout(function() { + element[0].focus(); + }); + }); + } + } +} diff --git a/website/public/js/directives/from-now.directive.js b/website/public/js/directives/from-now.directive.js new file mode 100644 index 0000000000..37b61a2b90 --- /dev/null +++ b/website/public/js/directives/from-now.directive.js @@ -0,0 +1,44 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('fromNow', fromNow); + +fromNow.$inject = [ + '$interval', + '$timeout' +]; + +function fromNow($interval, $timeout) { + return function(scope, element, attr){ + var interval, timeout; + + var updateText = function(){ + element.text(moment(scope.message.timestamp).fromNow()); + }; + + var setupInterval = function() { + if(interval) $interval.cancel(interval); + if(timeout) $timeout.cancel(timeout); + + var diff = moment().diff(scope.message.timestamp, 'minute'); + + if(diff < 60) { + // Update every minute + interval = $interval(updateText, 60000, false); + timeout = $timeout(setupInterval, diff * 60000); + } else { + // Update every hour + interval = $interval(updateText, 3600000, false); + } + }; + + updateText(); + setupInterval(); + + scope.$on('$destroy', function() { + if(interval) $interval.cancel(interval); + if(timeout) $timeout.cancel(timeout); + }); + } +} diff --git a/website/public/js/directives/habitrpg-tasks.directive.js b/website/public/js/directives/habitrpg-tasks.directive.js new file mode 100644 index 0000000000..1ec1a5b93a --- /dev/null +++ b/website/public/js/directives/habitrpg-tasks.directive.js @@ -0,0 +1,69 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('habitrpgTasks', habitrpgTasks); + +habitrpgTasks.$inject = [ + '$rootScope', + 'User' +]; + +function habitrpgTasks($rootScope, User) { + return { + restrict: 'EA', + templateUrl: 'templates/habitrpg-tasks.html', + //transclude: true, + //scope: { + // main: '@', // true if it's the user's main list + // obj: '=' + //}, + controller: ['$scope', '$rootScope', function($scope, $rootScope){ + $scope.editTask = function(task){ + task._editing = !task._editing; + task._tags = User.user.preferences.tagsCollapsed; + task._advanced = User.user.preferences.advancedCollapsed; + if($rootScope.charts[task.id]) $rootScope.charts[task.id] = false; + }; + }], + link: function(scope, element, attrs) { + // $scope.obj needs to come from controllers, so we can pass by ref + scope.main = attrs.main; + scope.modal = attrs.modal; + var dailiesView; + if(User.user.preferences.dailyDueDefaultView) { + dailiesView = "remaining"; + } else { + dailiesView = "all"; + } + $rootScope.lists = [ + { + header: window.env.t('habits'), + type: 'habit', + placeHolder: window.env.t('newHabit'), + placeHolderBulk: window.env.t('newHabitBulk'), + view: "all" + }, { + header: window.env.t('dailies'), + type: 'daily', + placeHolder: window.env.t('newDaily'), + placeHolderBulk: window.env.t('newDailyBulk'), + view: dailiesView + }, { + header: window.env.t('todos'), + type: 'todo', + placeHolder: window.env.t('newTodo'), + placeHolderBulk: window.env.t('newTodoBulk'), + view: "remaining" + }, { + header: window.env.t('rewards'), + type: 'reward', + placeHolder: window.env.t('newReward'), + placeHolderBulk: window.env.t('newRewardBulk'), + view: "all" + } + ]; + + } + } +} diff --git a/website/public/js/directives/hrpg-sort-checklist.directive.js b/website/public/js/directives/hrpg-sort-checklist.directive.js new file mode 100644 index 0000000000..52211e8cd4 --- /dev/null +++ b/website/public/js/directives/hrpg-sort-checklist.directive.js @@ -0,0 +1,30 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('hrpgSortChecklist', hrpgSortChecklist); + +hrpgSortChecklist.$inject = [ + 'User' +]; + +function hrpgSortChecklist(User) { + return function($scope, element, attrs, ngModel) { + $(element).sortable({ + axis: "y", + distance: 5, + start: function (event, ui) { + ui.item.data('startIndex', ui.item.index()); + }, + stop: function (event, ui) { + var task = angular.element(ui.item[0]).scope().task; + var startIndex = ui.item.data('startIndex'); + $scope.swapChecklistItems( + task, + startIndex, + ui.item.index() + ); + } + }); + } +} diff --git a/website/public/js/directives/hrpg-sort-tags.directive.js b/website/public/js/directives/hrpg-sort-tags.directive.js new file mode 100644 index 0000000000..3eac5fe0a6 --- /dev/null +++ b/website/public/js/directives/hrpg-sort-tags.directive.js @@ -0,0 +1,27 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('hrpgSortTags', hrpgSortTags); + +hrpgSortTags.$inject = [ + 'User' +]; + +function hrpgSortTags(User) { + return function($scope, element, attrs, ngModel) { + $(element).sortable({ + start: function (event, ui) { + ui.item.data('startIndex', ui.item.index()); + }, + stop: function (event, ui) { + User.user.ops.sortTag({ + query: { + from: ui.item.data('startIndex'), + to:ui.item.index() + } + }); + } + }); + } +} diff --git a/website/public/js/directives/hrpg-sort-tasks.directive.js b/website/public/js/directives/hrpg-sort-tasks.directive.js new file mode 100644 index 0000000000..0e18091cf2 --- /dev/null +++ b/website/public/js/directives/hrpg-sort-tasks.directive.js @@ -0,0 +1,32 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('hrpgSortTasks', hrpgSortTasks); + +hrpgSortTasks.$inject = [ + 'User' +]; + +function hrpgSortTasks(User) { + return function($scope, element, attrs, ngModel) { + $(element).sortable({ + axis: "y", + distance: 5, + start: function (event, ui) { + ui.item.data('startIndex', ui.item.index()); + }, + stop: function (event, ui) { + var task = angular.element(ui.item[0]).scope().task; + var startIndex = ui.item.data('startIndex'); + User.user.ops.sortTask({ + params: { id: task.id }, + query: { + from: startIndex, + to: ui.item.index() + } + }); + } + }); + } +} diff --git a/website/public/js/directives/popover-html-popup.directive.js b/website/public/js/directives/popover-html-popup.directive.js new file mode 100644 index 0000000000..555a7019d1 --- /dev/null +++ b/website/public/js/directives/popover-html-popup.directive.js @@ -0,0 +1,45 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('popoverHtmlPopup', popoverHtmlPopup) + .run(loadPopupTemplate); + +popoverHtmlPopup.$inject = [ + '$sce' +]; + +function popoverHtmlPopup($sce) { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, + link: function(scope, element, attrs) { + scope.$watch('content', function(value, oldValue) { + scope.unsafeContent = $sce.trustAsHtml(scope.content); + }); + }, + templateUrl: 'template/popover/popover-html.html' + }; +} + +/* + * TODO: Review whether it's appropriate to be seeding this into the + * templateCache like this. Feel like this might be an antipattern? + */ + +loadPopupTemplate.$inject = [ + '$templateCache' +]; + +function loadPopupTemplate($templateCache) { + $templateCache.put("template/popover/popover-html.html", + "
\n" + + "
\n" + + "\n" + + "
\n" + + "

\n" + + "
\n" + + "
\n" + + "
\n"); +} diff --git a/website/public/js/directives/popover-html.directive.js b/website/public/js/directives/popover-html.directive.js new file mode 100644 index 0000000000..0462d99a31 --- /dev/null +++ b/website/public/js/directives/popover-html.directive.js @@ -0,0 +1,17 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('popoverHtml', popoverHtml); + +popoverHtml.$inject = [ + '$compile', + '$timeout', + '$parse', + '$window', + '$tooltip' +]; + +function popoverHtml($compile, $timeout, $parse, $window, $tooltip) { + return $tooltip('popoverHtml', 'popover', 'click'); +} diff --git a/website/public/js/directives/task-focus.directive.js b/website/public/js/directives/task-focus.directive.js new file mode 100644 index 0000000000..391e42b7fe --- /dev/null +++ b/website/public/js/directives/task-focus.directive.js @@ -0,0 +1,24 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('taskFocus', taskFocus); + +taskFocus.$inject = ['$timeout']; + +/** + * Directive that places focus on the element it is applied to when the + * expression it binds to evaluates to true. + */ + +function taskFocus($timeout) { + return function(scope, elem, attrs) { + scope.$watch(attrs.taskFocus, function(newVal) { + if (newVal) { + $timeout(function() { + elem[0].focus(); + }, 0, false); + } + }); + } +} diff --git a/website/public/js/directives/when-scrolled.directive.js b/website/public/js/directives/when-scrolled.directive.js new file mode 100644 index 0000000000..3a063ca439 --- /dev/null +++ b/website/public/js/directives/when-scrolled.directive.js @@ -0,0 +1,17 @@ +'use strict'; + +angular + .module('habitrpg') + .directive('whenScrolled', whenScrolled); + +function whenScrolled() { + return function(scope, elm, attr) { + var raw = elm[0]; + + elm.bind('scroll', function() { + if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) { + scope.$apply(attr.whenScrolled); + } + }); + }; +} diff --git a/website/public/manifest.json b/website/public/manifest.json index 8bb5d7d275..7436040c57 100644 --- a/website/public/manifest.json +++ b/website/public/manifest.json @@ -50,7 +50,16 @@ "js/filters/filters.js", - "js/directives/directives.js", + "js/directives/focus-me.directive.js", + "js/directives/from-now.directive.js", + "js/directives/habitrpg-tasks.directive.js", + "js/directives/hrpg-sort-checklist.directive.js", + "js/directives/hrpg-sort-tags.directive.js", + "js/directives/hrpg-sort-tasks.directive.js", + "js/directives/popover-html-popup.directive.js", + "js/directives/popover-html.directive.js", + "js/directives/task-focus.directive.js", + "js/directives/when-scrolled.directive.js", "js/controllers/authCtrl.js", "js/controllers/notificationCtrl.js", diff --git a/website/src/i18n.js b/website/src/i18n.js index 0f2bb77473..82967213b9 100644 --- a/website/src/i18n.js +++ b/website/src/i18n.js @@ -127,7 +127,7 @@ var getUserLanguage = function(req, res, next){ }else if(req.locals && req.locals.user){ getFromUser(req.locals.user); }else if(req.session && req.session.userId){ - User.findOne({_id: req.session.userId}, function(err, user){ + User.findOne({_id: req.session.userId}, 'preferences.language', function(err, user){ if(err) return next(err); getFromUser(user); }); diff --git a/website/views/options/profile.jade b/website/views/options/profile.jade index b7cf432095..d7d9731502 100644 --- a/website/views/options/profile.jade +++ b/website/views/options/profile.jade @@ -270,7 +270,7 @@ script(id='partials/options.profile.profile.html', type='text/ng-template') input.form-control(type='url', ng-model='editingProfile.imageUrl', placeholder=env.t('imageUrl')) .form-group label=env.t('displayBlurb') - textarea.form-control(rows=5, placeholder=env.t('displayBlurb'), ng-model='editingProfile.blurb') + textarea.form-control(rows=5, placeholder=env.t('displayBlurbPlaceholder'), ng-model='editingProfile.blurb') include ../shared/formatting-help mixin backgrounds(mobile) diff --git a/website/views/shared/modals/classes.jade b/website/views/shared/modals/classes.jade index 5eac56aeea..b199cd0e83 100644 --- a/website/views/shared/modals/classes.jade +++ b/website/views/shared/modals/classes.jade @@ -1,18 +1,11 @@ script(type='text/ng-template', id='modals/chooseClass.html') .modal-header - h4 - |  - =env.t('chooseClass1') - | - a(href='http://habitrpg.wikia.com/wiki/Class_System' target='_blank')=env.t('chooseClass2') - |  - =env.t('chooseClass3') + h4=env.t('chooseClassHeading') .modal-body.select-class .container-fluid .row .col-md-3(ng-click='selectedClass = "warrior"') - h5 - a(href='http://habitrpg.wikia.com/wiki/Warrior' target='_blank')=env.t('warrior') + h5!=env.t('warriorWiki') figure.herobox(ng-class='{"selected-class": selectedClass=="warrior"}') .character-sprites span(class='skin_{{user.preferences.skin}}') @@ -26,8 +19,7 @@ script(type='text/ng-template', id='modals/chooseClass.html') span(class='shield_warrior_5') span(class='weapon_warrior_6') .col-md-3(ng-click='selectedClass = "wizard"') - h5 - a(href='http://habitrpg.wikia.com/wiki/Mage' target='_blank')=env.t('mage') + h5!=env.t('mageWiki') figure.herobox(ng-class='{"selected-class": selectedClass=="wizard"}') .character-sprites span(class='skin_{{user.preferences.skin}}') @@ -41,8 +33,7 @@ script(type='text/ng-template', id='modals/chooseClass.html') span(class='shield_wizard_5') span(class='weapon_wizard_6') .col-md-3(ng-click='selectedClass = "rogue"') - h5 - a(href='http://habitrpg.wikia.com/wiki/Rogue' target='_blank')=env.t('rogue') + h5!=env.t('rogueWiki') figure.herobox(ng-class='{"selected-class": selectedClass=="rogue"}') .character-sprites span(class='skin_{{user.preferences.skin}}') @@ -56,8 +47,7 @@ script(type='text/ng-template', id='modals/chooseClass.html') span(class='shield_rogue_6') span(class='weapon_rogue_6') .col-md-3(ng-click='selectedClass = "healer"') - h5 - a(href='http://habitrpg.wikia.com/wiki/Healer' target='_blank')=env.t('healer') + h5!=env.t('healerWiki') figure.herobox(ng-class='{"selected-class": selectedClass=="healer"}') .character-sprites span(class='skin_{{user.preferences.skin}}') @@ -77,5 +67,6 @@ script(type='text/ng-template', id='modals/chooseClass.html') .well(ng-show='selectedClass=="healer"')=env.t('healerText') .modal-footer - button.btn.btn-sm.btn-danger(ng-click='user.ops.disableClasses({}); $close()', popover-placement='top', popover-trigger='mouseenter', popover=env.t('optOutText'))=env.t('optOut') + button.btn.btn-danger(ng-click='user.ops.disableClasses({}); $close()', popover-placement='top', popover-trigger='mouseenter', popover=env.t('optOutText'))=env.t('optOut') button.btn.btn-primary(ng-disabled='!selectedClass' ng-click='changeClass(selectedClass); $close()')=env.t('select') + .pull-left!=env.t('chooseClassLearn') diff --git a/website/views/shared/tasks/task_view/add_new.jade b/website/views/shared/tasks/task_view/add_new.jade index ef214d5ce1..aee14a33b6 100644 --- a/website/views/shared/tasks/task_view/add_new.jade +++ b/website/views/shared/tasks/task_view/add_new.jade @@ -1,4 +1,4 @@ -form.task-add(name='new{{list.type}}form', ng-hide='obj._locked', ng-submit='addTask(obj[list.type+"s"],list)') +form.task-add(name='new{{list.type}}form', ng-hide='obj._locked', ng-submit='addTask(obj[list.type+"s"],list)', novalidate) textarea(rows='6', task-focus='list.bulk && list.focus', ng-model='list.newTask', placeholder='{{list.placeHolderBulk}}', ng-if='list.bulk', ui-keydown='{"meta-enter ctrl-enter":"addTask(obj[list.type+\'s\'],list)"}', required) input(type='text', task-focus='!list.bulk && list.focus', ng-model='list.newTask', placeholder='{{list.placeHolder}}', ng-if='!list.bulk', required) button(type='submit', ng-disabled='new{{list.type}}form.$invalid')