Merge branch 'develop' into apple_sub_fix

This commit is contained in:
SabreCat
2022-11-02 15:00:24 -05:00
72 changed files with 1640 additions and 850 deletions

View File

@@ -0,0 +1,86 @@
/*
* Award Habitoween ladder items to participants in this month's Habitoween festivities
*/
/* eslint-disable no-console */
const MIGRATION_NAME = '20211028_habitoween_ladder'; // Update when running in future years
import { model as User } from '../../../website/server/models/user';
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count++;
const set = {};
const inc = {
'items.food.Candy_Skeleton': 1,
'items.food.Candy_Base': 1,
'items.food.Candy_CottonCandyBlue': 1,
'items.food.Candy_CottonCandyPink': 1,
'items.food.Candy_Shade': 1,
'items.food.Candy_White': 1,
'items.food.Candy_Golden': 1,
'items.food.Candy_Zombie': 1,
'items.food.Candy_Desert': 1,
'items.food.Candy_Red': 1,
};
set.migration = MIGRATION_NAME;
if (user && user.items && user.items.pets && user.items.pets['JackOLantern-RoyalPurple']) {
set['items.mounts.JackOLantern-RoyalPurple'] = true;
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Glow']) {
set['items.pets.JackOLantern-RoyalPurple'] = 5;
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Glow']) {
set['items.mounts.JackOLantern-Glow'] = true;
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Ghost']) {
set['items.pets.JackOLantern-Glow'] = 5;
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Ghost']) {
set['items.mounts.JackOLantern-Ghost'] = true;
} else if (user && user.items && user.items.mounts && user.items.mounts['JackOLantern-Base']) {
set['items.pets.JackOLantern-Ghost'] = 5;
} else if (user && user.items && user.items.pets && user.items.pets['JackOLantern-Base']) {
set['items.mounts.JackOLantern-Base'] = true;
} else {
set['items.pets.JackOLantern-Base'] = 5;
}
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
return await User.update({_id: user._id}, {$inc: inc, $set: set}).exec();
}
export default async function processUsers () {
let query = {
migration: {$ne: MIGRATION_NAME},
'auth.timestamps.loggedin': {$gt: new Date('2022-10-01')},
};
const fields = {
_id: 1,
items: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({_id: 1})
.select(fields)
.lean()
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1],
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
};

View File

@@ -0,0 +1,119 @@
/* eslint-disable no-console */
const MIGRATION_NAME = '20221031_pet_set_group_achievements';
import { model as User } from '../../../website/server/models/user';
const progressCount = 1000;
let count = 0;
async function updateUser (user) {
count++;
const set = {
migration: MIGRATION_NAME,
};
if (user && user.items && user.items.pets) {
const pets = user.items.pets;
if (pets['Wolf-Skeleton']
&& pets['TigerCub-Skeleton']
&& pets['PandaCub-Skeleton']
&& pets['LionCub-Skeleton']
&& pets['Fox-Skeleton']
&& pets['FlyingPig-Skeleton']
&& pets['Dragon-Skeleton']
&& pets['Cactus-Skeleton']
&& pets['BearCub-Skeleton']
&& pets['Gryphon-Skeleton']
&& pets['Hedgehog-Skeleton']
&& pets['Deer-Skeleton']
&& pets['Egg-Skeleton']
&& pets['Rat-Skeleton']
&& pets['Octopus-Skeleton']
&& pets['Seahorse-Skeleton']
&& pets['Parrot-Skeleton']
&& pets['Rooster-Skeleton']
&& pets['Spider-Skeleton']
&& pets['Owl-Skeleton']
&& pets['Penguin-Skeleton']
&& pets['TRex-Skeleton']
&& pets['Rock-Skeleton']
&& pets['Bunny-Skeleton']
&& pets['Slime-Skeleton']
&& pets['Sheep-Skeleton']
&& pets['Cuttlefish-Skeleton']
&& pets['Whale-Skeleton']
&& pets['Cheetah-Skeleton']
&& pets['Horse-Skeleton']
&& pets['Frog-Skeleton']
&& pets['Snake-Skeleton']
&& pets['Unicorn-Skeleton']
&& pets['Sabretooth-Skeleton']
&& pets['Monkey-Skeleton']
&& pets['Snail-Skeleton']
&& pets['Falcon-Skeleton']
&& pets['Treeling-Skeleton']
&& pets['Axolotl-Skeleton']
&& pets['Turtle-Skeleton']
&& pets['Armadillo-Skeleton']
&& pets['Cow-Skeleton']
&& pets['Beetle-Skeleton']
&& pets['Ferret-Skeleton']
&& pets['Sloth-Skeleton']
&& pets['Triceratops-Skeleton']
&& pets['GuineaPig-Skeleton']
&& pets['Peacock-Skeleton']
&& pets['Butterfly-Skeleton']
&& pets['Nudibranch-Skeleton']
&& pets['Hippo-Skeleton']
&& pets['Yarn-Skeleton']
&& pets['Pterodactyl-Skeleton']
&& pets['Badger-Skeleton']
&& pets['Squirrel-Skeleton']
&& pets['SeaSerpent-Skeleton']
&& pets['Kangaroo-Skeleton']
&& pets['Alligator-Skeleton']
&& pets['Velociraptor-Skeleton']
&& pets['Dolphin-Skeleton']
&& pets['Robot-Skeleton']) {
set['achievements.boneToPick'] = true;
}
}
if (count % progressCount === 0) console.warn(`${count} ${user._id}`);
return await User.update({ _id: user._id }, { $set: set }).exec();
}
export default async function processUsers () {
let query = {
// migration: { $ne: MIGRATION_NAME },
'auth.timestamps.loggedin': { $gt: new Date('2022-01-01') },
};
const fields = {
_id: 1,
items: 1,
};
while (true) { // eslint-disable-line no-constant-condition
const users = await User // eslint-disable-line no-await-in-loop
.find(query)
.limit(250)
.sort({_id: 1})
.select(fields)
.lean()
.exec();
if (users.length === 0) {
console.warn('All appropriate users found and modified.');
console.warn(`\n${count} users processed\n`);
break;
} else {
query._id = {
$gt: users[users.length - 1]._id,
};
}
await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop
}
};

495
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
{
"name": "habitica",
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
"version": "4.246.0",
"version": "4.248.2",
"main": "./website/server/index.js",
"dependencies": {
"@babel/core": "^7.19.3",
"@babel/core": "^7.19.6",
"@babel/preset-env": "^7.19.1",
"@babel/register": "^7.18.9",
"@google-cloud/trace-agent": "^7.1.2",
@@ -13,7 +13,7 @@
"accepts": "^1.3.8",
"amazon-payments": "^0.2.9",
"amplitude": "^6.0.0",
"apidoc": "^0.53.0",
"apidoc": "^0.53.1",
"apple-auth": "^1.0.7",
"bcrypt": "^5.1.0",
"body-parser": "^1.20.1",
@@ -61,12 +61,12 @@
"paypal-rest-sdk": "^1.8.1",
"pp-ipn": "^1.1.0",
"ps-tree": "^1.0.0",
"rate-limiter-flexible": "^2.3.11",
"rate-limiter-flexible": "^2.4.0",
"redis": "^3.1.2",
"regenerator-runtime": "^0.13.9",
"remove-markdown": "^0.5.0",
"rimraf": "^3.0.2",
"short-uuid": "^4.2.0",
"short-uuid": "^4.2.2",
"stripe": "^10.13.0",
"superagent": "^8.0.2",
"universal-analytics": "^0.5.3",

View File

@@ -417,6 +417,8 @@ describe('Apple Payments', () => {
describe('does not apply multiple times', async () => {
it('errors when a user is using the same subscription', async () => {
user = new User();
await user.save();
payments.createSubscription.restore();
iap.getPurchaseData.restore();
iapGetPurchaseDataStub = sinon.stub(iap, 'getPurchaseData')

View File

@@ -11,10 +11,13 @@ import {
generateGroup,
} from '../../../../helpers/api-unit.helper';
import * as worldState from '../../../../../website/server/libs/worldState';
import { TransactionModel } from '../../../../../website/server/models/transaction';
describe('payments/index', () => {
let user; let group; let data; let
plan;
let user;
let group;
let data;
let plan;
beforeEach(async () => {
user = new User();
@@ -104,6 +107,23 @@ describe('payments/index', () => {
expect(recipient.purchased.plan.extraMonths).to.eql(3);
});
it('add a transaction entry to the recipient', async () => {
recipient.purchased.plan = plan;
expect(recipient.purchased.plan.extraMonths).to.eql(0);
await api.createSubscription(data);
expect(recipient.purchased.plan.extraMonths).to.eql(3);
const transactions = await TransactionModel
.find({ userId: recipient._id })
.sort({ createdAt: -1 })
.exec();
expect(transactions).to.have.lengthOf(1);
});
it('does not set negative extraMonths if plan has past dateTerminated date', async () => {
const dateTerminated = moment().subtract(2, 'months').toDate();
recipient.purchased.plan.dateTerminated = dateTerminated;

View File

@@ -16135,9 +16135,9 @@
}
},
"core-js": {
"version": "3.25.5",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.5.tgz",
"integrity": "sha512-nbm6eZSjm+ZuBQxCUPQKQCoUEfFOXjUZ8dTTyikyKaWrTYmAVbykQfwsKE5dBK88u3QCkCrzsx/PPlKfhsvgpw=="
"version": "3.26.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.26.0.tgz",
"integrity": "sha512-+DkDrhoR4Y0PxDz6rurahuB+I45OsEUv8E1maPTB6OuHRohMMcznBq9TMpdpDMm/hUPob/mJJS3PqgbHpMTQgw=="
},
"core-js-compat": {
"version": "3.11.0",
@@ -16589,7 +16589,7 @@
"de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
"integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="
"integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0="
},
"debug": {
"version": "4.1.1",
@@ -20816,7 +20816,7 @@
"is-window": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-window/-/is-window-1.0.2.tgz",
"integrity": "sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg=="
"integrity": "sha1-LIlspT25feRdPDMTOmXYyfVjSA0="
},
"is-windows": {
"version": "1.0.2",
@@ -26365,9 +26365,9 @@
}
},
"smartbanner.js": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.19.0.tgz",
"integrity": "sha512-F9vR7AIbyg2myhP9DrNYsKlKNqLuen+FFAu5R7SAF9IyCxNQkjpGUmiHbEaEVFTLw8J9hPmVC2lyGEJlOXTXKQ=="
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/smartbanner.js/-/smartbanner.js-1.19.1.tgz",
"integrity": "sha512-x3alFTlk6pLuqrm9PrYQv1E+86CrEIgPf/KJ+nP5342BmOWstbdR8OwD3TPmM56zHQm4MEr/eoqbEcfTKdvdKw=="
},
"snapdragon": {
"version": "0.8.2",
@@ -28467,7 +28467,7 @@
"uuid-browser": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz",
"integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg=="
"integrity": "sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA="
},
"v8-compile-cache": {
"version": "2.1.0",
@@ -28824,6 +28824,7 @@
"version": "npm:vue-loader@16.8.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
"integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
@@ -28834,6 +28835,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
@@ -28842,6 +28844,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -28851,6 +28854,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
@@ -28858,22 +28862,26 @@
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"optional": true
},
"emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"optional": true
},
"loader-utils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.3.tgz",
"integrity": "sha512-THWqIsn8QRnvLl0shHYVBN9syumU8pYWEHPTmkiVGd+7K5eFNVSY6AJhRvgGF70gg1Dz+l/k8WicvFCxdEs60A==",
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
@@ -28884,6 +28892,7 @@
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}

View File

@@ -32,7 +32,7 @@
"bootstrap": "^4.6.0",
"bootstrap-vue": "^2.22.0",
"chai": "^4.3.6",
"core-js": "^3.25.5",
"core-js": "^3.26.0",
"dompurify": "^2.4.0",
"eslint": "^6.8.0",
"eslint-config-habitrpg": "^6.2.0",
@@ -48,7 +48,7 @@
"nconf": "^0.12.0",
"sass": "^1.34.0",
"sass-loader": "^8.0.2",
"smartbanner.js": "^1.19.0",
"smartbanner.js": "^1.19.1",
"svg-inline-loader": "^0.8.2",
"svg-url-loader": "^7.1.1",
"svgo": "^1.3.2",

View File

@@ -63,6 +63,11 @@
width: 48px;
height: 56px;
}
.achievement-boneToPick2x {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-boneToPick2x.png');
width: 68px;
height: 68px;
}
.achievement-boot2x {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/achievement-boot2x.png');
width: 48px;
@@ -27335,6 +27340,31 @@
width: 117px;
height: 120px;
}
.head_mystery_202211 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202211.png');
width: 114px;
height: 90px;
}
.shop_head_mystery_202211 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202211.png');
width: 68px;
height: 68px;
}
.shop_set_mystery_202211 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202211.png');
width: 68px;
height: 68px;
}
.shop_weapon_mystery_202211 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_mystery_202211.png');
width: 68px;
height: 68px;
}
.weapon_mystery_202211 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202211.png');
width: 114px;
height: 90px;
}
.broad_armor_mystery_301404 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
width: 90px;
@@ -32829,6 +32859,204 @@
width: 68px;
height: 68px;
}
.headAccessory_special_bearEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_bearEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_bearEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_bearEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_blackHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_blackHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_blueHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_blueHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_cactusEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_cactusEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_cactusEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_cactusEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_foxEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_foxEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_foxEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_foxEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_greenHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_greenHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_lionEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_lionEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_lionEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_lionEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_pandaEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pandaEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pandaEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pandaEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_pigEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pigEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pigEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pigEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_pinkHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pinkHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_redHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_redHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_tigerEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_tigerEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_tigerEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_tigerEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_whiteHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_whiteHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_wolfEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_wolfEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_wolfEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_wolfEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_yellowHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_yellowHeadband.png');
width: 114px;
height: 90px;
}
.shop_headAccessory_special_bearEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_bearEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_blackHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_blackHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_blueHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_blueHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_cactusEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_cactusEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_foxEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_foxEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_greenHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_greenHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_lionEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_lionEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_pandaEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_pandaEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_pigEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_pigEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_pinkHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_pinkHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_redHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_redHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_tigerEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_tigerEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_whiteHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_whiteHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_wolfEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_wolfEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_yellowHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_yellowHeadband.png');
width: 68px;
height: 68px;
}
.head_0 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_0.png');
width: 90px;
@@ -33210,204 +33438,6 @@
width: 68px;
height: 68px;
}
.headAccessory_special_bearEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_bearEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_bearEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_bearEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_blackHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_blackHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_blueHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_blueHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_cactusEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_cactusEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_cactusEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_cactusEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_foxEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_foxEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_foxEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_foxEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_greenHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_greenHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_lionEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_lionEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_lionEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_lionEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_pandaEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pandaEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pandaEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pandaEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_pigEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pigEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_pigEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pigEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_pinkHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_pinkHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_redHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_redHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_tigerEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_tigerEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_tigerEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_tigerEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_whiteHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_whiteHeadband.png');
width: 114px;
height: 90px;
}
.headAccessory_special_wolfEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_wolfEars.png');
width: 90px;
height: 90px;
}
.customize-option.headAccessory_special_wolfEars {
background-position: -25px -15px;
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_wolfEars.png');
width: 60px;
height: 60px;
}
.headAccessory_special_yellowHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_special_yellowHeadband.png');
width: 114px;
height: 90px;
}
.shop_headAccessory_special_bearEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_bearEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_blackHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_blackHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_blueHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_blueHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_cactusEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_cactusEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_foxEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_foxEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_greenHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_greenHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_lionEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_lionEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_pandaEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_pandaEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_pigEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_pigEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_pinkHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_pinkHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_redHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_redHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_tigerEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_tigerEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_whiteHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_whiteHeadband.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_wolfEars {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_wolfEars.png');
width: 68px;
height: 68px;
}
.shop_headAccessory_special_yellowHeadband {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_special_yellowHeadband.png');
width: 68px;
height: 68px;
}
.shield_healer_1 {
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_healer_1.png');
width: 90px;

View File

@@ -45,7 +45,7 @@
v-html="$t('dayStart', { startTime: groupStartTime } )"
>
</div>
<div class="ml-2">
<div class="create-task-area ml-2">
<button
id="create-task-btn"
v-if="canCreateTasks"
@@ -132,6 +132,14 @@
margin-bottom: 0px;
}
.create-task-area {
position: inherit;
.dropdown {
right: 24px;
}
}
.day-start {
height: 2rem;
padding: 0.25rem 0.75rem;

View File

@@ -241,6 +241,14 @@ const NOTIFICATIONS = {
achievement: 'mountColorAchievs',
},
},
ACHIEVEMENT_PET_SET_COMPLETE: {
achievement: true,
label: $t => `${$t('achievement')}: ${$t('achievementPetSetComplete')}`,
modalId: 'generic-achievement',
data: {
achievement: 'petSetCompleteAchievs',
},
},
};
export default {
@@ -313,6 +321,7 @@ export default {
'ACHIEVEMENT_ANIMAL_SET',
'ACHIEVEMENT_PET_COLOR',
'ACHIEVEMENT_MOUNT_COLOR',
'ACHIEVEMENT_PET_SET_COMPLETE',
].forEach(type => {
handledNotifications[type] = true;
});
@@ -772,6 +781,15 @@ export default {
Vue.set(this.user.achievements, achievement, true);
break;
}
case 'ACHIEVEMENT_PET_SET_COMPLETE': {
const { achievement } = notification.data;
const upperCaseAchievement = achievement.charAt(0).toUpperCase() + achievement.slice(1);
const achievementTitleKey = `achievement${upperCaseAchievement}`;
NOTIFICATIONS.ACHIEVEMENT_PET_SET_COMPLETE.label = $t => `${$t('achievement')}: ${$t(achievementTitleKey)}`;
this.showNotificationWithModal(notification);
Vue.set(this.user.achievements, achievement, true);
break;
}
case 'ACHIEVEMENT': { // generic achievement
const { achievement } = notification.data;
const upperCaseAchievement = achievement.charAt(0).toUpperCase() + achievement.slice(1);

View File

@@ -75,6 +75,7 @@
v-show="selectedPage === 'subscription'"
class="subscribe-option"
:userReceivingGift="userReceivingGift"
:receiverName="receiverName"
/>
<!-- gem block -->
@@ -648,6 +649,7 @@ export default {
},
},
giftReceiver: this.receiverName,
toUserId: this.userReceivingGift._id,
});
}, 500);
},

View File

