diff --git a/config.json.example b/config.json.example index f2274ce940..1aa62936b7 100644 --- a/config.json.example +++ b/config.json.example @@ -22,6 +22,8 @@ "CRON_SEMI_SAFE_MODE":"false", "MAINTENANCE_MODE": "false", "SESSION_SECRET":"YOUR SECRET HERE", + "SESSION_SECRET_KEY": "1234567891234567891234567891234567891234567891234567891234567891", + "SESSION_SECRET_IV": "12345678912345678912345678912345", "ADMIN_EMAIL": "you@example.com", "SMTP_USER":"user@example.com", "SMTP_PASS":"password", diff --git a/package-lock.json b/package-lock.json index e1c2c6474b..f1664349fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.21.0", + "version": "4.22.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f8ae25281a..1fcd179baf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.21.0", + "version": "4.22.1", "main": "./website/server/index.js", "dependencies": { "@slack/client": "^3.8.1", diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js index 182de5aa30..a7d750fdb9 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js @@ -149,7 +149,10 @@ describe('GET /challenges/:challengeId/members', () => { let usersToGenerate = []; for (let i = 0; i < 3; i++) { - usersToGenerate.push(generateUser({challenges: [challenge._id]})); + usersToGenerate.push(generateUser({ + challenges: [challenge._id], + 'profile.name': `${i}profilename`, + })); } let generatedUsers = await Promise.all(usersToGenerate); let profileNames = generatedUsers.map(generatedUser => generatedUser.profile.name); diff --git a/test/api/v3/integration/user/auth/POST-register_local.test.js b/test/api/v3/integration/user/auth/POST-register_local.test.js index 046009d997..259d848c05 100644 --- a/test/api/v3/integration/user/auth/POST-register_local.test.js +++ b/test/api/v3/integration/user/auth/POST-register_local.test.js @@ -6,10 +6,14 @@ import { getProperty, } from '../../../../../helpers/api-integration/v3'; import { ApiUser } from '../../../../../helpers/api-integration/api-classes'; -import { v4 as generateRandomUserName } from 'uuid'; +import { v4 as uuid } from 'uuid'; import { each } from 'lodash'; import { encrypt } from '../../../../../../website/server/libs/encryption'; +function generateRandomUserName () { + return (Date.now() + uuid()).substring(0, 20); +} + describe('POST /user/auth/local/register', () => { context('username and email are free', () => { let api; @@ -37,7 +41,8 @@ describe('POST /user/auth/local/register', () => { expect(user.newUser).to.eql(true); }); - it('remove spaces from username', async () => { + xit('remove spaces from username', async () => { + // TODO can probably delete this test now let username = ' usernamewithspaces '; let email = 'test@example.com'; let password = 'password'; @@ -53,6 +58,54 @@ describe('POST /user/auth/local/register', () => { expect(user.profile.name).to.eql(username.trim()); }); + context('validates username', () => { + const email = 'test@example.com'; + const password = 'password'; + + it('requires to username to be less than 20', async () => { + const username = (Date.now() + uuid()).substring(0, 21); + + await expect(api.post('/user/auth/local/register', { + username, + email, + password, + confirmPassword: password, + })).to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: 'Invalid request parameters.', + }); + }); + + it('rejects chracters not in [-_a-zA-Z0-9]', async () => { + const username = 'a-zA_Z09*'; + + await expect(api.post('/user/auth/local/register', { + username, + email, + password, + confirmPassword: password, + })).to.eventually.be.rejected.and.eql({ + code: 400, + error: 'BadRequest', + message: 'Invalid request parameters.', + }); + }); + + it('allows only [-_a-zA-Z0-9] characters', async () => { + const username = 'a-zA_Z09'; + + const user = await api.post('/user/auth/local/register', { + username, + email, + password, + confirmPassword: password, + }); + + expect(user.auth.local.username).to.eql(username); + }); + }); + context('provides default tags and tasks', async () => { it('for a generic API consumer', async () => { let username = generateRandomUserName(); diff --git a/test/helpers/api-integration/v3/object-generators.js b/test/helpers/api-integration/v3/object-generators.js index c2aa0fdeab..8322ae1098 100644 --- a/test/helpers/api-integration/v3/object-generators.js +++ b/test/helpers/api-integration/v3/object-generators.js @@ -15,7 +15,7 @@ import * as Tasks from '../../../../website/server/models/task'; // , you can do so by passing in the full path as a string: // { 'items.eggs.Wolf': 10 } export async function generateUser (update = {}) { - let username = generateUUID(); + let username = (Date.now() + generateUUID()).substring(0, 20); let password = 'password'; let email = `${username}@example.com`; diff --git a/website/client/components/settings/site.vue b/website/client/components/settings/site.vue index eb8132a973..b18f8f29b9 100644 --- a/website/client/components/settings/site.vue +++ b/website/client/components/settings/site.vue @@ -118,6 +118,7 @@ hr div(v-if='!user.auth.local.username') p {{ $t('addLocalAuth') }} + p {{ $t('usernameLimitations') }} .form(name='localAuth', novalidate) //-.alert.alert-danger(ng-messages='changeUsername.$error && changeUsername.submitted') {{ $t('fillAll') }} .form-group diff --git a/website/client/components/static/home.vue b/website/client/components/static/home.vue index 3d5bf3d58b..8f20858108 100644 --- a/website/client/components/static/home.vue +++ b/website/client/components/static/home.vue @@ -23,6 +23,7 @@ .strike span {{$t('or')}} .form(@keyup.enter="register()") + p.form-text {{$t('usernameLimitations')}} input.form-control(type='text', placeholder='Login Name', v-model='username', :class='{"input-valid": username.length > 3}') input.form-control(type='email', placeholder='Email', v-model='email', :class='{"input-invalid": emailInvalid, "input-valid": emailValid}') input.form-control(type='password', placeholder='Password', v-model='password', :class='{"input-valid": password.length > 3}') diff --git a/website/common/locales/bg/gear.json b/website/common/locales/bg/gear.json index dd7304ae37..39dd817632 100644 --- a/website/common/locales/bg/gear.json +++ b/website/common/locales/bg/gear.json @@ -1290,8 +1290,8 @@ "backMystery201706Notes": "Само видът на този флаг с Веселия Роджър изпълва всяка задача за изпълнение или ежедневна задача с ужас! Не променя показателите. Предмет за абонати: юни 2017 г.", "backMystery201709Text": "Купчина магьоснически книги", "backMystery201709Notes": "Изучаването на магията изисква много четене, но със сигурност ще Ви хареса! Не променя показателите. Предмет за абонати: септември 2017 г.", - "backMystery201801Text": "Frost Sprite Wings", - "backMystery201801Notes": "They may look as delicate as snowflakes, but these enchanted wings can carry you anywhere you wish! Confers no benefit. January 2018 Subscriber Item.", + "backMystery201801Text": "Крила на снежна фея", + "backMystery201801Notes": "Може да изглеждат крехки като снежинки, но тези крила могат да Ви отнесат където пожелаете! Не променя показателите. Предмет за абонати: януари 2018 г.", "backSpecialWonderconRedText": "Могъщо наметало", "backSpecialWonderconRedNotes": "Развява се със сила и красота. Не променя показателите. Специално издание: Конгресен предмет.", "backSpecialWonderconBlackText": "Подло наметало", @@ -1402,8 +1402,8 @@ "headAccessoryMystery201502Notes": "Нека въображението Ви полети! Не променя показателите. Предмет за абонати: февруари 2015 г.", "headAccessoryMystery201510Text": "Гоблински рога", "headAccessoryMystery201510Notes": "Тези страховити рога са леко слизести. Не променя показателите. Предмет за абонати: октомври 2015 г.", - "headAccessoryMystery201801Text": "Frost Sprite Antlers", - "headAccessoryMystery201801Notes": "These icy antlers shimmer with the glow of winter auroras. Confers no benefit. January 2018 Subscriber Item.", + "headAccessoryMystery201801Text": "Рога на снежна фея", + "headAccessoryMystery201801Notes": "Тези ледени рога блестят със светлината на зимни сияния. Не променя показателите. Предмет за абонати: януари 2018 г.", "headAccessoryMystery301405Text": "Защитни очила за чело", "headAccessoryMystery301405Notes": "„Очилата се слагат на очите“ — казват хората. „Никому не са нужни защитни очила, които могат да се носят само на главата“ — казват пак те. Ха! Показахте на всички, че това не е вярно! Не променя показателите. Предмет за абонати: август 3015 г.", "headAccessoryArmoireComicalArrowText": "Забавна стрела", diff --git a/website/common/locales/bg/subscriber.json b/website/common/locales/bg/subscriber.json index 3dc02e6562..ea50893427 100644 --- a/website/common/locales/bg/subscriber.json +++ b/website/common/locales/bg/subscriber.json @@ -138,7 +138,7 @@ "mysterySet201710": "Комплект на надменното дяволче", "mysterySet201711": "Комплект на килимния летец", "mysterySet201712": "Комплект на майстора-свещар", - "mysterySet201801": "Frost Sprite Set", + "mysterySet201801": "Комплект на снежната фея", "mysterySet301404": "Стандартен изтънчен комплект", "mysterySet301405": "Комплект изтънчени принадлежности", "mysterySet301703": "Изтънчен паунов комплект", diff --git a/website/common/locales/bg/tasks.json b/website/common/locales/bg/tasks.json index 7a6951dc1d..1f4ee60106 100644 --- a/website/common/locales/bg/tasks.json +++ b/website/common/locales/bg/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Изтриване на завършените", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Тук можете да видите последните си 30 завършени задачи. Можете да видите по-старите си завършени задачи от „Данни > Инструмент за показване на данните“ или „Данни > Изнасяне на данни > Потребителски данни.", "deleteToDosExplanation": "Ако натиснете бутона по-долу, всички завършени и архивирани задачи ще бъдат изтрити завинаги, освен онези от протичащи в момента предизвикателства и от групови планове. Ако искате да запазите информацията за тях, първо ги изнесете.", "addMultipleTip": "Съвет: За да добавите няколко задачи, разделете ги с нов ред (Shift + Enter) и след това натиснете „Enter“.", diff --git a/website/common/locales/cs/tasks.json b/website/common/locales/cs/tasks.json index 579607a9f9..d15a559e02 100644 --- a/website/common/locales/cs/tasks.json +++ b/website/common/locales/cs/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Vymaž dokončené", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Zde vidíš svých posledních 30 splněných úkolů z Úkolníčku. Starší splněné úkoly můžeš najít v Data > Nástroj zobrazení dat nebo Data > Export dat > Data uživatele.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/da/tasks.json b/website/common/locales/da/tasks.json index 942e88df35..f8f7bb5690 100644 --- a/website/common/locales/da/tasks.json +++ b/website/common/locales/da/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Slet Færdiggjorte", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Dine 30 senest afsluttede To-dos vises her. Du kan se ældre afsluttede To-Dos i Data > Datavisningsværktøj eller Data > Dataeksport > Brugerdata.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/de/front.json b/website/common/locales/de/front.json index 4bd0d36ccb..b7171282f0 100644 --- a/website/common/locales/de/front.json +++ b/website/common/locales/de/front.json @@ -143,7 +143,7 @@ "presskitText": "Danke für Dein Interesse an Habitica! Die folgenden Bilder dürfen in Artikeln oder Videos über Habitica verwendet werden. Für weitere Informationen kontaktiere bitte Siena Leslie unter <%= pressEnquiryEmail %>.", "pkQuestion1": "What inspired Habitica? How did it start?", "pkAnswer1": "If you’ve ever invested time in leveling up a character in a game, it’s hard not to wonder how great your life would be if you put all of that effort into improving your real-life self instead of your avatar. We starting building Habitica to address that question.
Habitica officially launched with a Kickstarter in 2013, and the idea really took off. Since then, it’s grown into a huge project, supported by our awesome open-source volunteers and our generous users.", - "pkQuestion2": "Why does Habitica work?", + "pkQuestion2": "Warum funktioniert Habitica?", "pkAnswer2": "Forming a new habit is hard because people really need that obvious, instant reward. For example, it’s tough to start flossing, because even though our dentist tells us that it's healthier in the long run, in the immediate moment it just makes your gums hurt.
Habitica's gamification adds a sense of instant gratification to everyday objectives by rewarding a tough task with experience, gold… and maybe even a random prize, like a dragon egg! This helps keep people motivated even when the task itself doesn't have an intrinsic reward, and we've seen people turn their lives around as a result. You can check out success stories here: https://habitversary.tumblr.com", "pkQuestion3": "Why did you add social features?", "pkAnswer3": "Social pressure is a huge motivating factor for a lot of people, so we knew that we wanted to have a strong community that would hold each other accountable for their goals and cheer for their successes. Luckily, one of the things that multiplayer video games do best is foster a sense of community among their users! Habitica’s community structure borrows from these types of games; you can form a small Party of close friends, but you can also join a larger, shared-interest groups known as a Guild. Although some users choose to play solo, most decide to form a support network that encourages social accountability through features such as Quests, where Party members pool their productivity to battle monsters together.", diff --git a/website/common/locales/de/gear.json b/website/common/locales/de/gear.json index 297c870feb..527e6ff305 100644 --- a/website/common/locales/de/gear.json +++ b/website/common/locales/de/gear.json @@ -910,7 +910,7 @@ "headSpecialWinter2018RogueNotes": "The perfect holiday disguise, with a built-in headlight! Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", "headSpecialWinter2018WarriorText": "Giftbox Helm", "headSpecialWinter2018WarriorNotes": "This jaunty box top and bow are not only festive, but quite sturdy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.", - "headSpecialWinter2018MageText": "Sparkly Top Hat", + "headSpecialWinter2018MageText": "Glitzernder Zylinder", "headSpecialWinter2018MageNotes": "Ready for some extra special magic? This glittery hat is sure to boost all your spells! Increases Perception by <%= per %>. Limited Edition 2017-2018 Winter Gear.", "headSpecialWinter2018HealerText": "Mistletoe Hood", "headSpecialWinter2018HealerNotes": "This fancy hood will keep you warm with happy holiday feelings! Increases Intelligence by <%= int %>. Limited Edition 2017-2018 Winter Gear.", @@ -1206,11 +1206,11 @@ "shieldSpecialFall2017WarriorNotes": "Dieser gezuckerte Schild hat mächtige schützende Kräfte, versuche also nicht daran zu naschen! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2017 Herbstausrüstung.", "shieldSpecialFall2017HealerText": "Herumgeisternde Kugel", "shieldSpecialFall2017HealerNotes": "Diese Kugel kreischt gelegentlich. Es tut uns leid, aber wir wissen nicht warum. Jedenfalls sieht sie schick aus! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2017 Herbstausrüstung.", - "shieldSpecialWinter2018RogueText": "Peppermint Hook", + "shieldSpecialWinter2018RogueText": "Pfefferminz-Haken", "shieldSpecialWinter2018RogueNotes": "Perfect for climbing walls or distracting your foes with sweet, sweet candy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.", - "shieldSpecialWinter2018WarriorText": "Magic Gift Bag", + "shieldSpecialWinter2018WarriorText": "Magische Geschenktüte", "shieldSpecialWinter2018WarriorNotes": "Just about any useful thing you need can be found in this sack, if you know the right magic words to whisper. Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", - "shieldSpecialWinter2018HealerText": "Mistletoe Bell", + "shieldSpecialWinter2018HealerText": "Mistelzweigglocke", "shieldSpecialWinter2018HealerNotes": "What's that sound? The sound of warmth and cheer for all to hear! Increases Constitution by <%= con %>. Limited Edition 2017-2018 Winter Gear.", "shieldMystery201601Text": "Töter der Vorsätze", "shieldMystery201601Notes": "Diese Klinge kann zur Entfernung aller Ablenkungen verwendet werden. Gewährt keinen Attributbonus. Abonnentengegenstand, Januar 2016.", @@ -1302,7 +1302,7 @@ "backSpecialSnowdriftVeilNotes": "Dieser durchscheinende Schleier sieht aus, als hättest Du Dich in ein elegantes Schneegestöber gehüllt. Gewährt keinen Attributbonus.", "backSpecialAetherCloakText": "Äthermantel", "backSpecialAetherCloakNotes": "This cloak once belonged to the Lost Masterclasser herself. Increases Perception by <%= per %>.", - "backSpecialTurkeyTailBaseText": "Turkey Tail", + "backSpecialTurkeyTailBaseText": "Truthahnschwanz", "backSpecialTurkeyTailBaseNotes": "Wear your noble Turkey Tail with pride while you celebrate! Confers no benefit.", "body": "Körperaccessoire", "bodyCapitalized": "Rückenaccessoire", diff --git a/website/common/locales/de/tasks.json b/website/common/locales/de/tasks.json index 8e72452f16..aff0f5d610 100644 --- a/website/common/locales/de/tasks.json +++ b/website/common/locales/de/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Erfüllte Aufgaben entfernen", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Hier siehst Du Deine 30 neuesten erledigten Aufgaben. Ältere erledigte Aufgaben kannst Du hier einsehen: Daten > Werkzeug zur Datenanzeige > Daten exportieren > Benutzerdaten.", "deleteToDosExplanation": "Wenn Du auf diesen Knopf klickst, werden alle Deine erfüllten und archivierten To-Dos dauerhaft gelöscht, mit Außnahme von To-Dos aus aktiven Wettbewerben und Gruppenplänen. Exportiere sie vorher, wenn Du sie nicht verlieren möchtest.", "addMultipleTip": "Tipp: Um mehrere Aufgaben hinzuzufügen, trenne sie mit einem Zeilenumbruch (Umschalt + Enter) und drücke dann \"Enter\".", diff --git a/website/common/locales/en/front.json b/website/common/locales/en/front.json index b01e184e36..298b1c429f 100644 --- a/website/common/locales/en/front.json +++ b/website/common/locales/en/front.json @@ -275,6 +275,8 @@ "emailTaken": "Email address is already used in an account.", "newEmailRequired": "Missing new email address.", "usernameTaken": "Login Name already taken.", + "usernameWrongLength": "Login Name must be between 1 and 20 characters long.", + "usernameBadCharacters": "Login Name must contain only letters a to z, numbers 0 to 9, hyphens, or underscores.", "passwordConfirmationMatch": "Password confirmation doesn't match password.", "invalidLoginCredentials": "Incorrect username and/or email and/or password.", "passwordResetPage": "Reset Password", @@ -296,6 +298,7 @@ "signUpWithSocial": "Sign up with <%= social %>", "loginWithSocial": "Log in with <%= social %>", "confirmPassword": "Confirm Password", + "usernameLimitations": "Login Name must be 1 to 20 characters long, containing only letters a to z, or numbers 0 to 9, or hyphens, or underscores.", "usernamePlaceholder": "e.g., HabitRabbit", "emailPlaceholder": "e.g., rabbit@example.com", "passwordPlaceholder": "e.g., ******************", diff --git a/website/common/locales/en@pirate/tasks.json b/website/common/locales/en@pirate/tasks.json index 4087ac3833..9b6823cd37 100644 --- a/website/common/locales/en@pirate/tasks.json +++ b/website/common/locales/en@pirate/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Delete Completed", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Your most recent 30 completed To-Dos are shown here. You can see older completed To-Dos from Data > Data Display Tool or Data > Export Data > User Data.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/en_GB/tasks.json b/website/common/locales/en_GB/tasks.json index dbdd470f11..94a68d0d07 100644 --- a/website/common/locales/en_GB/tasks.json +++ b/website/common/locales/en_GB/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Delete Completed", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Your most recent 30 completed To-Dos are shown here. You can see older completed To-Dos from Data > Data Display Tool or Data > Export Data > User Data.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/es/tasks.json b/website/common/locales/es/tasks.json index 17d6c8e35f..d596a2976b 100644 --- a/website/common/locales/es/tasks.json +++ b/website/common/locales/es/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Borrado completado", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Aquí aparecen las 30 últimas tareas que has completado. Si quieres ver las tareas que completaste anteriormente, ve a Datos > Herramienta de visualización de datos o Datos > Exportar datos > Datos de usuario.", "deleteToDosExplanation": "Si pulsas el botón de abajo, todas tus Tareas Pendientes completadas y archivadas serán borradas permanentemente, excepto las Tareas Pendientes de retos activos o Planes de Grupo. Expórtalas primero si quieres mantener un registro de las mismas.", "addMultipleTip": "Consejo: Para añadir varias Tareas, sepáralas una a una utilizando un salto de línea (Shift + Enter) y, entonces, presiona \"Enter.\"", diff --git a/website/common/locales/es_419/tasks.json b/website/common/locales/es_419/tasks.json index 04253ba652..f990050b70 100644 --- a/website/common/locales/es_419/tasks.json +++ b/website/common/locales/es_419/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Borrar hábitos completados", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Se ven las 30 tareas completadas más recientes aquí. Se pueden ver tareas completadas anteriores por Datos > Exportar Datos > Datos de Usario.", "deleteToDosExplanation": "Si haces clic en el siguiente botón, todas tus Pendientes realizadas y tus Pendientes archivadas serán borradas de forma permanente, con la excepción de Pendientes de desafíos activos y de Planes Grupales. Expórtalas primero si quieres mantener un registro de ellas.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/fr/tasks.json b/website/common/locales/fr/tasks.json index 9fe7e4c5a0..dda6fba7e8 100644 --- a/website/common/locales/fr/tasks.json +++ b/website/common/locales/fr/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Supprimer les tâches accomplies", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Vos 30 tâches à faire terminées les plus récentes sont montrées ici. Vous pouvez consulter les tâches plus anciennes depuis Données > Outil d'affichage des données ou Données > Exporter les données > Données utilisateur.", "deleteToDosExplanation": "Si vous cliquez sur le bouton ci-dessous, toutes vos tâches À Faire complétées et archivées seront supprimées définitivement, à l'exception des tâches de défis actifs et des offres de groupe. Exportez-les d'abord si vous souhaitez en garder une trace.", "addMultipleTip": "Astuce : Pour ajouter plusieurs Tâches, séparez-les par des sauts de ligne (Shift + Entrée) puis tapez \"Entrée\".", diff --git a/website/common/locales/he/tasks.json b/website/common/locales/he/tasks.json index e2aeda787f..6541a28a75 100644 --- a/website/common/locales/he/tasks.json +++ b/website/common/locales/he/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "ניקוי מטלות שבוצעו", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "30 המשימות האחרונות מוצגות כאן. אתם יכולים לראות משימות מושלמות ישנות יותר ב מידע > כלי-הצגת-מידע או מידע > ייצוא-מידע > מידע-משתמש.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/hu/tasks.json b/website/common/locales/hu/tasks.json index ccb18a9e8f..641b7e92fd 100644 --- a/website/common/locales/hu/tasks.json +++ b/website/common/locales/hu/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Törlés kész", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "A legutolsó 30 befejezett feladatod látható itt. A többi befejezett feladatot az Adat > Adat kimutató eszköz vagy az Adat > Adatok exportálása > Felhasználói adatok menü alatt találod meg.", "deleteToDosExplanation": "Ha a lenti gombra kattintasz az összes eddigi elvégzett feladat valamint archivált feladat véglegesen törölve lesz, kivéve feladatok akítv kihívásokból és csoportos tervekből. Először exportáld őket, ha szeretnéd őket megőrizni.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/id/character.json b/website/common/locales/id/character.json index 6de65371ad..6a64f17a70 100644 --- a/website/common/locales/id/character.json +++ b/website/common/locales/id/character.json @@ -69,9 +69,9 @@ "costume": "Kostum", "costumeText": "Jika kamu lebih menyukai tampilan perlengkapan lain dibandingkan yang kamu kenakan sekarang, centang kotak \"Gunakan Kostum\" untuk menyembunyikan perlengkapan perang yang kamu kenakan di balik kostum yang kamu sukai.", "useCostume": "Gunakan Kostum", - "useCostumeInfo1": "Klik \"Gunakan Kostum\" untuk memasang item ke avatarmu tanpa memengaruhi status dari Perlengkapan Perang! Ini berarti kamu dapat memasang perlengkapan dengan status terbaik di sebelah kiri, dan memakai perlengkapan dengan model terbaik di sebelah kanan.", - "useCostumeInfo2": "Setelah memilih \"Gunakan Kostum\" avatarmu akan terlihat biasa saja... tapi jangan khawatir! Di kiri, kamu akan lihat karakter kamu masih menggunakan Perlengkapan Perang kamu. Selanjutnya, kamu dapat bergaya sepuasmu! Apapun yang kamu gunakan di kanan tidak akan mempengaruhi Statusmu, tapi dapat membuat kamu terlihat keren! Coba kombinasi yang berbeda-beda, campur aduk berbagai set, dan sesuaikan Kostum itu dengan peliharaan, tunggangan, dan juga latar belakangmu.