@@ -1,11 +1,22 @@
<template>
<b-modal
id="payments-success-modal"
:title="$t('accountSuspendedTitle')"
:hide-footer="isFromBalance || paymentData.newGroup"
:modal-class="isFromBalance || paymentData.newGroup ? ['modal-hidden-footer'] : []"
:hide-footer="isNewGroup || isGems || isSubscription"
:modal-class="isNewGroup || isGems || isSubscription
? ['modal-hidden-footer'] : []"
>
<!-- HEADER -->
<div slot="modal-header">
<div
class="modal-close"
@click="close()"
>
<div
class="icon-close"
v-html="icons.close"
>
</div>
</div>
<div class="check-container d-flex align-items-center justify-content-center">
<div
v-once
@@ -13,19 +24,127 @@
v-html="icons.check"
></div>
</div>
<h2>{{ $t(isFromBalance ? 'success' : 'paymentSuccessful') }}</h2>
<h2>{{ $t(isGemsBalance ? 'success' : 'paymentSuccessful') }}</h2>
</div>
<!-- BODY -->
<div class="row">
<div class="col-12 modal-body-col">
<!-- buy gems for self -->
<template v-if="isGems">
<strong v-once>{{ $t('paymentYouReceived') }}</strong>
<div class="details-block gems">
<div
v-once
class="svg-icon"
v-html="icons.gem"
></div>
<span>{{ paymentData.gemsBlock.gems }}</span>
</div>
</template>
<!-- buy gems to someone else OR send gems from balance-->
<template
v-if="isGiftGems || isGemsBalance"
>
<span v-html="$t('paymentYouSentGems', {name: paymentData.giftReceiver})"></span>
<div class="details-block gems">
<div
v-once
class="svg-icon"
v-html="icons.gem"
></div>
<span>{{ paymentData.gift.gems.amount }}</span>
</div>
</template>
<!-- give gift subscription (non-recurring)-->
<template v-if="paymentData.paymentType === 'gift-subscription'">
<div>
<span
v-html="$t('paymentYouSentSubscription', {
name: paymentData.giftReceiver, months: paymentData.subscription.months})"
></span>
</div>
</template>
<!-- buy self subscription (recurring) -->
<template v-if="isSubscription">
<strong v-once>{{ $t('nowSubscribed') }}</strong>
<div class="details-block">
<span
v-html="$t('paymentSubBilling', {
amount: paymentData.subscription.price, months: paymentData.subscription.months})"
></span>
</div>
</template>
<!-- group plan new or upgraded -->
<template v-if="isGroupPlan">
<span
v-html="$t(isNewGroup
? 'groupPlanCreated' : 'groupPlanUpgraded', {groupName: paymentData.group.name})"
></span>
<div
v-if="isGroupPlan"
class=""
>
<div class="details-block group-billing-date">
<span
v-html="$t('groupsPaymentSubBilling', { renewalDate })"
>
</span>
</div>
<div class="small-text group-auto-renew">
<span
v-once
>{{ $t('groupsPaymentAutoRenew') }}
</span>
</div>
</div>
</template>
<!-- buy self subscription auto renew -->
<template
v-if="isSubscription"
>
<span
v-once
class="small-text auto-renew"
>{{ $t('paymentAutoRenew') }}</span>
</template>
<!-- buttons for subscriptions / new Group / buy Gems for self -->
<button
v-if="isNewGroup || isGems || isSubscription"
v-once
class="btn btn-primary"
@click="submit()"
>
{{ $t('onwards') }}
</button>
</div>
</div>
<!-- FOOTER -->
<div slot="modal-footer">
<!-- everyone else -->
<!-- gift gems balance & buy, gift subscription -->
<div
v-if="paymentData.paymentType !== 'groupPlan' || paymentData.newGroup"
class="small-text"
v-if="isGemsBalance || isGiftGems || isGiftSubscription"
class="message mx-auto"
>
{{ $t('giftSubscriptionText4') }}
<lockable-label
:text="$t('sendGiftLabel')"
class="mx-auto label-text"
/>
<textarea
v-model="gift.message"
class="form-control mx-auto"
:placeholder="$t('sendGiftMessagePlaceholder')"
></textarea>
<button
:disabled="!gift.message || sendingInProgress"
class="btn btn-primary mx-auto"
@click="sendMessage()"
>
{{ $t('sendMessage') }}
</button>
</div>
<!-- upgradedGroup -->
<div
v-else
v-else-if="isUpgradedGroup"
class="demographics d-flex flex-column justify-content-center"
>
<lockable-label
@@ -56,108 +175,137 @@
</button>
</div>
</div>
<div class="row">
<div class="col-12 modal-body-col">
<!-- buy gems for self -->
<template v-if="paymentData.paymentType === 'gems'">
<strong v-once>{{ $t('paymentYouReceived') }}</strong>
<div class="details-block gems">
<div
v-once
class="svg-icon"
v-html="icons.gem"
></div>
<span>{{ paymentData.gemsBlock.gems }}</span>
</div>
</template>
<!-- buy or gift gems to someone else -->
<template
v-if="paymentData.paymentType === 'gift-gems'
|| paymentData.paymentType === 'gift-gems-balance'"
>
<span v-html="$t('paymentYouSentGems', {name: paymentData.giftReceiver})"></span>
<div class="details-block gems">
<div
v-once
class="svg-icon"
v-html="icons.gem"
></div>
<span>{{ paymentData.gift.gems.amount }}</span>
</div>
</template>
<!-- give gift subscription (non-recurring)-->
<template v-if="paymentData.paymentType === 'gift-subscription'">
<span
v-html="$t('paymentYouSentSubscription', {
name: paymentData.giftReceiver, months: paymentData.subscription.months})"
></span>
</template>
<!-- buy self subscription (recurring) -->
<template v-if="paymentData.paymentType === 'subscription'">
<strong v-once>{{ $t('nowSubscribed') }}</strong>
<div class="details-block">
<span
v-html="$t('paymentSubBilling', {
amount: paymentData.subscription.price, months: paymentData.subscription.months})"
></span>
</div>
</template>
<!-- group plan new or upgraded -->
<template v-if="paymentData.paymentType === 'groupPlan'">
<span
v-html="$t(paymentData.newGroup
? 'groupPlanCreated' : 'groupPlanUpgraded', {groupName: paymentData.group.name})"
></span>
<div
v-if="!paymentData.newGroup || paymentData.newGroup"
class=""
>
<div class="details-block group-billing-date">
<span
v-html="$t('groupsPaymentSubBilling', { renewalDate })"
>
</span>
</div>
<div class="small-text group-auto-renew">
<span
v-once
>{{ $t('groupsPaymentAutoRenew') }}
</span>
</div>
</div>
</template>
<!-- buy self subscription auto renew -->
<template
v-if="paymentData.paymentType === 'subscription'"
>
<span
v-once
class="small-text auto-renew"
>{{ $t('paymentAutoRenew') }}</span>
</template>
<!-- buttons for subscriptions -->
<button
v-if="paymentData.paymentType !== 'groupPlan'"
v-once
class="btn btn-primary"
@click="submit()"
>
{{ $t('onwards') }}
</button>
</div>
</div>
</b-modal>
</template>
<style lang="scss">
@import '~@/assets/scss/colors.scss';
#payments-success-modal .modal-md {
max-width: 448px;
}
#payments-success-modal {
.modal-md {
max-width: 448px;
min-width: 330px;
#payments-success-modal .modal-content {
background: transparent;
.modal-close {
position: absolute;
right: 16px;
top: 16px;
cursor: pointer;
.icon-close {
width: 18px;
height: 18px;
vertical-align: middle;
& svg path {
fill: $green-1;
}
& :hover {
fill: $green-1;
}
}
}
.modal-content {
background: transparent;
}
.modal-header {
justify-content: center;
padding-top: 24px;
padding-bottom: 0px;
background: $green-100;
border-top-right-radius: 8px;
border-top-left-radius: 8px;
border-bottom: none;
h2 {
color: $green-1;
}
.check-container {
width: 64px;
height: 64px;
border-radius: 50%;
background: $green-1;
margin: 0 auto;
margin-bottom: 16px;
}
.check {
width: 35.1px;
height: 28px;
color: $white;
}
}
.modal-body {
padding: 16px 32px 24px 32px;
background: $white;
.modal-body-col {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
.btn.btn-primary {
margin-top: 24px;
}
}
.details-block {
background: $gray-700;
border-radius: 4px;
padding: 8px 16px;
margin-top: 16px;
display: inline-flex;
flex-direction: row;
text-align: center;
&.gems {
padding: 12px 16px 12px 20px;
color: $green-10;
font-size: 24px;
font-weight: bold;
line-height: 1.33;
.svg-icon {
margin-right: 8px;
width: 32px;
height: 32px;
}
}
}
.auto-renew {
margin-top: 16px;
color: $orange-10;
font-style: normal;
}
.group-auto-renew {
margin: 12px 20px -8px 20px;
color: $yellow-5;
font-style: normal;
}
.group-billing-date {
width: 269px;
}
}
.modal-footer {
background: $gray-700;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
justify-content: center;
border-top: none;
.small-text {
font-style: normal;
}
}
}
}
#payments-success-modal.modal-hidden-footer .modal-body {
@@ -165,102 +313,6 @@
border-bottom-left-radius: 8px;
}
#payments-success-modal .modal-header {
justify-content: center;
padding-top: 24px;
padding-bottom: 0px;
background: $green-100;
border-top-right-radius: 8px;
border-top-left-radius: 8px;
border-bottom: none;
h2 {
color: $green-1;
}
.check-container {
width: 64px;
height: 64px;
border-radius: 50%;
background: $green-1;
margin: 0 auto;
margin-bottom: 16px;
}
.check {
width: 35.1px;
height: 28px;
color: $white;
}
}
#payments-success-modal .modal-body {
padding: 16px 32px 24px 32px;
background: $white;
.modal-body-col {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
.btn.btn-primary {
margin-top: 24px;
}
}
.details-block {
background: $gray-700;
border-radius: 4px;
padding: 8px 16px;
margin-top: 16px;
display: inline-flex;
flex-direction: row;
text-align: center;
&.gems {
padding: 12px 16px 12px 20px;
color: $green-10;
font-size: 24px;
font-weight: bold;
line-height: 1.33;
.svg-icon {
margin-right: 8px;
width: 32px;
height: 32px;
}
}
}
.auto-renew {
margin-top: 16px;
color: $orange-10;
font-style: normal;
}
.group-auto-renew {
margin: 12px 20px -8px 20px;
color: $yellow-5;
font-style: normal;
}
.group-billing-date {
width: 269px;
}
}
#payments-success-modal .modal-footer {
background: $gray-700;
border-bottom-right-radius: 8px;
border-bottom-left-radius: 8px;
justify-content: center;
border-top: none;
.small-text {
font-style: normal;
}
}
.demographics {
background-color: $gray-700;
@@ -278,23 +330,42 @@
margin-bottom: 20px;
}
}
.message {
margin-bottom: 8px;
width: 378px;
display: flex;
flex-direction: column;
textarea.form-control {
height: 56px;
margin: 0 24px 24px 24px;
font-size: 0.875rem;
}
}
</style>
<style lang="scss">
@import '~@/assets/scss/mixins.scss';
</style>
<script>
// icons
import checkIcon from '@/assets/svg/check.svg';
import gemIcon from '@/assets/svg/gem.svg';
import closeIcon from '@/assets/svg/close.svg';
// components
import { mapState } from '@/libs/store';
import subscriptionBlocks from '@/../../common/script/content/subscriptionBlocks';
import selectTranslatedArray from '@/components/tasks/modal-controls/selectTranslatedArray';
import lockableLabel from '@/components/tasks/modal-controls/lockableLabel';
// mixins
import notificationsMixin from '@/mixins/notifications';
import paymentsMixin from '@/mixins/payments';
// analytics
import * as Analytics from '@/libs/analytics';
export default {
@@ -302,18 +373,30 @@ export default {
selectTranslatedArray,
lockableLabel,
},
mixins: [paymentsMixin],
mixins: [
paymentsMixin,
notificationsMixin,
],
data () {
return {
icons: Object.freeze({
check: checkIcon,
gem: gemIcon,
close: closeIcon,
}),
paymentData: {},
upgradedGroup: {
name: '',
demographics: null,
},
sendingInProgress: false,
gift: {
message: '',
},
receiverName: {
name: null,
uuid: null,
},
};
},
computed: {
@@ -323,9 +406,30 @@ export default {
const memberCount = this.paymentData.group.memberCount || 1;
return sub.price + 3 * (memberCount - 1);
},
isFromBalance () {
isGemsBalance () {
return this.paymentData.paymentType === 'gift-gems-balance';
},
isGems () {
return this.paymentData.paymentType === 'gems';
},
isGiftGems () {
return this.paymentData.paymentType === 'gift-gems';
},
isGiftSubscription () {
return this.paymentData.paymentType === 'gift-subscription';
},
isSubscription () {
return this.paymentData.paymentType === 'subscription';
},
isGroupPlan () {
return this.paymentData.paymentType === 'groupPlan';
},
isUpgradedGroup () {
return this.paymentData.paymentType === 'groupPlan' && !this.paymentData.newGroup;
},
isNewGroup () {
return this.paymentData.paymentType === 'groupPlan' && this.paymentData.newGroup;
},
},
mounted () {
this.$root.$on('habitica:payment-success', data => {
@@ -341,6 +445,19 @@ export default {
this.$root.$off('habitica:payments-success');
},
methods: {
async sendMessage () {
this.sendingInProgress = true;
await this.$store.dispatch('members:sendPrivateMessage', {
message: this.gift.message,
toUserId: this.paymentData.gift.uuid || this.paymentData.toUserId,
});
this.close();
},
close () {
this.gift.message = '';
this.sendingInProgress = false;
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
},
submit () {
if (this.paymentData.group && !this.paymentData.newGroup) {
Analytics.track({

View File

@@ -125,6 +125,10 @@ export default {
type: Object,
default () {},
},
receiverName: {
type: String,
default: '',
},
},
data () {
return {
@@ -135,7 +139,6 @@ export default {
type: 'subscription',
subscription: { key: 'basic_earned' },
},
receiverName: '',
};
},
computed: {

View File

@@ -2730,5 +2730,11 @@
"armorSpecialFall2022HealerNotes": "Wie viele Beobachter könnte ein Beobachter beobachten, wenn ein Beobachter Beobachter beobachten könnte? Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
"headSpecialFall2022MageNotes": "Zieh andere in Deinen Bann und locke sie zu Dir hin mit dieser magischen Maidenmaske. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
"eyewearArmoireComedyMaskNotes": "Heiter! Eine malerische Maske für Dein fröhlich' Herz, spielend, Freude verkündend, Heiterkeit und Frohsinn auf der Bühne ausstrahlend. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Theatermaskenset (Gegenstand 1 von 2).",
"eyewearArmoireTragedyMaskNotes": "Ach! Eine schwere Maske für Deinen armen Darsteller, stolzierend, sich grämend, und auf der Bühne Leid und Kummer ausdrückend. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Theatermaskenset (Gegenstand 2 von 2)."
"eyewearArmoireTragedyMaskNotes": "Ach! Eine schwere Maske für Deinen armen Darsteller, stolzierend, sich grämend, und auf der Bühne Leid und Kummer ausdrückend. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Theatermaskenset (Gegenstand 2 von 2).",
"armorArmoireSheetGhostCostumeText": "Bettuch-Geist-Kostüm",
"weaponMystery202211Text": "Blitzbeschwörer Stab",
"weaponMystery202211Notes": "Bündle die massive Macht eines Blitzgewitters mit diesem Stab. Gewährt keinen Attributbonus. November 2022 Abonnentengegenstand.",
"armorArmoireSheetGhostCostumeNotes": "Boo! Das ist das gruseligste Kostüm in Habitica, also geh vernünftig damit um … und gib Acht, dass Du nicht stolperst. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Unabhängiger Gegenstand.",
"headMystery202211Text": "Blitzbeschwörer Hut",
"headMystery202211Notes": "Sei vorsichtig mit diesem blitzenden Hut, er kann einen sehr schockierenden Eindruck bei Deinen Bewunderern hinteralssen! Gewährt keinen Attributbonus. November 2022 Abonnentengegenstand."
}

View File

@@ -197,7 +197,7 @@
"userIsClamingTask": "`<%= username %> beansprucht:` <%= task %>",
"approvalRequested": "Zustimmung erbeten",
"cantDeleteAssignedGroupTasks": "Du kannst Gruppen-Aufgaben, die Dir zugewiesen wurden, nicht löschen.",
"groupPlanUpgraded": "<strong><%- groupName %></strong> wurde auf einen Gruppenplan hochgestuft!",
"groupPlanUpgraded": "<strong><%- groupName %></strong> wurde erfolgreich auf einen Gruppenplan hochgestuft!",
"groupPlanCreated": "<strong><%- groupName %></strong> wurde erstellt!",
"onlyGroupLeaderCanInviteToGroupPlan": "Nur der Gruppenleiter kann Nutzer zu einer Gruppe mit einem Abonnement hinzufügen.",
"paymentDetails": "Zahlungsinformationen",
@@ -382,5 +382,21 @@
"sendGiftTotal": "Insgesamt:",
"chatTemporarilyUnavailable": "Chat aktuell nicht verfügbar. Bitte versuche es später erneut.",
"assignTo": "Zugewiesen an",
"newGroupsEnjoy": "Wir hoffen, Dir gefallen die neuen Gruppenpläne!"
"newGroupsEnjoy": "Wir hoffen, Dir gefallen die neuen Gruppenpläne!",
"groupUseDefault": "Wähle eine Antwort",
"createGroup": "Erstelle eine Gruppe",
"groupUse": "Was beschreibt den Zweck Deiner Gruppe am Besten?*",
"groupParentChildren": "Eltern(teile), die Aufgaben für ihre Kinder erstellen",
"groupCouple": "Ein Paar, das sich Aufgaben teilt",
"groupFriends": "Freunde, die sich Aufgaben teilen",
"groupCoworkers": "Arbeitskollegen, die sich Aufgaben teilen",
"groupManager": "Ein Manager, der Aufgaben für seine Mitarbeiter erstellt",
"groupTeacher": "Ein Lehrer, der Aufgaben für seine Schüler oder Studierenden erstellt",
"nameStar": "Name*",
"descriptionOptional": "Beschreibung",
"descriptionOptionalText": "Füge eine Beschreibung hinzu",
"nameStarText": "Füge einen Titel hinzu",
"nextPaymentMethod": "Weiter: Zahlungsmethode",
"dayStart": "<strong>Tageswechsel</strong>: <%= startTime %>",
"viewStatus": "Status"
}

View File

@@ -229,5 +229,11 @@
"summer2022MantaRayMageSet": "Mantarochen (Magier)",
"julyYYYY": "Juli <%= year %>",
"octoberYYYY": "Oktober <%= year %>",
"februaryYYYY": "Februar <%= year %>"
"februaryYYYY": "Februar <%= year %>",
"fall2022KappaRogueSet": "Kappa (Schurke)",
"fall2022OrcWarriorSet": "Ork (Krieger)",
"fall2022HarpyMageSet": "Harpyie (Magier)",
"fall2022WatcherHealerSet": "Beobachter (Heiler)",
"gemSaleHow": "Kauf einfach zwischen <%= eventStartMonth %> <%= eventStartOrdinal %>und <%= eventEndOrdinal %> eines der Edelstein-Pakete wie normal und Deinem Konto werden automatisch die zusätzlichen Edelsteine gutgeschrieben. Das heißt insgesamt mehr Edelsteine zum ausgeben, teilen oder ansparen für zukünftige Veröffentlichungen!",
"gemSaleLimitations": "Dieses Sonderangebot gilt nur während der zeitlich beschränkten Aktion. Die Aktion startet am <%= eventStartOrdinal %>. <%= eventStartMonth %> um 8:00 EDT (12:00 UTC) und endet am <%= eventEndOrdinal %>. <%= eventStartMonth %> um 20:00 PM EDT (00:00 UTC). Das Sonderangebot ist nur verfügbar, wenn Du Edelsteine für Dich selbst kaufst."
}

View File

@@ -214,5 +214,6 @@
"needToPurchaseGems": "Willst Du Edelsteine als Geschenk kaufen?",
"mysterySet202208": "Frecher Pferdeschwanz-Set",
"mysterySet202209": "Magisches Gelehrten-Set",
"mysterySet202210": "Bedrohliche Schlange Set"
"mysterySet202210": "Bedrohliche Schlange Set",
"mysteryset202211": "Blitzbeschwörer Set"
}

View File

@@ -138,5 +138,8 @@
"achievementGroupsBeta2022ModalText":"You and your groups helped Habitica by testing and providing feedback!",
"achievementWoodlandWizard": "Woodland Wizard",
"achievementWoodlandWizardText": "Has hatched all standard colors of forest creatures: Badger, Bear, Deer, Fox, Frog, Hedgehog, Owl, Snail, Squirrel, and Treeling!",
"achievementWoodlandWizardModalText": "You collected all the forest pets!"
"achievementWoodlandWizardModalText": "You collected all the forest pets!",
"achievementBoneToPick": "Bone to Pick",
"achievementBoneToPickText": "Has hatched all the Classic and Quest Skeleton Pets!",
"achievementBoneToPickModalText": "You collected all the Classic and Quest Skeleton Pets!"
}

View File

@@ -71,5 +71,5 @@
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), come ask in the [Habitica Help guild](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! We're happy to help.",
"faqQuestion13": "What is a Group Plan?",
"webFaqAnswer13": "## How do Group Plans work?\n\nA [Group Plan](/group-plans) gives your Party or Guild access to a shared task board thats similar to your personal task board! Its a shared Habitica experience where tasks can be created and checked off by anyone in the group.\n\nThere are also features available like member roles, status view, and task assigning that give you a more controlled experience. [Visit our wiki](https://habitica.fandom.com/wiki/Group_Plans) to learn more about our Group Plans features!\n\n## Who benefits from a Group Plan?\n\nGroup Plans work best when you have a small team of people who want to collaborate together. We recommend 2-5 members.\n\nGroup Plans are great for families, whether its a parent and child or you and a partner. Shared goals, chores, or responsibilities are easy to keep track of on one board.\n\nGroup Plans can also be useful for teams of colleagues that have shared goals, or managers that want to introduce their employees to gamification.\n\n## Quick tips for using Groups\n\nHere are some quick tips to get you started with your new Group. Well provide more details in the following sections:\n\n* Make a member a manager to give them the ability to create and edit tasks\n* Leave tasks unassigned if anyone can complete it and it only needs done once\n* Assign a task to one person to make sure no one else can complete their task\n* Assign a task to multiple people if they all need to complete it\n* Toggle the ability to display shared tasks on your personal board to not miss anything\n* You get rewarded for the tasks you complete, even multi-assigned\n* Task completion rewards arent shared or split between Team members\n* Use task color on the team board to judge the average completion rate of tasks\n* Regularly review the tasks on your Team Board to make sure they are still relevant\n* Missing a Daily wont damage you or your team, but the task will degrade in color\n\n## How can others in the group create tasks?\n\nOnly the group leader and managers can create tasks. If youd like a group member to be able to create tasks, then you should promote them to be a manager by going to the Group Information tab, viewing the member list, and clicking the dot icon by their name.\n\n## How does assigning a task work?\n\nGroup Plans give you the unique ability to assign tasks to other group members. Assigning a task is great for delegating. If you assign a task to someone, then other members are prevented from completing it.\n\nYou can also assign a task to multiple people if it needs to be completed by more than one member. For example, if everyone has to brush their teeth, create a task and assign it to each group member. They will all be able to check it off and get their individual rewards for doing so. The main task will show as complete once everyone checks it off.\n\n## How do unassigned tasks work?\n\nUnassigned tasks can be completed by anyone in the group, so leave a task unassigned to allow any member to complete it. For example, taking out the trash. Whoever takes out the trash can check off the unassigned task and it will show as completed for everyone.\n\n## How does the synchronized day reset work?\n\nShared tasks will reset at the same time for everyone to keep the shared task board in sync. This time is visible on the shared task board and is determined by the group leaders day start time. Because shared tasks reset automatically, you will not get a chance to complete yesterdays uncompleted shared Dailies when you check in the next morning.\n\nShared Dailies will not do damage if they are missed, however they will degrade in color to help visualize progress. We dont want the shared experience to be a negative one!\n\n## How do I use my Group on the mobile apps?\n\nWhile the mobile apps dont fully support all Group Plans functionality yet, you can still complete shared tasks from the iOS and Android app. On the browser version of Habitica, go to your groups shared task board and turn on the copy tasks toggle. Now all open and assigned shared tasks will display on your personal task board across all platforms.\n\n## Whats the difference between a Groups shared tasks and Challenges?\n\nGroup Plan shared task boards are more dynamic than Challenges, in that they can constantly be updated and interacted with. Challenges are great if you have one set of tasks to send out to many people.\n\nGroup Plans are also a paid feature, while Challenges are available free to everyone.\n\nYou cannot assign specific tasks in Challenges, and Challenges do not have a shared day reset. In general, Challenges offer less control and direct interaction."
"webFaqAnswer13": "## How do Group Plans work?\n\nA [Group Plan](/group-plans) gives your Party or Guild access to a shared task board thats similar to your personal task board! Its a shared Habitica experience where tasks can be created and checked off by anyone in the group.\n\nThere are also features available like member roles, status view, and task assigning that give you a more controlled experience. [Visit our wiki](https://habitica.fandom.com/wiki/Group_Plans) to learn more about our Group Plans features!\n\n## Who benefits from a Group Plan?\n\nGroup Plans work best when you have a small team of people who want to collaborate together. We recommend 2-5 members.\n\nGroup Plans are great for families, whether its a parent and child or you and a partner. Shared goals, chores, or responsibilities are easy to keep track of on one board.\n\nGroup Plans can also be useful for teams of colleagues that have shared goals, or managers that want to introduce their employees to gamification.\n\n## Quick tips for using Groups\n\nHere are some quick tips to get you started with your new Group. Well provide more details in the following sections:\n\n* Make a member a manager to give them the ability to create and edit tasks\n* Leave tasks unassigned if anyone can complete it and it only needs done once\n* Assign a task to one person to make sure no one else can complete their task\n* Assign a task to multiple people if they all need to complete it\n* Toggle the ability to display shared tasks on your personal board to not miss anything\n* You get rewarded for the tasks you complete, even multi-assigned\n* Task completion rewards arent shared or split between Team members\n* Use task color on the team board to judge the average completion rate of tasks\n* Regularly review the tasks on your Team Board to make sure they are still relevant\n* Missing a Daily wont damage you or your team, but the task will degrade in color\n\n## How can others in the group create tasks?\n\nOnly the group leader and managers can create tasks. If youd like a group member to be able to create tasks, then you should promote them to be a manager by going to the Group Information tab, viewing the member list, and clicking the dot icon by their name.\n\n## How does assigning a task work?\n\nGroup Plans give you the unique ability to assign tasks to other group members. Assigning a task is great for delegating. If you assign a task to someone, then other members are prevented from completing it.\n\nYou can also assign a task to multiple people if it needs to be completed by more than one member. For example, if everyone has to brush their teeth, create a task and assign it to each group member. They will all be able to check it off and get their individual rewards for doing so. The main task will show as complete once everyone checks it off.\n\n## How do unassigned tasks work?\n\nUnassigned tasks can be completed by anyone in the group, so leave a task unassigned to allow any member to complete it. For example, taking out the trash. Whoever takes out the trash can check off the unassigned task and it will show as completed for everyone.\n\n## How does the synchronized day reset work?\n\nShared tasks will reset at the same time for everyone to keep the shared task board in sync. This time is visible on the shared task board and is determined by the group leaders day start time. Because shared tasks reset automatically, you will not get a chance to complete yesterdays uncompleted shared Dailies when you check in the next morning.\n\nShared Dailies will not do damage if they are missed, however they will degrade in color to help visualize progress. We dont want the shared experience to be a negative one!\n\n## How do I use my Group on the mobile apps?\n\nWhile the mobile apps dont fully support all Group Plans functionality yet, you can still complete shared tasks from the iOS and Android app by copying the tasks onto your personal task board. You can switch this preference on from Settings in the mobile apps or from the group task board on the browser version. Now open and assigned shared tasks will display on your personal task board across all platforms.\n\n## Whats the difference between a Groups shared tasks and Challenges?\n\nGroup Plan shared task boards are more dynamic than Challenges, in that they can constantly be updated and interacted with. Challenges are great if you have one set of tasks to send out to many people.\n\nGroup Plans are also a paid feature, while Challenges are available free to everyone.\n\nYou cannot assign specific tasks in Challenges, and Challenges do not have a shared day reset. In general, Challenges offer less control and direct interaction."
}

View File

@@ -482,6 +482,8 @@
"weaponMystery202201Notes": "Unleash a cloud of gold and silver glitter when the clock strikes midnight. Happy New Year! Now who's cleaning this up? Confers no benefit. January 2022 Subscriber Item.",
"weaponMystery202209Text": "Magic Manual",
"weaponMystery202209Notes": "This book will guide you through your journey into magic-making. Confers no benefit. September 2022 Subscriber Item.",
"weaponMystery202211Text": "Electromancer Staff",
"weaponMystery202211Notes": "Harness the awesome power of a lightning storm with this staff. Confers no benefit. November 2022 Subscriber Item.",
"weaponMystery301404Text": "Steampunk Cane",
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
@@ -1965,6 +1967,8 @@
"headMystery202208Notes": "Enjoy showing off this voluminous hair - it can double as a whip in a pinch! Confers no benefit. August 2022 Subscriber Item.",
"headMystery202210Text": "Ominous Ophidian Helm",
"headMystery202210Notes": "This scaly hood will surely terrify your To-Do list into submission! Confers no benefit. October 2022 Subscriber Item.",
"headMystery202211Text": "Electromancer Hat",
"headMystery202211Notes": "Be careful with this powerful hat, its effect on admirers can be quite shocking! Confers no benefit. November 2022 Subscriber Item.",
"headMystery301404Text": "Fancy Top Hat",
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",

View File

@@ -132,7 +132,8 @@
"sendGiftTotal": "Total:",
"sendGiftFromBalance": "From Balance",
"sendGiftPurchase": "Purchase",
"sendGiftMessagePlaceholder": "Personal message (optional)",
"sendGiftLabel": "Would you like to send a gift message?",
"sendGiftMessagePlaceholder": "Add a gift message",
"sendGiftSubscription": "<%= months %> Month(s): $<%= price %> USD",
"gemGiftsAreOptional": "Please note that Habitica will never require you to gift gems to other players. Begging people for gems is a <strong>violation of the Community Guidelines</strong>, and all such instances should be reported to <%= hrefTechAssistanceEmail %>.",
"giftMessageTooLong": "The maximum length for gift messages is <%= maxGiftMessageLength %>.",

View File

@@ -92,7 +92,7 @@
"paymentSuccessful": "Your payment was successful!",
"paymentYouReceived": "You received:",
"paymentYouSentGems": "You sent <strong><%- name %></strong>:",
"paymentYouSentSubscription": "You sent <strong><%- name %></strong> a <%= months %>-months Habitica subscription.",
"paymentYouSentSubscription": "You sent <strong><%- name %></strong><br> a <%= months %> month(s) Habitica subscription.",
"paymentSubBilling": "Your subscription will be billed <strong>$<%= amount %></strong> every <strong><%= months %> months</strong>.",
"groupsPaymentSubBilling": "Your next billing date is <strong><%= renewalDate %></strong>.",
"paymentSubBillingWithMethod": "Your subscription will be billed <strong>$<%= amount %></strong> every <strong><%= months %> months</strong> via <strong><%= paymentMethod %></strong>.",

View File

@@ -143,6 +143,7 @@
"mysterySet202208": "Perky Ponytail Set",
"mysterySet202209": "Magical Scholar Set",
"mysterySet202210": "Ominous Ophidian Set",
"mysterySet202211": "Electromancer Set",
"mysterySet301404": "Steampunk Standard Set",
"mysterySet301405": "Steampunk Accessories Set",
"mysterySet301703": "Peacock Steampunk Set",

View File

@@ -2182,70 +2182,70 @@
"headSpecialSpring2020HealerText": "Fascinador Iris",
"headSpecialWinter2020WarriorText": "Tocado Polvonevado",
"headSpecialSpring2020HealerNotes": "¡Engaña a tus enemigos con este tocado de flores! Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de primavera 2020.",
"headSpecialSummer2020HealerText": "Yelmo tachonado de cristal",
"headSpecialFall2020RogueNotes": "Mira dos veces, actúa una: esta máscara te lo hace fácil. Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de otoño 2020.",
"headSpecialSummer2020HealerText": "Yelmo Tachonado de Cristal",
"headSpecialFall2020RogueNotes": "Mira dos veces, actúa una: esta máscara te lo hace fácil. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de otoño 2020.",
"headSpecialSpring2020MageText": "Gorra con Tapa de Goteo",
"headSpecialSpring2020MageNotes": "¿Está el cielo despejado?¿hay poca humedad? No te preocupes, te ayudamos. ¡Humedece tu magia sin humillar tu espíritu! Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de primavera 2020.",
"headSpecialSummer2020WarriorNotes": "Multiplica tu fuerza y habilidad con esta prenda de cabeza altamente visible. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada de verano 2020.",
"headSpecialFall2020RogueText": "Máscara de piedra de dos cabezas",
"headSpecialFall2020WarriorNotes": "¡El guerrero que en su día la usaba, jamás se inmutó ante las tareas más duras! Pero puede que otros retrocedan ante ti cuando lo uses... Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada de otoño 2020.",
"headSpecialSummer2020WarriorNotes": "Multiplica tu fuerza y habilidad con esta prenda de cabeza altamente visible. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de verano 2020.",
"headSpecialFall2020RogueText": "Máscara de Piedra de Dos Cabezas",
"headSpecialFall2020WarriorNotes": "¡El guerrero que en su día la usaba, jamás se inmutó ante las tareas más duras! Pero puede que otros retrocedan ante ti cuando lo uses... Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de otoño 2020.",
"headSpecialFall2020MageText": "Clarividencia Despertada",
"headSpecialSummer2020RogueNotes": "¡Completa tu estilo picaresco camuflándote con este yelmo! Quizás puedas engañar a tus enemigos con tus lágrima de cocodrilo... Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de verano 2020.",
"headSpecialSummer2020WarriorText": "Gorra de pescado llamativo",
"headSpecialSummer2020WarriorText": "Gorra de Pescado Llamativo",
"headSpecialWinter2020HealerNotes": "Por favor, quíteselo de la cabeza antes de tratar de hacer café o té con él. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de invierno 2019-2020.",
"headSpecialSummer2020HealerNotes": "Estate tranquilo, puede que los recogeconchas mantengan sus manos lejos de tu pelo. Aumenta la inteligencia en <%= int %>. Equipamiento de edición limitada de verano 2020.",
"headSpecialSummer2020MageText": "Cresta de pez sable",
"headSpecialSummer2020HealerNotes": "Estate tranquilo, puede que los recogeconchas mantengan sus manos lejos de tu pelo. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de verano 2020.",
"headSpecialSummer2020MageText": "Cresta de Pez Sable",
"headSpecialSummer2020RogueText": "Yelmo de Cocodrilo",
"headSpecialSummer2020MageNotes": "¿Quién necesita una corona teniendo esta cresta? Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de verano 2020.",
"headSpecialFall2020MageNotes": "Con esta gorra asentada a la perfección sobre tu frente, tu tercer ojo se abre, lo que te permite concentrarte en lo que de otro modo sería invisible: flujos de maná, espíritus inquietos y tareas pendientes olvidadas. Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de otoño 2020.",
"headSpecialFall2020WarriorText": "Capucha siniestra",
"headSpecialSummer2020MageNotes": "¿Quién necesita una corona teniendo esta cresta? Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de verano 2020.",
"headSpecialFall2020MageNotes": "Con esta gorra asentada a la perfección sobre tu frente, tu tercer ojo se abre, lo que te permite concentrarte en lo que de otro modo sería invisible: flujos de maná, espíritus inquietos y tareas pendientes olvidadas. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de otoño 2020.",
"headSpecialFall2020WarriorText": "Capucha Siniestra",
"headSpecialWinter2020WarriorNotes": "Una sensación de picazón en el cuero cabelludo es un pequeño precio a pagar por la magnificencia estacional. Aumenta la Fuerza en <%= str%>. Equipamiento de edición limitada de invierno 2019-2020.",
"headSpecialSpring2020WarriorNotes": "¡Los golpes de tus enemigos rebotarán en este yelmo inspirado en los escarabajos!. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de primavera 2020.",
"headSpecialSpring2020RogueNotes": "Tan vibrante y valioso que sufrirás la tentación de robárselo a tu propia cabeza. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de primavera 2020.",
"headSpecialSpring2020WarriorText": "Yelmo de Escarabajo",
"headSpecialSpring2020RogueText": "Kabuto de Lapis",
"headSpecialWinter2021WarriorText": "Capucha aislante",
"headSpecialSpring2021RogueNotes": "Dejémonos de florituras lingüísticas: ¡este sombrero te permitirá camuflarte a la perfección entre las flores de primavera! Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSpring2021MageNotes": "Coloca esta ligera corona sobre tu frente y los pájaros de las aguas acudirán en tu ayuda. ¿Qué misión les darás? Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSummer2021MageText": "Cresta nautiloide",
"headSpecialWinter2021WarriorText": "Capucha Aislante",
"headSpecialSpring2021RogueNotes": "Dejémonos de florituras lingüísticas: ¡este sombrero te permitirá camuflarte a la perfección entre las flores de primavera! Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSpring2021MageNotes": "Coloca esta ligera corona sobre tu frente y los pájaros de las aguas acudirán en tu ayuda. ¿Qué misión les darás? Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSummer2021MageText": "Cresta Nautiloide",
"headMystery202007Notes": "Este yelmo te permitirá entonar complejas y hermosas canciones para tus compañeros cetáceos. No otorga ningún beneficio. Artículo del suscriptor de julio 2020.",
"headMystery201912Notes": "¡Este reluciente copo de nieve te otorga resistencia al frío sin importar lo alto que vueles! No otorga ningún beneficio. Artículo de suscriptor de diciembre 2019.",
"headSpecialFall2020HealerNotes": "La espantosa palidez de este rostro con forma de calavera brilla como una advertencia para todos los mortales: ¡El tiempo es fugaz! ¡Cumple con tus plazos antes de que sea demasiado tarde! Aumenta la inteligencia en <%= int %>. Equipamiento de edición limitada de otoño 2020.",
"headSpecialFall2020HealerNotes": "La espantosa palidez de este rostro con forma de calavera brilla como una advertencia para todos los mortales: ¡El tiempo es fugaz! ¡Cumple con tus plazos antes de que sea demasiado tarde! Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de otoño 2020.",
"headMystery202006Text": "Tiara de sugilita",
"headSpecialWinter2021MageNotes": "Deja volar tu imaginación, mientras sientes la hogareña seguridad que proporciona esta capucha. Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headSpecialWinter2021MageNotes": "Deja volar tu imaginación, mientras sientes la hogareña seguridad que proporciona esta capucha. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headMystery201911Notes": "Cada uno de los cristales tachonados sobre este sombrero te otorga un poder especial: Clarividencia Mística, Sabiduría Arcana, y ... Placa de Sortilegio Giratorio. Nada mal, la verdad. No otorga ningún beneficio. Artículo de suscriptor de noviembre 2019.",
"headSpecialSpring2021WarriorText": "Yelmo solar",
"headSpecialFall2020HealerText": "Máscara de cabeza de la Muerte",
"headSpecialSpring2021WarriorNotes": "¡No temas! La piedra solar de este yelmo te ayudará a sacar a la luz esas tareas pendientes que tengas en color rojo oscuro profundo. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSummer2021MageNotes": "Puede que los ojos en forma de agujeros colocados sobre esta gorra moteada no mejoren mucho tu visión submarina, pero de lo que sí puedes estar seguro es de que desconcertarán a tus oponentes. Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialWinter2021RogueText": "Máscara de hiedra",
"headSpecialWinter2021HealerNotes": "¡Una sorprendente cantidad de calor se escapa por la cabeza! Sin embargo, eso no ocurrirá mientras uses esta gruesa capucha y sus respectivas gafas. ¡No habrá ni un solo carámbano en tus pestañas! Aumenta la inteligencia en <%= int %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headSpecialSummer2021WarriorText": "Yelmo pescadero",
"headSpecialSpring2021RogueText": "Sombrero de flores gemelas",
"headSpecialSpring2021WarriorText": "Yelmo Solar",
"headSpecialFall2020HealerText": "Máscara de Cabeza de la Muerte",
"headSpecialSpring2021WarriorNotes": "¡No temas! La piedra solar de este yelmo te ayudará a sacar a la luz esas tareas pendientes que tengas en color rojo oscuro profundo. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSummer2021MageNotes": "Puede que los ojos en forma de agujeros colocados sobre esta gorra moteada no mejoren mucho tu visión submarina, pero de lo que sí puedes estar seguro es de que desconcertarán a tus oponentes. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialWinter2021RogueText": "Máscara de Hiedra",
"headSpecialWinter2021HealerNotes": "¡Una sorprendente cantidad de calor se escapa por la cabeza! Sin embargo, eso no ocurrirá mientras uses esta gruesa capucha y sus respectivas gafas. ¡No habrá ni un solo carámbano en tus pestañas! Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headSpecialSummer2021WarriorText": "Yelmo Pescadero",
"headSpecialSpring2021RogueText": "Sombrero de Flores Gemelas",
"headMystery202006Notes": "La energía positiva de estas radiantes piedras púrpuras atraerá a tu lado a las criaturas más amigables del mar. No otorga ningún beneficio. Artículo de suscriptor de junio 2020.",
"headSpecialWinter2021WarriorNotes": "Envuélvete con esta confortable capucha para superar el frío invernal. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headSpecialWinter2021WarriorNotes": "Envuélvete con esta confortable capucha para superar el frío invernal. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headMystery202007Text": "Espectacular yelmo de orca",
"headSpecialWinter2021MageText": "Capucha de sombra lunar",
"headSpecialWinter2021MageText": "Capucha de Sombra Lunar",
"headMystery202003Text": "Yelmo de espino",
"headSpecialWinter2021HealerText": "Equipo de cabeza para la exploración ártica",
"headSpecialSummer2021RogueNotes": "Es gruesa, brillante y divertida. ¡Como tú! Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialSummer2021HealerText": "Máscara de loro",
"headSpecialSummer2021HealerNotes": "¡Toma prestado el plumaje de un loro para ayudarte con tus batallas diarias! Aumenta la inteligencia en <%= int %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialWinter2021RogueNotes": "Un pícaro puede pasar desapercibido en el bosque con una máscara como esta. Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headSpecialSummer2021RogueText": "Capucha de pez payaso",
"headSpecialSpring2021MageText": "Tiara de cría de cisne",
"headSpecialSpring2021HealerText": "Guirnalda de salix",
"headSpecialWinter2021HealerText": "Equipo de Cabeza para la Exploración Ártica",
"headSpecialSummer2021RogueNotes": "Es gruesa, brillante y divertida. ¡Como tú! Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialSummer2021HealerText": "Máscara de Loro",
"headSpecialSummer2021HealerNotes": "¡Toma prestado el plumaje de un loro para ayudarte con tus batallas diarias! Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialWinter2021RogueNotes": "Un pícaro puede pasar desapercibido en el bosque con una máscara como esta. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headSpecialSummer2021RogueText": "Capucha de Pez Payaso",
"headSpecialSpring2021MageText": "Tiara de Cría de Cisne",
"headSpecialSpring2021HealerText": "Guirnalda de Salix",
"headSpecialFall2021RogueText": "Has sido engullido",
"headSpecialFall2021WarriorText": "Corbata sin cabeza",
"headSpecialFall2021WarriorNotes": "Pierde la cabeza por este formal conjunto de cuello y corbata que completan tu traje. Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada de otoño 2021.",
"headSpecialFall2021MageText": "Máscara comecerebros",
"headSpecialFall2021HealerText": "Máscara de invocador",
"headSpecialFall2021HealerNotes": "Tu propia mágica transforma tu pelo en brillantes e impactantes llamas cuando llevas esta máscara. Aumenta la inteligencia en <%= int %>. Equipamiento de edición limitada de otoño 2021.",
"headSpecialFall2021WarriorText": "Corbata sin Cabeza",
"headSpecialFall2021WarriorNotes": "Pierde la cabeza por este formal conjunto de cuello y corbata que completan tu traje. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de otoño 2021.",
"headSpecialFall2021MageText": "Máscara Comecerebros",
"headSpecialFall2021HealerText": "Máscara de Invocador",
"headSpecialFall2021HealerNotes": "Tu propia mágica transforma tu pelo en brillantes e impactantes llamas cuando llevas esta máscara. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de otoño 2021.",
"headMystery202003Notes": "¡Ten cuidado, este yelmo es afilado por todas partes! No otorga ningún beneficio. Artículo de suscriptor de marzo 2020.",
"headSpecialSpring2021HealerNotes": "¡No lloréis, compañeros!¡Ya está aquí el sanador para acabar con vuestro sufrimiento! Aumenta la inteligencia en <%= int %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSummer2021WarriorNotes": "¡Este yelmo puede mantenerte seguro y además su magia te permitirá a respirar bajo el agua! Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialFall2021RogueNotes": "Ugh, estás atascado. Ahora estás condenado a vagar por los corredores de la mazmorra, coleccionando escombros. ¡CONDENADÍSIMOOOO! Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de otoño 2021.",
"headSpecialFall2021MageNotes": "Los tentáculos que rodean la boca agarran la presa y mantienen sus deliciosos pensamientos cerca de ella para que puedas saborearlos. Aumenta la percepción en <%= per %>. Equipamiento de edición limitada de otoño 2021.",
"headSpecialSpring2021HealerNotes": "¡No lloréis, compañeros!¡Ya está aquí el sanador para acabar con vuestro sufrimiento! Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de primavera 2021.",
"headSpecialSummer2021WarriorNotes": "¡Este yelmo puede mantenerte seguro y además su magia te permitirá a respirar bajo el agua! Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de verano 2021.",
"headSpecialFall2021RogueNotes": "Ugh, estás atascado. Ahora estás condenado a vagar por los corredores de la mazmorra, coleccionando escombros. ¡CONDENADÍSIMOOOO! Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de otoño 2021.",
"headSpecialFall2021MageNotes": "Los tentáculos que rodean la boca agarran la presa y mantienen sus deliciosos pensamientos cerca de ella para que puedas saborearlos. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de otoño 2021.",
"headMystery202001Notes": "Tu capacidad auditiva será tan aguda, que escucharás brillar a las estrellas y girar a la luna. No otorga ningún beneficio. Artículo de suscriptor de enero 2020.",
"headMystery202101Text": "Yelmo molón de leopardo de las nieves",
"headArmoireTricornHatNotes": "¡Transfórmate en un bromista profesional! Aumenta la percepción en <%= per %>. Armario Encantado: Artículo independiente.",
@@ -2529,7 +2529,7 @@
"armorSpecialWinter2022WarriorText": "Calcetín Calentito",
"headSpecialWinter2022MageText": "Yelmo de Granada",
"headSpecialWinter2022MageNotes": "Gracias a su piel dura, este casco festivo y frutal es exgranadamente fuerte. Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de invierno 2020-2021.",
"headSpecialWinter2022RogueNotes": "¿Qué? ¿Eh? ¿Que hay un Pícaro dónde? ¡Lo siento, con estos fuegos artificiales no oigo nada! Aumenta la Percepción en <%= per %>. Equipamiento de Edición Limitada de Invierno 2020-2021.",
"headSpecialWinter2022RogueNotes": "¿Qué? ¿Eh? ¿Que hay un Pícaro dónde? ¡Lo siento, con estos fuegos artificiales no oigo nada! Aumenta la Percepción en <%= per %>. Equipamiento de edición limitada de invierno 2021-2022.",
"headSpecialWinter2022WarriorText": "Gorro de Calcetín Calentito",
"headSpecialWinter2022WarriorNotes": "Con su color verde festivo y su ribete rojo, seguro que este sombrero te mantendrá caliente todo el invierno. Aumenta la Fuerza en <%= str %>. Equipamiento de Edición Limitada de Invierno 2020-2021.",
"headSpecialWinter2022HealerText": "Corona de Hielo Cristalino",
@@ -2597,5 +2597,24 @@
"weaponArmoireHuntingHornText": "Cuerno de Caza",
"weaponSpecialSpring2022HealerText": "Vara de Peridoto",
"weaponSpecialSpring2022HealerNotes": "Utiliza esta vara para acceder a las propiedades curativas del peridoto, ya sea para llevar la calma, la positividad, o la bondad. Aumenta la Inteligencia en <%= int %>. Equipamiento de edición limitada de primavera 2022.",
"weaponSpecialSpring2022RogueNotes": "¡Qué brillante! Es tan brillante y resplandeciente y bonito y lindo y todo tuyo. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de primavera 2022."
"weaponSpecialSpring2022RogueNotes": "¡Qué brillante! Es tan brillante y resplandeciente y bonito y lindo y todo tuyo. Aumenta la Fuerza en <%= str %>. Equipamiento de edición limitada de primavera 2022.",
"weaponArmoireOrangeKiteNotes": "Con colores como el amanecer y el anochecer, ¡veamos cómo de alto puede llegar tu cometa! Aumenta todas las estadisticas en <%= attrs %>. Armario Encantado: Colección de Cometas (Artículo 3 de 5)",
"weaponSpecialSummer2022RogueText": "Pinza de cangrejo",
"weaponSpecialSummer2022RogueNotes": "Si estás en un apuro, ¡no dudes enseñar estas temibles pinzas! Aumenta la fuerza en <%= str %>. Equipamiento de edición limitada de verano 2022.",
"weaponSpecialFall2022RogueText": "Cuchilla de pepino",
"weaponSpecialFall2022RogueNotes": "No solo te puedes defender con este pepino, también es una comida sabrosa. Aumenta la Fuerza en <%= str %>.Equipamiento de edición limitada de otoño 2022.",
"weaponSpecialFall2022MageText": "Ráfagas de viento",
"weaponMystery202209Text": "Manual de magia",
"weaponMystery202209Notes": "Este libro te guiará a través de tu viaje en la creación de magia. No otorga ningún beneficio. Artículo de suscriptor de septiembre de 2022.",
"weaponArmoireGreenKiteNotes": "Una cometa más impresionante que nunca, con sus sombras de amarillo y verde. Aumenta todas las estadisticas en <%= attrs %>. Armario Encantado: Colección de Cometas (Artículo 2 de 5)",
"weaponArmoireBlueKiteText": "Cometa azul",
"weaponArmoireOrangeKiteText": "Cometa naranja",
"weaponArmoireBlueKiteNotes": "Navegando en lo alto del azul, ¿qué trucos puedes conseguir que haga tu cometa? Aumenta todas las estadisticas en <%= attrs %>. Armario Encantado: Colección de Cometas (Artículo 1 de 5)",
"weaponArmoireGreenKiteText": "Cometa verde",
"weaponArmoirePinkKiteNotes": "Navegando, girando, volando alto, tu cometa destaca contra el cielo. Aumenta todas las estadisticas en <%= attrs %>. Armario Encantado: Colección de Cometas (Artículo 4 de 5)",
"weaponArmoireYellowKiteText": "Cometa amarilla",
"weaponArmoireYellowKiteNotes": "Cayendo en picado y girando de un lado a otro, mira cómo va tu alegre cometa. Aumenta todas las estadisticas en <%= attrs %>. Armario Encantado: Colección de Cometas (Artículo 5 de 5)",
"weaponArmoirePinkKiteText": "Cometa rosa",
"weaponArmoirePushBroomText": "Escoba de empuje",
"headSpecialSummer2022RogueText": "Casco de Cangrejo"
}

View File

@@ -231,5 +231,9 @@
"julyYYYY": "Julio de <%= year %>",
"octoberYYYY": "Octubre de <%= year %>",
"fall2022HarpyMageSet": "Arpía (Mago)",
"fall2022OrcWarriorSet": "Orca (Guerrero)"
"fall2022OrcWarriorSet": "Orca (Guerrero)",
"gemSaleLimitations": "Esta promoción solo aplica durante el tiempo limitado del evento. Este evento empieza el <%= eventStartOrdinal %> de <%= eventStartMonth %> a las 8:00 AM EDT (12:00 UTC) y acabará el <%= eventEndOrdinal %> de <%= eventStartMonth %> a las 8:00 PM EDT (00:00 UTC). Esta promoción solo está disponible cuando se compran Gemas para uno mismo.",
"gemSaleHow": "Entre el <%= eventStartOrdinal %> y <%= eventEndOrdinal %> de <%= eventStartMonth %>, simplemente compra cualquier paquete de Gemas como normalmente, y se abonará en tu cuenta el número promocional de Gemas. ¡Más Gemas para gastar, compartir o guardar para futuras entregas!",
"fall2022KappaRogueSet": "Kapa (Pícaro)",
"fall2022WatcherHealerSet": "Mirador (Sanador)"
}

View File

@@ -14,12 +14,12 @@
"next": "Siguiente",
"randomize": "Aleatorizar",
"mattBoch": "Matt Boch",
"mattBochText1": "¡Bienvenido al Establo! Soy Matt, el señor de las bestias. Cada vez que completas una tarea, tienes una chance aleatoria de conseguir un Huevo o una Poción de eclosión con los cuales puedes eclosionar una Mascota. ¡Cuando nazca tu Mascota, aparecerá aquí! Haz clic en la imagen de una Mascota para añadirla a tu personaje. Aliméntalas con el alimento para mascotas que encuentres y se convertirán en vigorosas Monturas.",
"mattBochText1": "¡Bienvenido al Establo! Soy Matt, el señor de las bestias. Cada vez que completas una tarea, tienes una posibilidad aleatoria de conseguir un Huevo o una Poción de eclosión con los cuales puedes eclosionar una Mascota. ¡Cuando nazca tu Mascota, aparecerá aquí! Haz clic en la imagen de una Mascota para añadirla a tu personaje. Aliméntalas con el alimento para mascotas que encuentres y se convertirán en vigorosas Monturas.",
"welcomeToTavern": "¡Bienvenido a la taberna!",
"sleepDescription": "¿Necesitas un descanso? Pásate por la Posada de Daniel para pausar algunas de las mecánicas de juego más dificiles de Habitica:",
"sleepBullet1": "Las Tareas Diarias incumplidas no te dañarán",
"sleepBullet2": "Las tareas no perderán sus rachas",
"sleepBullet3": "Los Jefes no te dañarán por tus propias Tareas Diarias incompletas",
"sleepBullet1": "Tus Tareas Diarias incumplidas no te dañarán (aunque los jefes te harán daño causado por las Tareas Diarias incumplidas por otro miembro del Equipo)",
"sleepBullet2": "Las rachas de tus Tareas y Hábitos no se reiniciarán",
"sleepBullet3": "El daño que produzcas a los Jefes de misión o los objetos de colección encontrados permanecerán pendientes hasta que salgas de la Taverna",
"sleepBullet4": "El daño que hagas a tu jefe o los objetos de Misiones de recolección permanecerán pendientes hasta que termine el día",
"pauseDailies": "Pausar daño",
"unpauseDailies": "Volver a sufrir daño",
@@ -81,7 +81,7 @@
"newBaileyUpdate": "¡Nuevas Novedades de Bailey!",
"tellMeLater": "Dímelo más tarde",
"dismissAlert": "Descartar este aviso",
"donateText3": "Habitica es un proyecto de código abierto que depende del soporte de sus usuarios. El dinero que gastes en gemas nos ayuda a mantener activos los servidores, mantener al pequeño grupo de personal, desarrollar nuevas características y proveer incentivos para nuestros voluntarios.",
"donateText3": "Habitica es un proyecto de código abierto que depende del soporte de sus usuarios. El dinero que gastes en gemas nos ayuda a mantener activos los servidores, mantener al pequeño grupo de personal, desarrollar nuevas características y proveer incentivos para nuestros voluntarios",
"card": "Tarjeta de crédito",
"paymentMethods": "Comprar con",
"paymentSuccessful": "¡El pago se llevó a cabo con éxito!",
@@ -101,9 +101,9 @@
"tourPartyPage": "Tu Equipo te ayudará a mantenerte responsable. ¡Invita a amigos para desbloquear un Pergamino de Misión!",
"tourGuildsPage": "Los Gremios son grupos de conversación de intereses comunes creados por los jugadores, para los jugadores. Ojea la lista y únete a los Gremios que te interesen. ¡Asegúrate de echar un vistazo al popular Gremio de Ayuda de Habitica: Haz una Pregunta, donde cualquiera puede hacer preguntas sobre Habitica!",
"tourChallengesPage": "¡Los desafios son listas de tareas tematicas creadas por usuarios! Unirte a un Desafio añadira sus tareas a tu cuenta. ¡Compite contra otros usuarios para ganar premios en Gemas!",
"tourMarketPage": "Cada vez que completes una tarea, tendrás una chance aleatoria de recibir un Huevo, una Poción eclosionadora o un trozo de Alimento para mascotas. También puedes comprar estos objetos aquí.",
"tourMarketPage": "Cada vez que completes una tarea, tendrás una posibilidad aleatoria de recibir un Huevo, una Poción eclosionadora o un trozo de Alimento para mascotas. También puedes comprar estos objetos aquí.",
"tourHallPage": "Bienvenido al Salón de los Héroes, donde los contribuidores del código abierto de Habitica son honrados. Ya sea mediante código, arte, música, escritura o incluso por simple buena voluntad, ellos han ganado Gemas, equipamiento exclusivo, y prestigiosos títulos. ¡Tú puedes contribuir con Habitica también!",
"tourPetsPage": "¡Bienvenido al Establo! Cada vez que completes una tarea, tendrás una chance aleatoria de recibir un Huevo o una Poción eclosionadora para eclosionar Mascotas. Cuando eclosiones una Mascota, ¡aparecerá aquí! Haz click en la imagen de una mascota para añadirla a tu avatar. Aliméntalas con el Alimento para mascotas que encuentres y se convertirán en poderosas monturas.",
"tourPetsPage": "¡Bienvenido al Establo! Cada vez que completes una tarea, tendrás una posibilidad aleatoria de recibir un Huevo o una Poción eclosionadora para eclosionar Mascotas. Cuando eclosiones una Mascota, ¡aparecerá aquí! Haz click en la imagen de una mascota para añadirla a tu avatar. Aliméntalas con el Alimento para mascotas que encuentres y se convertirán en poderosas monturas.",
"tourMountsPage": "Una vez que has alimentado a tu mascota lo suficiente como para que se convierta en una montura, aparecerá aquí. ¡Haz click en una montura para ensillar!",
"tourEquipmentPage": "¡Aquí es donde tu Equipamiento se almacena! Tu Equipo de Batalla afecta a tus Atributos. Si quieres enseñar Equipamiento distinto en tu avatar sin cambiar tus Atributos, haz click en \"Llevar disfraz.\"",
"equipmentAlreadyOwned": "Tú ya tienes esa parte del conjunto",
@@ -131,5 +131,8 @@
"limitedAvailabilityMinutes": "Disponible por <%= minutes %>m <%= seconds %>s",
"limitedAvailabilityHours": "Disponible por <%= hours %>h <%= minutes %>m",
"amountExp": "<%= amount %> Exp",
"newStuffPostedOn": "Publicado el <%= publishDate %>, <%= publishTime %>"
"newStuffPostedOn": "Publicado el <%= publishDate %>, <%= publishTime %>",
"groupsPaymentSubBilling": "Tu próxima fecha de facturación es <strong><%= renewalDate %></strong>.",
"groupsPaymentAutoRenew": "Esta suscripción se auto-renovará hasta que sea cancelada. Si quieres cancelarla, puedes hacerlo desde la pestaña de Cobro de grupos.",
"helpSupportHabitica": "Ayuda a apoyar a Habitica"
}

View File

@@ -745,10 +745,13 @@
"questOnyxCollectOnyxStones": "Piedras de Ónice",
"questOnyxDropOnyxPotion": "Poción de Eclosión de Ónice",
"questOnyxUnlockText": "Desbloquea la compra de Pociones de Eclosión de Ónice en el Mercado",
"questVirtualPetCompletion": "Al presionar cuidadosamente un botón, parece haber satisfecho las misteriosas necesidades de la mascota virtual, y finalmente se ha calmado y parece contento. llena de pociones emitiendo pitidos.<br><br>“El momento, April Fool”, dice @Beffymaroo con una sonrisa irónica. “Sospecho que este tipo grande que emite un pitido es un conocido tuyo.”<br><br>“Uh, sí,” dice el Loco, tímidamente. “¡Lo siento mucho y gracias a ambos por cuidar de Wotchimon! Toma estas pociones a modo de agradecimiento, pueden recuperar tus mascotas virtuales cuando quieras” asi que vale la pena intentarlo!",
"questVirtualPetNotes": "Es una tranquila y agradable mañana de primavera en Habitica, una semana después de un memorable Día de los Inocentes. Tú y @Beffymaroo están en los establos atendiendo a sus mascotas (aun que todavía están un poco confundidas por el tiempo que pasaron virtualmente!.<br><br>A lo lejos escuchas un estruendo y un pitido, suave al principio pero aumentando en volumen como si estuviera cada vez más cerca. Aparece una forma de huevo en el horizonte y, a medida que se acerca, con un pitido cada vez más fuerte, ¡ves que es una mascota virtual gigantesca!<br><br>“Oh, no”, exclama @Beffymaroo, “Creo que April Fool dejó asuntos pendientes con este tipo grande aquí, ¡parece querer atención!”<br><br>La mascota virtual emite un pitido enfadado, lanzando una rabieta virtual y gritando cada vez más cerca.",
"questVirtualPetCompletion": "Al presionar cuidadosamente un botón, parece haber satisfecho las misteriosas necesidades de la mascota virtual, y finalmente se ha calmado y parece contento.<br><br> De repente en una explosión de confeti, Santo Inocente aparece con una cesta llena de pociones emitiendo pitidos suaves.<br><br>“Qué oportuno, Santo Inocente”, dice @Beffymaroo con una sonrisa irónica. “Sospecho que este tipo grande que emite un pitido es un conocido tuyo.”<br><br>“Uh, sí,” dice Inocente, tímidamente. “¡Lo siento mucho y gracias a ambos por cuidar de Wotchimon! Toma estas pociones a modo de agradecimiento, pueden recuperar tus mascotas virtuales cuando quieras”<br><br>No estás 100% seguro de estar de acuerdo con todos esos pitidos, ¡pero son muy monos, así que vale la pena intentarlo!",
"questVirtualPetNotes": "Es una tranquila y agradable mañana de primavera en Habitica, una semana después de un memorable Día de los Inocentes. Tú y @Beffymaroo estáis en los establos atendiendo a vuestras mascotas (¡quienes todavía están un poco confundidas por el tiempo que pasaron virtualmente!).<br><br>A lo lejos escuchas un estruendo y un pitido, suave al principio pero aumentando en volumen como si estuviera cada vez más cerca. Aparece una forma de huevo en el horizonte y, a medida que se acerca, con un pitido cada vez más fuerte, ¡ves que es una mascota virtual gigantesca!<br><br>“Oh, no”, exclama @Beffymaroo, “Creo que Santo Inocente dejó asuntos pendientes con este tipo grande aquí, ¡parece querer atención!”<br><br>La mascota virtual emite un pitido enfadado, lanzando una rabieta virtual y gritando cada vez más cerca.",
"questVirtualPetBoss": "Wotchimon",
"questVirtualPetRageTitle": "El pitido",
"questVirtualPetRageEffect": "\"¡Wotchimon usa un pitido molesto!\" ¡Wotchimon emite un pitido molesto y su barra de felicidad desaparece repentinamente! Daño pendiente reducido.",
"questVirtualPetRageDescription": "Esta barra se llena cuando no completas tus Diarios. ¡Cuando esté lleno, Wotchimon eliminará algunos de los daños causados de tu grupo!"
"questVirtualPetRageDescription": "Esta barra se llena cuando no completas tus Diarios. ¡Cuando esté lleno, Wotchimon eliminará algunos de los daños causados de tu grupo!",
"questVirtualPetDropVirtualPetPotion": "Poción de eclosión de Mascotas Virtuales",
"questVirtualPetText": "El Caos Virtual con Santo Inocente: El Pitido",
"questVirtualPetUnlockText": "Desbloquea la poción de eclosión de mascotas virtuales para comprar en el Mercado"
}

View File

@@ -728,5 +728,12 @@
"backgroundAutumnPicnicText": "Picnic Autunnale",
"backgroundAutumnPicnicNotes": "Goditi un Picnic Autunnale.",
"backgroundOldPhotoText": "Vecchia Foto",
"backgroundOldPhotoNotes": "Mettiti in posa in una Vecchia Foto."
"backgroundOldPhotoNotes": "Mettiti in posa in una Vecchia Foto.",
"backgroundSpookyRuinsText": "Rovine Spettrali",
"backgroundSpookyRuinsNotes": "Esplora delle Rovine Spettrali.",
"backgroundMaskMakersWorkshopText": "Bottega del Mascheraio",
"backgroundMaskMakersWorkshopNotes": "Prova un nuovo volto nella Bottega del Mascheraio.",
"backgroundCemeteryGateText": "Cancello di un Cimitero",
"backgrounds102022": "SET 101: Rilasciato a ottobre 2022",
"backgroundCemeteryGateNotes": "Infesta il Cancello di un Cimitero."
}

View File

@@ -2730,5 +2730,11 @@
"headMystery202210Text": "Inquietante Elmo Ofidiano",
"headMystery202210Notes": "Questo cappuccio squamoso sottometterà sicuramente la tua lista di Cose da Fare, terrorizzandola! Non conferisce alcun bonus. Oggetto abbonati ottobre 2022.",
"armorMystery202210Text": "Inquietante Armatura Ofidiana",
"armorMystery202210Notes": "Prova a strisciare, tanto per cambiare, e potresti scoprire che è un mezzo per spostarsi piuttosto efficiente! Non conferisce alcun bonus. Oggetto abbonati ottobre 2022."
"armorMystery202210Notes": "Prova a strisciare, tanto per cambiare, e potresti scoprire che è un mezzo per spostarsi piuttosto efficiente! Non conferisce alcun bonus. Oggetto abbonati ottobre 2022.",
"weaponMystery202211Text": "Bastone dell'Elettromante",
"weaponMystery202211Notes": "Sfrutta l'incredibile potenza di un temporale con questo bastone. Non conferisce alcun bonus. Oggetto abbonati novembre 2022.",
"armorArmoireSheetGhostCostumeText": "Costume da Fantasma con le Lenzuola",
"armorArmoireSheetGhostCostumeNotes": "Bu! Questo è il costume più spaventoso in tutta Habitica, quindi indossalo con saggezza... e stai attento a non inciampare sui tuoi passi. Aumenta la Costituzione di <%= con %>. Scrigno incantato: Oggetto Indipendente.",
"headMystery202211Text": "Cappello dell'Elettromante",
"headMystery202211Notes": "Stai attento con questo potente cappello, l'effetto che ha sugli ammiratori può essere piuttosto scioccante! Non conferisce alcun bonus. Oggetto abbonati novembre 2022."
}