Masih ada pertanyaan lagi? Cek laman Kostumdi wiki. Berhasil mendapatkan kombinasi yang sempurna? Tunjukkan Kostum kamu di guild Karnival Kostumatau pamerkan di Kedai Minuman!", - "costumePopoverText": "PIlih \"Gunakan Kostum\" untuk menggunakan item-item tersebut kepada avatarmu tanpa mempengaruhi Status dari Perlengkapan Perang-mu! Ini berarti kamu dapat memakaikan avatar kamu dengan pakaian apapun yang kamu mau sambil menggunakan Perlengkapan Perang terbaikmu.", + "useCostumeInfo1": "Klik \"Gunakan Kostum\" untuk memasang item ke avatarmu tanpa memengaruhi Atribut dari Perlengkapan Perang! Ini berarti kamu dapat memasang perlengkapan dengan Atribut terbaik di sebelah kiri, dan memakai perlengkapan dengan model terbaik di sebelah kanan.", + "useCostumeInfo2": "Setelah memilih \"Gunakan Kostum\" avatarmu akan terlihat biasa saja... tapi jangan khawatir! Di kiri, kamu akan lihat karakter kamu masih menggunakan Perlengkapan Perang kamu. Selanjutnya, kamu dapat bergaya sepuasmu! Apapun yang kamu gunakan di kanan tidak akan mempengaruhi Atribut-mu, tapi dapat membuat kamu terlihat keren! Coba kombinasi yang berbeda-beda, campur aduk berbagai set, dan sesuaikan Kostum itu dengan peliharaan, tunggangan, dan juga latar belakangmu.