View File

@@ -514,7 +514,7 @@
"questHippoUnlockText": "Sblocca le uova di Ippopotamo acquistabili nel Mercato",
"farmFriendsText": "Pacchetto missioni Amici della Fattoria",
"farmFriendsNotes": "Contiene \"La Mucca Muutante\", \"Cavalca il Destriero dell'Incubo\", e \"L'Ariete Tuonante\". Disponibile fino al 30 settembre.",
"witchyFamiliarsText": "Pacchetto di Missioni dei Familiari Stregati",
"witchyFamiliarsText": "Pacchetto di Missioni dei Famigli Stregati",
"witchyFamiliarsNotes": "Contiene 'Il Re dei Ratti', 'L'Aracnide Ghiacciato', 'Palude della Rana del Disordine'. Disponibile fino al 31 Ottobre.",
"questGroupLostMasterclasser": "Mistero dei Masterclasser",
"questUnlockLostMasterclasser": "Per sbloccare questa missione, completa le missioni finali di queste serie: 'Dilatoria sotto Attacco', 'Caos a Fantalata', La calamità di Stoikalm', e 'Terrore a Boscompito'.",

View File

@@ -212,5 +212,6 @@
"mysterySet202207": "Set Medusa Improvvisante",
"mysterySet202208": "Set Coda di Cavallo Pimpante",
"mysterySet202209": "Set dell'Erudito Magico",
"mysterySet202210": "Set dell'Inquietante Ofidiano"
"mysterySet202210": "Set dell'Inquietante Ofidiano",
"mysteryset202211": "Set dell'Elettromante"
}