Masih ada pertanyaan lagi? Cek laman Kostumdi wiki. Berhasil mendapatkan kombinasi yang sempurna? Tunjukkan Kostum kamu di guild Karnival Kostumatau pamerkan di Kedai Minuman!", + "costumePopoverText": "PIlih \"Gunakan Kostum\" untuk menggunakan item-item tersebut kepada avatarmu tanpa mempengaruhi Atribut dari Perlengkapan Perang-mu! Ini berarti kamu dapat memakaikan avatar kamu dengan pakaian apapun yang kamu mau sambil menggunakan Perlengkapan Perang terbaikmu.", "autoEquipPopoverText": "Pilih ini jika kamu ingin langsung memakai perlengkapan setelah membelinya.", "costumeDisabled": "Kamu telah menonaktifkan kostummu.", "gearAchievement": "Kamu mendapat lencana \"Ultimate Gear\" karena sudah mendapat semua perlengkapan sesuai dengan pekerjaanmu! Kamu sudah melengkapi perlengkapan berikut:", @@ -99,7 +99,7 @@ "allocateInt": "Poin yang diberikan untuk Kecerdasan:", "allocateIntPop": "Tambahkan satu poin ke Kecerdasan", "noMoreAllocate": "Sekarang kamu sudah mencapai level 100, kamu tidak akan mendapat poin atribut lagi. Kamu bisa terus menaikkan level, atau mulai petualangan baru dari level 1 dengan menggunakan Orb of Rebirth yang sekarang bisa diambil gratis di Pasar.", - "stats": "Status", + "stats": "Atribut", "achievs": "Pencapaian", "strength": "Kekuatan", "strText": "Kekuatan meningkatkan peluang \"serangan kritis\" yang akan menambah jumlah Koin Emas dan Pengalaman (XP) yang didapatkan serta memperbesar kemungkinan mendapatkan item. Kekuatan juga membantu meningkatkan damage kamu terhadap monster boss.", @@ -133,15 +133,15 @@ "unallocated": "Poin Status yang Belum Dialokasikan", "haveUnallocated": "Kamu memiliki <%= points %> Poin Status yang belum dialokasikan", "autoAllocation": "Alokasi Otomatis", - "autoAllocationPop": "Letakkan poin kepada Status sesuai dengan kemauanmu, ketika kamu naik level.", + "autoAllocationPop": "Letakkan poin kepada Atribut sesuai dengan kemauanmu, ketika kamu naik level.", "evenAllocation": "Distribusi rata Poin Status", - "evenAllocationPop": "Assigns the same number of Points to each Stat.", + "evenAllocationPop": "Berikan jumlah Poin yang sama untuk setiap Atribut.", "classAllocation": "Distribusi Poin berdasarkan Pekerjaan", - "classAllocationPop": "Berikan Poin lebih untuk Status yang penting untuk Pekerjaanmu.", + "classAllocationPop": "Berikan Poin lebih untuk Atribut yang penting untuk Pekerjaanmu.", "taskAllocation": "Distribusi Poin berdasarkan aktivitas tugas", "taskAllocationPop": "Memberikan Poin berdasarkan kategori Kekuatan, Kecerdasan, Ketahanan, dan Persepsi yang berhubungan dengan tugas-tugas yang kamu selesaikan.", "distributePoints": "Distribusikan Poin yang Belum Dialokasikan", - "distributePointsPop": "Assigns all unallocated Stat Points according to the selected allocation scheme.", + "distributePointsPop": "Berikan semua Poin Atribut yang belum terpakai sesuai dengan skema alokasi yang dipilih.", "warriorText": "Para Prajurit mencetak lebih banyak \"serangan kritis\" saat menyelesaikan tugas, yang secara acak memberi tambahan Koin Emas, Pengalaman, dan memperbesar kemungkinan mendapatkan item. Prajurit juga mengakibatkan damage besar kepada monster-monster bos. Mainkan Prajurit kalau kamu termotivasi oleh imbalan-imbalan berbentuk jackpot yang tidak terduga, atau ingin menghajar para monster!", "wizardText": "Mage belajar dengan cepat, memperoleh Pengalaman dan Level lebih cepat daripada pekerjaan lain. Mereka juga punya banyak Mana untuk menggunakan kemampuan khusus. Pilih Mage jika kamu suka bermain Habitica dengan menggunakan taktik, atau jika kamu merasa sangat termotivasi untuk naik level dan membuka fitur-fitur lanjutan!", "mageText": "Penyihir cepat belajar, meraih Pengalaman dan Level lebih cepat daripada pekerjaan-pekerjaan lainnya. Mereka juga mendapatkan banyak Mana dengan menggunakan kemampuan khusus. Bermainlah sebagai Penyihir jika kamu menyukai aspek permainan taktik dari Habitica, atau jika kamu sangat termotifasi dengan peraihan level dan membuka fitur lebih lanjut.", @@ -161,7 +161,7 @@ "respawn": "Bangkit!", "youDied": "Kamu Terbunuh!", "dieText": "Kamu kehilangan satu Level, semua Koin Emas, dan salah satu Perlengkapanmu. Bangkitlah, Habiteer, dan coba lagi! Kurangi Kebiasaan buruk tersebut, waspada dalam menyelesaikan Keseharian, dan tunda kematian selama mungkin dengan Ramuan Kesehatan jika kamu goyah!", - "sureReset": "Are you sure? This will reset your character's class and allocated Stat Points (you'll get them all back to re-allocate), and costs 3 Gems.", + "sureReset": "Apakah kamu yakin? Kamu akan memilih ulang pekerjaan karaktermu dan Poin Atribut yang sudah dialokasikan akan dihapus (kamu akan mendapatkan semuanya kembali untuk dialokasikan ulang), seharga 3 Permata.", "purchaseFor": "Beli seharga <%= cost %> Gem?", "purchaseForHourglasses": "Beli seharga <%= cost %> Jam Pasir?", "notEnoughMana": "Mana tidak cukup.", @@ -197,11 +197,11 @@ "con": "KET", "per": "PER", "int": "KEC", - "showQuickAllocation": "Show Stat Allocation", - "hideQuickAllocation": "Hide Stat Allocation", - "quickAllocationLevelPopover": "Kamu akan mendapat satu Poin setiap level untuk dialokasikan kepada satu Status pilihanmu. Kamu dapat melakukan ini sendiri, atau biarkan permainan ini memutuskannya untukmu dengan menggunakan salah satu pilihan dari Alokasi Otomatis yang dapat ditemukan di Ikon Pengguna > Status.", - "invalidAttribute": "\"<%= attr %>\" is not a valid Stat.", - "notEnoughAttrPoints": "You don't have enough Stat Points.", + "showQuickAllocation": "Tampilkan Alokasi Atribut", + "hideQuickAllocation": "Sembunyikan Alokasi Atribut", + "quickAllocationLevelPopover": "Kamu akan mendapat satu Poin setiap level untuk dialokasikan kepada satu Atribut pilihanmu. Kamu dapat melakukan ini sendiri, atau biarkan permainan ini memutuskannya untukmu dengan menggunakan salah satu pilihan dari Alokasi Otomatis yang dapat ditemukan di Ikon Pengguna > Atribut.", + "invalidAttribute": "\"<%= attr %>\" bukan Atribut yang valid.", + "notEnoughAttrPoints": "Kamu tidak memiliki cukup Poin Atribut.", "style": "Gaya", "facialhair": "Wajah", "photo": "Foto", @@ -219,5 +219,5 @@ "offHand": "Tangan Lain", "pointsAvailable": "Poin Tersedia", "pts": "poin", - "statsObjectRequired": "Pembaruan Status diperlukan" + "statsObjectRequired": "Pembaruan Atribut diperlukan" } \ No newline at end of file diff --git a/website/common/locales/id/front.json b/website/common/locales/id/front.json index d6f34b2037..aeadc501db 100644 --- a/website/common/locales/id/front.json +++ b/website/common/locales/id/front.json @@ -86,7 +86,7 @@ "landingend": "Belum yakin juga?", "landingend2": "Lihat daftar yang lebih detil dari [fitur kami](/static/overview). Apakah kamu sedang mencari sebuah pendekatan swasta? Lihat [paket administratif](/static/plans) kami, sempurna untuk keluarga, guru, kelompok dukungan, dan juga bisnis.", "landingp1": "Kekurangan dari kebanyakan aplikasi dalam bidang produktivitas di pasar adalah mereka tidak mampu memberikan penghargaan yang mampu membuat pengguna terus menggunakannya. Habitica mengatasi ini dengan membuat membangun karakter menyenangkan! Dengan memberikan penghargaan atas keberhasilan dan memberikan penalti ketika ceroboh, Habitica memberikan motivasi eksternal untuk menyelesaikan aktivitas sehari-harimu.", - "landingp2": "Setiap kali kamu memperkuat kebiasaan positif, menyelesaikan tugas harian atau menyelesaikan to-do yang sudah lama ditinggalkan, Habitica langsung menghadiahimu poin Pengalaman dan Koin Emas. Dengan mendapatkan pengalaman, kamu dapat meningkatkan levelmu, meningkatkan Status dan membuka fitur baru, seperti pekerjaan dan peliharaan. Koin Emas dapat digunakan untuk membeli item dalam game yang mengubah pengalamanmu atau hadiah pribadi yang kamu ciptakan untuk motivasimu. Bahkan sekecil apapun kesuksesanmu akan tetap diberikan hadiah langsung, dan hal inilah yang akan menyebabkanmu menjadi lebih tidak menunda-nunda.", + "landingp2": "Setiap kali kamu memperkuat kebiasaan positif, menyelesaikan tugas harian atau menyelesaikan to-do yang sudah lama ditinggalkan, Habitica langsung menghadiahimu poin Pengalaman dan Koin Emas. Dengan mendapatkan pengalaman, kamu dapat meningkatkan levelmu, meningkatkan Atribut dan membuka fitur baru, seperti pekerjaan dan peliharaan. Koin Emas dapat digunakan untuk membeli item dalam game yang mengubah pengalamanmu atau hadiah pribadi yang kamu ciptakan untuk motivasimu. Bahkan sekecil apapun kesuksesanmu akan tetap diberikan hadiah langsung, dan hal inilah yang akan menyebabkanmu menjadi lebih tidak menunda-nunda.", "landingp2header": "Hadiah Langsung", "landingp3": "Setiap kali kamu menuruti kebiasaan burukmu atau gagal untuk menyelesaikan pekerjaan harianmu, kamu akan kehilangan nyawa. Kalau kamu terlalu banyak kehilangan nyawa, kamu akan mati dan kehilangan progress yang sudah kamu buat. Dengan memberikan konsekuensi langsung, Habitica akan membantumu menghilangkan kebiasaan buruk dan siklus menunda-nunda sebelum mereka benar-benar menimbulkan masalah.", "landingp3header": "Konsekuensi", diff --git a/website/common/locales/id/gear.json b/website/common/locales/id/gear.json index c1de2d24c8..2765422fa4 100644 --- a/website/common/locales/id/gear.json +++ b/website/common/locales/id/gear.json @@ -81,7 +81,7 @@ "weaponSpecial0Text": "Pedang Jiwa Kegelapan", "weaponSpecial0Notes": "Menyantap jiwa musuh untuk memperkuat tiap sabetan jahatnya. Meningkatkan Kekuatan sebesar <%= str %>.", "weaponSpecial1Text": "Pedang Kristal", - "weaponSpecial1Notes": "Permukaan berkilaunya mengisahkan kehidupan para pahlawan. Meningkatkan semua Status sebesar <%= attrs %>.", + "weaponSpecial1Notes": "Permukaan berkilaunya mengisahkan kehidupan para pahlawan. Meningkatkan semua Atribut sebesar <%= attrs %>.", "weaponSpecial2Text": "Tongkat Naga Stephen Weber", "weaponSpecial2Notes": "Rasakan kekuatan naga dari dalam! Meningkatkan Kekuatan dan Persepsi masing-masing sebesar <%= attrs %>.", "weaponSpecial3Text": "Mustaine's Milestone Mashing Morning Star", @@ -89,7 +89,7 @@ "weaponSpecialCriticalText": "Palu Kritis Penghancur Bug", "weaponSpecialCriticalNotes": "Jawara ini berhasil mengalahkan sebuah musuh kritis GitHub meskipun ksatria yang lain gagal. Dibuat dari tulang belulang dari Bug, palu ini menyerang dengan serangan kritis yang dahsyat. Meningkatkan Kekuatan dan Persepsi masing-masing sebesar <%= attrs %>.", "weaponSpecialTakeThisText": "Pedang Take This", - "weaponSpecialTakeThisNotes": "Pedang ini didapatkan oleh para partisipan yang bergabung dalam Tantangan yang disponsori oleh Take This. Selamat! Meningkatkan semua Status sebesar <%= attrs %>.", + "weaponSpecialTakeThisNotes": "Pedang ini didapatkan dengan berpartisipasi dalam Tantangan bersponsor yang dibuat oleh Take This. Selamat! Meningkatkan semua Atribut sebesar <%= attrs %>.", "weaponSpecialTridentOfCrashingTidesText": "Trisula Pemecah Ombak", "weaponSpecialTridentOfCrashingTidesNotes": "Memberi kemampuan untuk memerintah para ikan, sekaligus memberi tusukan yang kuat ke tugas-tugasmu. Meningkatkan Kecerdasan sebesar <%= int %>.", "weaponSpecialTaskwoodsLanternText": "Lentera Taskwood", @@ -113,7 +113,7 @@ "weaponSpecialTachiText": "Tachi", "weaponSpecialTachiNotes": "Pedang yang ringan dan melengkung ini akan mengiris tugasmu menjadi pita! Meningkatkan Kekuatan sebesar <%= str %>.", "weaponSpecialAetherCrystalsText": "Kristal Aether", - "weaponSpecialAetherCrystalsNotes": "Pelindung tangan dan kristal ini pernah menjadi kepunyaan sang Masterclasser yang Hilang. Meningkatkan semua Status sebesar <%= attrs %>.", + "weaponSpecialAetherCrystalsNotes": "Pelindung tangan dan kristal ini pernah menjadi kepunyaan sang Masterclasser yang Hilang. Meningkatkan semua Atribut sebesar <%= attrs %>.", "weaponSpecialYetiText": "Tombak Penjinak Yeti", "weaponSpecialYetiNotes": "Tombak ini membuat penggunanya mampu memerintah yeti manapun. Meningkatkan Kekuatan sebesar <%= str %>. Perlengkapan Musim Dingin 2013-2014 Edisi Terbatas.", "weaponSpecialSkiText": "Tongkat Ski Pembunuh", @@ -273,7 +273,7 @@ "weaponArmoireIronCrookText": "Linggis besi", "weaponArmoireIronCrookNotes": "Ditempa dengan ganas dari besi, linggis ini cocok digunakan dalam menggembala domba. Meningkatkan Persepsi dan Kekuatan masing-masing sebesar <%= attrs %>. Peti Harta Karun: Set Besi Berduri (Item 3 dari 3)", "weaponArmoireGoldWingStaffText": "Tongkat Sayap Emas", - "weaponArmoireGoldWingStaffNotes": "Sayap di tongkat ini selalu mengepak dan berputar. Meningkatkan semua Status masing-masing sebesar <%= attrs %>. Perlengkapan Tambahan: Item Tersendiri.", + "weaponArmoireGoldWingStaffNotes": "Sayap di tongkat ini selalu mengepak dan berputar. Meningkatkan semua Atribut masing-masing sebesar <%= attrs %>. Perlengkapan Tambahan: Item Tersendiri.", "weaponArmoireBatWandText": "Tongkat Kelelawar", "weaponArmoireBatWandNotes": "Tongkat ini dapat mengubah berbagai tugas menjadi kelelawar! Goyangkan dan saksikanlah semua tugasmu melayang pergi. Meningkatkan Kecerdasan sebesar <%= int %> dan Persepsi sebesar <%= per %>. Perlengkapan Tambahan: Item Tersendiri.", "weaponArmoireShepherdsCrookText": "Tongkat Penggembala", @@ -369,11 +369,11 @@ "armorSpecial0Text": "Baju Bayang-bayang", "armorSpecial0Notes": "Menjerit jika diserang, merasakan rasa sakit sang pengguna. Meningkatkan Ketahanan sebesar <%= con %>.", "armorSpecial1Text": "Baju Kristal", - "armorSpecial1Notes": "Kekuatannya tak pernah lelah menjaga penggunanya agar selalu nyaman. Meningkatkan semua Status sebesar <%= attrs %>.", + "armorSpecial1Notes": "Kekuatannya tak pernah lelah menjaga penggunanya agar selalu nyaman. Meningkatkan semua Atribut sebesar <%= attrs %>.", "armorSpecial2Text": "Jubah mulia Jean Chalard", "armorSpecial2Notes": "Membuat kamu ekstra lembut! Meningkatkan Ketahanan dan Kecerdasan masing-masing sebesar <%= attrs %>.", - "armorSpecialTakeThisText": "Baju Take This", - "armorSpecialTakeThisNotes": "Baju zirah ini didapatkan dengan berpartisipasi dalam Tantangan bersponsor yang dibuat oleh Take This. Selamat! Meningkatkan semua Status sebesar <%= attrs %>.", + "armorSpecialTakeThisText": "Baju Zirah Take This", + "armorSpecialTakeThisNotes": "Baju zirah ini didapatkan dengan berpartisipasi dalam Tantangan bersponsor yang dibuat oleh Take This. Selamat! Meningkatkan semua Atribut sebesar <%= attrs %>.", "armorSpecialFinnedOceanicArmorText": "Baju Samudra Bersirip", "armorSpecialFinnedOceanicArmorNotes": "Meskipun lembut, pakaian ini dapat membuat kulitmu mampu membakar apapun yang kamu sentuh seperti halnya koral api. Meningkatkan Kekuatan sebesar <%= str %>.", "armorSpecialPyromancersRobesText": "Jubah Pyromancer", @@ -661,7 +661,7 @@ "armorArmoireWoodElfArmorText": "Baju Zirah Elf Hutan", "armorArmoireWoodElfArmorNotes": "Baju zirah dari kulit pohon dan dedaunan bisa digunakan sebagai kamuflase tahan lama di hutan. Meningkatkan Persepsi sebesar <%= per %>. Peti Harta Karun: Set Elf Hutan (Item 2 dari 3).", "armorArmoireRamFleeceRobesText": "Ram Fleece Robes", - "armorArmoireRamFleeceRobesNotes": "These robes keep you warm even through the fiercest blizzard. Increases Constitution by <%= con %> and Strength by <%= str %>. Enchanted Armoire: Ram Barbarian Set (Item 2 of 3).", + "armorArmoireRamFleeceRobesNotes": "Jubah ini akan menjagamu tetap hangat bahkan menembus badai salju terganas. Meningkatkan Ketahanan sebesar <%= con %> dan Kekuatan sebesar <%= str %>. Peti Harta Karun: Set Domba Barbarian (Item 2 dari 3).", "armorArmoireGownOfHeartsText": "Gown of Hearts", "armorArmoireGownOfHeartsNotes": "This gown has all the frills! But that's not all, it will also increase your heart's fortitude. Increases Constitution by <%= con %>. Enchanted Armoire: Queen of Hearts Set (Item 2 of 3).", "armorArmoireMushroomDruidArmorText": "Mushroom Druid Armor", @@ -735,11 +735,11 @@ "headSpecial0Text": "Helm Bayang-bayang", "headSpecial0Notes": "Darah dan abu, lava dan batu obsidian, semuanya memberikan helm ini penampilan dan kekuatan. Meningkatkan Kecerdasan sebesar <%= int %>.", "headSpecial1Text": "Helm Kristal", - "headSpecial1Notes": "Mahkota yang disukai para pemimpin. Meningkatkan semua Status sebesar <%= attrs %>.", + "headSpecial1Notes": "Mahkota yang disukai para pemimpin. Meningkatkan semua Atribut sebesar <%= attrs %>.", "headSpecial2Text": "Helm Tanpa Nama", "headSpecial2Notes": "Helm yang diberikan untuk siapapun yang mengorbankan dirinya tanpa pamrih. Meningkatkan Kecerdasan dan Kekuatan masing-masing sebesar <%= attrs %>.", "headSpecialTakeThisText": "Helm Take This", - "headSpecialTakeThisNotes": "Helm ini didapatkan dengan berpartisipasi dalam sebuah Tantangan bersponsor yang buat oleh Take This. Selamat! Meningkatkan semua Status sebesar <%= attrs %>.", + "headSpecialTakeThisNotes": "Helm ini didapatkan dengan berpartisipasi dalam Tantangan bersponsor yang buat oleh Take This. Selamat! Meningkatkan semua Atribut sebesar <%= attrs %>.", "headSpecialFireCoralCircletText": "Mahkota Koral Api", "headSpecialFireCoralCircletNotes": "Mahkota ini, didesain oleh alkemis termahsyur Habitica, membuatmu mampu bernafas di dalam air dan menyelam untuk mencari harta karun! Meningkatkan Persepsi sebesar <%= per %>.", "headSpecialPyromancersTurbanText": "Serban Pyromancer", @@ -1047,7 +1047,7 @@ "headArmoireWoodElfHelmText": "Helm Elf Hutan", "headArmoireWoodElfHelmNotes": "Helm dedaunan ini mungkin terlihat tipis, tapi ini bisa melindungimu dari cuaca buruk dan musuh berbahaya. Meningkatkan Ketahanan sebesar <%= con %>. Peti Harta Karun: Set Elf Hutan (Item 1 dari 3).", "headArmoireRamHeaddressText": "Ram Headdress", - "headArmoireRamHeaddressNotes": "This elaborate helm is fashioned to look like a ram's head. Increases Constitution by <%= con %> and Perception by <%= per %>. Enchanted Armoire: Ram Barbarian Set (Item 1 of 3).", + "headArmoireRamHeaddressNotes": "Helm rumit ini didesain untuk kelihatan seperti kepala domba. Meningkatkan Ketahanan sebesar <%= con %> dan Persepsi sebesar <%= per %>. Peti Harta Karun: Set Domba Barbarian (Item 1 dari 3).", "headArmoireCrownOfHeartsText": "Crown of Hearts", "headArmoireCrownOfHeartsNotes": "This rosy red crown isn't just eye-catching! It will also strengthen your heart against tough tasks. Increases Strength by <%= str %>. Enchanted Armoire: Queen of Hearts Set (Item 1 of 3).", "headArmoireMushroomDruidCapText": "Mushroom Druid Cap", @@ -1093,9 +1093,9 @@ "shieldSpecial0Text": "Tengkorak Tersiksa", "shieldSpecial0Notes": "Melihat di balik tabir kematian, dan menunjukkan apa yang ada di sana untuk menakut-nakuti musuh. Meningkatkan Persepsi sebesar <%= per %>.", "shieldSpecial1Text": "Perisai Kristal", - "shieldSpecial1Notes": "Shatters arrows and deflects the words of naysayers. Increases all Stats by <%= attrs %>.", + "shieldSpecial1Notes": "Menghancurkan panah dan menangkis kata-kata penentangmu. Meningkatkan semua Atribut sebesar <%= attrs %>.", "shieldSpecialTakeThisText": "Perisai Take This", - "shieldSpecialTakeThisNotes": "This shield was earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", + "shieldSpecialTakeThisNotes": "Perisai ini didapatkan dengan berpartisipasi dalam Tantangan bersponsor yang dibuat oleh Take This. Selamat! Meningkatkan semua Atribut sebesar <%= attrs %>.", "shieldSpecialGoldenknightText": "Mustaine's Milestone Mashing Morning Star", "shieldSpecialGoldenknightNotes": "Rapat, monster, rasa sakit: sudah diatasi! Hancurkan! Meningkatkan Ketahanan dan Persepsi masing-masing sebesar <%= attrs %>.", "shieldSpecialMoonpearlShieldText": "Perisai Permata Bulan", @@ -1241,7 +1241,7 @@ "shieldArmoirePerchingFalconText": "Elang Bertengger", "shieldArmoirePerchingFalconNotes": "Seekor elang bersahabat bertengger di tanganmu, siap untuk menyambar musuhmu. Meningkatkan Kekuatan sebesar <%= str %>. Peti Harta Karun: Set Pawang Elang (Item 3 dari 3).", "shieldArmoireRamHornShieldText": "Perisai Tanduk Domba", - "shieldArmoireRamHornShieldNotes": "Ram this shield into opposing Dailies! Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Ram Barbarian Set (Item 3 of 3).", + "shieldArmoireRamHornShieldNotes": "Seruduk Keseharian lawanmu dengan perisai ini! Meningkatkan Ketahanan dan Kekuatan masing-masing sebesar <%= attrs %>. Peti Harta Karun: Set Domba Barbarian (Item 3 dari 3).", "shieldArmoireRedRoseText": "Red Rose", "shieldArmoireRedRoseNotes": "This deep red rose smells enchanting. It will also sharpen your understanding. Increases Perception by <%= per %>. Enchanted Armoire: Independent Item.", "shieldArmoireMushroomDruidShieldText": "Mushroom Druid Shield", @@ -1290,14 +1290,14 @@ "backMystery201706Notes": "The sight of this Jolly Roger-emblazoned flag fills any To-Do or Daily with dread! Confers no benefit. June 2017 Subscriber Item.", "backMystery201709Text": "Stack o' Sorcery Books", "backMystery201709Notes": "Learning magic takes a lot of reading, but you're sure to enjoy your studies! Confers no benefit. September 2017 Subscriber Item.", - "backMystery201801Text": "Frost Sprite Wings", - "backMystery201801Notes": "They may look as delicate as snowflakes, but these enchanted wings can carry you anywhere you wish! Confers no benefit. January 2018 Subscriber Item.", + "backMystery201801Text": "Sayap Peri Musim Dingin", + "backMystery201801Notes": "Sayap ini terlihat lembut seperti butiran salju, tapi sayap ajaib ini bisa membawamu ke mana pun yang kamu mau! Tidak menambah status apapun. Item Pelanggan Januari 2018.", "backSpecialWonderconRedText": "Jubah Kekuatan", "backSpecialWonderconRedNotes": "Berayun dengan kekuatan dan keanggunan.. Tidak menambah status apapun. Item Edisi Spesial Konvensi", "backSpecialWonderconBlackText": "Jubah Pengintai", "backSpecialWonderconBlackNotes": "Berputar dengan bayangan dan bisikan. Tidak menambah status apapun. Item Edisi Spesial Konvensi", "backSpecialTakeThisText": "Sayap Take This", - "backSpecialTakeThisNotes": "These wings were earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", + "backSpecialTakeThisNotes": "Sayap ini didapatkan dengan berpartisipasi dalam Tantangan bersponsor yang dibuat oleh Take This. Selamat! Meningkatkan semua Atribut sebesar <%= attrs %>.", "backSpecialSnowdriftVeilText": "Snowdrift Veil", "backSpecialSnowdriftVeilNotes": "This translucent veil makes it appear you are surrounded by an elegant flurry of snow! Confers no benefit.", "backSpecialAetherCloakText": "Jubah Aether", @@ -1314,8 +1314,8 @@ "bodySpecialWonderconGoldNotes": "Kerah emas yang menarik! Tidak menambah status apapun. Item Edisi Spesial Konvensi", "bodySpecialWonderconBlackText": "Kerah Ebony", "bodySpecialWonderconBlackNotes": "Kerah ebony yang menarik! Tidak menambah status apapun. Item Edisi Spesial Konvensi", - "bodySpecialTakeThisText": "Take This Pauldrons", - "bodySpecialTakeThisNotes": "These pauldrons were earned by participating in a sponsored Challenge made by Take This. Congratulations! Increases all Stats by <%= attrs %>.", + "bodySpecialTakeThisText": "Pelindung Bahu Take This", + "bodySpecialTakeThisNotes": "Pelindung bahu ini didapatkan dengan berpartisipasi dalam Tantangan bersponsor yang dibuat oleh Take This. Selamat! Meningkatkan semua Atribut sebesar <%= attrs %>.", "bodySpecialAetherAmuletText": "Kalung Aether", "bodySpecialAetherAmuletNotes": "This amulet has a mysterious history. Increases Constitution and Strength by <%= attrs %> each.", "bodySpecialSummerMageText": "Jubah Bersinar", @@ -1402,12 +1402,12 @@ "headAccessoryMystery201502Notes": "Biarkan imajinasimu mengangkasa! Tidak menambah status apapun. Item Pelanggan Februari 2015.", "headAccessoryMystery201510Text": "Tanduk Goblin", "headAccessoryMystery201510Notes": "Tanduk menakutkan ini agak berlendir. Tidak menambah status apapun. Item Pelanggan Oktober 2015.", - "headAccessoryMystery201801Text": "Frost Sprite Antlers", - "headAccessoryMystery201801Notes": "These icy antlers shimmer with the glow of winter auroras. Confers no benefit. January 2018 Subscriber Item.", + "headAccessoryMystery201801Text": "Tanduk Peri Musim Dingin", + "headAccessoryMystery201801Notes": "Tanduk es ini berkilau dengan cahaya dari aurora musim dingin. Tidak menambah status apapun. Item Pelanggan Januari 2018.", "headAccessoryMystery301405Text": "Kacamata Kepala", "headAccessoryMystery301405Notes": "\"Kacamata untuk mata,\" kata mereka. \"Tidak ada yang pakai kacamata di kepala,\" kata mereka. Hah! Yang benar saja! Tidak menambah status apapun. Item Pelanggan Agustus 3015.", "headAccessoryArmoireComicalArrowText": "Panah Kocak", - "headAccessoryArmoireComicalArrowNotes": "This whimsical item doesn't provide a Stat boost, but it sure is good for a laugh! Confers no benefit. Enchanted Armoire: Independent Item.", + "headAccessoryArmoireComicalArrowNotes": "Item aneh ini tidak memberikan tambahan Atribut, tapi beneran bagus untuk melucu! Tidak menambah status apapun. Peti Harta Karun: Item Tersendiri.", "eyewear": "Kacamata", "eyewearCapitalized": "Kacamata", "eyewearBase0Text": "Tidak Mengenakan Kacamata", diff --git a/website/common/locales/id/loadingscreentips.json b/website/common/locales/id/loadingscreentips.json index ba20f7ea36..9a65893494 100644 --- a/website/common/locales/id/loadingscreentips.json +++ b/website/common/locales/id/loadingscreentips.json @@ -28,7 +28,7 @@ "tip26": "Tanda panah di kanan nama seseorang berarti mereka sedang di-buff.", "tip27": "Lupa mencentang Tugasan Harian yang dilakukan kemarin? Jangan khawatir! Dengan menggunakan Catat Aktifitas Kemarin, kamu akan mendapat kesempatan untuk memasukkan apa yang kamu lakukan sebelum hari barumu dimulai.", "tip28": "Atur Awal Hari Kustom di bawah Ikon Pengguna > Pengaturan untuk mengatur kapan harimu mengulang.", - "tip29": "Selesaikan semua Keseharian-mu untuk mendapatkan Buff Hari Sempurna yang meningkatkan stat kamu!", + "tip29": "Selesaikan semua Keseharian-mu untuk mendapatkan Buff Hari Sempurna yang meningkatkan Atribut-mu!", "tip30": "Kamu dapat mengundang orang ke dalam Guild, bukan hanya Party.", "tip31": "Cek daftar yang tersedia di Perpustakaan Tugas dan Guild Tantangan untuk melihat contoh-contoh tugas.", "tip32": "Banyak kode, ilustrasi dan kisah di Habitica yang ditulis oleh kontributor secara sukarela! Pergi ke Guild Aspiring Legends untuk membantu.", diff --git a/website/common/locales/id/npc.json b/website/common/locales/id/npc.json index 2902248b63..1a1c60a922 100644 --- a/website/common/locales/id/npc.json +++ b/website/common/locales/id/npc.json @@ -108,9 +108,9 @@ "paymentMethods": "Bayar menggunakan", "classGear": "Perlengkapan Pekerjaan", "classGearText": "Selamat atas pilihan pekerjaanmu! Saya telah menambahkan senjata dasarmu ke dalam inventorimu. Coba lihat di bawah untuk menggunakannya!", - "classStats": "Ini adalah Status pekerjaanmu; ini berpengaruh pada permainan. Setiap kamu naik level, kamu mendapat satu Poin untuk dialokasikan pada Status tertentu. Arahkan kursor pada setiap stat untuk informasi lebih lanjut.", + "classStats": "Ini adalah Atribut pekerjaanmu; ini berpengaruh pada permainan. Setiap kamu naik level, kamu mendapat satu Poin untuk dialokasikan pada Atribut tertentu. Arahkan kursor pada setiap stat untuk informasi lebih lanjut.", "autoAllocate": "Alokasi Otomatis", - "autoAllocateText": "Jika 'Alokasi Otomatis' terpilih, avatarmu mendapatkan peningkatan Status otomatis berdasarkan Status tugasmu, yang dapat kamu temukan pada TUGAS > Ubah > Pengaturan lebih lanjut > Alokasi Status. Contohnya, jika kamu sering pergi ke gym, dan Keseharian 'Gym' kamu atur ke 'Kekuatan', maka kamu akan mendapatkan nilai Kekuatan secara otomatis.", + "autoAllocateText": "Jika 'Alokasi Otomatis' terpilih, avatarmu mendapatkan peningkatan Atribut otomatis berdasarkan Atribut tugasmu, yang dapat kamu temukan pada TUGAS > Ubah > Pengaturan lebih lanjut > Alokasi Atribut. Contohnya, jika kamu sering pergi ke gym, dan Keseharian 'Gym' kamu atur ke 'Kekuatan', maka kamu akan mendapatkan nilai Kekuatan secara otomatis.", "spells": "Kemampuan", "spellsText": "Kamu sekarang dapat membuka kemampuan khusus untuk pekerjaanmu. Kamu akan melihat yang pertama pada level 11. Mana kamu bertambah 10 poin setiap harinya, ditambah satu poin setiap To-Do yang terselesaikan.", "skillsTitle": "Kemampuan", @@ -136,7 +136,7 @@ "tourHallPage": "Selamat datang di Aula para Pahlawan, untuk menghormati para kontributor open-source Habitica. Baik melalui kode, karya seni, musik, tulisan, atau bahkan hanya sekadar bantuan, mereka telah mendapatkan Permata, perlengkapan eksklusif dan titel kebanggaan. Kamu bisa berkontribusi pada Habitica juga!", "tourPetsPage": "Ini adalah Istal! Setelah level 3, kamu bisa mendapatkan telur peliharaan dan ramuan penetas saat menyelesaikan tugas. Saat kamu menetaskan peliharaan di Pasar, peliharaan itu akan muncul di sini! Klik pada gambar peliharaan untuk menampilkannya di avatarmu. Beri makan mereka dengan makanan yang kamu temukan setelah level 3 dan mereka akan tumbuh menjadi tunggangan yang kuat.", "tourMountsPage": "Setelah kamu memberi makan yang cukup untuk mengubahnya menjadi tunggangan, tunggangan akan muncul disini. Klik pada tunggangan untuk menungganginya!", - "tourEquipmentPage": "Ini adalah di mana Perlengkapanmu disimpan! Perlengkapan Perangmu akan memengaruhi Status. Jika kamu ingin avatar-mu menampilkan Perlengkapan tertentu tanpa mengubah Status, klik \"Gunakan Kostum.\"", + "tourEquipmentPage": "Ini adalah di mana Perlengkapanmu disimpan! Perlengkapan Perangmu akan memengaruhi Atribut-mu. Jika kamu ingin avatar-mu menampilkan Perlengkapan tertentu tanpa mengubah Atribut-mu, klik \"Gunakan Kostum.\"", "equipmentAlreadyOwned": "Kamu telah memiliki perlengkapan tersebut", "tourOkay": "Oke!", "tourAwesome": "Keren!", diff --git a/website/common/locales/id/subscriber.json b/website/common/locales/id/subscriber.json index 7563ed2009..4ce5f267a6 100644 --- a/website/common/locales/id/subscriber.json +++ b/website/common/locales/id/subscriber.json @@ -138,7 +138,7 @@ "mysterySet201710": "Set Imp Angkuh", "mysterySet201711": "Set Pengendara Karpet", "mysterySet201712": "Set Candlemancer", - "mysterySet201801": "Frost Sprite Set", + "mysterySet201801": "Set Peri Musim Dingin", "mysterySet301404": "Set Steampunk Standard", "mysterySet301405": "Set Aksesoris Steampunk", "mysterySet301703": "Set Merak Steampunk", diff --git a/website/common/locales/id/tasks.json b/website/common/locales/id/tasks.json index 444465d182..b6896d3193 100644 --- a/website/common/locales/id/tasks.json +++ b/website/common/locales/id/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Hapus yang Telah Selesai", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "30 To-Do terakhir yang kamu selesaikan ditampilkan di sini. Kamu dapat melihat To-Do lama yang telah kamu selesaikan dari Data > Data Display Tool atau Data > Ekspor Data > Data Pengguna.", "deleteToDosExplanation": "Jika kamu menekan tombol di bawah, semua To-Do yang sudah kamu selesaikan dan To-Do di arsip akan dihapus secara permanen, kecuali To-Do dari tantangan yang aktif dan Rencana Grup. Silakan ekspor terlebih dahulu jika kamu mau menyimpan catatan mengenai tugasmu.", "addMultipleTip": "Tips: Untuk menambahkan beberapa Tugas sekaligus, pisahkan baris masing-masing tugas (Shift + Enter) lalu tekan \"Enter.\"", @@ -42,9 +44,9 @@ "easy": "Mudah", "medium": "Sedang", "hard": "Susah", - "attributes": "Status", + "attributes": "Atribut", "attributeAllocation": "Alokasi Status", - "attributeAllocationHelp": "Alokasi Status adalah opsi yang yang menyediakan cara-cara untuk Habitica mengalokasikan secara otomatis Poin Status yang didapat kepada suatu Status sewaktu naik level.