View File

@@ -402,5 +402,19 @@
"newGroupsBullet10b": "<strong>タスクを1人のメンバーに割り当て</strong>ると、そのメンバーだけが完了できるようになります",
"newGroupsBullet10c": "メンバー全員がタスクを完了する必要がある場合は、<strong>複数のメンバーにタスクを割り当て</strong>ましょう",
"newGroupsVisitFAQ": "詳細なガイダンスについては、[ヘルプ] ドロップダウンから <a href='/static/faq#group-plans' target='_blank'>FAQ</a> にアクセスしてください。",
"newGroupsEnjoy": "新しくなったグループプランをお楽しみください!"
"newGroupsEnjoy": "新しくなったグループプランをお楽しみください!",
"groupUse": "このグループに最も合う目的はどれですか?*",
"groupUseDefault": "回答を選択",
"groupCouple": "パートナーとタスクを共有する",
"groupFriends": "友達とタスクを共有する",
"groupCoworkers": "仕事仲間とタスクを共有する",
"nameStar": "名前*",
"nameStarText": "タイトルを追加",
"groupManager": "マネージャーとして従業員のタスクを設定する",
"groupTeacher": "教師として生徒のタスクを設定する",
"descriptionOptional": "説明",
"descriptionOptionalText": "説明を追加",
"nextPaymentMethod": "次のステップ:支払方法",
"createGroup": "グループを作る",
"groupParentChildren": "保護者として子どものタスクを設定する"
}

View File

@@ -133,5 +133,6 @@
"amountExp": "<%= amount %>経験値",
"newStuffPostedOn": "<%= publishDate %> <%= publishTime %>に投稿",
"helpSupportHabitica": "Habiticaを支援する",
"groupsPaymentSubBilling": "次回の請求日は <strong><%= renewalDate %></strong> です。"
"groupsPaymentSubBilling": "次回の請求日は <strong><%= renewalDate %></strong> です。",
"groupsPaymentAutoRenew": "この有料プランは解約するまで自動更新されます。解約する必要がある場合は、グループの請求タブから解約できます。"
}

View File

@@ -219,5 +219,6 @@
"passwordSuccess": "パスワードは正常に変更されました",
"giftSubscriptionRateText": "<strong><%= months %> か月</strong>ごとに<strong>$<%= price %> USD米ドル</strong>",
"transaction_create_bank_challenge": "作成された口座チャレンジ",
"transaction_admin_update_balance": "管理者より付与"
"transaction_admin_update_balance": "管理者より付与",
"transaction_admin_update_hourglasses": "管理者の更新"
}

View File

@@ -212,5 +212,5 @@
"wantToSendOwnGems": "持っているジェムを贈りたいですか?",
"mysterySet202208": "はつらつポニーテールセット",
"mysterySet202209": "魔法学者セット",
"mysterySet202210": "不吉な蛇セット"
"mysterySet202210": "くちなわセット"
}

View File

@@ -49,9 +49,10 @@
"balance": "Suma",
"playerTiers": "Rangi graczy",
"tier": "Ranga",
"conRewardsURL": "http://habitica.fandom.com/wiki/Contributor_Rewards",
"conRewardsURL": "https://habitica.fandom.com/wiki/Contributor_Rewards",
"surveysSingle": "Pomógł rozwinąć Habitica poprzez wypełnienie ankiet lub testowanie. Dziękujemy!",
"surveysMultiple": "Pomagał w rozwoju Habitiki przy <%= count %> okazjach, czy to wypełniając ankiety, czy też wkładając dużo wysiłku w testowanie. Dziękujemy!",
"blurbHallPatrons": "To jest Sala patronów, gdzie oddajemy cześć szlachetnym poszukiwaczom przygód, którzy wsparli Habitica w pierwszej zbiórce na Kickstarterze. Dziękujemy im za pomoc w powołaniu Habitiki do życia!",
"blurbHallContributors": "To jest Sala Współtwórców, gdzie uhonorowani zostali open-source'owi współtwórcy Habitiki. Czy to za pomocą kodu, sztuki, muzyki, pisania, czy jedynie uczynności, zdobyli oni <a href='http://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> klejnoty, ekskluzywne wyposażenie</a> oraz <a href='http://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'>prestiżowe tytuły</a>. Ty również możesz współtworzyć Habiti! <a href='http://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Tutaj dowiesz się więcej. </a>"
"blurbHallContributors": "To jest Sala Współtwórców, gdzie uhonorowani zostali open-source'owi współtwórcy Habitica. Czy to za pomocą kodu, sztuki, muzyki, pisania, czy jedynie uczynności, zdobyli oni <a href='https://habitica.fandom.com/wiki/Contributor_Rewards' target='_blank'> klejnoty, ekskluzywne wyposażenie</a> oraz <a href='https://habitica.fandom.com/wiki/Contributor_Titles' target='_blank'>prestiżowe tytuły</a>. Ty również możesz współtworzyć Habitica! <a href='https://habitica.fandom.com/wiki/Contributing_to_Habitica' target='_blank'> Tutaj dowiesz się więcej. </a>",
"noPrivAccess": "Nie masz wymaganych przywilejów."
}

View File

@@ -9,9 +9,9 @@
"androidFaqAnswer1": "Dobre Nawyki (oznaczone +) to zadania, które możesz wykonać kilka razy dziennie, np. jedzenie warzyw. Złe Nawyki (oznaczone -) to czynności, których powinieneś unikać, takie jak obgryzanie paznokci. Nawyki z plusem oraz minusem symbolizują dobry lub zły wybór, np. wyjście do góry po schodach w przeciwieństwie do wyjechania windą. Dobre Nawyki nagrodzą cię Doświadczeniem i Złotem. Złe Nawyki zmniejszą twoje zdrowie.\n\nCodzienne to zadania, które musisz wykonać każdego dnia, takie jak umycie zębów lub sprawdzenie poczty elektronicznej. Możesz zmienić w jakie dni powinieneś ukończyć Codzienny klikając na dane zadanie. Jeśli pominiesz Codziennie zadanie zaplanowane na dzisiaj twoja postać w nocy otrzyma obrażenia. Uważaj by nie dodać zbyt wielu Codziennych naraz!\n\nDo Zrobienia stanowią twoją listę zadań do wykonania. Za ukończenie Do Zrobienia zyskujesz Złoto oraz Doświadczenie. Nigdy nie stracisz punktów zdrowia z powodu zadań Do Zrobienia. Możesz ustalić termin wykonania tego zadania klikając na nie w celu edycji.",
"webFaqAnswer1": "* Dobre Nawyki (oznaczone :heavy_plus_sign:) to zadania, które możesz wykonać kilka razy dziennie, np. jedzenie warzyw. Złe Nawyki (oznaczone :heavy_minus_sign:) to czynności, których powinieneś unikać, takie jak obgryzanie paznokci. Nawyki z :heavy_plus_sign: oraz :heavy_minus_sign: symbolizują dobry lub zły wybór, np. wejście po schodach w przeciwieństwie do wjechania windą. Dobre Nawyki nagrodzą cię Doświadczeniem i Złotem. Złe Nawyki zmniejszą twoje zdrowie.\n* Codzienne to zadania, które musisz wykonać każdego dnia, takie jak umycie zębów lub sprawdzenie poczty elektronicznej. Możesz zmienić w jakie dni powinieneś ukończyć Codzienne klikając na dane zadanie. Jeśli pominiesz Codziennie zadanie zaplanowane na dzisiaj, twój awatar w nocy otrzyma obrażenia. Uważaj by nie dodać zbyt wielu Codziennych naraz!\n* Do Zrobienia stanowią twoją listę zadań do wykonania. Za ukończenie Do Zrobienia zyskujesz Złoto oraz Doświadczenie. Nigdy nie stracisz punktów zdrowia z powodu zadań Do Zrobienia. Możesz ustawić termin wykonania zadania klikając na ikonę ołówka aby wejść w tryb edycji.",
"faqQuestion2": "Jakie są przykładowe zadania?",
"iosFaqAnswer2": "Na wiki są cztery listy przykładowych zadań jako inspiracja:\n\n*[Przykładowe Nawyki](http://habitica.fandom.com/wiki/Sample_Habits)\n*[Przykładowe Codzienne](http://habitica.fandom.com/wiki/Sample_Dailies)\n*[Przykładowe Do Zrobienia](http://habitica.fandom.com/wiki/Sample_To-Dos)\n*[Przykładowe losowe nagrody](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"androidFaqAnswer2": "Na wiki są cztery listy przykładowych zadań jako inspiracja:\n\n*[Przykładowe Nawyki](http://habitica.fandom.com/wiki/Sample_Habits)\n*[Przykładowe Codzienne](http://habitica.fandom.com/wiki/Sample_Dailies)\n*[Przykładowe Do Zrobienia](http://habitica.fandom.com/wiki/Sample_To-Dos)\n*[Przykładowe losowe nagrody](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"webFaqAnswer2": "Wiki ma cztery listy przykładowych zadań, które możesz wykorzystać jako inspirację\n* [Przykładowe Nawyki](http://habitica.fandom.com/wiki/Sample_Habits)\n* [Przykładowe Codzienne](http://habitica.fandom.com/wiki/Sample_Dailies)\n* [Przykładowe Do Zrobienia](http://habitica.fandom.com/wiki/Sample_To-Dos)\n* [Przykładowe Nagrody](http://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"iosFaqAnswer2": "Na wiki są cztery listy przykładowych zadań jako inspiracja:\n\n*[Przykładowe Nawyki](https://habitica.fandom.com/wiki/Sample_Habits)\n*[Przykładowe Codzienne](https://habitica.fandom.com/wiki/Sample_Dailies)\n*[Przykładowe Do Zrobienia](https://habitica.fandom.com/wiki/Sample_To_Do%27s)\n*[Przykładowe losowe nagrody](https://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"androidFaqAnswer2": "Na wiki są cztery listy przykładowych zadań jako inspiracja:\n\n*[Przykładowe Nawyki](https://habitica.fandom.com/wiki/Sample_Habits)\n*[Przykładowe Codzienne](https://habitica.fandom.com/wiki/Sample_Dailies)\n*[Przykładowe Do Zrobienia](https://habitica.fandom.com/wiki/Sample_To_Do%27s)\n*[Przykładowe losowe nagrody](https://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"webFaqAnswer2": "Wiki ma cztery listy przykładowych zadań, które możesz wykorzystać jako inspirację\n* [Przykładowe Nawyki](https://habitica.fandom.com/wiki/Sample_Habits)\n* [Przykładowe Codzienne](https://habitica.fandom.com/wiki/Sample_Dailies)\n* [Przykładowe Do Zrobienia](https://habitica.fandom.com/wiki/Sample_To_Do%27s)\n* [Przykładowe Nagrody](https://habitica.fandom.com/wiki/Sample_Custom_Rewards)",
"faqQuestion3": "Dlaczego moje zadania zmieniają kolory?",
"iosFaqAnswer3": "Twoje zadania zmieniają kolor w zależności od tego, jak dobrze idzie ci ich wypełnianie! Każde nowe zadanie ma na początku kolor żółty. Wypełniaj Codzienne albo dobre Nawyki częściej, a będą coraz bardziej niebieskie. Opuść Codzienne lub poddaj się złemu Nawykowi, a zadanie będzie coraz bardziej czerwone. Im więcej czerwieni, tym większą nagrodę zdobędziesz za to zadanie, ale jeśli to Codzienne albo zły Nawyk, tym bardziej cię zrani! To pomaga motywować cię do wypełniania zadań, które sprawiają ci kłopot.",
"androidFaqAnswer3": "Twoje zadania zmieniają kolor w zależności od tego, jak dobrze idzie ci ich wypełnianie! Każde nowe zadanie ma na początku kolor żółty. Wypełniaj Codzienne albo dobre Nawyki częściej, a będą coraz bardziej niebieskie. Opuść Codzienne lub poddaj się złemu Nawykowi, a zadanie będzie coraz bardziej czerwone. Im więcej czerwieni, tym większą nagrodę zdobędziesz za to zadanie, ale jeśli to Codzienne albo zły Nawyk, tym bardziej cię zrani! To pomaga motywować cię do wypełniania zadań, które sprawiają ci kłopot.",
@@ -22,8 +22,8 @@
"webFaqAnswer4": "Istnieje kilka rzeczy, które mogą powodować obrażenia. Po pierwsze, jeśli zostawisz na noc niewykonane Codzienne i nie zaznaczysz wykonania na okienku, które pojawi się rano, wtedy te niewykonane zadania zadadzą Tobie obrażenia. Po drugie, jeśli klikniesz zły nawyk, to dostaniesz obrażenia. Na koniec, podczas drużynowej bijatyki z Bossem, jeśli Ty lub ktokolwiek z drużyny nie wykonacie Codziennych, Boss zaatakuje was. Głównym sposobem leczenia jest zdobycie kolejnego poziomu, które przywraca całe zdrowie. Można również kupić za złoto Eliksir Zdrowia, z kolumny z Nagrodami. Dodatkowo, od poziomu 10 włącznie możesz wybrać klasę Uzdrowiciela, a wtedy nauczysz się umiejętności leczenia. Inni Uzdrowiciele mogą Cię wyleczyć jeśli znajdujesz się z nimi razem w drużynie. Więcej dowiesz się klikając w pasku nawigacyjnym pozycję \"Drużyna\".",
"faqQuestion5": "Jak grać w Habitica z przyjaciółmi?",
"iosFaqAnswer5": "Najlepszy sposób to zaproszenie ich do twojej drużyny! W drużynie można wypełniać Misje, walczyć z potworami i używać umiejętności, aby wzajemnie się wspierać. \n\nJeśli chcesz założyć swoją własną Drużynę, wejdź w Menu > [Drużyna](https://habitica.com/party) i kliknij \"Załóż Drużynę\". Następnie kliknij \"Zaproś\", aby zaprosić swoich przyjaciół, wpisując ich @nazwę. Jeśli chcesz dołączyć do czyjejś Drużyny , po prostu przekaż mu swoją @nazwę użytkownika a on wyśle Ci zaproszenie!\n\nWraz z przyjaciółmi możesz dołączyć do gildii, które są publicznymi pokojami rozmów skupiających ludzi o podobnych zainteresowaniach! Istnieje wiele społeczności poświęconych wzajemnemu wsparciu i rozrywce, zajrzyj do nich koniecznie.\n\nJeśli lubisz współzawodnictwo, możesz stworzyć Wyzwanie wraz z przyjaciółmi, lub dołączyć do istniejącego, podejmując się realizacji kilku zadań. Znajdziesz tu szeroki wybór Wyzwań ukierunkowanych na rozległy zakres zainteresowań i celów. Niektóre publiczne wyzwania przyznają nawet Klejnoty, jeśli zostaniesz zwycięzcą Wyzwania.",
"androidFaqAnswer5": "Najlepszym sposobem jest zaprosić ich do Drużyny! Drużyny mogą iść razem na misje, walczyć z potworami, rzucać umiejętności by wzajemnie się wspierać. Wejdź na [website](https://habitica.com/) by stworzyć jedną, jeśli nie masz jeszcze Drużyny. Możecie także dołączyć razem do gildii (Społeczność > Gildie). Gildie są czatami, skupionymi na wspólnych zainteresowaniach lub osiągnięciem wspólnego celu, mogą być publiczne bądź prywatne. Możesz dołączyć do tak wielu gildii jak tylko chcesz, lecz tylko do jednej drużyny\n\nPo więcej informacji, sprawdź strony wiki o [Drużynach](http://habitica.fandom.com/wiki/Party) i [Gildiach](http://habitica.fandom.com/wiki/Guilds).",
"webFaqAnswer5": "Najlepszym sposobem jest zaprosić ich do Drużyny klikając na \"Drużyna\" na pasku nawigacyjnym! Drużyny mogą iść razem na misje, walczyć z potworami, rzucać umiejętności by wzajemnie się wspierać. Możecie także dołączyć razem do gildii (wybierając z menu \"Gildie\"). Gildie są czatami, skupionymi na wspólnych zainteresowaniach lub osiągnięciem wspólnego celu, mogą być publiczne bądź prywatne. Możesz dołączyć do tak wielu gildii jak tylko chcesz, lecz tylko do jednej drużyny. Więcej szczegółów uzyskasz na stronach wiki [Drużyna](http://habitica.fandom.com/pl/wiki/Drużyna) oraz [Gildie](http://habitica.fandom.com/pl/wiki/Gildie).",
"androidFaqAnswer5": "Najlepszym sposobem jest zaprosić ich do Drużyny! Drużyny mogą iść razem na misje, walczyć z potworami, rzucać umiejętności by wzajemnie się wspierać. Wejdź na [website](https://habitica.com/) by stworzyć jedną, jeśli nie masz jeszcze Drużyny. Możecie także dołączyć razem do gildii (Społeczność > Gildie). Gildie są czatami, skupionymi na wspólnych zainteresowaniach lub osiągnięciem wspólnego celu, mogą być publiczne bądź prywatne. Możesz dołączyć do tak wielu gildii jak tylko chcesz, lecz tylko do jednej drużyny\n\nPo więcej informacji, sprawdź strony wiki o [Drużynach](https://habitica.fandom.com/wiki/Party) i [Gildiach](https://habitica.fandom.com/wiki/Guilds).",
"webFaqAnswer5": "Najlepszym sposobem jest zaprosić ich do Drużyny klikając na \"Drużyna\" na pasku nawigacyjnym! Drużyny mogą iść razem na misje, walczyć z potworami, rzucać umiejętności by wzajemnie się wspierać. Możecie także dołączyć razem do gildii (wybierając z menu \"Gildie\"). Gildie są czatami, skupionymi na wspólnych zainteresowaniach lub osiągnięciem wspólnego celu, mogą być publiczne bądź prywatne. Możesz dołączyć do tak wielu gildii jak tylko chcesz, lecz tylko do jednej drużyny. Więcej szczegółów uzyskasz na stronach wiki [Drużyna](https://habitica.fandom.com/pl/wiki/Drużyna) oraz [Gildie](https://habitica.fandom.com/pl/wiki/Gildie).",
"faqQuestion6": "Jak zdobyć chowańca albo wierzchowca?",
"iosFaqAnswer6": "Za każdym razem, gdy ukończysz zadanie, dostaniesz szansę na zdobycie Jaja, Eliksiru Wyklucia lub Jedzenia. Znajdziesz je w Menu > Przedmioty.\n\nAby wykluć Zwierzaka, potrzebujesz jaja oraz eliksiru wyklucia. Kliknij na jajo aby wybrać gatunek, jaki chcesz wykluć, a potem na \"Wykluj Jajo\". Następnie wybierz Eliksir Wyklucia, aby wybrać jego kolor! Idź do Menu > aby dodać swojego nowego Zwierzaka do swojej postaci, klikając na niego.\n\nMożesz też sprawić, że twój Zwierzak wyrośnie na Wierzchowca, karmiąc go w Menu > Zwierzaki. Kliknij na Chowańca, a potem na \"Nakarm Zwierzaka\"! Musisz nakarmić Zwierzaka dużo razy, zanim stanie się Wierzchowcem, ale jeśli odnajdziesz jego ulubione jedzenie, będzie rósł szybciej. Możesz to zrobić metodą prób i błędów albo [skorzystać z podpowiedzi](https://habitica.fandom.com/wiki/Food#Food_Preferences). Gdy już masz Wierzchowca, idź do Menu > Wierzchowce i kliknij na niego, aby twoja postać go dosiadła.\n\nMożesz też otrzymać jaja Zwierzaków z Misji, kończąc niektóre Misje. (aby dowiedzieć się więcej o Misjach zobacz: [Jak walczyć z potworami i wykonywać Misje?](https://habitica.com/static/faq/#monsters-quests)).",
"androidFaqAnswer6": "Za każdym razem, gdy ukończysz zadanie, dostaniesz szansę na zdobycie Jaja, Eliksiru Wyklucia lub Jedzenia. Znajdziesz je w Menu > Przedmioty.\n\nAby wykluć Zwierzaka, potrzebujesz Jaja oraz Eliksiru Wyklucia. Kliknij na jajo aby wybrać gatunek, jaki chcesz wykluć, a potem na \"Wykluj Jajo\". Następnie wybierz eliksir wyklucia, aby wybrać jego kolor! Idź do Menu > Zwierzaki, aby dodać swojego nowego Zwierzaka do swojej postaci, klikając na niego.\n\nMożesz też sprawić, że twój Zwierzak wyrośnie na Wierzchowca, karmiąc go w Menu > Zwierzaki. Kliknij na Zwierzaka, a potem na \"Nakarm Chowańca\"! Musisz nakarmić Zwierzaka dużo razy, zanim stanie się Wierzchowcem, ale jeśli odnajdziesz jego ulubione jedzenie, będzie szybciej rósł. Możesz to zrobić metodą prób i błędów albo [skorzystać z podpowiedzi](https://habitica.fandom.com/wiki/Food#Food_Preferences). Gdy już masz Wierzchowca, idź do Menu > Wierzchowce i kliknij na niego, aby twój awatar go dosiadł.\n\nMożesz też otrzymać jaja Chowańców z Misji, kończąc niektóre Misje. (Patrz niżej, aby dowiedzieć się więcej o Misjach.)",

View File

@@ -724,5 +724,12 @@
"backgroundAutumnPicnicNotes": "Aproveite um Piquenique de Outono.",
"backgroundAutumnPicnicText": "Piquenique de Outono",
"backgroundTheatreStageText": "Palco de Teatro",
"backgroundTheatreStageNotes": "Performe em um Palco de Teatro."
"backgroundTheatreStageNotes": "Performe em um Palco de Teatro.",
"backgroundSpookyRuinsText": "Ruínas Assustadoras",
"backgroundSpookyRuinsNotes": "Explore algumas Ruínas Assustadoras.",
"backgroundMaskMakersWorkshopText": "Seminário de Criação de Máscaras",
"backgroundMaskMakersWorkshopNotes": "Prove um novo rosto no Seminário de Criação de Máscaras.",
"backgroundCemeteryGateText": "Portão de Cemitério",
"backgroundCemeteryGateNotes": "Assombre um Portão de Cemitério.",
"backgrounds102022": "Conjunto 101: Lançado em outubro de 2022"
}