Kamu bisa mengatur metode Alokasi Otomatis ke Berdasarkan Tugas di bagian Status dari profilmu.", + "attributeAllocationHelp": "Alokasi Atribut adalah opsi yang yang menyediakan cara-cara untuk Habitica mengalokasikan secara otomatis Poin Atribut yang didapat kepada suatu Atribut sewaktu naik level.

Kamu bisa mengatur metode Alokasi Otomatis ke Berdasarkan Tugas di bagian Atribut dari profilmu.", "progress": "Perkembangan", "daily": "Harian", "dailies": "Keseharian", @@ -107,9 +109,9 @@ "streakSingular": "Streaker", "streakSingularText": "Telah melakukan Kegiatan Harian 21 hari berturut-turut", "perfectName": "<%= count %> Hari Sempurna", - "perfectText": "Menyelesaikan semua Keseharian pada <%= count %> hari. Dengan pencapaian ini kamu akan mendapatkan buff +level/2 untuk semua Status pada hari berikutnya. Level di atas 100 tidak akan memberimu efek tambahan lagi.", + "perfectText": "Menyelesaikan semua Keseharian pada <%= count %> hari. Dengan pencapaian ini kamu akan mendapatkan buff +level/2 untuk semua Atribut pada hari berikutnya. Level di atas 100 tidak akan memberimu efek tambahan lagi.", "perfectSingular": "Hari Sempurna", - "perfectSingularText": "Menyelesaikan semua Keseharian dalam satu hari. Dengan pencapaian ini kamu akan mendapatkan buff +level/2 untuk semua Status keesokan harinya. Level di atas 100 tidak akan memberimu efek tambahan lagi.", + "perfectSingularText": "Menyelesaikan semua Keseharian dalam satu hari. Dengan pencapaian ini kamu akan mendapatkan buff +level/2 untuk semua Atribut keesokan harinya. Level di atas 100 tidak akan memberimu efek tambahan lagi.", "streakerAchievement": "Kamu mendapat penghargaan 'Streaker'! Pembentukan kebiasaan biasanya terjadi dalam 21 hari. Kamu bisa menumpuk penghargaan ini dengan melakukan tugas ini lagi atau tugas lain setiap 21 hari berturut-turut!", "fortifyName": "Ramuan Penguat", "fortifyPop": "Mengembalikan tugas ke netral (warna kuning), dan membuat Kesehatan kembali penuh.", @@ -139,7 +141,7 @@ "toDoHelp3": "Membagi sebuah To-Do menjadi daftar cek yang lebih rinci akan membuat tugas itu menjadi tidak menakutkan, dan akan meningkatkan poinmu!", "toDoHelp4": "Untuk inspirasi, cek contoh To-Do!", "rewardHelp1": "Perlengkapan yang kamu beli untuk avatarmu disimpan di dalam <%= linkStart %>Inventori > Perlengkapan<%= linkEnd %>.", - "rewardHelp2": "Perlengkapan memengaruhi Statusmu (<%= linkStart %>Avatar > Status<%= linkEnd %>).", + "rewardHelp2": "Perlengkapan memengaruhi Atribut-mu(<%= linkStart %>Avatar > Atribut<%= linkEnd %>).", "rewardHelp3": "Perlengkapan Khusus akan muncul di sini selama Acara Sedunia.", "rewardHelp4": "Jangan takut untuk menentukan Hadiah Pribadi! Cek beberapa contoh disini.", "clickForHelp": "Klik untuk bantuan", diff --git a/website/common/locales/it/content.json b/website/common/locales/it/content.json index c40d3eb622..2ea425c946 100644 --- a/website/common/locales/it/content.json +++ b/website/common/locales/it/content.json @@ -161,9 +161,9 @@ "questEggYarnText": "Gomitolo", "questEggYarnMountText": "Tappeto Volante", "questEggYarnAdjective": "un lanoso", - "questEggPterodactylText": "Pterodactyl", - "questEggPterodactylMountText": "Pterodactyl", - "questEggPterodactylAdjective": "trusting", + "questEggPterodactylText": "Pterodattilo", + "questEggPterodactylMountText": "Pterodattilo", + "questEggPterodactylAdjective": "un fiducioso", "eggNotes": "Trova una pozione per far schiudere questo uovo, e nascerà <%= eggAdjective(locale) %> <%= eggText(locale) %>.", "hatchingPotionBase": "Base", "hatchingPotionWhite": "Bianco", @@ -222,6 +222,6 @@ "foodCandyRed": "Caramella alla Cannella", "foodSaddleText": "Sella", "foodSaddleNotes": "Rende immediatamente cavalcabile uno dei tuoi animali.", - "foodSaddleSellWarningNote": "Hey! This is a pretty useful item! Are you familiar with how to use a Saddle with your Pets?", + "foodSaddleSellWarningNote": "Ehi! Questo è uno strumento piuttosto utile! Sai come usare una Sella con i tuoi animali?", "foodNotes": "Dai questo ad un animale e potrà diventare un possente destriero." } \ No newline at end of file diff --git a/website/common/locales/it/front.json b/website/common/locales/it/front.json index 9e5b2c8edf..90a8fb08ea 100644 --- a/website/common/locales/it/front.json +++ b/website/common/locales/it/front.json @@ -30,7 +30,7 @@ "companyAbout": "Come funziona", "companyBlog": "Blog", "devBlog": "Blog sviluppatori", - "companyContribute": "Contribute", + "companyContribute": "Contribuisci", "companyDonate": "Fai una donazione", "companyPrivacy": "Privacy", "companyTerms": "Termini di utilizzo", @@ -141,23 +141,23 @@ "presskit": "Kit per recensioni", "presskitDownload": "Scarica tutte le immagini:", "presskitText": "Grazie per il tuo interesse verso Habitica! Le seguenti immagini possono essere utliizzate per articoli o video riguardanti Habitica. Per avere maggiori informazioni, si prega di contattare Siena Leslie all'indirizzo <%= pressEnquiryEmail %>.", - "pkQuestion1": "What inspired Habitica? How did it start?", + "pkQuestion1": "Cosa ha ispirato Habitica? Come è nato?", "pkAnswer1": "If you’ve ever invested time in leveling up a character in a game, it’s hard not to wonder how great your life would be if you put all of that effort into improving your real-life self instead of your avatar. We starting building Habitica to address that question.
Habitica officially launched with a Kickstarter in 2013, and the idea really took off. Since then, it’s grown into a huge project, supported by our awesome open-source volunteers and our generous users.", - "pkQuestion2": "Why does Habitica work?", + "pkQuestion2": "Perchè Habitica funziona?", "pkAnswer2": "Forming a new habit is hard because people really need that obvious, instant reward. For example, it’s tough to start flossing, because even though our dentist tells us that it's healthier in the long run, in the immediate moment it just makes your gums hurt.
Habitica's gamification adds a sense of instant gratification to everyday objectives by rewarding a tough task with experience, gold… and maybe even a random prize, like a dragon egg! This helps keep people motivated even when the task itself doesn't have an intrinsic reward, and we've seen people turn their lives around as a result. You can check out success stories here: https://habitversary.tumblr.com", - "pkQuestion3": "Why did you add social features?", + "pkQuestion3": "Perchè avete aggiunto delle funzioni social?", "pkAnswer3": "Social pressure is a huge motivating factor for a lot of people, so we knew that we wanted to have a strong community that would hold each other accountable for their goals and cheer for their successes. Luckily, one of the things that multiplayer video games do best is foster a sense of community among their users! Habitica’s community structure borrows from these types of games; you can form a small Party of close friends, but you can also join a larger, shared-interest groups known as a Guild. Although some users choose to play solo, most decide to form a support network that encourages social accountability through features such as Quests, where Party members pool their productivity to battle monsters together.", "pkQuestion4": "Why does skipping tasks remove your avatar’s health?", "pkAnswer4": "If you skip one of your daily goals, your avatar will lose health the following day. This serves as an important motivating factor to encourage people to follow through with their goals because people really hate hurting their little avatar! Plus, the social accountability is critical for a lot of people: if you’re fighting a monster with your friends, skipping your tasks hurts their avatars, too.", - "pkQuestion5": "What distinguishes Habitica from other gamification programs?", + "pkQuestion5": "Cos'ha di diverso Habitica rispetto ad altri programmi di \"gamification\"?", "pkAnswer5": "One of the ways that Habitica has been most successful at using gamification is that we've put a lot of effort into thinking about the game aspects to ensure that they are actually fun. We've also included many social components, because we feel that some of the most motivating games let you play with friends, and because research has shown that it's easier to form habits when you have accountability to other people.", - "pkQuestion6": "Who is the typical user of Habitica?", + "pkQuestion6": "Chi è il tipico utente di Habitica?", "pkAnswer6": "Lots of different people use Habitica! More than half of our users are ages 18 to 34, but we have grandparents using the site with their young grandkids and every age in-between. Often families will join a party and battle monsters together.
Many of our users have a background in games, but surprisingly, when we ran a survey a while back, 40% of our users identified as non-gamers! So it looks like our method can be effective for anyone who wants productivity and wellness to feel more fun.", - "pkQuestion7": "Why does Habitica use pixel art?", + "pkQuestion7": "Perchè Habitica usa la pixel art?", "pkAnswer7": "Habitica uses pixel art for several reasons. In addition to the fun nostalgia factor, pixel art is very approachable to our volunteer artists who want to chip in. It's much easier to keep our pixel art consistent even when lots of different artists contribute, and it lets us quickly generate a ton of new content!", "pkQuestion8": "How has Habitica affected people's real lives?", "pkAnswer8": "You can find lots of testimonials for how Habitica has helped people here: https://habitversary.tumblr.com", - "pkMoreQuestions": "Do you have a question that’s not on this list? Send an email to leslie@habitica.com!", + "pkMoreQuestions": "Hai una domanda che non è in questa lista? Manda una mail a leslie@habitica.com!", "pkVideo": "Video", "pkPromo": "Promozioni", "pkLogo": "Loghi", @@ -213,7 +213,7 @@ "unlockHeadline": "Più sei produttivo, più contenuti sblocchi!", "useUUID": "Usa ID Utente / Chiave API (per gli utenti Facebook)", "username": "Nome di login", - "emailOrUsername": "Email or Login Name (case-sensitive)", + "emailOrUsername": "E-mail o nome di login (attenzione alle maiuscole)", "watchVideos": "Guarda i video", "work": "Lavoro", "zelahQuote": "Con [Habitica] 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!", @@ -263,14 +263,14 @@ "altAttrSlack": "Slack", "missingAuthHeaders": "Mancano le intestazioni di autenticazione.", "missingAuthParams": "Mancano i parametri di autenticazione.", - "missingUsernameEmail": "Manca l'e-mail o il nome di login", + "missingUsernameEmail": "Manca l'e-mail o il nome di login.", "missingEmail": "E-mail mancante.", "missingUsername": "Nome di login mancante.", "missingPassword": "Password mancante.", "missingNewPassword": "Manca la nuova password.", "invalidEmailDomain": "Non puoi registrarti usando e-mail con i seguenti domini: <%= domains %>", "wrongPassword": "Password errata.", - "incorrectDeletePhrase": "Please type <%= magicWord %> in all caps to delete your account.", + "incorrectDeletePhrase": "Scrivi <%= magicWord %> tutto in maiuscolo per eliminare il tuo account.", "notAnEmail": "Indirizzo e-mail non valido.", "emailTaken": "L'indirizzo email è già stato utilizzato per un altro account.", "newEmailRequired": "Manca il nuovo indirizzo e-mail.", @@ -330,5 +330,5 @@ "getStarted": "Inizia", "mobileApps": "App Mobile", "learnMore": "Maggiori informazioni", - "useMobileApps": "Habitica is not optimized for a mobile browser. We recommend downloading our mobile apps." + "useMobileApps": "Habitica non è ottimizzato per i browser dei dispositivi mobili. Consigliamo di scaricare le nostre app." } \ No newline at end of file diff --git a/website/common/locales/it/generic.json b/website/common/locales/it/generic.json index 36e668f639..1dea4af626 100644 --- a/website/common/locales/it/generic.json +++ b/website/common/locales/it/generic.json @@ -33,7 +33,7 @@ "showLess": "Mostra meno", "expandToolbar": "Mostra barra", "collapseToolbar": "Nascondi barra", - "markdownHelpLink": "Markdown formatting help", + "markdownHelpLink": "Guida per la formattazione", "showFormattingHelp": "Mostra guida per la formattazione", "hideFormattingHelp": "Nascondi guida per la formattazione", "youType": "Digiti:", @@ -136,11 +136,11 @@ "audioTheme_airuTheme": "Tema di Airu", "audioTheme_beatscribeNesTheme": "Tema NES di Beatscribe", "audioTheme_arashiTheme": "Tema di Arashi", - "audioTheme_lunasolTheme": "Lunasol Theme", - "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", - "audioTheme_maflTheme": "MAFL Theme", - "audioTheme_pizildenTheme": "Pizilden's Theme", - "audioTheme_farvoidTheme": "Farvoid Theme", + "audioTheme_lunasolTheme": "Tema Lunasol", + "audioTheme_spacePenguinTheme": "Tema di SpacePenguin", + "audioTheme_maflTheme": "Tema MAFL", + "audioTheme_pizildenTheme": "Tema di Pizilden", + "audioTheme_farvoidTheme": "Tema Farvoid", "askQuestion": "Fai una domanda", "reportBug": "Segnala un bug", "HabiticaWiki": "La wiki di Habitica", @@ -248,7 +248,7 @@ "artDesign": "Arte e design", "booksWriting": "Libri e scrittura", "comicsHobbies": "Fumetti e hobby", - "diyCrafts": "DIY & Crafts", + "diyCrafts": "Fai-da-te & creazioni", "education": "Educazione", "foodCooking": "Cibo e cucina", "healthFitness": "Salute e fitness", @@ -259,7 +259,7 @@ "creativity": "Creatività", "budgeting": "Budgeting", "health_wellness": "Salute e benessere", - "self_care": "Self-Care", + "self_care": "Cura di sè", "habitica_official": "Ufficiale Habitica", "academics": "Academics", "advocacy_causes": "Advocacy + Causes", @@ -268,7 +268,7 @@ "health_fitness": "Salute + Fitness", "hobbies_occupations": "Hobbies + Occupations", "location_based": "Basate su luoghi", - "mental_health": "Mental Health + Self-Care", + "mental_health": "Salute mentale + Cura di sè", "getting_organized": "Organizzarsi", "self_improvement": "Crescita personale", "spirituality": "Spiritualità", diff --git a/website/common/locales/it/groups.json b/website/common/locales/it/groups.json index bc446fe424..713f3a829d 100644 --- a/website/common/locales/it/groups.json +++ b/website/common/locales/it/groups.json @@ -394,7 +394,7 @@ "inviteToPartyOrQuest": "Invita la Squadra ad una Missione ", "inviteInformation": "Clicking \"Invite\" will send an invitation to your party members. When all members have accepted or denied, the Quest begins.", "questOwnerRewards": "Ricompense per Capomissione", - "updateParty": "Update Party", + "updateParty": "Aggiorna Squadra", "upgrade": "Upgrade", "selectPartyMember": "Seleziona un membro della squadra", "areYouSureDeleteMessage": "Vuoi davvero eliminare questo messaggio?", diff --git a/website/common/locales/it/messages.json b/website/common/locales/it/messages.json index 87dba39acf..52aa223d63 100644 --- a/website/common/locales/it/messages.json +++ b/website/common/locales/it/messages.json @@ -53,7 +53,7 @@ "messageGroupChatFlagAlreadyReported": "Hai già segnalato questo messaggio.", "messageGroupChatNotFound": "Messaggio non trovato!", "messageGroupChatAdminClearFlagCount": "Solo un amministratore può azzerare il conteggio flag!", - "messageCannotFlagSystemMessages": "You cannot flag a system message. If you need to report a violation of the Community Guidelines related to this message, please email a screenshot and explanation to Lemoness at <%= communityManagerEmail %>.", + "messageCannotFlagSystemMessages": "Non puoi segnalare un messaggio di sistema. Se hai bisogno di segnalare una violazione delle Linee guida della community relativa a questo messaggio, per favore invia per e-mail uno screenshot e una spiegazione del problema a Lemoness, all'indirizzo <%= communityManagerEmail %>.", "messageGroupChatSpam": "Ops, sembra che tu stia pubblicando troppi messaggi! Per favore, aspetta un minuto e poi prova di nuovo. La chat della Taverna contiene solo 200 messaggi contemporaneamente, quindi Habitica incoraggia l'uso di messaggi più lunghi e ragionati e di risposte unificate in un unico messaggio. Non vediamo l'ora di sentire quello che devi dire. :)", "messageUserOperationProtected": "Il percorso `<%= operation %>` non è stato salvato, perchè è un percorso protetto.", "messageUserOperationNotFound": "Operazione <%= operation %> non trovata", diff --git a/website/common/locales/it/npc.json b/website/common/locales/it/npc.json index 367a8e4806..77e587b91c 100644 --- a/website/common/locales/it/npc.json +++ b/website/common/locales/it/npc.json @@ -88,7 +88,7 @@ "plusOneGem": "+1 Gemma", "typeNotSellable": "L'oggetto non è in vendita. deve essere uno dei seguenti <%= acceptedTypes %>", "userItemsKeyNotFound": "Non trovata la chiave per user.items <%= type %>", - "userItemsNotEnough": "You do not have enough <%= type %>", + "userItemsNotEnough": "Non hai abbastanza <%= type %>", "pathRequired": "È richiesta la stringa guida", "unlocked": "Sono disponibili nuovi oggetti", "alreadyUnlocked": "Set completo già sbloccato.", diff --git a/website/common/locales/it/quests.json b/website/common/locales/it/quests.json index 657cab4816..0e8ec4b1e7 100644 --- a/website/common/locales/it/quests.json +++ b/website/common/locales/it/quests.json @@ -9,11 +9,11 @@ "goldQuests": "Masterclasser Quest Lines", "questDetails": "Dettagli missione", "questDetailsTitle": "Dettagli missione", - "questDescription": "Le Missioni permettono ai giocatori di concentrarsi su obiettivi comuni, a lungo termine, insieme ai membri della propria squadra.", + "questDescription": "Le Missioni permettono ai giocatori di concentrarsi su obiettivi comuni, a lungo termine, insieme ai propri compagni di squadra.", "invitations": "Inviti", "completed": "Completata!", "rewardsAllParticipants": "Ricompense per tutti i partecipanti", - "rewardsQuestOwner": "Ricompense addizionali per il proprietario della missione", + "rewardsQuestOwner": "Ricompense aggiuntive per il proprietario della missione", "questOwnerReceived": "Il proprietario della missione ha ricevuto anche", "youWillReceive": "Riceverai", "questOwnerWillReceive": "Il proprietario della missione riceverà anche", @@ -37,7 +37,7 @@ "questCollection": "+ <%= val %> oggetto/i missione trovati", "questDamage": "+ <%= val %> danno al boss", "begin": "Inizia", - "bossHP": "Boss HP", + "bossHP": "Salute del Boss", "bossStrength": "Forza del Boss", "rage": "Furia", "collect": "Raccogli", @@ -98,7 +98,7 @@ "questNotFound": "Missione \"<%= key %>\" non trovata.", "questNotOwned": "Non possiedi questa pergamena.", "questNotGoldPurchasable": "La Missione \"<%= key %>\" non può essere comprata con Oro.", - "questLevelTooHigh": "Devi essere almeno di livello <%= level %> per iniziare questa missione.", + "questLevelTooHigh": "Devi essere almeno al livello <%= level %> per iniziare questa missione.", "questAlreadyUnderway": "La tua squadra è già in missione. Riprova quando la missione corrente è terminata.", "questAlreadyAccepted": "Hai già accettato l'invito alla missione.", "noActiveQuestToLeave": "Nessuna missione attiva da abbandonare", @@ -110,7 +110,7 @@ "questAlreadyRejected": "Hai già rifiutato l'invito alla missione", "cantCancelActiveQuest": "Non è possibile annullare una ricerca attiva, utilizzare la funzionalità di interruzione ", "onlyLeaderCancelQuest": "Solo il leader del gruppo o della missione può annullare una missione", - "questNotPending": "Non ci sono missioni da cominciare", + "questNotPending": "Non ci sono missioni da cominciare.", "questOrGroupLeaderOnlyStartQuest": "Solo il leader del gruppo o della missione può forzare l'inizio di una missione", "createAccountReward": "Crea account", "loginIncentiveQuest": "Per sbloccare questa missione, usa Habitica per un totale di <%= count %> giorni!", diff --git a/website/common/locales/it/tasks.json b/website/common/locales/it/tasks.json index 3c5a0717fb..431d7289f4 100644 --- a/website/common/locales/it/tasks.json +++ b/website/common/locales/it/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Elimina attività completate", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Qui puoi vedere le ultime 30 Cose Da Fare che hai portato a termine. Per vedere le altre Cose Da Fare completate, clicca su \"Dati utente > Visualizzazione dati utente\" oppure \"Dati utente > Esporta dati > Dati utente\".", "deleteToDosExplanation": "Se clicchi il bottone qua in basso, tutte le tue Cose Da Fare complete o archiviate saranno cancellate permanentemente, eccetto per le Cose Da Fare appartenenti a sfide attive o a piani per gruppi. Se vuoi conservarne una registrazione, devi prima esportarle.", "addMultipleTip": "Consiglio: Per aggiungere più attività insieme, separale con degli \"a capo\" (Maiusc + Invio) e poi premi Invio.", @@ -31,7 +33,7 @@ "extraNotes": "Note", "notes": "Note", "direction/Actions": "Azione positiva/negativa", - "advancedSettings": "Advanced Settings", + "advancedSettings": "Avanzate", "taskAlias": "Alias Attività", "taskAliasPopover": "Questo alias attività può essere usato per interagire con le applicazioni di terze parti. Sono supportati solo i caratteri alfanumerici e i simboli '-' e '_' (senza le virgolette). L'alias attività deve essere unico tra tuttte le tue attività.", "taskAliasPlaceholder": "il-tuo-alias-attività-qui", @@ -55,7 +57,7 @@ "repeat": "Ripeti", "repeats": "Ripetizione", "repeatEvery": "Ripeti ogni", - "repeatOn": "Repeat On", + "repeatOn": "Ripeti di", "repeatHelpTitle": "Quanto spesso dovrebbe essere ripetuta questa attività?", "dailyRepeatHelpContent": "Questa attività andrà completata ogni X giorni. Puoi impostare questo valore qui sotto.", "weeklyRepeatHelpContent": "Questa attività andrà completata nei giorni evidenziati sotto. Clicca su un giorno per attivarlo/disattivarlo.", @@ -63,7 +65,7 @@ "repeatWeek": "Certi giorni della settimana", "day": "Giorno", "days": "Giorni", - "restoreStreak": "Adjust Streak", + "restoreStreak": "Ripristina Serie", "resetStreak": "Reset serie", "todo": "Cosa Da Fare", "todos": "Cose Da Fare", @@ -117,7 +119,7 @@ "fortifyText": "La fortificazione farà tornare tutte le attività, eccetto quelle delle sfide, allo stato neutro (colore giallo), proprio come se le avessi appena create, e riempirà la tua barra della Salute. Questo è un ottimo aiuto se le tue attività rosse stanno rendendo il gioco troppo difficile, o se quelle blu stanno rendendo il gioco troppo semplice. Se ripartire con calma suona come una buona idea, spendi qualche gemma e fai vedere alle tue attività chi comanda!", "confirmFortify": "Sei sicuro/a?", "fortifyComplete": "Fortificazione completa!", - "deleteTask": "Delete this Task", + "deleteTask": "Elimina questa attività", "sureDelete": "Vuoi davvero eliminare questa attività?", "sureDeleteCompletedTodos": "Vuoi davvero eliminare le tue Cose Da Fare completate?", "streakCoins": "Bonus serie!", diff --git a/website/common/locales/ja/tasks.json b/website/common/locales/ja/tasks.json index 8651187bb1..8bf75fad92 100644 --- a/website/common/locales/ja/tasks.json +++ b/website/common/locales/ja/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "完了済みを削除", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "最近完了した 30 件の「To-Do」をここに表示します。より古いものは、「データ > データ表示ツール」または「データ > データをエクスポート > ユーザーデータ」で確認できます。", "deleteToDosExplanation": "下のボタンをクリックすると、進行中のチャレンジやグループプランの「To-Do」を除いて、すべての完了した「To-Do」とアーカイブ済の「To-Do」が完全に削除されます。記録を保存しておきたい場合は、まずエクスポートしてください。", "addMultipleTip": "Tip:1複数のタスクを追加するには、(Shift + Enter)でタスクを分割し、\"Enter\"キーで確定して下さい。", diff --git a/website/common/locales/nl/tasks.json b/website/common/locales/nl/tasks.json index 534b7c39ba..47be6b0e35 100644 --- a/website/common/locales/nl/tasks.json +++ b/website/common/locales/nl/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Verwijder voltooide taken", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Je meest recente 30 voltooide To-do's worden hier getoond. Je kan oudere voltooide To-do's zien via Gegevens > Gegevens weergeven of Gegevens > Gegevens exporteren > Gebruikersgegevens.", "deleteToDosExplanation": "Met de onderstaande knop worden al je voltooide To-do's en gearchiveerde To-do's voorgoed verwijderd, behalve de To-do's van actieve uitdagingen en groepsplannen. Exporteer ze eerst als je ze wil bewaren.", "addMultipleTip": "Tip: Om meerdere taken aan te maken scheid je ze van elkaar door een line break (Shift + Enter) te gebruiken en daarna op \"Enter\" te drukken.", diff --git a/website/common/locales/pl/tasks.json b/website/common/locales/pl/tasks.json index 6963ccf4bf..eb2cd39734 100644 --- a/website/common/locales/pl/tasks.json +++ b/website/common/locales/pl/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Usuń zakończone", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Ostatnie 30 skończonych Zadań jest widoczne tutaj. Możesz zobaczyć starsze skończone Zadania w Dane > Narzędzie wyświetlania danych lub Dane > Eksport danych > Dane użytkownika.", "deleteToDosExplanation": "Jeśli wciśniesz ten przycisk, to wszystkie twoje zakończone i zarchiwizowane Do-Zrobienia zostaną na zawsze usunięte. Nie dotyczyny do Do-Zrobienia z aktywnych wyzwań oraz planów grupowych. Eksoportuj je najpierw, jeśli chcesz je zachować.", "addMultipleTip": "Rada: W celu dodania wielu zadań, oddziel każde z nich wstawiając znak końca linii (Shift + Enter), a następnie wciśnij \"Enter\".", diff --git a/website/common/locales/pt/character.json b/website/common/locales/pt/character.json index d978b3e205..97cd40dd45 100644 --- a/website/common/locales/pt/character.json +++ b/website/common/locales/pt/character.json @@ -115,7 +115,7 @@ "allocatedPointsText": "Pontos de Características que ganhaste e distribuíste. Distribui Pontos usando a coluna de Criação de Personagem.", "allocated": "Distribuído", "buffs": "Buffs", - "buffsText": "Temporary Stat bonuses from abilities and achievements. These wear off at the end of your day. The abilities you've unlocked appear in the Rewards list of your Tasks page.", + "buffsText": "Bónus de Características temporários obtidos através de habilidades e conquistas. Estes desaparecem ao final do dia. As habilidades que já desbloqueaste aparecem na lista de Recompensas da tua página de Tarefas.", "characterBuild": "Criação do Personagem", "class": "Classe", "experience": "Experiência", @@ -125,18 +125,18 @@ "mage": "Mago", "wizard": "Mago", "mystery": "Mistério", - "changeClass": "Change Class, Refund Stat Points", + "changeClass": "Mudar de Classe, Devolver Pontos de Características", "lvl10ChangeClass": "Para mudar de classe você precisa ser pelo menos nível 10.", "changeClassConfirmCost": "Tem a certeza que quer mudar de classe por 3 Gemas?", "invalidClass": "Classe inválida. Por favor especifique 'guerreiro', 'ladino', 'mago' ou 'curandeiro'.", - "levelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options.", + "levelPopover": "Cada nível vale-te um Ponto para atribuíres a uma Característica à escolha. Podes fazê-lo manualmente ou deixar o jogo decidir por ti usando uma das opções de Alocação Automática.", "unallocated": "Pontos de Características não alocados", - "haveUnallocated": "You have <%= points %> unallocated Stat Point(s)", + "haveUnallocated": "Tens <%= points %>Ponto(s) por alocar", "autoAllocation": "Distribuição Automática", - "autoAllocationPop": "Places Points into Stats according to your preferences, when you level up.", - "evenAllocation": "Distribute Stat Points evenly", - "evenAllocationPop": "Assigns the same number of Points to each Stat.", - "classAllocation": "Distribute Points based on Class", + "autoAllocationPop": "Atribui Pontos a Características de acordo com as tuas preferências, quando passas de nível.", + "evenAllocation": "Distribui Pontos de Características uniformemente", + "evenAllocationPop": "Atribui o mesmo número de Pontos a cada Característica.", + "classAllocation": "Distribui Pontos de acordo com a Classe", "classAllocationPop": "Assigns more Points to the Stats important to your Class.", "taskAllocation": "Distribute Points based on task activity", "taskAllocationPop": "Assigns Points based on the Strength, Intelligence, Constitution, and Perception categories associated with the tasks you complete.", diff --git a/website/common/locales/pt/tasks.json b/website/common/locales/pt/tasks.json index 9c4de46ddb..e3ba80068f 100644 --- a/website/common/locales/pt/tasks.json +++ b/website/common/locales/pt/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Eliminar Concluídos", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Os seus 30 Afazeres mais recentes são mostrados aqui. Pode ver os afazeres concluídos mais antigos de Dados > Ferramenta de Exibição de Dados ou Dados > Exportar Dados > Dados do Utilizador.", "deleteToDosExplanation": "Se carregar no botão abaixo, todos os seus Afazeres completos e arquivados serão permanentemente apagados, excepto Afazeres pertencentes a desafios correntemente ativos ou Planos de Grupo. Exporte-os primeiro se quiser manter um registo dos mesmos.", "addMultipleTip": "Dica: Para adicionar multiplas Tarefas, separe cada uma usando um intervalo de linha (Shift + Enter) e depois carregue em \"Enter.\"", diff --git a/website/common/locales/pt_BR/challenge.json b/website/common/locales/pt_BR/challenge.json index 01804046e2..4dea8c8c36 100644 --- a/website/common/locales/pt_BR/challenge.json +++ b/website/common/locales/pt_BR/challenge.json @@ -102,7 +102,7 @@ "editChallenge": "Editar o desafio", "challengeDescription": "Descrição do desafio", "selectChallengeWinnersDescription": "Selecione um vencedor dos participantes do desafio.", - "awardWinners": "Vencedor do desafio", + "awardWinners": "Vencedor do Desafio", "doYouWantedToDeleteChallenge": "Você deseja deletar este desafio?", "deleteChallenge": "Deletar Desafio", "challengeNamePlaceholder": "Qual é o nome do seu desafio?", diff --git a/website/common/locales/pt_BR/character.json b/website/common/locales/pt_BR/character.json index 9da31ca8e7..9c8f60130f 100644 --- a/website/common/locales/pt_BR/character.json +++ b/website/common/locales/pt_BR/character.json @@ -69,9 +69,9 @@ "costume": "Aparência", "costumeText": "Marque a opção \"Mostrar Aparência\" para usar outros equipamentos que você prefira ao invés de seu equipamento de batalha.", "useCostume": "Mostrar Aparência", - "useCostumeInfo1": "Selecione \"Mostrar Aparência\" para equipar itens no seu Avatar sem afetar os status do Equipamento de Batalha! Isto significa que você pode equipar para os melhores atributos na esquerda, e vestir o seu avatar do jeito que preferir na direita.", - "useCostumeInfo2": "Once you click \"Use Costume\" your avatar will look pretty basic... but don't worry! If you look on the left, you'll see that your Battle Gear is still equipped. Next, you can make things fancy! Anything you equip on the right won't affect your Stats, but can make you look super awesome. Try out different combos, mixing sets, and coordinating your Costume with your pets, mounts, and backgrounds.

Got more questions? Check out the Costume page on the wiki. Find the perfect ensemble? Show it off in the Costume Carnival guild or brag in the Tavern!", - "costumePopoverText": "Select \"Use Costume\" to equip items to your avatar without affecting the Stats from your Battle Gear! This means that you can dress up your avatar in whatever outfit you like while still having your best Battle Gear equipped.", + "useCostumeInfo1": "Selecione \"Mostrar Aparência\" para equipar itens no seu Avatar sem afetar os Atributos do Equipamento de Batalha! Isto significa que você pode equipar para os melhores atributos na esquerda, e vestir o seu avatar do jeito que preferir na direita.", + "useCostumeInfo2": "Uma vez que clicar em \"Mostrar Aparência\" , seu avatar parecerá bem básico.... mas não se preocupe! Se olhar a esquerda verá que seu equipamento de batalha continua equipado. Então está na hora de deixar as coisas mais chiques! Qualquer coisa que equipar na direita não afetará seus Atributos, mas pode lhe deixar maravilhoso. Experimente diferentes combinações, misturando conjuntos, combinando com seus Mascotes, Montarias e Cenários.

Alguma dúvida? Dê uma olhada na Página de Trajes no wiki. Encontrou o conjunto perfeito? Mostre-o na Guilda Costume Carnival ou se exiba na Taverna!", + "costumePopoverText": "Selecione \"Mostrar Aparência\" para equipar itens no seu Avatar sem afetar os status do Equipamento de Batalha! Isto significa que você pode vestir seu Avatar em qualquer roupa que você preferir enquanto ainda continua com seu melhor Equipamento de Batalha equipado.", "autoEquipPopoverText": "Selecione esta opção para automáticamente equipar os equipamentos assim que você os comprar.", "costumeDisabled": "Você desabilitou a Aparência.", "gearAchievement": "Você ganhou a conquista \"Equipamento Supremo\" por chegar ao melhor conjunto de equipamentos da sua classe! Você já conseguiu os seguintes conjuntos completos:", @@ -91,14 +91,14 @@ "xp": "EXP", "health": "Vida", "allocateStr": "Pontos distribuídos em Força:", - "allocateStrPop": "Adicionar um Ponto em Força", + "allocateStrPop": "Adicionar Ponto em Força", "allocateCon": "Pontos distribuídos em Constituição:", - "allocateConPop": "Adicionar um Ponto em Constituição", + "allocateConPop": "Adicionar Ponto em Constituição", "allocatePer": "Pontos distribuídos em Percepção:", - "allocatePerPop": "Adicionar um Ponto em Percepção", + "allocatePerPop": "Adicionar Ponto em Percepção", "allocateInt": "Pontos distribuídos em Inteligência:", - "allocateIntPop": "Adicionar um Ponto em Inteligência", - "noMoreAllocate": "Agora que você chegou no nível 100, você não receberá mais nenhum Ponto de Atributo. Você pode continuar subindo de nível ou começar uma nova aventura no nível 1 usando uma Orbe do Renascimento, agora disponível de graça no Mercado.", + "allocateIntPop": "Adicionar Ponto em Inteligência", + "noMoreAllocate": "Agora que você chegou no nível 100, você não receberá mais nenhum Ponto de Atributo. Você pode continuar subindo de nível ou começar uma nova aventura no nível 1 usando um Orbe do Renascimento, agora disponível de graça no Mercado.", "stats": "Atributos", "achievs": "Conquistas", "strength": "Força", @@ -197,8 +197,8 @@ "con": "CON", "per": "PER", "int": "INT", - "showQuickAllocation": "Mostrar distribuição de Atributos", - "hideQuickAllocation": "Esconder distribuição de Atributos", + "showQuickAllocation": "Mostrar Distribuição de Atributos", + "hideQuickAllocation": "Esconder Distribuição de Atributos", "quickAllocationLevelPopover": "Each level earns you one Point to assign to a Stat of your choice. You can do so manually, or let the game decide for you using one of the Automatic Allocation options found in User Icon > Stats.", "invalidAttribute": "\"<%= attr %>\" não é um Atributo válido.", "notEnoughAttrPoints": "Você não possui Pontos de Atributos suficientes.", diff --git a/website/common/locales/pt_BR/tasks.json b/website/common/locales/pt_BR/tasks.json index 8549887d79..3e2df87fac 100644 --- a/website/common/locales/pt_BR/tasks.json +++ b/website/common/locales/pt_BR/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Deletar Completados", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Os seus 30 Afazeres concluídos mais recentes são mostrados aqui. Você pode ver os Afazeres antigos que foram concluídos em Dados > Ferramenta de Exibição de Dados ou Dados > Exportar Dados > Dados do Usuário", "deleteToDosExplanation": "Se você clicar no botão abaixo, todos os seus Afazeres completados e arquivados serão apagados permanentemente, exceto os Afazeres de desafios ativos e de Planos de Time. Exporte-os primeiro se você quiser guardá-los para o futuro.", "addMultipleTip": "Dica: Para adicionar múltiplas tarefas, separe cada uma com uma quebra de linha (Shift + Enter) e então pressione Enter.", @@ -31,13 +33,13 @@ "extraNotes": "Notas Extras", "notes": "Observações", "direction/Actions": "Direção/Ações", - "advancedSettings": "Advanced Settings", + "advancedSettings": "Configurações Avançadas ", "taskAlias": "Pseudônimo da Tarefa", "taskAliasPopover": "O pseudônimo dessa tarefa pode ser usado quando integrados com sistemas de terceiros. Apenas hifens, sublinhados, letras e números são permitidos. O pseudônimo deve ser único entre todas as suas tarefas.", "taskAliasPlaceholder": "pseudônimo-da-sua-tarefa-aqui", "taskAliasPopoverWarning": "ATENÇÃO: Trocar esse valor irá quebrar qualquer integração com sistemas de terceiros que estejam utilizando o pseudônimo da tarefa.", "difficulty": "Dificuldade", - "difficultyHelp": "Difficulty describes how challenging a Habit, Daily, or To-Do is for you to complete. A higher difficulty results in greater rewards when a Task is completed, but also greater damage when a Daily is missed or a negative Habit is clicked.", + "difficultyHelp": "Dificuldade descreve o quão desafiador é um Hábito, Diária ou Afazer para você completar. Uma maior dificuldade resulta em maiores recompensas quando a Tarefa é completada, mas também em um maior dano quando uma Diária não é completada ou quando um Hábito negativo é clicado.", "trivial": "Trivial", "easy": "Fácil", "medium": "Médio", @@ -117,7 +119,7 @@ "fortifyText": "A Fortificação retornará todas as suas tarefas, exceto as tarefas de desafios, para um estado neutro (amarelo), como se você tivesse acabado de adicioná-las e encherá a sua barra de Vida. Isso é ótimo se suas tarefas vermelhas estão deixando o jogo muito difícil ou se suas tarefas azuis estão deixando o jogo fácil demais. Se começar do zero te parecer mais motivador, gaste as gemas e faça uma reprise!", "confirmFortify": "Tem certeza?", "fortifyComplete": "Fortificação completa!", - "deleteTask": "Delete this Task", + "deleteTask": "Deletar essa Tarefa", "sureDelete": "Certeza que quer deletar essa tarefa?", "sureDeleteCompletedTodos": "Você tem certeza de que quer apagar seus afazeres completos?", "streakCoins": "Bônus de Combo!", diff --git a/website/common/locales/ro/tasks.json b/website/common/locales/ro/tasks.json index 0f85d6d9cb..9be9f4ef10 100644 --- a/website/common/locales/ro/tasks.json +++ b/website/common/locales/ro/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Șterge pe cele completate", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Your most recent 30 completed To-Dos are shown here. You can see older completed To-Dos from Data > Data Display Tool or Data > Export Data > User Data.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/ru/tasks.json b/website/common/locales/ru/tasks.json index 6ce07b2e36..d6500b9d8b 100644 --- a/website/common/locales/ru/tasks.json +++ b/website/common/locales/ru/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Удалить завершенные", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Здесь показывается 30 ваших последних завершенных задач. Вы можете посмотреть более старые выполненные задачи, выбрав в меню Данные > Анализ данных или Данные > Экспорт данных > Пользовательские данные.", "deleteToDosExplanation": "Если вы нажмёте эту кнопку, все ваши завершённые задачи и находящиеся в архиве задачи будут удалены навсегда; за исключением задач из активных испытаний и групп с подпиской. Экспортируйте их прежде, чем нажимать на кнопку, если хотите их сохранить.", "addMultipleTip": "Подсказка: добавление пары задач за раз, разделяется разрывом строки (Shift + Enter) и вводом \"Enter\".", diff --git a/website/common/locales/sk/tasks.json b/website/common/locales/sk/tasks.json index e564732638..16ec9a3124 100644 --- a/website/common/locales/sk/tasks.json +++ b/website/common/locales/sk/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Zmaž hotové", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Tvojich naposledy splnených 30 úloh je ukázaných tu. Staršie splnené úlohy si môžeš pozrieť: Dáta > Nástroj na zobrazenie dát alebo Dáta > Export dát > Používateľské dáta.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/sr/tasks.json b/website/common/locales/sr/tasks.json index ed663b872d..135d5d5890 100644 --- a/website/common/locales/sr/tasks.json +++ b/website/common/locales/sr/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Obrisati završene zadatke", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Your most recent 30 completed To-Dos are shown here. You can see older completed To-Dos from Data > Data Display Tool or Data > Export Data > User Data.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/sv/tasks.json b/website/common/locales/sv/tasks.json index dbe5015400..f62aca4fe9 100644 --- a/website/common/locales/sv/tasks.json +++ b/website/common/locales/sv/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Borttagning slutförd", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Dina 30 senast slutförda att-göra visas här. Du kan se äldre slutförda att-göra på Data > Data Display Tool eller Data > Data export > Användardata.", "deleteToDosExplanation": "Om du klickar på knappen nedanför kommer alla av dina slutförda Att-Göra och arkiverade Att-Göra bli raderade permanent, förutom Att-Göra från aktiva utmaningar och Grupp-Planer. Exportera dom först om du vill ha ett register av dom.", "addMultipleTip": "Tips: För att lägga till flera Uppgifter, separera varje uppgift med en linjebrytare (Shift + Enter) och tryck senad på \"Enter\".", diff --git a/website/common/locales/tr/tasks.json b/website/common/locales/tr/tasks.json index 03d31b7a10..321692691d 100644 --- a/website/common/locales/tr/tasks.json +++ b/website/common/locales/tr/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Tamamlanmışları Sil", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "En son tamamladığın 30 Yapılacak İş burada gösterilir. Tamamlanan Yapılacak İşlerin daha eskilerini Veri > Veri Görüntüleme Aracı veya Veri > Veriyi Dışa Aktar > Kullanıcı Verisi sekmelerinden görebilirsin.", "deleteToDosExplanation": "Aşağıdaki düğmeye tıkladığında, Grup Planları ve aktif mücadele Yapılacakları dışında, tamamlanmış tüm Yapılacaklar ve arşivlenmiş Yapılacaklar kalıcı olarak silinecektir. Eğer bir kopya saklamak istersen öncelikle bunları dışa aktar.", "addMultipleTip": "öneri Birden fazla iş eklemek için her birini aralarında (Shift+Enter) a basarak yazıp sonra Enter a basarak ekliyebilirsin", diff --git a/website/common/locales/uk/tasks.json b/website/common/locales/uk/tasks.json index 1d2e6d7e0d..aa7c511ccb 100644 --- a/website/common/locales/uk/tasks.json +++ b/website/common/locales/uk/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "Вилучити виконані", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "Тут показані останні 30 виконаних задач. Побачити більше ви можете за шляхом Дані > Інструмент відображення даних або Дані > Експорт даних > Дані користувача.", "deleteToDosExplanation": "If you click the button below, all of your completed To-Dos and archived To-Dos will be permanently deleted, except for To-Dos from active challenges and Group Plans. Export them first if you want to keep a record of them.", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/common/locales/zh/tasks.json b/website/common/locales/zh/tasks.json index 848ad8ac68..be8e14672e 100644 --- a/website/common/locales/zh/tasks.json +++ b/website/common/locales/zh/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "删除已完成任务", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "你最近完成的30个待办事项显示在这。你可以在数据>数据显示工具或者数据>导出数据>用户数据查看更早完成的代办事项。", "deleteToDosExplanation": "如果你点击下方的按钮,除了正在进行的挑战或者团队任务,所有你已完成的待办事项和历史记录将永远删除,如果你想留下这些记录请先把他们导出哦!", "addMultipleTip": "提示:要添加多个任务,请使用换行符(Shift + Enter)分隔每个任务,然後按“Enter”键。", diff --git a/website/common/locales/zh_TW/tasks.json b/website/common/locales/zh_TW/tasks.json index 47e212dcf7..b015b90b52 100644 --- a/website/common/locales/zh_TW/tasks.json +++ b/website/common/locales/zh_TW/tasks.json @@ -1,5 +1,7 @@ { "clearCompleted": "清除已完成任務", + "clearCompletedDescription": "Completed To-Dos are deleted after 30 days for non-subscribers and 90 days for subscribers.", + "clearCompletedConfirm": "Are you sure you want to clear your completed todos?", "lotOfToDos": "你過去30天完成的代辦事項顯示在這裡。你可以在Data > Data Display Tool or Data > Export Data > User Data查看更早之前完成的代辦事項。", "deleteToDosExplanation": "如果你點擊下面的按鈕,除了仍在進行中的挑戰集團隊計劃外,你所有已完成和已歸檔的代辦事項將被永久刪除。如果想要將他們保存的話,點擊前可以先匯出這些代辦事項。", "addMultipleTip": "Tip: To add multiple Tasks, separate each one using a line break (Shift + Enter) and then press \"Enter.\"", diff --git a/website/server/controllers/api-v3/auth.js b/website/server/controllers/api-v3/auth.js index 4a52e90d01..910568ed4a 100644 --- a/website/server/controllers/api-v3/auth.js +++ b/website/server/controllers/api-v3/auth.js @@ -25,6 +25,8 @@ import { validatePasswordResetCodeAndFindUser, convertToBcrypt} from '../../libs const BASE_URL = nconf.get('BASE_URL'); const TECH_ASSISTANCE_EMAIL = nconf.get('EMAILS:TECH_ASSISTANCE_EMAIL'); const COMMUNITY_MANAGER_EMAIL = nconf.get('EMAILS:COMMUNITY_MANAGER_EMAIL'); +const USERNAME_LENGTH_MIN = 1; +const USERNAME_LENGTH_MAX = 20; let api = {}; @@ -78,11 +80,11 @@ function hasBackupAuth (user, networkToRemove) { /** * @api {post} /api/v3/user/auth/local/register Register - * @apiDescription Register a new user with email, username and password or attach local auth to a social user + * @apiDescription Register a new user with email, login name, and password or attach local auth to a social user * @apiName UserRegisterLocal * @apiGroup User * - * @apiParam (Body) {String} username Username of the new user + * @apiParam (Body) {String} username Login name of the new user. Must be 1-36 characters, containing only a-z, 0-9, hyphens (-), or underscores (_). * @apiParam (Body) {String} email Email address of the new user * @apiParam (Body) {String} password Password for the new user * @apiParam (Body) {String} confirmPassword Password confirmation @@ -101,7 +103,12 @@ api.registerLocal = { notEmpty: {errorMessage: res.t('missingEmail')}, isEmail: {errorMessage: res.t('notAnEmail')}, }, - username: {notEmpty: {errorMessage: res.t('missingUsername')}}, + username: { + notEmpty: {errorMessage: res.t('missingUsername')}, + isLength: {options: {min: USERNAME_LENGTH_MIN, max: USERNAME_LENGTH_MAX}, errorMessage: res.t('usernameWrongLength')}, + // TODO use the constants in the error message above + matches: {options: /^[-_a-zA-Z0-9]+$/, errorMessage: res.t('usernameBadCharacters')}, + }, password: { notEmpty: {errorMessage: res.t('missingPassword')}, equals: {options: [req.body.confirmPassword], errorMessage: res.t('passwordConfirmationMatch')}, diff --git a/website/server/libs/encryption.js b/website/server/libs/encryption.js index 390c59234e..36fff3f521 100644 --- a/website/server/libs/encryption.js +++ b/website/server/libs/encryption.js @@ -1,24 +1,26 @@ import { - createCipher, - createDecipher, + createCipheriv, + createDecipheriv, } from 'crypto'; import nconf from 'nconf'; const algorithm = 'aes-256-ctr'; -const SESSION_SECRET = nconf.get('SESSION_SECRET'); +const SESSION_SECRET_KEY = nconf.get('SESSION_SECRET_KEY'); +const SESSION_SECRET_IV = nconf.get('SESSION_SECRET_IV'); + +const key = Buffer.from(SESSION_SECRET_KEY, 'hex'); +const iv = Buffer.from(SESSION_SECRET_IV, 'hex'); export function encrypt (text) { - let cipher = createCipher(algorithm, SESSION_SECRET); + const cipher = createCipheriv(algorithm, key, iv); let crypted = cipher.update(text, 'utf8', 'hex'); - crypted += cipher.final('hex'); return crypted; } export function decrypt (text) { - let decipher = createDecipher(algorithm, SESSION_SECRET); + const decipher = createDecipheriv(algorithm, key, iv); let dec = decipher.update(text, 'hex', 'utf8'); - dec += decipher.final('utf8'); return dec; }