View File

@@ -2730,5 +2730,11 @@
"armorMystery202210Text": "Armadura Serpente Sinistra",
"armorMystery202210Notes": "Tente deslizar pra variar, talvez você encontre um novo modo de transporte! Não confere benefícios. Item de Assinante de Outubro de 2022.",
"headMystery202210Text": "Capacete Serpente Sinistra",
"headMystery202210Notes": "Esse capuz escamoso certamente irá aterrorizar sua lista de afazeres! Não confere benefícios. Item de Assinante de Outubro de 2022."
"headMystery202210Notes": "Esse capuz escamoso certamente irá aterrorizar sua lista de afazeres! Não confere benefícios. Item de Assinante de Outubro de 2022.",
"weaponMystery202211Text": "Cajado Eletromante",
"weaponMystery202211Notes": "Aproveite o incrível poder de uma tempestade de raios com este cajado. Não confere benefícios. Item de Assinante de novembro de 2022.",
"armorArmoireSheetGhostCostumeText": "Fantasia Fantasma do Lençol",
"armorArmoireSheetGhostCostumeNotes": "Buu! Esta é a fantasia mais assustadora de todo o Habitica, então use-a com sabedoria... e tome cuidado para não tropeçar. Aumenta Constituição em <%= con %>. Armário Encantado: Item Independente.",
"headMystery202211Text": "Chapéu Eletromante",
"headMystery202211Notes": "Tome cuidado com este chapéu poderoso, seu efeito em quem o encara pode ser chocante! Não confere benefícios. Item de Assinante de novembro de 2022."
}

View File

@@ -143,7 +143,7 @@
"getwell1": "Se cuida! <3",
"getwell2": "Estou pensando em você!",
"getwell3": "Sinto muito você não estar se sentindo bem!",
"getwellCardAchievementTitle": "Cuidador da Confiança",
"getwellCardAchievementTitle": "Cuidador de Confiança",
"getwellCardAchievementText": "Desejos de melhoras são sempre bem-vindos. Enviou ou recebeu <%= count %> cartões de melhoras.",
"goodluckCard": "Cartão de Boa Sorte",
"goodluckCardExplanation": "Vocês dois recebem a conquista da Carta Sortuda!",

View File

@@ -86,7 +86,7 @@
"displayNameSuccess": "Nome de exibição alterado com sucesso",
"emailSuccess": "Email alterado com sucesso",
"detachSocial": "Desconectar <%= network %>",
"detachedSocial": "Removido <%= network %> com sucesso como modo de autenticação.",
"detachedSocial": "Removido <%= network %> com sucesso como modo de autenticação",
"addedLocalAuth": "Autenticação local adicionada com sucesso",
"data": "Dados",
"email": "E-mail",
@@ -144,7 +144,7 @@
"webhookIdAlreadyTaken": "Um webhook com o id <%= id %> já existe.",
"noWebhookWithId": "Não existe webhook com o id <%= id %>.",
"regIdRequired": "RegId é necessário",
"pushDeviceAdded": "Dispositivo Push adicionado com sucesso.",
"pushDeviceAdded": "Dispositivo Push adicionado com sucesso",
"pushDeviceNotFound": "O usuário não tem dispositivo push nesse id.",
"pushDeviceRemoved": "Dispositivo push removido com sucesso.",
"buyGemsGoldCap": "Capacidade máxima de Gemas aumentada para <%= amount %>",

View File

@@ -214,5 +214,6 @@
"sendAGift": "Enviar presente",
"mysterySet202208": "Conjunto Rabo de Cavalo Radiante",
"mysterySet202209": "Conjunto Mágico Escolar",
"mysterySet202210": "Conjunto Serpente Sinistra"
"mysterySet202210": "Conjunto Serpente Sinistra",
"mysteryset202211": "Conjunto Eletromante"
}

View File

@@ -728,5 +728,12 @@
"backgroundAutumnPicnicText": "Осенний пикник",
"backgroundAutumnPicnicNotes": "Насладитесь осенним пикником.",
"backgroundOldPhotoText": "Старая фотография",
"backgroundOldPhotoNotes": "Примите таинственную позу на старом фото."
"backgroundOldPhotoNotes": "Примите таинственную позу на старом фото.",
"backgroundSpookyRuinsText": "Зловещие руины",
"backgroundSpookyRuinsNotes": "Исследуйте зловещие руины.",
"backgroundMaskMakersWorkshopNotes": "Примерьте новое лицо в мастерской по изготовлению масок.",
"backgroundCemeteryGateText": "Кладбищенские врата",
"backgroundCemeteryGateNotes": "Привидения обитают у этих зловещих кладбищенских врат.",
"backgrounds102022": "Набор 101: Выпущен в октябре 2022",
"backgroundMaskMakersWorkshopText": "Мастерская по изготовлению масок"
}

View File

@@ -2702,7 +2702,7 @@
"weaponSpecialFall2022MageText": "Порыв ветра",
"weaponSpecialFall2022RogueText": "Огуречный клинок",
"weaponSpecialFall2022RogueNotes": "Этим огуречным клинком можно не только защититься, но и вкусно подкрепиться. Увеличивает силу на <%= str %>. Ограниченный выпуск осени 2022.",
"weaponSpecialFall2022WarriorNotes": "Возможно, он больше подходит для рубки бревен или для разрезания хрустящей буханочки хлеба нежели для вражеской брони, но ГРРА! Он выглядит устрашающе! Увеличивает силу на <%= str %>. Ограниченный выпуск осени 2022",
"weaponSpecialFall2022WarriorNotes": "Возможно, он больше подходит для рубки бревен или для разрезания хрустящей буханочки хлеба нежели для вражеской брони, но ГРРА! Он выглядит устрашающе! Увеличивает силу на <%= str %>. Ограниченный выпуск осени 2022.",
"weaponSpecialFall2022MageNotes": "Эти могучие порывы будут сопровождать вас, когда вы устремитесь в небо. Увеличивает интеллект на <%= int %> и восприятие на <%= per %>. Ограниченный выпуск осени 2022.",
"weaponSpecialFall2022HealerText": "Правый подглядывающий глаз",
"armorSpecialFall2022RogueText": "Броня Каппы",
@@ -2727,5 +2727,11 @@
"armorSpecialFall2022HealerText": "Множество наблюдающих щупалец",
"shieldSpecialFall2022HealerNotes": "Взгляните на этот костюм и трепещите. Увеличивает телосложение на <%= con %>. Ограниченный выпуск осени 2022.",
"armorMystery202210Text": "Доспех Зловещей змеи",
"headMystery202210Text": "Шлем Зловещей змеи"
"headMystery202210Text": "Шлем Зловещей змеи",
"weaponMystery202211Text": "Посох электроманта",
"headMystery202211Text": "Шляпа электроманта",
"headMystery202211Notes": "Будьте осторожны с этим могущественным головным убором, его эффект на поклонников может быть весьма шокирующим! Бонусов не дает. Подарок подписчикам ноября 2022.",
"armorArmoireSheetGhostCostumeText": "Костюм привидения",
"armorArmoireSheetGhostCostumeNotes": "Буу! Это самый страшный костюм во всей Habitica, поэтому надевайте его с умом... и смотрите под ноги, чтобы не споткнуться. Увеличивает телосложение на <%= con %>. Зачарованный сундук: Независимый предмет.",
"weaponMystery202211Notes": "С помощью этого посоха вы сможете использовать чудовищную силу грозы. Бонусов не дает. Подарок подписчикам ноября 2022."
}

View File

@@ -81,7 +81,7 @@
"newBaileyUpdate": "Обновление от Бэйли!",
"tellMeLater": "Напомнить позже",
"dismissAlert": "Скрыть эти вести",
"donateText3": "Habitica это проект с открытым исходным кодом, зависящий от поддержки своих пользователей. Деньги, которые вы тратите на покупку самоцветов, помогают нам поддерживать сервера в рабочем состоянии, сохранять небольшой штат сотрудников, разрабатывать новые функции и давать стимул нашим волонтерам.",
"donateText3": "Habitica это проект с открытым исходным кодом, зависящий от поддержки своих пользователей. Деньги, которые вы тратите на покупку самоцветов, помогают нам поддерживать сервера в рабочем состоянии, сохранять небольшой штат сотрудников, разрабатывать новые функции и давать стимул нашим волонтерам",
"card": "Пластиковой карточкой",
"paymentMethods": "Приобрести с использованием",
"paymentSuccessful": "Платеж прошел успешно!",

View File

@@ -219,5 +219,6 @@
"passwordSuccess": "Пароль успешно изменен",
"giftSubscriptionRateText": "<strong>$<%= price %> долларов США</strong> за <strong><%= months %> месяц(-а/-ев)</strong>",
"transaction_admin_update_hourglasses": "Права администратора обновлены",
"transaction_admin_update_balance": "Предоставлены права администратора"
"transaction_admin_update_balance": "Предоставлены права администратора",
"transaction_create_bank_challenge": "Создан банк испытания"
}

View File

@@ -214,5 +214,6 @@
"mysterySet202208": "Набор Задорный хвостик",
"mysterySet202209": "Набор магического учёного",
"mysterySet202207": "Набор желейной медузы",
"mysterySet202210": "Набор Зловещей змеи"
"mysterySet202210": "Набор Зловещей змеи",
"mysteryset202211": "Набор электроманта"
}

View File

@@ -92,61 +92,61 @@
"weaponSpecialTakeThisNotes": "Цей меч було отримано за участь у випробуванні, спонсорованому кампанією Take This. Щиро вітаємо! Збільшує всі характеристики на <%= attrs %>.",
"weaponSpecialTridentOfCrashingTidesText": "Тризуб руйнівних приливів",
"weaponSpecialTridentOfCrashingTidesNotes": "Дає вам можливість керувати рибами, а також наносити кілька могутніх ударів під час ваших завдань. Збільшує інтелект на <%= int %>.",
"weaponSpecialTaskwoodsLanternText": "",
"weaponSpecialTaskwoodsLanternNotes": "",
"weaponSpecialTaskwoodsLanternText": "Ліхтар Трудобора",
"weaponSpecialTaskwoodsLanternNotes": "З давніх часів цей ліхтар оберігає Сади Трудобора, його світло може осяяти найтемнішу пітьму і розвіяти могутні заклинання. Збільшує сприйняття і інтелект на <%= attrs %>.",
"weaponSpecialBardInstrumentText": "Лютня Барда",
"weaponSpecialBardInstrumentNotes": "",
"weaponSpecialBardInstrumentNotes": "Зіграй веселу мелодію на цій магічній лютні! Збільшує інтелект і сприйняття на <%= attrs %>.",
"weaponSpecialLunarScytheText": "Місячна коса",
"weaponSpecialLunarScytheNotes": "Регулярно заточуйте цю косу, інакше її сила зменшиться. Збільшує силу та спритність на <%= attrs %>.",
"weaponSpecialMammothRiderSpearText": "Спис Наїздника Мамонта",
"weaponSpecialMammothRiderSpearNotes": "",
"weaponSpecialMammothRiderSpearNotes": "Цей спис із наконечником з рожевого кварцу придасть вам стародавню силу заклинань. Збільшує інтелект на <%= int %>.",
"weaponSpecialPageBannerText": "Стяг пажа",
"weaponSpecialPageBannerNotes": "Високо розмахуйте своїм стягом, щоб вселяти впевненість! Збільшує силу на <%= str %>.",
"weaponSpecialRoguishRainbowMessageText": "",
"weaponSpecialRoguishRainbowMessageNotes": "",
"weaponSpecialRoguishRainbowMessageText": "Жартівливе веселкове повідомлення",
"weaponSpecialRoguishRainbowMessageNotes": "Цей сяючий конверт містить у собі заохочення від жителів Habitica та трохи чарів, щоб пришвидшити доставку! Збільшує сприйняття на <%= per %>.",
"weaponSpecialSkeletonKeyText": "Ключ скелета",
"weaponSpecialSkeletonKeyNotes": "",
"weaponSpecialNomadsScimitarText": "",
"weaponSpecialNomadsScimitarNotes": "",
"weaponSpecialFencingFoilText": "",
"weaponSpecialFencingFoilNotes": "",
"weaponSpecialSkeletonKeyNotes": "Усі найкращі крадії мають при собі ключ, що відчиняє будь-які двері! Збільшує комплекцію на <%= con %>.",
"weaponSpecialNomadsScimitarText": "Ятаган Номада",
"weaponSpecialNomadsScimitarNotes": "Вигнуте лезо цього ятагана прекрасно підходить для атаки задач, сидячи на скакуні! Збільшує інтелект на <%= int %>.",
"weaponSpecialFencingFoilText": "Рапіра",
"weaponSpecialFencingFoilNotes": "Якщо хтось посміє оспорити вашу честь, ви будете готові з цією чудовою рапірою! Збільшує силу на <%= str %>.",
"weaponSpecialTachiText": "Тачі (японський меч)",
"weaponSpecialTachiNotes": "Цей легкий і вигнутий меч поріже Ваші завдання на шматочки! Збільшує силу на <%= str %>.",
"weaponSpecialAetherCrystalsText": "Кристали ефіру",
"weaponSpecialAetherCrystalsNotes": "",
"weaponSpecialAetherCrystalsNotes": "Ці браслети та кристали колись належали останній з ордену Майстрів. Збільшує всі характеристики на <%= attrs %>.",
"weaponSpecialYetiText": "Спис приборкувача Єті",
"weaponSpecialYetiNotes": "",
"weaponSpecialYetiNotes": "Цей спис дозволяє власнику керувати будь-яким єті. Збільшує силу на <%= str %>. Лімітований випуск зими 2013-2014.",
"weaponSpecialSkiText": "Палка лижника-вбивці",
"weaponSpecialSkiNotes": "",
"weaponSpecialSkiNotes": "Зброя, що здатна знищувати орди ворогів! Воно також допомагає власнику робити гарні паралельні повороти. Збільшує силу на <%= str %>. Лімітований випуск зими 2013-2014.",
"weaponSpecialCandycaneText": "Карамельна патериця",
"weaponSpecialCandycaneNotes": "",
"weaponSpecialCandycaneNotes": "Неймовірний магічний посох. Тобто, неймовірно СМАЧНИЙ, звичайно! Збільшує інтелект на <%= int %> і сприйняття на <%= per %>. Лімітований випуск зими 2013-2014.",
"weaponSpecialSnowflakeText": "Паличка \"Сніжинка\"",
"weaponSpecialSnowflakeNotes": "",
"weaponSpecialSnowflakeNotes": "Ця палиця сяє від безмежної цілющої сили. Збільшує інтелект на <%= int %>. Лімітований випуск зими 2013-2014.",
"weaponSpecialSpringRogueText": "Бойові кігті",
"weaponSpecialSpringRogueNotes": "",
"weaponSpecialSpringRogueNotes": "Чудово підходить, щоб збиратися на високі будівлі та шматувати килими. Збільшує силу на <%= str %>. Лімітований випуск весни 2014.",
"weaponSpecialSpringWarriorText": "Морквяний меч",
"weaponSpecialSpringWarriorNotes": "",
"weaponSpecialSpringWarriorNotes": "Цей могутній меч може з легкістю шматувати ворогів! Він також може стати смачним перекусом в пилу битви. Збільшує силу на <%= str %>. Лімітований випуск весни 2014.",
"weaponSpecialSpringMageText": "Сирна патериця",
"weaponSpecialSpringMageNotes": "",
"weaponSpecialSpringMageNotes": "Тільки найсильніші гризуни можуть кинути виклик своєму голоду, щоб заволодіти цим могутнім посохом. Збільшує інтелект на <%= int %> і сприйняття на <%= per %>. Лімітований випуск весни 2014.",
"weaponSpecialSpringHealerText": "Улюблена кісточка",
"weaponSpecialSpringHealerNotes": "",
"weaponSpecialSpringHealerNotes": "ПРИНЕСТИ! Збільшує інтелект на <%= int %>. Лімітований випуск весни 2014.",
"weaponSpecialSummerRogueText": "Піратське Мачете",
"weaponSpecialSummerRogueNotes": "",
"weaponSpecialSummerRogueNotes": "Тисяча чортів! Принудьте свої завдання прогулятися по дошці! Збільшує силу на <%= str %>. Лімітований випуск літа 2014.",
"weaponSpecialSummerWarriorText": "Ніж Мореплавця",
"weaponSpecialSummerWarriorNotes": "Жодне завдання не посміє тягатися з цим зазубреним ножем! Збільшує силу на <%= str %>. Лімітований випуск літа 2014.",
"weaponSpecialSummerMageText": "Ловець Водоростей",
"weaponSpecialSummerMageNotes": "",
"weaponSpecialSummerMageNotes": "Цей тризуб чудово пронизує водорості та дозволяє збирати врожай із подвійною ефективністю! Збільшує інтелект на <%= int %> і сприйняття на <%= per %>. Лімітований випуск літа 2014.",
"weaponSpecialSummerHealerText": "Жезл Мілководдя",
"weaponSpecialSummerHealerNotes": "",
"weaponSpecialFallRogueText": "",
"weaponSpecialFallRogueNotes": "",
"weaponSpecialFallWarriorText": "",
"weaponSpecialFallWarriorNotes": "",
"weaponSpecialFallMageText": "Магічний віник",
"weaponSpecialFallMageNotes": "",
"weaponSpecialFallHealerText": "",
"weaponSpecialFallHealerNotes": "",
"weaponSpecialWinter2015RogueText": "",
"weaponSpecialSummerHealerNotes": "Ця палиця із аквамарину та живих коралів чудово приваблює косяки риб. Збільшує інтелект на <%= int %>. Лімітований випуск літа 2014.",
"weaponSpecialFallRogueText": "Срібний кілок",
"weaponSpecialFallRogueNotes": "Заспокоює нежить. Також дає перевагу над перевертнями, тому що обережність ніколи не завадить. Збільшує силу на <%= str %>. Лімітований випуск осені 2014.",
"weaponSpecialFallWarriorText": "Чіпкий кіготь науки",
"weaponSpecialFallWarriorNotes": "Цей чіпкий кіготь є передовою технологією. Збільшує силу на <%= str %>. Лімітований випуск осені 2014.",
"weaponSpecialFallMageText": "Магічна мітла",
"weaponSpecialFallMageNotes": "Ця зачарована мітла літає швидше за дракона! Збільшує інтелект на <%= int %> та сприйняття на <%= per %>. Лімітований випуск осені 2014.",
"weaponSpecialFallHealerText": "Палиця із скарабеєм",
"weaponSpecialFallHealerNotes": "Скарабей на цій палиці захищає та зцілює свого власника. Збільшує інтелект на <%= int %>. Лімітований випуск осені 2014.",
"weaponSpecialWinter2015RogueText": "Крижаний шип",
"weaponSpecialWinter2015RogueNotes": "",
"weaponSpecialWinter2015WarriorText": "Гумко-Меч",
"weaponSpecialWinter2015WarriorNotes": "",
@@ -1335,7 +1335,7 @@
"shieldSpecialFallWarriorText": "",
"shieldSpecialFallWarriorNotes": "",
"shieldSpecialFallHealerText": "Інкрустований щит",
"shieldSpecialFallHealerNotes": "",
"shieldSpecialFallHealerNotes": "Цей блискучий щит був знайдений у стародавній гробниці. Збільшує комплекцію на <%= con %>. Лімітований випуск осені 2014.",
"shieldSpecialWinter2015RogueText": "Ice Spike",
"shieldSpecialWinter2015RogueNotes": "You truly, definitely, absolutely just picked these up off of the ground. Increases Strength by <%= str %>. Limited Edition 2014-2015 Winter Gear.",
"shieldSpecialWinter2015WarriorText": "",
@@ -1399,7 +1399,7 @@
"shieldSpecialSummer2017RogueText": "Sea Dragon Fins",
"shieldSpecialSummer2017RogueNotes": "The edges of these fins are razor-sharp. Increases Strength by <%= str %>. Limited Edition 2017 Summer Gear.",
"shieldSpecialSummer2017WarriorText": "",
"shieldSpecialSummer2017WarriorNotes": "",
"shieldSpecialSummer2017WarriorNotes": "Ця мушля, яку ви знайшли, може бути як і прикрасою, так і захистом! Збільшує комплекцію на <%= con %>. Лімітований випуск літа 2016.",
"shieldSpecialSummer2017HealerText": "",
"shieldSpecialSummer2017HealerNotes": "",
"shieldSpecialFall2017RogueText": "Candied Apple Mace",
@@ -1411,7 +1411,7 @@
"shieldSpecialWinter2018RogueText": "Peppermint Hook",
"shieldSpecialWinter2018RogueNotes": "Perfect for climbing walls or distracting your foes with sweet, sweet candy. Increases Strength by <%= str %>. Limited Edition 2017-2018 Winter Gear.",
"shieldSpecialWinter2018WarriorText": "",
"shieldSpecialWinter2018WarriorNotes": "",
"shieldSpecialWinter2018WarriorNotes": "Майже будь-яка корисна річ, яка вам потрібна може бути знайдена у цій сумці, якщо ви прошепочете потрібні магічні слова. Збільшує комплекцію на <%= con %>. Лімітований випуск зими 2017-2018.",
"shieldSpecialWinter2018HealerText": "",
"shieldSpecialWinter2018HealerNotes": "",
"shieldSpecialSpring2018WarriorText": "",

View File

@@ -197,7 +197,7 @@
"userIsClamingTask": "<%= username %> привласнив: <%= task %>",
"approvalRequested": "Запит на схвалення надіслано",
"cantDeleteAssignedGroupTasks": "Не можна видалити групові завдання, які призначені Вам.",
"groupPlanUpgraded": "<strong><%- groupName %></strong> оновлено до групового плану!",
"groupPlanUpgraded": "<strong><%- groupName %></strong> успішно оновлено до групового плану!",
"groupPlanCreated": "<strong><%- groupName %></strong> створено!",
"onlyGroupLeaderCanInviteToGroupPlan": "Тільки лідер групи може запрошувати користувачів до групи з підпискою.",
"paymentDetails": "Деталі оплати",
@@ -402,5 +402,19 @@
"newGroupsBullet10b": "<strong>Призначте завдання одному учаснику</strong>, щоб лише він міг його виконати",
"newGroupsBullet10c": "<strong>Призначте завдання кільком учасникам</strong>, якщо їм усім потрібно його виконати",
"newGroupsVisitFAQ": "Відвідайте <a href='/static/faq#group-plans' target='_blank'>ЧаПи</a> зі спадного меню «Допомога», щоб отримати додаткові вказівки.",
"newGroupsEnjoy": "Сподіваємося, вам сподобаються нові групові плани!"
"newGroupsEnjoy": "Сподіваємося, вам сподобаються нові групові плани!",
"createGroup": "Створити групу",
"groupUseDefault": "Оберіть відповідь",
"groupUse": "Що краще описує те, як ви використовуєте вашу групу?*",
"nameStar": "Ім'я*",
"nameStarText": "Додати назву",
"descriptionOptional": "Опис",
"descriptionOptionalText": "Додати опис",
"groupFriends": "Друзі спільно виконують завдання",
"groupCoworkers": "Колеги спільно виконують завдання",
"nextPaymentMethod": "Наступний крок: Спосіб оплати",
"groupTeacher": "Вчитель організує заняття для учнів",
"groupCouple": "Спільне виконання завдань",
"groupManager": "Менеджер назначає завдання працівникам",
"groupParentChildren": "Батьки або один з батьків розподіляють задачі між дітьми"
}

View File

@@ -81,7 +81,7 @@
"newBaileyUpdate": "Оновлення від Бейлі!",
"tellMeLater": "Нагадати мені пізніше",
"dismissAlert": "Заховати Бейлі",
"donateText3": "Habitica — це проєкт з відкритим кодом, який залежить від підтримки наших користувачів. Гроші, які ви витрачаєте на самоцвіти, допомагають нам оплачувати роботу серверів, утримувати невеликий штат, розробляти нові функції та стимулювати наших добровольців.",
"donateText3": "Habitica — це проєкт з відкритим кодом, який залежить від підтримки наших користувачів. Гроші, які ви витрачаєте на самоцвіти, допомагають нам оплачувати роботу серверів, утримувати невеликий штат, розробляти нові функції та стимулювати наших добровольців",
"card": "Платіжна карта",
"paymentMethods": "Придбати за допомогою",
"paymentSuccessful": "Ваш платіж пройшов успішно!",
@@ -105,7 +105,7 @@
"tourHallPage": "Ласкаво просимо до Залу Героїв, де прославляються контриб'ютори до відкритого проєкту Habitica. Чи то за допомогою коду, мистецтва, музики, письма чи навіть просто корисністю, вони здобули дорогоцінні камені, ексклюзивне обладнання та престижні звання. Ви також можете зробити свій внесок у Habitica!",
"tourPetsPage": "Ласкаво просимо до хліва! Кожного разу, коли Ви виконуєте завдання, Ви матимете шанс отримати яйце або інкубаційне зілля, щоб вилупити тваринку. Коли Ви вилупите вихованця, він з’явиться тут! Натисніть зображення домашнього улюбленця, щоб додати його до свого аватара. Годуйте їх знайденим кормом, і вони виростуть у верхових тварин.",
"tourMountsPage": "Після того, як Ви нагодуєте вихованця достатньою кількістю їжі, щоб перетворити його на скакуна, він з’явиться тут. Натисніть на сідло, щоб осідлати його!",
"tourEquipmentPage": "Тут зберігається ваше обладнання! Ваше бойове спорядження впливає на Вашу статистику. Якщо Ви хочете показати відмінне спорядження на своєму аватарі, не змінюючи статистику, натисніть «Одягти костюм».",
"tourEquipmentPage": "Тут зберігається ваше спорядження! Ваше бойове спорядження впливає на Вашу статистику. Якщо Ви хочете показати відмінне спорядження на своєму аватарі, не змінюючи статистику, натисніть «Одягти костюм».",
"equipmentAlreadyOwned": "Ви вже володієте цим спорядженням",
"tourOkay": "Гаразд!",
"tourAwesome": "Круто!",
@@ -132,5 +132,6 @@
"paymentAutoRenew": "Ця підписка буде автоматично поновлюватися, доки її не буде скасовано. Якщо вам потрібно скасувати цю підписку, Ви можете зробити це у своїх налаштуваннях.",
"paymentCanceledDisputes": "Ми надіслали підтвердження скасування на Вашу електронну пошту. Якщо Ви не бачите електронного листа, зв’яжіться з нами, щоб запобігти майбутнім суперечкам щодо розрахунків.",
"helpSupportHabitica": "Підтримайте Habitica",
"groupsPaymentSubBilling": "Дата вашого наступного платежу <strong><%= renewalDate %></strong>."
"groupsPaymentSubBilling": "Дата вашого наступного платежу <strong><%= renewalDate %></strong>.",
"groupsPaymentAutoRenew": "Ця підписка буде продовжуватись автоматично до тих пір, поки не буде відмінена. Якщо вам потрібно відмінити підписку, ви можете зробити це у вкладці \"груповий рахунок\"."
}

View File

@@ -724,5 +724,12 @@
"backgroundAutumnPicnicText": "秋日野炊",
"backgroundAutumnPicnicNotes": "享受秋日野炊。",
"backgroundOldPhotoText": "老照片",
"backgroundOldPhotoNotes": "在老照片里抢占C位。"
"backgroundOldPhotoNotes": "在老照片里抢占C位。",
"backgrounds102022": "第101组2022年10月推出",
"backgroundSpookyRuinsText": "幽灵废墟",
"backgroundSpookyRuinsNotes": "探索某些幽灵废墟。",
"backgroundMaskMakersWorkshopNotes": "尝试在面具工坊换一张新面孔。",
"backgroundMaskMakersWorkshopText": "面具工坊",
"backgroundCemeteryGateText": "墓地大门",
"backgroundCemeteryGateNotes": "厉鬼出没的墓地大门。"
}

View File

@@ -306,9 +306,9 @@
"weaponArmoireMythmakerSwordNotes": "重剑无锋大巧不工,这把宝剑成就了许多神话中的英雄人物。增加感知、力量各<%= attrs %>点。魔法衣橱黄金战袍套装3/3。",
"weaponArmoireIronCrookText": "钢铁手杖",
"weaponArmoireIronCrookNotes": "纯钢打造,力透杖柄。这柄曲柄杖用来放牧效果极好。增加感知、力量各<%= attrs %>点。魔法衣橱铁角套装3/3。",
"weaponArmoireGoldWingStaffText": "金翅法",
"weaponArmoireGoldWingStaffText": "金翅法",
"weaponArmoireGoldWingStaffNotes": "法杖上的翅膀持续颤动旋转。增加全属性<%= attrs %>点。魔法衣橱:独立装备。",
"weaponArmoireBatWandText": "蝙蝠法",
"weaponArmoireBatWandText": "蝙蝠法",
"weaponArmoireBatWandNotes": "这根法杖可以把任何任务都变成一只蝙蝠!挥一挥,让它们飞的远远的。增加<%= int %>点智力和<%= per %>点感知。魔法衣橱:独立装备。",
"weaponArmoireShepherdsCrookText": "牧羊人之杖",
"weaponArmoireShepherdsCrookNotes": "对放牧狮鹫很有用。增加<%= con %>点体质。魔法衣橱牧羊人套装1/3。",
@@ -2587,7 +2587,7 @@
"weaponSpecialSummer2022RogueNotes": "如果你在处境窘迫,不要犹豫显示这些强悍的爪!增加<%= str %>点力量。2022年夏季限定版装备。",
"weaponSpecialSummer2022WarriorNotes": "它旋转!它重定向!它带来风暴!增加<%= str %>点力量。2022年夏季限定版装备。",
"weaponSpecialSummer2022MageText": "蝠鲼法杖",
"weaponSpecialSummer2022HealerText": "有益的泡",
"weaponSpecialSummer2022HealerText": "增益泡泡",
"weaponSpecialSummer2022MageNotes": "用这个法杖旋一下就会神奇的清前面的水。增加<%= int %>点智力和<%= per %>点感知。2022年夏季限定版装备。",
"weaponSpecialSummer2022HealerNotes": "这些泡以满意的啪释放/治愈术!增加<%= int %>点智力。2022年夏季限定版装备。",
"weaponSpecialSpring2022WarriorText": "反转的伞",
@@ -2730,5 +2730,11 @@
"shieldSpecialFall2022WarriorText": "兽人之盾",
"shieldSpecialFall2022WarriorNotes": "要么招待要么RAWR增加<%= con %>点体质。2022年秋季限定版装备。",
"shieldSpecialFall2022HealerText": "窥视左目",
"shieldSpecialFall2022HealerNotes": "二号眼,盯着这套服饰颤抖吧。增加<%= con %>点体质。2022年秋季限定版装备。"
"shieldSpecialFall2022HealerNotes": "二号眼,盯着这套服饰颤抖吧。增加<%= con %>点体质。2022年秋季限定版装备。",
"weaponMystery202211Text": "电磁法杖",
"weaponMystery202211Notes": "用这根法杖来驾驭闪电风暴的强大威力。没有属性加成。2022年11月订阅者物品。",
"armorArmoireSheetGhostCostumeText": "床单幽灵服装",
"armorArmoireSheetGhostCostumeNotes": "嘿这是Habitica最恐怖的服装所以请分场合穿它……注意脚下以免绊倒。增加<%= con %>点体质。魔法衣橱:独立装备。",
"headMystery202211Text": "电磁帽",
"headMystery202211Notes": "小心这顶威力强大的帽子它对崇拜者的影响可能相当惊人没有属性加成。2022年11月订阅者物品。"
}

View File

@@ -88,7 +88,7 @@
"audioTheme_maflTheme": "MAFL主题",
"audioTheme_pizildenTheme": "Pizilden的主题",
"audioTheme_farvoidTheme": "Farvoid的主题",
"reportBug": "报告问题",
"reportBug": "报告漏洞",
"overview": "新手教学",
"dateFormat": "日期格式",
"achievementStressbeast": "Stoïkalm的救星",
@@ -202,7 +202,7 @@
"finish": "完成",
"congratulations": "恭喜你!",
"onboardingAchievs": "到职成就",
"askQuestion": "问个问题",
"askQuestion": "提出问题",
"reportBugHeaderDescribe": "请详述您所面临的问题,我们的团队将会尽快处理并给予回复。",
"reportEmailText": "这将仅用于答复你关于该问题有关的信息。",
"reportEmailPlaceholder": "您的电子邮件",

View File

@@ -214,5 +214,6 @@
"mysterySet202207": "果冻水母套装",
"mysterySet202208": "活泼马尾套装",
"mysterySet202209": "魔法学者套装",
"mysterySet202210": "不祥之蛇套装"
"mysterySet202210": "不祥之蛇套装",
"mysteryset202211": "电磁套装"
}

View File

@@ -2355,5 +2355,36 @@
"weaponSpecialFall2021RogueNotes": "你到底遇到了什麼? 人們總是說盜賊的手是黏糊糊的,但這不代表什麼! 新增<%= str %>點力量。 2021年秋季限定版裝備。",
"weaponSpecialFall2021WarriorNotes": "這種經典的單刃斧頭非常適合用來砍…南瓜! 新增<%= str %>點力量。 2021秋季限定版裝備。",
"weaponSpecialFall2021MageNotes": "知識渴求知識。 由記憶和欲望構成,這只可怕的手抓住了更多。 新增<%= int %>點智力,<%= per %>點感知。 2021年秋季限定版裝備。",
"weaponSpecialFall2021HealerNotes": "使用這根魔杖召喚治療火焰和一個幽靈來幫助你。 新增<%= int %>點智力。 2021年秋季限定版裝備。"
"weaponSpecialFall2021HealerNotes": "使用這根魔杖召喚治療火焰和一個幽靈來幫助你。 新增<%= int %>點智力。 2021年秋季限定版裝備。",
"weaponSpecialWinter2022RogueText": "仙女棒",
"weaponSpecialWinter2022RogueNotes": "金銀是盜賊的最愛,對嗎? 這些都是應季主題。 新增<%= str %>點力量。 2021-2022年冬季限定版裝備。",
"weaponSpecialWinter2022WarriorText": "手杖糖劍",
"weaponSpecialWinter2022HealerNotes": "用這個固態水工具去碰朋友的脖子,他們就會從椅子上跳下來! 過會兒他們就會感覺好多了。 但願吧。 新增<%= int %>點智力。 2021-2022年冬季限定版裝備。",
"weaponSpecialSummer2022RogueText": "螃蟹鉗",
"weaponSpecialSummer2022RogueNotes": "如果你在處境窘迫,不要猶豫顯示這些強悍的爪! 新增<%= str %>點力量。 2022年夏季限定版裝備。",
"weaponSpecialSummer2022WarriorText": "水龍捲風",
"weaponSpecialSummer2022WarriorNotes": "它旋轉! 它重定向! 它帶來風暴! 新增<%= str %>點力量。 2022年夏季限定版裝備。",
"weaponSpecialSummer2022MageText": "蝠鱝法杖",
"weaponSpecialWinter2022WarriorNotes": "要把這根糖果手杖打磨成一把完美的劍,需要舔幾下? 新增<%= str %>點力量。 2021-2022年冬季限定版裝備。",
"weaponSpecialWinter2022MageText": "石榴法杖",
"weaponSpecialWinter2022MageNotes": "這根法杖上的漿果蘊含著一種可以在冬天使用的古老魔法。 新增<%= int %>點智力。 2021-2022年冬季限定版裝備。",
"weaponSpecialWinter2022HealerText": "冰晶魔杖",
"weaponSpecialSummer2022MageNotes": "用這根神奇法杖製造漩渦來清理你面前的水域。 新增<%= int %>點智力和<%= per %>點感知。 2022年夏季限定版裝備。",
"weaponSpecialSummer2022HealerText": "增益泡泡",
"weaponSpecialSummer2022HealerNotes": "這些泡泡在令人滿意的爆裂聲中對清水施加治療魔法! 新增<%= int %>點智力。 2022年夏季限定版裝備。",
"headSpecialNye2021Text": "怪誕的派對帽子",
"headSpecialNye2021Notes": "你收到了一頂怪誕的派對帽子! 當新年鐘聲響起時,自豪地戴上它吧! 沒有属性加成。",
"weaponSpecialSpring2022RogueText": "巨型耳釘",
"weaponSpecialSpring2022RogueNotes": "亮晶晶! 你收集到如此閃亮、美麗又完美的物件! 新增<%= str %>點力量。 2022年春季限定版裝備。",
"weaponSpecialSpring2022WarriorText": "反轉雨傘",
"weaponSpecialSpring2022WarriorNotes": "呀! 我想那風比你想像的要大一些,是吧? 新增<%= str %>點力量。 2022年春季限定版裝備。",
"weaponSpecialSpring2022MageText": "連翹法杖",
"weaponSpecialSpring2022MageNotes": "這些明黃花朵做好準備去引導你的强力春之魔法。 新增<%= int %>點智力和<%= per %>點感知。 2022年春季限定版裝備。",
"weaponSpecialSpring2022HealerText": "橄榄石魔杖",
"weaponSpecialSpring2022HealerNotes": "使用這根魔杖來挖掘橄欖石的治療特性,無論是帶來平靜、積極還是善良。 增加<%= int %>点智力。 2022年春季限定版装备。",
"weaponSpecialFall2022RogueText": "黃瓜刀",
"weaponSpecialFall2022RogueNotes": "這根黃瓜不僅可以用來防身,餓了還能靠它飽餐一頓。 新增<%= str %>點力量。 2022年秋季限定版裝備。",
"weaponSpecialFall2022WarriorNotes": "比起敵人的盔甲來說也許更適合用來劈木頭或切硬皮麵包但是RAWR 它看起來確實很可怕! 新增<%= str %>點力量。 2022年秋季限定版裝備。",
"weaponSpecialFall2022WarriorText": "獸人利劍",
"weaponSpecialFall2022MageText": "爆裂之風"
}

View File

@@ -212,5 +212,6 @@
"reportDescriptionText": "請附上截圖或 Javascript 控制台錯誤碼,以便問題處理。",
"submitBugReport": "提交問題回報",
"reportSent": "問題回報已傳送!",
"reportSentDescription": "我們會盡早給予回覆一旦我們的團隊有機會去找尋問題來源。感謝您回報錯誤及問題。"
"reportSentDescription": "我們會盡早給予回覆一旦我們的團隊有機會去找尋問題來源。感謝您回報錯誤及問題。",
"emptyReportBugMessage": "錯誤報告已遺失"
}

View File

@@ -310,6 +310,15 @@ const mountColorAchievs = {
};
Object.assign(achievementsData, mountColorAchievs);
const petSetCompleteAchievs = {
boneToPick: {
icon: 'achievement-boneToPick',
titleKey: 'achievementBoneToPick',
textKey: 'achievementBoneToPickText',
},
};
Object.assign(achievementsData, petSetCompleteAchievs);
const onboardingAchievs = {
createdTask: {
icon: 'achievement-createdTask',

View File

@@ -32,6 +32,7 @@ export { default as SEASONAL_SETS } from './seasonalSets';
export { default as ANIMAL_COLOR_ACHIEVEMENTS } from './animalColorAchievements';
export { default as ANIMAL_SET_ACHIEVEMENTS } from './animalSetAchievements';
export { default as QUEST_SERIES_ACHIEVEMENTS } from './questSeriesAchievements';
export { default as PET_SET_COMPLETE_ACHIEVEMENTS } from './petCompleteSetAchievements'; // eslint-disable-line import/no-cycle
export { default as STABLE_ACHIEVEMENTS } from './stableAchievements';
export { default as ITEM_LIST } from './itemList';
export { default as QUEST_SERIES } from '../quests/series';

View File

@@ -0,0 +1,11 @@
// this achievement covers all pets of a specific type--classic & quest
const PET_SET_COMPLETE_ACHIEVEMENTS = [
{
color: 'Skeleton',
petAchievement: 'boneToPick',
petNotificationType: 'ACHIEVEMENT_PET_SET_COMPLETE',
},
];
export default PET_SET_COMPLETE_ACHIEVEMENTS;

View File

@@ -196,6 +196,7 @@ const head = {
202207: { },
202208: { },
202210: { },
202211: { },
301404: { },
301405: { },
301703: { },
@@ -250,6 +251,7 @@ const weapon = {
202102: { },
202104: { twoHanded: true },
202111: { twoHanded: true },
202211: { twoHanded: true },
202201: { },
202209: { },
301404: { },

View File

@@ -13,6 +13,7 @@ import {
ANIMAL_COLOR_ACHIEVEMENTS,
ANIMAL_SET_ACHIEVEMENTS,
STABLE_ACHIEVEMENTS,
PET_SET_COMPLETE_ACHIEVEMENTS,
} from './constants';
import achievements from './achievements';
@@ -43,6 +44,7 @@ api.questSeriesAchievements = QUEST_SERIES_ACHIEVEMENTS;
api.animalColorAchievements = ANIMAL_COLOR_ACHIEVEMENTS;
api.animalSetAchievements = ANIMAL_SET_ACHIEVEMENTS;
api.stableAchievements = STABLE_ACHIEVEMENTS;
api.petSetCompleteAchievs = PET_SET_COMPLETE_ACHIEVEMENTS;
api.quests = quests;
api.questsByLevel = questsByLevel;

View File

@@ -219,6 +219,7 @@ function _getBasicAchievements (user, language) {
_addSimple(result, user, { path: 'birdsOfAFeather', language });
_addSimple(result, user, { path: 'reptacularRumble', language });
_addSimple(result, user, { path: 'woodlandWizard', language });
_addSimple(result, user, { path: 'boneToPick', language });
_addSimpleWithMasterCount(result, user, { path: 'beastMaster', language });
_addSimpleWithMasterCount(result, user, { path: 'mountMaster', language });

View File

@@ -113,6 +113,34 @@ export default function hatch (user, req = {}, analytics) {
});
}
if (content.dropEggs[egg] || content.questEggs[egg]) {
forEach(content.petSetCompleteAchievs, achievement => {
if (hatchingPotion !== achievement.color) return;
if (!user.achievements[achievement.petAchievement]) {
const dropPetIndex = findIndex(
keys(content.dropEggs),
animal => !user.items.pets[`${animal}-${achievement.color}`] || user.items.pets[`${animal}-${achievement.color}`] <= 0,
);
const questPetIndex = findIndex(
keys(content.questEggs),
animal => !user.items.pets[`${animal}-${achievement.color}`] || user.items.pets[`${animal}-${achievement.color}`] <= 0,
);
if (dropPetIndex === -1 && questPetIndex === -1) {
user.achievements[achievement.petAchievement] = true;
if (user.addNotification) {
const achievementString = `achievement${upperFirst(achievement.petAchievement)}`;
user.addNotification(achievement.petNotificationType, {
label: `${'achievement'}: ${achievementString}`,
achievement: achievement.petAchievement,
message: `${i18n.t('modalAchievement')} ${i18n.t(achievementString)}`,
modalText: i18n.t(`${achievementString}ModalText`),
});
}
}
}
});
}
if (analytics && moment().diff(user.auth.timestamps.created, 'days') < 7) {
analytics.track('pet hatch', {
uuid: user._id,

View File

@@ -279,11 +279,16 @@ api.updateHero = {
}
if (updateData.purchased.plan.consecutive) {
if (updateData.purchased.plan.consecutive.trinkets) {
await hero.updateHourglasses(
updateData.purchased.plan.consecutive.trinkets
- hero.purchased.plan.consecutive.trinkets,
'admin_update_hourglasses', '', 'Updated by Habitica staff',
);
const changedHourglassTrinkets = updateData.purchased.plan.consecutive.trinkets
- hero.purchased.plan.consecutive.trinkets;
if (changedHourglassTrinkets !== 0) {
await hero.updateHourglasses(
changedHourglassTrinkets,
'admin_update_hourglasses', '', 'Updated by Habitica staff',
);
}
hero.purchased.plan.consecutive.trinkets = updateData.purchased.plan.consecutive.trinkets;
}
if (updateData.purchased.plan.consecutive.gemCapExtra) {

View File

@@ -0,0 +1,7 @@
export const paymentConstants = {
UNLIMITED_CUSTOMER_ID: 'habitrpg', // Users with the customerId have an unlimted free subscription
GROUP_PLAN_CUSTOMER_ID: 'group-plan',
GROUP_PLAN_PAYMENT_METHOD: 'Group Plan',
GOOGLE_PAYMENT_METHOD: 'Google',
IOS_PAYMENT_METHOD: 'Apple',
};

View File

@@ -1,3 +1,5 @@
// TODO these files need to refactored.
import nconf from 'nconf';
import _ from 'lodash';
import moment from 'moment';
@@ -12,6 +14,8 @@ import { // eslint-disable-line import/no-cycle
getUserInfo,
sendTxn as txnEmail,
} from '../email';
import { paymentConstants } from './constants';
import { cancelSubscription, createSubscription } from './subscriptions'; // eslint-disable-line import/no-cycle
const TECH_ASSISTANCE_EMAIL = nconf.get('EMAILS_TECH_ASSISTANCE_EMAIL');
const JOINED_GROUP_PLAN = 'joined group plan';
@@ -37,7 +41,8 @@ async function addSubscriptionToGroupUsers (group) {
members = await User.find({ 'party._id': group._id }).select('_id purchased items auth profile.name notifications').exec();
}
const promises = members.map(member => this.addSubToGroupUser(member, group));
// eslint-disable-next-line no-use-before-define
const promises = members.map(member => addSubToGroupUser(member, group));
await Promise.all(promises);
}
@@ -63,12 +68,12 @@ async function addSubToGroupUser (member, group) {
// When changing customerIdsToIgnore or paymentMethodsToIgnore, the code blocks below for
// the `group-member-join` email template will probably need to be changed.
const customerIdsToIgnore = [
this.constants.GROUP_PLAN_CUSTOMER_ID,
this.constants.UNLIMITED_CUSTOMER_ID,
paymentConstants.GROUP_PLAN_CUSTOMER_ID,
paymentConstants.UNLIMITED_CUSTOMER_ID,
];
const paymentMethodsToIgnore = [
this.constants.GOOGLE_PAYMENT_METHOD,
this.constants.IOS_PAYMENT_METHOD,
paymentConstants.GOOGLE_PAYMENT_METHOD,
paymentConstants.IOS_PAYMENT_METHOD,
];
let previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE;
const leader = await User.findById(group.leader).exec();
@@ -104,7 +109,7 @@ async function addSubToGroupUser (member, group) {
const memberPlan = member.purchased.plan;
if (member.isSubscribed()) {
const customerHasCancelledGroupPlan = (
memberPlan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID
memberPlan.customerId === paymentConstants.GROUP_PLAN_CUSTOMER_ID
&& !member.hasNotCancelled()
);
const ignorePaymentPlan = paymentMethodsToIgnore.indexOf(memberPlan.paymentMethod) !== -1;
@@ -127,13 +132,13 @@ async function addSubToGroupUser (member, group) {
if ((ignorePaymentPlan || ignoreCustomerId) && !customerHasCancelledGroupPlan) {
// member has been added to group plan but their subscription will not be changed
// automatically so they need a special message in the email
if (memberPlan.paymentMethod === this.constants.GOOGLE_PAYMENT_METHOD) {
if (memberPlan.paymentMethod === paymentConstants.GOOGLE_PAYMENT_METHOD) {
previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE;
} else if (memberPlan.paymentMethod === this.constants.IOS_PAYMENT_METHOD) {
} else if (memberPlan.paymentMethod === paymentConstants.IOS_PAYMENT_METHOD) {
previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_IOS;
} else if (memberPlan.customerId === this.constants.UNLIMITED_CUSTOMER_ID) {
} else if (memberPlan.customerId === paymentConstants.UNLIMITED_CUSTOMER_ID) {
previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_LIFETIME_FREE;
} else if (memberPlan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID) {
} else if (memberPlan.customerId === paymentConstants.GROUP_PLAN_CUSTOMER_ID) {
previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GROUP_PLAN;
} else {
// this triggers a generic message in the email template in case we forget
@@ -183,7 +188,7 @@ async function addSubToGroupUser (member, group) {
member.markModified('items.mounts');
data.user = member;
await this.createSubscription(data);
await createSubscription(data);
txnEmail(data.user, 'group-member-join', [
{ name: 'LEADER', content: leader.profile.name },
@@ -207,13 +212,14 @@ async function cancelGroupUsersSubscription (group) {
members = await User.find({ 'party._id': group._id }).select('_id guilds purchased').exec();
}
const promises = members.map(member => this.cancelGroupSubscriptionForUser(member, group));
// eslint-disable-next-line no-use-before-define
const promises = members.map(member => cancelGroupSubscriptionForUser(member, group));
await Promise.all(promises);
}
async function cancelGroupSubscriptionForUser (user, group, userWasRemoved = false) {
if (user.purchased.plan.customerId !== this.constants.GROUP_PLAN_CUSTOMER_ID) return;
if (user.purchased.plan.customerId !== paymentConstants.GROUP_PLAN_CUSTOMER_ID) return;
const userGroups = user.guilds.toObject();
if (user.party._id) userGroups.push(user.party._id);
@@ -241,7 +247,7 @@ async function cancelGroupSubscriptionForUser (user, group, userWasRemoved = fal
{ name: 'LEADER', content: leader.profile.name },
{ name: 'GROUP_NAME', content: group.name },
]);
await this.cancelSubscription({ user });
await cancelSubscription({ user });
}
}

View File

@@ -11,16 +11,11 @@ import { // eslint-disable-line import/no-cycle
import { // eslint-disable-line import/no-cycle
buyGems,
} from './gems';
import { paymentConstants } from './constants';
const api = {};
api.constants = {
UNLIMITED_CUSTOMER_ID: 'habitrpg', // Users with the customerId have an unlimted free subscription
GROUP_PLAN_CUSTOMER_ID: 'group-plan',
GROUP_PLAN_PAYMENT_METHOD: 'Group Plan',
GOOGLE_PAYMENT_METHOD: 'Google',
IOS_PAYMENT_METHOD: 'Apple',
};
api.constants = paymentConstants;
api.addSubscriptionToGroupUsers = addSubscriptionToGroupUsers;

View File

@@ -1,3 +1,5 @@
// TODO these files need to refactored.
import _ from 'lodash';
import moment from 'moment';
@@ -11,6 +13,7 @@ import { // eslint-disable-line import/no-cycle
model as Group,
basicFields as basicGroupFields,
} from '../../models/group';
import { model as User } from '../../models/user'; // eslint-disable-line import/no-cycle
import {
NotAuthorized,
NotFound,
@@ -19,6 +22,8 @@ import shared from '../../../common';
import { sendNotification as sendPushNotification } from '../pushNotifications'; // eslint-disable-line import/no-cycle
import calculateSubscriptionTerminationDate from './calculateSubscriptionTerminationDate';
import { getCurrentEventList } from '../worldState'; // eslint-disable-line import/no-cycle
import { paymentConstants } from './constants';
import { addSubscriptionToGroupUsers, cancelGroupUsersSubscription } from './groupPayments'; // eslint-disable-line import/no-cycle
// @TODO: Abstract to shared/constant
const JOINED_GROUP_PLAN = 'joined group plan';
@@ -64,7 +69,7 @@ function _dateDiff (earlyDate, lateDate) {
return moment(lateDate).diff(earlyDate, 'months', true);
}
async function createSubscription (data) {
async function prepareSubscriptionValues (data) {
let recipient = data.gift ? data.gift.member : data.user;
const block = shared.content.subscriptionBlocks[data.gift
? data.gift.subscription.key
@@ -87,6 +92,22 @@ async function createSubscription (data) {
let emailType = 'subscription-begins';
let recipientIsSubscribed = recipient.isSubscribed();
if (data.user && !data.gift && !data.groupId) {
const unlockedUser = await User.findOneAndUpdate(
{
_id: data.user._id,
$or: [
{ _subSignature: 'NOT_RUNNING' },
{ _subSignature: { $exists: false } },
],
},
{ $set: { _subSignature: 'SUB_IN_PROGRESS' } },
);
if (!unlockedUser) {
throw new NotFound('User not found or subscription already processing.');
}
}
// If we are buying a group subscription
if (data.groupId) {
const groupFields = basicGroupFields.concat(' purchased');
@@ -96,7 +117,7 @@ async function createSubscription (data) {
if (group) {
analytics.track(
this.groupID,
data.groupID,
data.demographics,
);
}
@@ -121,7 +142,7 @@ async function createSubscription (data) {
groupId = group._id;
recipient.purchased.plan.quantity = data.sub.quantity;
await this.addSubscriptionToGroupUsers(group);
await addSubscriptionToGroupUsers(group);
}
const { plan } = recipient.purchased;
@@ -130,7 +151,10 @@ async function createSubscription (data) {
if (plan.customerId && !plan.dateTerminated) { // User has active plan
plan.extraMonths += months;
} else {
if (!recipientIsSubscribed || !plan.dateUpdated) plan.dateUpdated = today;
if (!recipientIsSubscribed || !plan.dateUpdated) {
plan.dateUpdated = today;
}
if (moment(plan.dateTerminated).isAfter()) {
plan.dateTerminated = moment(plan.dateTerminated).add({ months }).toDate();
} else {
@@ -139,9 +163,15 @@ async function createSubscription (data) {
}
}
if (!plan.customerId) plan.customerId = 'Gift'; // don't override existing customer, but all sub need a customerId
if (!plan.customerId) {
plan.customerId = 'Gift';
}
// don't override existing customer, but all sub need a customerId
} else {
if (!plan.dateTerminated) plan.dateTerminated = today;
if (!plan.dateTerminated) {
plan.dateTerminated = today;
}
Object.assign(plan, { // override plan with new values
planId: block.key,
@@ -161,22 +191,58 @@ async function createSubscription (data) {
});
// allow non-override if a plan was previously used
if (!plan.gemsBought) plan.gemsBought = 0;
if (!plan.dateCreated) plan.dateCreated = today;
if (!plan.mysteryItems) plan.mysteryItems = [];
if (!plan.gemsBought) {
plan.gemsBought = 0;
}
if (!plan.dateCreated) {
plan.dateCreated = today;
}
if (!plan.mysteryItems) {
plan.mysteryItems = [];
}
if (data.subscriptionId) {
plan.subscriptionId = data.subscriptionId;
}
}
return {
block,
months,
plan,
recipient,
autoRenews,
group,
groupId,
itemPurchased,
purchaseType,
emailType,
};
}
async function createSubscription (data) {
const {
block,
months,
plan,
recipient,
autoRenews,
group,
groupId,
itemPurchased,
purchaseType,
emailType,
} = await prepareSubscriptionValues(data);
// Block sub perks
const perks = Math.floor(months / 3);
if (perks) {
plan.consecutive.offset += months;
plan.consecutive.gemCapExtra += perks * 5;
if (plan.consecutive.gemCapExtra > 25) plan.consecutive.gemCapExtra = 25;
await plan.updateHourglasses(data.user._id, perks, 'subscription_perks'); // one Hourglass every 3 months
await plan.updateHourglasses(recipient._id, perks, 'subscription_perks'); // one Hourglass every 3 months
}
if (recipient !== group) {
@@ -186,7 +252,7 @@ async function createSubscription (data) {
}
// @TODO: Create a factory pattern for use cases
if (!data.gift && data.customerId !== this.constants.GROUP_PLAN_CUSTOMER_ID) {
if (!data.gift && data.customerId !== paymentConstants.GROUP_PLAN_CUSTOMER_ID) {
txnEmail(data.user, emailType);
}
@@ -275,7 +341,7 @@ async function createSubscription (data) {
promo: 'Winter',
promoUsername: data.gift.member.auth.local.username,
};
await this.createSubscription(promoData);
await createSubscription(promoData);
}
if (data.gift.member.preferences.pushNotifications.giftedSubscription !== false) {
@@ -290,10 +356,6 @@ async function createSubscription (data) {
}
}
if (group) await group.save();
if (data.user && data.user.isModified()) await data.user.save();
if (data.gift) await data.gift.member.save();
slack.sendSubscriptionNotification({
buyer: {
id: data.user._id,
@@ -310,6 +372,24 @@ async function createSubscription (data) {
groupId,
autoRenews,
});
if (group) {
await group.save();
}
if (data.user) {
if (data.user.isModified()) {
await data.user.save();
}
if (!data.gift && !data.groupId) {
await User.findOneAndUpdate(
{ _id: data.user._id },
{ $set: { _subSignature: 'NOT_RUNNING' } },
);
}
}
if (data.gift) {
await data.gift.member.save();
}
}
// Cancels a subscription or group plan, setting termination to happen later
@@ -342,7 +422,7 @@ async function cancelSubscription (data) {
emailType = 'group-cancel-subscription';
emailMergeData.push({ name: 'GROUP_NAME', content: group.name });
await this.cancelGroupUsersSubscription(group);
await cancelGroupUsersSubscription(group);
} else {
// cancelling a user subscription
plan = data.user.purchased.plan;
@@ -352,12 +432,12 @@ async function cancelSubscription (data) {
if (data.cancellationReason && data.cancellationReason === JOINED_GROUP_PLAN) sendEmail = false;
}
if (plan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID) {
if (plan.customerId === paymentConstants.GROUP_PLAN_CUSTOMER_ID) {
sendEmail = false; // because group-member-cancel email has already been sent
}
plan.dateTerminated = calculateSubscriptionTerminationDate(
data.nextBill, plan, this.constants.GROUP_PLAN_CUSTOMER_ID,
data.nextBill, plan, paymentConstants.GROUP_PLAN_CUSTOMER_ID,
);
// clear extra time. If they subscribe again, it'll be recalculated from p.dateTerminated
@@ -369,7 +449,9 @@ async function cancelSubscription (data) {
await data.user.save();
}
if (sendEmail) txnEmail(data.user, emailType, emailMergeData);
if (sendEmail) {
txnEmail(data.user, emailType, emailMergeData);
}
if (group) {
cancelType = 'group-unsubscribe';

View File

@@ -151,6 +151,7 @@ export default new Schema({
birdsOfAFeather: Boolean,
reptacularRumble: Boolean,
woodlandWizard: Boolean,
boneToPick: Boolean,
// Onboarding Guide
createdTask: Boolean,
completedTask: Boolean,
@@ -430,6 +431,8 @@ export default new Schema({
lastCron: { $type: Date, default: Date.now },
_cronSignature: { $type: String, default: 'NOT_RUNNING' }, // Private property used to avoid double cron
// Lock property to avoid double subscription. Not strictly private because we query on it
_subSignature: { $type: String, default: 'NOT_RUNNING' },
// {GROUP_ID: Boolean}, represents whether they have unseen chat messages
newMessages: {

View File

@@ -46,6 +46,7 @@ const NOTIFICATION_TYPES = [
'ACHIEVEMENT_ANIMAL_SET',
'ACHIEVEMENT_PET_COLOR',
'ACHIEVEMENT_MOUNT_COLOR',
'ACHIEVEMENT_PET_SET_COMPLETE',
// Deprecated notification types. Can be removed once old data is cleaned out
'BOSS_DAMAGE', // deprecated
'ACHIEVEMENT_ALL_YOUR_BASE', // deprecated