mirror of
https://github.com/HabitRPG/habitica.git
synced 2026-05-13 11:31:23 -05:00
Compare commits
235 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a018588021 | |||
| 580139ff69 | |||
| e0860e604e | |||
| 9fc69456bb | |||
| 5bf14e05cc | |||
| 7d081056ba | |||
| 2ff7bef2a6 | |||
| 51b3b0c4c7 | |||
| 174a4e69f9 | |||
| 1ce060eac6 | |||
| 55f07f8ab2 | |||
| 4fe8b63748 | |||
| b5c64185f0 | |||
| debeee7569 | |||
| 64b8a28363 | |||
| 894558f2df | |||
| 57be0fbe45 | |||
| cf9fbd43bb | |||
| ea817eecf7 | |||
| f1381878e7 | |||
| 9bd039b17b | |||
| 8804892135 | |||
| 90b34c4dac | |||
| 96a919ed4b | |||
| e56b672226 | |||
| 91cbf7a2a9 | |||
| 04e2a39a9f | |||
| bdd926e110 | |||
| a8e9c9bc70 | |||
| 497073a714 | |||
| f1fa6a8456 | |||
| 3f690c24da | |||
| f24d81d895 | |||
| 82c5e40b92 | |||
| 6b27e18699 | |||
| 4f70a6fbf4 | |||
| 300c2bb0a8 | |||
| 4b4f073089 | |||
| 1d8e3d45a1 | |||
| 116068effa | |||
| f2aaee15f3 | |||
| 06a8d2bbd7 | |||
| 15353eba8a | |||
| febffb3f07 | |||
| 25c7d52d6a | |||
| 837c1c20a3 | |||
| 02b11a61bc | |||
| a0e28f7db4 | |||
| fdfa2d6df4 | |||
| 4fd2011be5 | |||
| 259131ee3f | |||
| 1a5cba57b7 | |||
| 5e05190f22 | |||
| 81540ef399 | |||
| 2bbff36cc8 | |||
| 9f52e47011 | |||
| 4dca69f14b | |||
| 1378b1e1ad | |||
| 734a611a5c | |||
| dbd485cb96 | |||
| 4c62a48f5d | |||
| 11496f3e0c | |||
| 9a3e3aaf42 | |||
| d9250fd780 | |||
| 70a5124815 | |||
| 532fa2816b | |||
| d22f191f83 | |||
| 2b49a800a5 | |||
| 0db927c726 | |||
| 6ee06f76e4 | |||
| 978e8c4320 | |||
| 5c7d537c61 | |||
| 0e6ece95a4 | |||
| b08ed8b0fb | |||
| fafaa29d72 | |||
| 3a088de7e8 | |||
| 835da85119 | |||
| f6e5360bdd | |||
| eee8ad2029 | |||
| c7e73f9b85 | |||
| 9b1a726875 | |||
| accf7e2897 | |||
| 9e98e56e9b | |||
| 6c85b1e047 | |||
| 7c553e535c | |||
| c16207c9ba | |||
| 27440772f0 | |||
| aea0be3245 | |||
| a2d5211b00 | |||
| 53fb28cc48 | |||
| 1c0710b45b | |||
| 3bc82a6692 | |||
| 2add227b97 | |||
| 4cc1f902c8 | |||
| 1b52529822 | |||
| e39a5a0628 | |||
| 575aea2605 | |||
| 222ba544d7 | |||
| 2372efa22e | |||
| b5c950ac96 | |||
| 18ec3eb355 | |||
| 62b4315b3d | |||
| 56805e6c90 | |||
| 0c6070dd9a | |||
| 19c26c01e3 | |||
| 0f3bc980d9 | |||
| 7f87120d34 | |||
| f7a03d2eb5 | |||
| 90250d1a25 | |||
| 22a0c72f6e | |||
| a4326498d1 | |||
| 8f26a22bd4 | |||
| 0b2cf5bceb | |||
| f43a0d8289 | |||
| 39be8db4f9 | |||
| f0a1f11a16 | |||
| 84c4b3536c | |||
| cf834f57d7 | |||
| 97be341ff6 | |||
| 15c68abafa | |||
| 21a1b9449b | |||
| 0ec7784fb1 | |||
| 9ddd0f29d0 | |||
| 37791dfe8d | |||
| 0322b657b8 | |||
| cc39f6e4e9 | |||
| 452b516c67 | |||
| 235eae32b0 | |||
| de9f1be7b9 | |||
| e75610447f | |||
| bd4c65cd3e | |||
| baf60dc951 | |||
| 70e88d601c | |||
| 104ec60adb | |||
| e97454e0e7 | |||
| 144baa98b1 | |||
| 02e33853b1 | |||
| 8c0d41d084 | |||
| 9d4f70371d | |||
| 57a090eea1 | |||
| 18534a21ff | |||
| ed0a36a287 | |||
| e50f240366 | |||
| 4d1bbdd8d0 | |||
| d1928c9181 | |||
| 137f7d53dc | |||
| 3f9d55254e | |||
| b60a76d7dd | |||
| a5575b3593 | |||
| ace964f2b3 | |||
| 12b045093a | |||
| 8cd9536bdc | |||
| 08f0374b46 | |||
| 3582e233be | |||
| 3974adcb65 | |||
| 57d3fea523 | |||
| 173d7a178c | |||
| 7db093d2bb | |||
| 06d2ffb37d | |||
| 40997854dd | |||
| 4c4d0be31f | |||
| b8cf1b895f | |||
| a08ecbe044 | |||
| f3771f4869 | |||
| e0eed8238e | |||
| 6baf08d461 | |||
| 535fddf92d | |||
| ef97f301d9 | |||
| eea79ce1b6 | |||
| 191fee524c | |||
| e9ee2d3fdd | |||
| 3c8be16135 | |||
| 9890e0079a | |||
| 586897fbfc | |||
| f75a6eb11d | |||
| 155d6d5af6 | |||
| 004f1ee2dc | |||
| c61bdaf563 | |||
| 85e14bb100 | |||
| 8e9b469d8d | |||
| 6e5cac88fc | |||
| 80acb70718 | |||
| 13eef6e4cf | |||
| 719fab8d4b | |||
| 4c34c68d78 | |||
| 9a8d1854b9 | |||
| 014a4b653a | |||
| 37e5d6b40a | |||
| fb780c9a2d | |||
| 1a86943711 | |||
| 21185b689c | |||
| 5a85e0730c | |||
| 771558e1fd | |||
| e6f903fd2e | |||
| 5c13bf1980 | |||
| 36a4ec69d5 | |||
| c6ba1d8402 | |||
| 0081bad831 | |||
| abdb6244d3 | |||
| 90f1977a49 | |||
| bc33e4349d | |||
| 61f3d8d61c | |||
| 796d752974 | |||
| 008314676d | |||
| f364b3c06f | |||
| ae23ac12ff | |||
| e2bb7fda60 | |||
| 09d6dae75c | |||
| bc5813fd10 | |||
| 4464464c51 | |||
| a3e6aff330 | |||
| a523d0b894 | |||
| 8a809c3828 | |||
| 40f433b099 | |||
| 9a1266677a | |||
| d70dd2e6dd | |||
| f078d19e4b | |||
| e08d0f4016 | |||
| 0435e3537a | |||
| 0aadee550e | |||
| f487837b4b | |||
| b593db2150 | |||
| a07c2e6268 | |||
| e3c552dd54 | |||
| 8d1f7e77ed | |||
| cfd601e7bf | |||
| 5d81c63897 | |||
| cff6c5674f | |||
| edcb3f4289 | |||
| bd28a282df | |||
| 999071a15c | |||
| 9bee9d0a06 | |||
| f5b632e3e5 | |||
| 8ecd152b41 | |||
| ba22c18cd9 |
@@ -2,6 +2,9 @@ name: Test
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
version: "3"
|
||||
services:
|
||||
client:
|
||||
build:
|
||||
@@ -9,7 +8,6 @@ services:
|
||||
- server
|
||||
environment:
|
||||
- BASE_URL=http://server:3000
|
||||
image: habitica
|
||||
networks:
|
||||
- habitica
|
||||
ports:
|
||||
@@ -27,7 +25,6 @@ services:
|
||||
- mongo
|
||||
environment:
|
||||
- NODE_DB_URI=mongodb://mongo/habitrpg
|
||||
image: habitica
|
||||
networks:
|
||||
- habitica
|
||||
ports:
|
||||
|
||||
+1
-1
Submodule habitica-images updated: ce1e117dc9...d66a5ea922
@@ -0,0 +1,97 @@
|
||||
/* eslint-disable no-console */
|
||||
import { model as UserModel } from '../../../website/server/models/user';
|
||||
import { TransactionModel } from '../../../website/server/models/transaction';
|
||||
|
||||
const MIGRATION_NAME = '20220915_transactions_user_name';
|
||||
|
||||
/* transaction config */
|
||||
const transactionPerRun = 500;
|
||||
const progressCount = 1000;
|
||||
const transactionQuery = {
|
||||
migration: { $ne: MIGRATION_NAME }, // skip already migrated entries
|
||||
'transactionType': { $in: ['gift_send', 'gift_receive'] },
|
||||
};
|
||||
|
||||
let count = 0;
|
||||
async function updateTransaction (transaction, userNameMap) {
|
||||
count++;
|
||||
|
||||
const set = {
|
||||
migration: MIGRATION_NAME,
|
||||
};
|
||||
|
||||
if (userNameMap.has(transaction.reference)) {
|
||||
set['referenceText'] = userNameMap.get(transaction.reference);
|
||||
} else {
|
||||
set['referenceText'] = 'Account not found';
|
||||
}
|
||||
|
||||
if (count % progressCount === 0) {
|
||||
console.warn(`${count} ${transaction._id}`);
|
||||
}
|
||||
|
||||
return TransactionModel.updateOne({
|
||||
_id: transaction._id
|
||||
}, { $set: set }).exec();
|
||||
}
|
||||
|
||||
export default async function processTransactions () {
|
||||
const fields = {
|
||||
_id: 1,
|
||||
reference: 1,
|
||||
referenceText: 1,
|
||||
};
|
||||
|
||||
const userNameMap = new Map();
|
||||
|
||||
while (true) { // eslint-disable-line no-constant-condition
|
||||
const foundTransactions = await TransactionModel // eslint-disable-line no-await-in-loop
|
||||
.find(transactionQuery)
|
||||
.limit(transactionPerRun)
|
||||
.sort({reference: 1})
|
||||
.select(fields)
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
if (foundTransactions.length === 0) {
|
||||
console.warn('All appropriate transactions found and modified.');
|
||||
console.warn(`\n${count} transactions processed\n`);
|
||||
break;
|
||||
}
|
||||
|
||||
// check for unknown users and load the names
|
||||
const userIdsToLoad = [];
|
||||
for (const foundTransaction of foundTransactions) {
|
||||
const userId = foundTransaction.reference;
|
||||
if (userNameMap.has(userId)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
userIdsToLoad.push(userId);
|
||||
}
|
||||
|
||||
const users = await UserModel // eslint-disable-line no-await-in-loop
|
||||
.find({
|
||||
_id: { $in: userIdsToLoad }
|
||||
})
|
||||
.select({
|
||||
_id: 1,
|
||||
'auth.local.username': 1,
|
||||
})
|
||||
.lean()
|
||||
.exec();
|
||||
|
||||
for (const user of users) {
|
||||
const localUserName = user.auth?.local?.username;
|
||||
|
||||
if (!localUserName) {
|
||||
console.warn(`\nNo Username found for ID: ${user._id}\n`);
|
||||
continue;
|
||||
}
|
||||
|
||||
userNameMap.set(user._id, localUserName)
|
||||
}
|
||||
|
||||
await Promise.all(foundTransactions.map(t => updateTransaction(t, userNameMap))); // eslint-disable-line no-await-in-loop
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Award Habitoween ladder items to participants in this month's Habitoween festivities
|
||||
*/
|
||||
/* eslint-disable no-console */
|
||||
|
||||
const MIGRATION_NAME = '20221031_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
|
||||
}
|
||||
};
|
||||
@@ -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
|
||||
}
|
||||
};
|
||||
Generated
+1051
-1190
File diff suppressed because it is too large
Load Diff
+20
-20
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.244.1",
|
||||
"version": "4.251.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.18.13",
|
||||
"@babel/preset-env": "^7.19.1",
|
||||
"@babel/core": "^7.19.6",
|
||||
"@babel/preset-env": "^7.20.2",
|
||||
"@babel/register": "^7.18.9",
|
||||
"@google-cloud/trace-agent": "^5.1.6",
|
||||
"@google-cloud/trace-agent": "^7.1.2",
|
||||
"@parse/node-apn": "^5.1.3",
|
||||
"@slack/webhook": "^6.1.0",
|
||||
"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.0.1",
|
||||
"body-parser": "^1.20.0",
|
||||
"bcrypt": "^5.1.0",
|
||||
"body-parser": "^1.20.1",
|
||||
"bootstrap": "^4.6.0",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-session": "^2.0.0",
|
||||
@@ -27,7 +27,7 @@
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.0.0",
|
||||
"express": "^4.18.1",
|
||||
"express": "^4.18.2",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-validator": "^5.2.0",
|
||||
"glob": "^8.0.3",
|
||||
@@ -41,9 +41,9 @@
|
||||
"helmet": "^4.6.0",
|
||||
"image-size": "^1.0.2",
|
||||
"in-app-purchase": "^1.11.3",
|
||||
"js2xmlparser": "^4.0.2",
|
||||
"js2xmlparser": "^5.0.0",
|
||||
"jsonwebtoken": "^8.5.1",
|
||||
"jwks-rsa": "^2.1.4",
|
||||
"jwks-rsa": "^2.1.5",
|
||||
"lodash": "^4.17.21",
|
||||
"merge-stream": "^2.0.0",
|
||||
"method-override": "^3.0.0",
|
||||
@@ -54,27 +54,27 @@
|
||||
"nconf": "^0.12.0",
|
||||
"node-gcm": "^1.0.5",
|
||||
"on-headers": "^1.0.2",
|
||||
"passport": "^0.5.0",
|
||||
"passport": "^0.6.0",
|
||||
"passport-facebook": "^3.0.0",
|
||||
"passport-google-oauth2": "^0.2.0",
|
||||
"passport-google-oauth20": "2.0.0",
|
||||
"paypal-rest-sdk": "^1.8.1",
|
||||
"pp-ipn": "^1.1.0",
|
||||
"ps-tree": "^1.0.0",
|
||||
"rate-limiter-flexible": "^2.3.10",
|
||||
"rate-limiter-flexible": "^2.4.0",
|
||||
"redis": "^3.1.2",
|
||||
"regenerator-runtime": "^0.13.9",
|
||||
"regenerator-runtime": "^0.13.11",
|
||||
"remove-markdown": "^0.5.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"short-uuid": "^4.2.0",
|
||||
"stripe": "^8.222.0",
|
||||
"superagent": "^7.1.6",
|
||||
"short-uuid": "^4.2.2",
|
||||
"stripe": "^10.13.0",
|
||||
"superagent": "^8.0.5",
|
||||
"universal-analytics": "^0.5.3",
|
||||
"useragent": "^2.1.9",
|
||||
"uuid": "^8.3.2",
|
||||
"validator": "^13.7.0",
|
||||
"vinyl-buffer": "^1.0.1",
|
||||
"winston": "^3.8.1",
|
||||
"winston": "^3.8.2",
|
||||
"winston-loggly-bulk": "^3.2.1",
|
||||
"xml2js": "^0.4.23"
|
||||
},
|
||||
@@ -111,10 +111,10 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^0.27.2",
|
||||
"chai": "^4.3.6",
|
||||
"chai": "^4.3.7",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-moment": "^0.1.0",
|
||||
"chalk": "^4.1.2",
|
||||
"chalk": "^5.1.2",
|
||||
"cross-spawn": "^7.0.3",
|
||||
"expect.js": "^0.3.1",
|
||||
"istanbul": "^1.1.0-alpha.1",
|
||||
@@ -122,7 +122,7 @@
|
||||
"monk": "^7.3.4",
|
||||
"require-again": "^2.0.0",
|
||||
"run-rs": "^0.7.7",
|
||||
"sinon": "^13.0.2",
|
||||
"sinon": "^14.0.2",
|
||||
"sinon-chai": "^3.7.0",
|
||||
"sinon-stub-promise": "^4.0.0"
|
||||
},
|
||||
|
||||
@@ -326,6 +326,7 @@ describe('Apple Payments', () => {
|
||||
it('errors when a user is already subscribed', async () => {
|
||||
payments.createSubscription.restore();
|
||||
user = new User();
|
||||
await user.save();
|
||||
|
||||
await applePayments.subscribe(sku, user, receipt, headers, nextPaymentProcessing);
|
||||
|
||||
|
||||
@@ -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;
|
||||
@@ -672,10 +692,12 @@ describe('payments/index', () => {
|
||||
context('No Active Promotion', () => {
|
||||
beforeEach(() => {
|
||||
sinon.stub(worldState, 'getCurrentEvent').returns(null);
|
||||
sinon.stub(worldState, 'getCurrentEventList').returns([]);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
worldState.getCurrentEvent.restore();
|
||||
worldState.getCurrentEventList.restore();
|
||||
});
|
||||
|
||||
it('does not apply a discount', async () => {
|
||||
@@ -692,14 +714,14 @@ describe('payments/index', () => {
|
||||
|
||||
context('Active Promotion', () => {
|
||||
beforeEach(() => {
|
||||
sinon.stub(worldState, 'getCurrentEvent').returns({
|
||||
sinon.stub(worldState, 'getCurrentEventList').returns([{
|
||||
...common.content.events.fall2020,
|
||||
event: 'fall2020',
|
||||
});
|
||||
}]);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
worldState.getCurrentEvent.restore();
|
||||
worldState.getCurrentEventList.restore();
|
||||
});
|
||||
|
||||
it('applies a discount', async () => {
|
||||
|
||||
@@ -11,6 +11,12 @@ describe('PUT /group', () => {
|
||||
const groupName = 'Test Public Guild';
|
||||
const groupType = 'guild';
|
||||
const groupUpdatedName = 'Test Public Guild Updated';
|
||||
const groupCategories = [
|
||||
{
|
||||
slug: 'initialCat',
|
||||
name: 'Initial Category',
|
||||
},
|
||||
];
|
||||
|
||||
beforeEach(async () => {
|
||||
const { group, groupLeader, members } = await createAndPopulateGroup({
|
||||
@@ -18,6 +24,7 @@ describe('PUT /group', () => {
|
||||
name: groupName,
|
||||
type: groupType,
|
||||
privacy: 'public',
|
||||
categories: groupCategories,
|
||||
},
|
||||
members: 1,
|
||||
});
|
||||
@@ -61,6 +68,35 @@ describe('PUT /group', () => {
|
||||
expect(updatedGroup.categories[0].name).to.eql(categories[0].name);
|
||||
});
|
||||
|
||||
it('removes the initial group category', async () => {
|
||||
const categories = [];
|
||||
|
||||
const updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, {
|
||||
categories,
|
||||
});
|
||||
|
||||
expect(updatedGroup.categories.length).to.equal(0);
|
||||
});
|
||||
|
||||
it('removes duplicate group categories', async () => {
|
||||
const categories = [
|
||||
{
|
||||
slug: 'newCat',
|
||||
name: 'New Category',
|
||||
},
|
||||
{
|
||||
slug: 'newCat',
|
||||
name: 'New Category',
|
||||
},
|
||||
];
|
||||
|
||||
const updatedGroup = await leader.put(`/groups/${groupToUpdate._id}`, {
|
||||
categories,
|
||||
});
|
||||
|
||||
expect(updatedGroup.categories.length).to.equal(1);
|
||||
});
|
||||
|
||||
it('allows an admin to update a guild', async () => {
|
||||
const updatedGroup = await adminUser.put(`/groups/${groupToUpdate._id}`, {
|
||||
name: groupUpdatedName,
|
||||
|
||||
@@ -344,6 +344,24 @@ describe('POST /user/auth/local/register', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('enforces maximum length for the password', async () => {
|
||||
const username = generateRandomUserName();
|
||||
const email = `${username}@example.com`;
|
||||
const password = '12345678910111213141516171819202122232425262728293031323334353637383940';
|
||||
const confirmPassword = '12345678910111213141516171819202122232425262728293031323334353637383940';
|
||||
|
||||
await expect(api.post('/user/auth/local/register', {
|
||||
username,
|
||||
email,
|
||||
password,
|
||||
confirmPassword,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 400,
|
||||
error: 'BadRequest',
|
||||
message: t('invalidReqParams'),
|
||||
});
|
||||
});
|
||||
|
||||
it('requires a username', async () => {
|
||||
const email = `${generateRandomUserName()}@example.com`;
|
||||
const password = 'password';
|
||||
|
||||
@@ -213,7 +213,7 @@ describe('cron utility functions', () => {
|
||||
};
|
||||
}
|
||||
|
||||
it('offset 0, next date in 3 months', () => {
|
||||
it('monthly plan, next date in 3 months', () => {
|
||||
const user = baseUserData(60, 0, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
@@ -222,8 +222,8 @@ describe('cron utility functions', () => {
|
||||
.to.be.sameMoment('2022-08-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 1, next date in 1 months', () => {
|
||||
const user = baseUserData(60, 1, 'group_plan_auto');
|
||||
it('monthly plan, next date in 1 month', () => {
|
||||
const user = baseUserData(62, 0, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
@@ -231,8 +231,17 @@ describe('cron utility functions', () => {
|
||||
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 2, next date in 2 months - with any plan', () => {
|
||||
const user = baseUserData(60, 2, 'basic_3mo');
|
||||
it('multi-month plan, no offset', () => {
|
||||
const user = baseUserData(60, 0, 'basic_3mo');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('multi-month plan with offset', () => {
|
||||
const user = baseUserData(60, 1, 'basic_3mo');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
|
||||
Generated
+609
-484
File diff suppressed because it is too large
Load Diff
@@ -21,19 +21,19 @@
|
||||
"@storybook/vue": "6.3.13",
|
||||
"@vue/cli-plugin-babel": "^4.5.15",
|
||||
"@vue/cli-plugin-eslint": "^4.5.19",
|
||||
"@vue/cli-plugin-router": "^4.5.15",
|
||||
"@vue/cli-plugin-router": "^5.0.8",
|
||||
"@vue/cli-plugin-unit-mocha": "^4.5.15",
|
||||
"@vue/cli-service": "^4.5.15",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"amplitude-js": "^8.21.0",
|
||||
"axios": "^0.25.0",
|
||||
"amplitude-js": "^8.21.1",
|
||||
"axios": "^0.27.2",
|
||||
"axios-progress-bar": "^1.2.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"bootstrap": "^4.6.0",
|
||||
"bootstrap-vue": "^2.22.0",
|
||||
"chai": "^4.3.6",
|
||||
"core-js": "^3.24.1",
|
||||
"dompurify": "^2.4.0",
|
||||
"core-js": "^3.26.0",
|
||||
"dompurify": "^2.4.1",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
@@ -41,14 +41,15 @@
|
||||
"habitica-markdown": "^3.0.0",
|
||||
"hellojs": "^1.19.5",
|
||||
"inspectpack": "^4.7.1",
|
||||
"intro.js": "^5.1.0",
|
||||
"intro.js": "^6.0.0",
|
||||
"jquery": "^3.6.1",
|
||||
"lodash": "^4.17.21",
|
||||
"moment": "^2.29.4",
|
||||
"nconf": "^0.12.0",
|
||||
"sass": "^1.34.0",
|
||||
"sass-loader": "^8.0.2",
|
||||
"smartbanner.js": "^1.19.0",
|
||||
"smartbanner.js": "^1.19.1",
|
||||
"stopword": "^2.0.5",
|
||||
"svg-inline-loader": "^0.8.2",
|
||||
"svg-url-loader": "^7.1.1",
|
||||
"svgo": "^1.3.2",
|
||||
@@ -58,7 +59,7 @@
|
||||
"vue": "^2.7.10",
|
||||
"vue-cli-plugin-storybook": "2.1.0",
|
||||
"vue-mugen-scroll": "^0.2.6",
|
||||
"vue-router": "^3.5.4",
|
||||
"vue-router": "^3.6.5",
|
||||
"vue-template-compiler": "^2.7.10",
|
||||
"vuedraggable": "^2.24.3",
|
||||
"vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#153d339e4dbebb73733658aeda1d5b7fcc55b0a0",
|
||||
|
||||
@@ -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;
|
||||
@@ -509,6 +514,11 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.background_among_giant_mushrooms {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_among_giant_mushrooms.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_animal_clouds {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_animal_clouds.png');
|
||||
width: 141px;
|
||||
@@ -549,6 +559,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_autumn_bridge {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_autumn_bridge.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_autumn_flower_garden {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_autumn_flower_garden.png');
|
||||
width: 141px;
|
||||
@@ -675,6 +690,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_branches_of_a_holiday_tree {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_branches_of_a_holiday_tree.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_brick_wall_with_ivy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_brick_wall_with_ivy.png');
|
||||
width: 141px;
|
||||
@@ -715,6 +735,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_cemetery_gate {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_cemetery_gate.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_champions_colosseum {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_champions_colosseum.png');
|
||||
width: 141px;
|
||||
@@ -1289,6 +1314,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_inside_a_crystal {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_inside_a_crystal.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_inside_a_potion_bottle {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_inside_a_potion_bottle.png');
|
||||
width: 141px;
|
||||
@@ -1359,6 +1389,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_mask_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_mask_makers_workshop.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_meandering_cave {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_meandering_cave.png');
|
||||
width: 141px;
|
||||
@@ -1404,6 +1439,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_misty_autumn_forest {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_misty_autumn_forest.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_monster_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_monster_makers_workshop.png');
|
||||
width: 141px;
|
||||
@@ -1684,6 +1724,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_snowy_village {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_snowy_village.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_south_pole {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_south_pole.png');
|
||||
width: 141px;
|
||||
@@ -1714,6 +1759,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spooky_ruins {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_spooky_ruins.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_spooky_scarecrow_field {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_spooky_scarecrow_field.png');
|
||||
width: 141px;
|
||||
@@ -2080,6 +2130,11 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.icon_background_among_giant_mushrooms {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_among_giant_mushrooms.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_animal_clouds {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_animal_clouds.png');
|
||||
width: 68px;
|
||||
@@ -2120,6 +2175,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_autumn_bridge {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_autumn_bridge.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_autumn_flower_garden {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_autumn_flower_garden.png');
|
||||
width: 68px;
|
||||
@@ -2246,6 +2306,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_branches_of_a_holiday_tree {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_branches_of_a_holiday_tree.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_brick_wall_with_ivy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_brick_wall_with_ivy.png');
|
||||
width: 68px;
|
||||
@@ -2286,6 +2351,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_cemetery_gate {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_cemetery_gate.png');
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.icon_background_champions_colosseum {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_champions_colosseum.png');
|
||||
width: 68px;
|
||||
@@ -2865,6 +2935,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_inside_a_crystal {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_inside_a_crystal.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_inside_a_potion_bottle {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_inside_a_potion_bottle.png');
|
||||
width: 68px;
|
||||
@@ -2935,6 +3010,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_mask_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_mask_makers_workshop.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_meandering_cave {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_meandering_cave.png');
|
||||
width: 68px;
|
||||
@@ -2980,6 +3060,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_misty_autumn_forest {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_misty_autumn_forest.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_monster_makers_workshop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_monster_makers_workshop.png');
|
||||
width: 68px;
|
||||
@@ -3260,6 +3345,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_snowy_village {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_snowy_village.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_south_pole {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_south_pole.png');
|
||||
width: 68px;
|
||||
@@ -3290,6 +3380,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_spooky_ruins {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_spooky_ruins.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_spooky_scarecrow_field {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_spooky_scarecrow_field.png');
|
||||
width: 68px;
|
||||
@@ -18340,6 +18435,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_jewelersApron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_jewelersApron.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_lamplightersGreatcoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_lamplightersGreatcoat.png');
|
||||
width: 114px;
|
||||
@@ -18450,6 +18550,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_sheetGhostCostume {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_sheetGhostCostume.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_shepherdRobes {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_shepherdRobes.png');
|
||||
width: 90px;
|
||||
@@ -18550,6 +18655,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.eyewear_armoire_jewelersEyeLoupe {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_armoire_jewelersEyeLoupe.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.eyewear_armoire_plagueDoctorMask {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_armoire_plagueDoctorMask.png');
|
||||
width: 90px;
|
||||
@@ -19025,6 +19135,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_bubblingCauldron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_bubblingCauldron.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_chocolateFood {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_chocolateFood.png');
|
||||
width: 90px;
|
||||
@@ -19125,6 +19240,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_jewelersPliers {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_jewelersPliers.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_lifeBuoy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_lifeBuoy.png');
|
||||
width: 114px;
|
||||
@@ -19550,6 +19670,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_jewelersApron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_jewelersApron.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_lamplightersGreatcoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_lamplightersGreatcoat.png');
|
||||
width: 68px;
|
||||
@@ -19660,6 +19785,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_sheetGhostCostume {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_sheetGhostCostume.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_shepherdRobes {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_shepherdRobes.png');
|
||||
width: 68px;
|
||||
@@ -19775,6 +19905,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_eyewear_armoire_jewelersEyeLoupe {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_armoire_jewelersEyeLoupe.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_eyewear_armoire_plagueDoctorMask {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_armoire_plagueDoctorMask.png');
|
||||
width: 68px;
|
||||
@@ -20250,6 +20385,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_bubblingCauldron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_bubblingCauldron.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_chocolateFood {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_chocolateFood.png');
|
||||
width: 68px;
|
||||
@@ -20350,6 +20490,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_jewelersPliers {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_jewelersPliers.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_shield_armoire_lifeBuoy {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_shield_armoire_lifeBuoy.png');
|
||||
width: 68px;
|
||||
@@ -20675,6 +20820,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_finelyCutGem {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_finelyCutGem.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_floridFan {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_floridFan.png');
|
||||
width: 68px;
|
||||
@@ -20790,6 +20940,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_magicSpatula {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_magicSpatula.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_armoire_magnifyingGlass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_armoire_magnifyingGlass.png');
|
||||
width: 68px;
|
||||
@@ -21225,6 +21380,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_jewelersApron {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_jewelersApron.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_lamplightersGreatcoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_lamplightersGreatcoat.png');
|
||||
width: 114px;
|
||||
@@ -21335,6 +21495,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_sheetGhostCostume {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_sheetGhostCostume.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_shepherdRobes {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_shepherdRobes.png');
|
||||
width: 90px;
|
||||
@@ -21550,6 +21715,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_finelyCutGem {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_finelyCutGem.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_floridFan {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_floridFan.png');
|
||||
width: 114px;
|
||||
@@ -21665,6 +21835,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_magicSpatula {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_magicSpatula.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_magnifyingGlass {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_magnifyingGlass.png');
|
||||
width: 114px;
|
||||
@@ -27260,6 +27435,101 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202210.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.head_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202210.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.shop_armor_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_mystery_202210.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_mystery_202210.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_set_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202210.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.slim_armor_mystery_202210 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202210.png');
|
||||
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_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202212.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.headAccessory_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/headAccessory_mystery_202212.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shop_armor_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_headAccessory_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_headAccessory_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_set_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_weapon_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_weapon_mystery_202212.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.slim_armor_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202212.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_mystery_202212 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202212.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;
|
||||
|
||||
@@ -180,8 +180,8 @@ input, textarea, input.form-control, textarea.form-control {
|
||||
}
|
||||
|
||||
// used in checkboxes and radios
|
||||
$bg-focused-active-control: #4f2993;
|
||||
$bg-disabled-control: #34303a;
|
||||
$bg-focused-active-control: $purple-200;
|
||||
$bg-disabled-control: $gray-10;
|
||||
|
||||
// custom control
|
||||
.custom-control {
|
||||
@@ -231,17 +231,21 @@ $bg-disabled-control: #34303a;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
&:focus:not(:checked):not(:disabled)~.custom-control-label::before, &:active:not(:checked):not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-focused-active-control, 0.1);
|
||||
&:focus:not(:checked):not(:disabled)~.custom-control-label::before,
|
||||
&:active:not(:checked):not(:disabled)~.custom-control-label::before {
|
||||
border: 2px solid $gray-300;
|
||||
box-shadow: 0 0 0 2px rgba(146, 92, 243, 0.5);
|
||||
}
|
||||
|
||||
&:focus:checked:not(:disabled)~.custom-control-label::before, &:active:checked:not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-focused-active-control, 0.1);
|
||||
border-color: $purple-400;
|
||||
&:focus:checked:not(:disabled)~.custom-control-label::before,
|
||||
&:active:checked:not(:disabled)~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 2px rgba(146, 92, 243, 0.5);
|
||||
border-color: 2 px solid $purple-400;
|
||||
background-color: $purple-400;
|
||||
}
|
||||
|
||||
&:focus:disabled~.custom-control-label::before, &:active:disabled~.custom-control-label::before {
|
||||
&:focus:disabled~.custom-control-label::before,
|
||||
&:active:disabled~.custom-control-label::before {
|
||||
box-shadow: 0 0 0 6px rgba($bg-disabled-control, 0.1);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="13" height="10" viewBox="0 0 13 10">
|
||||
<path fill-rule="evenodd" d="M4.662 9.832c-.312 0-.61-.123-.831-.344L0 5.657l1.662-1.662 2.934 2.934L10.534 0l1.785 1.529-6.764 7.893a1.182 1.182 0 0 1-.848.409l-.045.001"/>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
|
||||
<path d="M6.54,13c-.3,0-.59-.13-.81-.35l-3.73-3.9,1.62-1.69,2.86,2.98L12.26,3l1.74,1.56L7.41,12.58c-.21,.25-.51,.4-.83,.42-.01,0-.03,0-.04,0Z" fill-rule="evenodd"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 236 B |
@@ -0,0 +1,10 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path fill="#DE3F3F" d="M0 5.667 3.333 1h9.334L16 5.667l-8 8.666z"/>
|
||||
<path fill="#FFF" opacity=".25" d="M4.667 5.533 4 2.333h4zM11.333 5.533l.667-3.2H8z"/>
|
||||
<path fill="#FFF" opacity=".5" d="M4.667 5.533 8 2.333l3.333 3.2zM1.733 5.533 4 2.333l.667 3.2z"/>
|
||||
<path fill="#34313A" opacity=".11" d="M14.267 5.533 12 2.333l-.667 3.2zM1.733 5.533h2.934L8 12.4z"/>
|
||||
<path fill="#FFF" opacity=".5" d="M14.267 5.533h-2.934L8 12.4z"/>
|
||||
<path fill="#FFF" opacity=".25" d="M4.667 5.533h6.666L8 12.4z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 675 B |
@@ -0,0 +1,10 @@
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
|
||||
<g fill="none" fill-rule="evenodd">
|
||||
<path d="M3 12.606v1.778c0 .208.093.408.262.53 1.842 1.347 6.923 1.347 8.766 0a.655.655 0 0 0 .26-.53v-1.778c0-1.621-.831-3.177-2.091-4.104a.666.666 0 0 1 0-1.08c1.26-.927 2.092-2.483 2.092-4.105V1.54a.652.652 0 0 0-.261-.53c-1.843-1.346-6.924-1.346-8.766 0A.65.65 0 0 0 3 1.54v1.777c0 1.622.832 3.178 2.092 4.105.368.27.368.81 0 1.08C3.832 9.429 3 10.985 3 12.606" fill="#F19595"/>
|
||||
<path d="M7.644 1.327c1.51 0 2.684.274 3.318.587v1.403c0 1.169-.594 2.332-1.551 3.036a2.006 2.006 0 0 0-.818 1.609c0 .63.305 1.232.817 1.608.958.705 1.552 1.868 1.552 3.036v1.404c-.634.313-1.809.587-3.318.587-1.508 0-2.683-.274-3.317-.587v-1.404c0-1.168.594-2.331 1.551-3.035.513-.377.817-.978.817-1.609 0-.63-.304-1.232-.816-1.609-.958-.704-1.552-1.867-1.552-3.036V1.914c.634-.313 1.809-.587 3.317-.587" fill-opacity=".9" fill="#FFF"/>
|
||||
<path d="M7.797 2.324c-1.132 0-2.331.105-2.343.385-.01.226-.005.664.914 1.13.893.453 1.06 1.282 1.546 1.282.564 0 .596-.477 1.284-.95.71-.488.823-1.148.815-1.408-.011-.363-1.084-.439-2.216-.439" fill="#DE3F3F"/>
|
||||
<path d="M9.198 4.17c.71-.487.823-1.146.815-1.407-.009-.288-.684-.395-1.526-.427.236.12.543.377.467.88-.078.525-.904 1.105-.77 1.568.025.09.069.162.124.221.247-.17.408-.502.89-.835" fill="#B01515"/>
|
||||
<path d="M7.644 9.17c-.344 0-.433.628-.933 1.018-.613.478-1.196 1.067-1.356 1.914-.131.698-.012.785.148.834.16.049 1.386.257 2.588 0 1.203-.258 1.87-.737 1.755-1.227-.111-.466-.448-.865-1.068-1.325-.593-.44-.79-1.214-1.134-1.214" fill="#DE3F3F"/>
|
||||
<path d="M5.503 12.936c.16.05 1.386.257 2.588 0 .956-.205 1.574-.55 1.729-.929a.096.096 0 0 0-.005-.023c-.067-.256-1.073-.41-2.325-.207-1.192.192-2.158.586-2.153 1.03.037.08.097.108.166.129" fill="#B01515"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -22,11 +22,6 @@
|
||||
Account created:
|
||||
<strong>{{ hero.auth.timestamps.created | formatDate }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Most recent cron:
|
||||
<strong>{{ hero.auth.timestamps.loggedin | formatDate }}</strong>
|
||||
("auth.timestamps.loggedin")
|
||||
</div>
|
||||
<div v-if="cronError">
|
||||
"lastCron" value:
|
||||
<strong>{{ hero.lastCron | formatDate }}</strong>
|
||||
@@ -36,6 +31,19 @@
|
||||
("auth.timestamps.loggedin" and "lastCron" dates are different).
|
||||
</span>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<div>
|
||||
Most recent cron:
|
||||
<strong>{{ hero.auth.timestamps.loggedin | formatDate }}</strong>
|
||||
("auth.timestamps.loggedin")
|
||||
</div>
|
||||
<button
|
||||
class="btn btn-primary ml-2"
|
||||
@click="resetCron()"
|
||||
>
|
||||
Reset Cron to Yesterday
|
||||
</button>
|
||||
</div>
|
||||
<div class="subsection-start">
|
||||
Time zone:
|
||||
<strong>{{ hero.preferences.timezoneOffset | formatTimeZone }}</strong>
|
||||
@@ -218,6 +226,10 @@ export default {
|
||||
await this.saveHero({ hero: this.hero, msg: 'API Token' });
|
||||
this.tokenModified = true;
|
||||
},
|
||||
resetCron () {
|
||||
this.hero.resetCron = true;
|
||||
this.saveHero({ hero: this.hero, msg: 'Last Cron', clearData: true });
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
:reset-counter="resetCounter"
|
||||
/>
|
||||
|
||||
<subscription-and-perks
|
||||
:hero="hero"
|
||||
/>
|
||||
|
||||
<cron-and-auth
|
||||
:hero="hero"
|
||||
:reset-counter="resetCounter"
|
||||
@@ -45,6 +49,7 @@
|
||||
|
||||
<transactions
|
||||
:hero="hero"
|
||||
:reset-counter="resetCounter"
|
||||
/>
|
||||
|
||||
<contributor-details
|
||||
@@ -97,6 +102,7 @@ import AvatarAndDrops from './avatarAndDrops';
|
||||
import PrivilegesAndGems from './privilegesAndGems';
|
||||
import ContributorDetails from './contributorDetails';
|
||||
import Transactions from './transactions';
|
||||
import SubscriptionAndPerks from './subscriptionAndPerks';
|
||||
|
||||
import { userStateMixin } from '../../../mixins/userState';
|
||||
|
||||
@@ -110,6 +116,7 @@ export default {
|
||||
PrivilegesAndGems,
|
||||
ContributorDetails,
|
||||
Transactions,
|
||||
SubscriptionAndPerks,
|
||||
},
|
||||
mixins: [userStateMixin],
|
||||
data () {
|
||||
|
||||
@@ -40,6 +40,11 @@
|
||||
v-model="hero.auth.blocked"
|
||||
type="checkbox"
|
||||
> Ban / Block
|
||||
<p>
|
||||
<small>
|
||||
Banning a user also auto-hides all their guild posts.
|
||||
</small>
|
||||
</p>
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
|
||||
@@ -0,0 +1,155 @@
|
||||
<template>
|
||||
<div class="accordion-group">
|
||||
<h3
|
||||
class="expand-toggle"
|
||||
:class="{'open': expand}"
|
||||
@click="expand = !expand"
|
||||
>
|
||||
Subscription, Monthly Perks
|
||||
</h3>
|
||||
<div v-if="expand">
|
||||
<form @submit.prevent="saveHero({ hero, msg: 'Subscription Perks' })">
|
||||
<div v-if="hero.purchased.plan.paymentMethod">
|
||||
Payment method:
|
||||
<strong>{{ hero.purchased.plan.paymentMethod }}</strong>
|
||||
</div>
|
||||
<div v-if="hero.purchased.plan.planId">
|
||||
Payment schedule ("basic-earned" is monthly):
|
||||
<strong>{{ hero.purchased.plan.planId }}</strong>
|
||||
</div>
|
||||
<div v-if="hero.purchased.plan.dateCreated">
|
||||
Creation date:
|
||||
<strong>{{ dateFormat(hero.purchased.plan.dateCreated) }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Termination date:
|
||||
<strong
|
||||
v-if="hero.purchased.plan.dateTerminated"
|
||||
>
|
||||
{{ dateFormat(hero.purchased.plan.dateTerminated) }}
|
||||
</strong>
|
||||
<strong v-else> None </strong>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<label>
|
||||
Consecutive months:
|
||||
<input
|
||||
v-model="hero.purchased.plan.consecutive.count"
|
||||
class="form-control"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
Months until renewal:
|
||||
<strong>{{ hero.purchased.plan.consecutive.offset }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Next Mystic Hourglass:
|
||||
<strong>{{ nextHourglassDate }}</strong>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<label>
|
||||
Mystic Hourglasses:
|
||||
<input
|
||||
v-model="hero.purchased.plan.consecutive.trinkets"
|
||||
class="form-control"
|
||||
type="number"
|
||||
min="0"
|
||||
step="1"
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
Gem cap:
|
||||
<strong>{{ hero.purchased.plan.consecutive.gemCapExtra + 25 }}</strong>
|
||||
</div>
|
||||
<div class="form-inline">
|
||||
<label>
|
||||
Gems bought this month:
|
||||
<input
|
||||
v-model="hero.purchased.plan.gemsBought"
|
||||
class="form-control"
|
||||
type="number"
|
||||
min="0"
|
||||
:max="hero.purchased.plan.consecutive.gemCapExtra + 25"
|
||||
step="1"
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
<div
|
||||
v-if="hero.purchased.plan.extraMonths > 0"
|
||||
>
|
||||
Additional credit (applied upon cancellation):
|
||||
<strong>{{ hero.purchased.plan.extraMonths }}</strong>
|
||||
</div>
|
||||
<div>
|
||||
Mystery Items:
|
||||
<span
|
||||
v-if="hero.purchased.plan.mysteryItems.length > 0"
|
||||
>
|
||||
<span
|
||||
v-for="(item, index) in hero.purchased.plan.mysteryItems"
|
||||
:key="index"
|
||||
>
|
||||
<strong v-if="index < hero.purchased.plan.mysteryItems.length - 1">
|
||||
{{ item }},
|
||||
</strong>
|
||||
<strong v-else> {{ item }} </strong>
|
||||
</span>
|
||||
</span>
|
||||
<span v-else>
|
||||
<strong>None</strong>
|
||||
</span>
|
||||
</div>
|
||||
<input
|
||||
type="submit"
|
||||
value="Save"
|
||||
class="btn btn-primary mt-1"
|
||||
>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import saveHero from '../mixins/saveHero';
|
||||
import { getPlanContext } from '@/../../common/script/cron';
|
||||
|
||||
export default {
|
||||
mixins: [saveHero],
|
||||
props: {
|
||||
hero: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
expand: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
nextHourglassDate () {
|
||||
const currentPlanContext = getPlanContext(this.hero, new Date());
|
||||
|
||||
return currentPlanContext.nextHourglassDate.format('MMMM');
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
'hero.purchased.plan.consecutive.count' () { // eslint-disable-line object-shorthand
|
||||
this.hero.purchased.plan.consecutive.gemCapExtra = Math.min(
|
||||
Math.floor(this.hero.purchased.plan.consecutive.count / 3) * 5, 25,
|
||||
);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
dateFormat (date) {
|
||||
return moment(date).format('YYYY/MM/DD');
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -30,6 +30,10 @@ export default {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
resetCounter: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
@@ -38,6 +42,14 @@ export default {
|
||||
hourglassTransactions: [],
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
resetCounter () {
|
||||
if (this.expand) {
|
||||
this.expand = !this.expand;
|
||||
this.toggleTransactionsOpen();
|
||||
}
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async toggleTransactionsOpen () {
|
||||
this.expand = !this.expand;
|
||||
|
||||
@@ -280,6 +280,7 @@ import markdownDirective from '@/directives/markdown';
|
||||
import { userStateMixin } from '../../mixins/userState';
|
||||
|
||||
import { TAVERN_ID, MIN_SHORTNAME_SIZE_FOR_CHALLENGES, MAX_SUMMARY_SIZE_FOR_CHALLENGES } from '@/../../common/script/constants';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
export default {
|
||||
directives: {
|
||||
@@ -288,64 +289,7 @@ export default {
|
||||
mixins: [userStateMixin],
|
||||
props: ['groupId'],
|
||||
data () {
|
||||
const categoryOptions = [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'self_improvement',
|
||||
key: 'self_improvement',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
];
|
||||
const categoryOptions = CategoryOptions;
|
||||
const hashedCategories = {};
|
||||
categoryOptions.forEach(category => {
|
||||
hashedCategories[category.key] = category.label;
|
||||
|
||||
@@ -89,70 +89,14 @@
|
||||
import throttle from 'lodash/throttle';
|
||||
import FilterSidebar from '@/components/ui/filterSidebar';
|
||||
import FilterGroup from '@/components/ui/filterGroup';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
export default {
|
||||
components: { FilterGroup, FilterSidebar },
|
||||
data () {
|
||||
return {
|
||||
categoryFilters: [],
|
||||
categoryOptions: [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'self_improvement',
|
||||
key: 'self_improvement',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
],
|
||||
categoryOptions: CategoryOptions,
|
||||
membershipFilters: [],
|
||||
membershipOptions: [
|
||||
{
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
<!-- THIS IS A VERY OLD FILE DO NOT USE -->
|
||||
<template>
|
||||
<div class="create-group-modal-pages">
|
||||
<div
|
||||
|
||||
@@ -0,0 +1,356 @@
|
||||
<template>
|
||||
<b-modal
|
||||
id="create-group"
|
||||
:title="activePage === PAGES.CREATE_GROUP ? 'Create your Group' : 'Select Payment'"
|
||||
:hide-footer="true"
|
||||
:hide-header="true"
|
||||
size="md"
|
||||
@hide="onHide()"
|
||||
>
|
||||
<div
|
||||
v-if="activePage === PAGES.CREATE_GROUP"
|
||||
class="col-12"
|
||||
>
|
||||
<!-- HEADER -->
|
||||
<div
|
||||
class="modal-close"
|
||||
>
|
||||
<span
|
||||
class="cancel-text"
|
||||
@click="close()"
|
||||
>
|
||||
{{ $t('cancel') }}
|
||||
</span>
|
||||
<button
|
||||
class="btn btn-primary next-button"
|
||||
:value="$t('next')"
|
||||
:disabled="!newGroupIsReady"
|
||||
@click="createGroup()"
|
||||
>
|
||||
{{ $t('next') }}
|
||||
</button>
|
||||
</div>
|
||||
<h2>{{ $t('createGroup') }}</h2>
|
||||
|
||||
<!-- FORM -->
|
||||
<div class="form-group">
|
||||
<lockable-label
|
||||
:text="$t('nameStar')"
|
||||
/>
|
||||
<input
|
||||
id="new-group-name"
|
||||
v-model="newGroup.name"
|
||||
class="form-control input-medium option-content name-input"
|
||||
required="required"
|
||||
type="text"
|
||||
:placeholder="$t('nameStarText')"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<lockable-label
|
||||
for="new-group-description"
|
||||
:text="$t('descriptionOptional')"
|
||||
class="description-label"
|
||||
/>
|
||||
<div class="characters-remaining">
|
||||
{{ $t('charactersRemaining', {characters: charactersRemaining}) }}
|
||||
</div>
|
||||
<textarea
|
||||
id="new-group-description"
|
||||
v-model="newGroup.description"
|
||||
class="form-control option-content description-input"
|
||||
cols="3"
|
||||
:placeholder="$t('descriptionOptionalText')"
|
||||
maxlength="250"
|
||||
></textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input
|
||||
id="create-group-leaderOnlyChallenges-checkbox"
|
||||
v-model="newGroup.leaderOnly.challenges"
|
||||
class="custom-control-input"
|
||||
type="checkbox"
|
||||
>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
for="create-group-leaderOnlyChallenges-checkbox"
|
||||
>{{ $t('leaderOnlyChallenges') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<lockable-label
|
||||
:text="$t('groupUse')"
|
||||
/>
|
||||
<select-translated-array
|
||||
:items="[
|
||||
'groupParentChildren',
|
||||
'groupCouple',
|
||||
'groupFriends',
|
||||
'groupCoworkers',
|
||||
'groupManager',
|
||||
'groupTeacher'
|
||||
]"
|
||||
class="group-input"
|
||||
:placeholder="'groupUseDefault'"
|
||||
:value="newGroup.demographics"
|
||||
@select="newGroup.demographics = $event"
|
||||
/>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button
|
||||
class="btn btn-primary btn-lg btn-block btn-payment"
|
||||
:disabled="!newGroupIsReady"
|
||||
@click="createGroup()"
|
||||
>
|
||||
{{ $t('nextPaymentMethod') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- PAYMENT -->
|
||||
<!-- @TODO: Separate payment into a separate modal -->
|
||||
<div
|
||||
v-if="activePage === PAGES.PAY"
|
||||
class="col-12 payments"
|
||||
>
|
||||
<div class="text-center">
|
||||
<payments-buttons
|
||||
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
|
||||
:amazon-data="pay(PAYMENTS.AMAZON)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
h2 {
|
||||
color: $purple-300;
|
||||
font-size: 1.25rem;
|
||||
height: 28px;
|
||||
width: 120px;
|
||||
margin-top: 24px;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.cancel-text {
|
||||
color: $blue-10;
|
||||
font-size: 0.875rem;
|
||||
margin-right: 16px;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
.next-button {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.form-control::placeholder {
|
||||
color: $gray-50;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
.description-label {
|
||||
margin-bottom: -24px;
|
||||
}
|
||||
|
||||
.name-input, .description-input, .group-input {
|
||||
margin-top: -4px;
|
||||
}
|
||||
|
||||
.characters-remaining {
|
||||
color: $gray-100;
|
||||
font-size: 0.75rem;
|
||||
line-height: 1.33;
|
||||
text-align: right;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.description-input {
|
||||
height: 56px;
|
||||
}
|
||||
|
||||
.spacer {
|
||||
margin-bottom: 16px !important;
|
||||
}
|
||||
|
||||
.btn-payment {
|
||||
margin: 24px 112px 24px 112px;
|
||||
width: 177px;
|
||||
}
|
||||
|
||||
.payments {
|
||||
padding: 24px;
|
||||
}
|
||||
|
||||
.payment-options {
|
||||
margin-bottom: 4em;
|
||||
|
||||
.purple-box {
|
||||
background-color: #4f2a93;
|
||||
color: #fff;
|
||||
padding: .5em;
|
||||
border-radius: 8px;
|
||||
width: 200px;
|
||||
height: 215px;
|
||||
|
||||
.dollar {
|
||||
}
|
||||
|
||||
.number {
|
||||
font-size: 60px;
|
||||
}
|
||||
|
||||
.name {
|
||||
width: 100px;
|
||||
margin-left: .3em;
|
||||
}
|
||||
|
||||
div {
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
.box, .purple-box {
|
||||
display: inline-block;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
<style lang="scss">
|
||||
@import '~@/assets/scss/mixins.scss';
|
||||
#create-group {
|
||||
.modal-dialog {
|
||||
max-width: 448px;
|
||||
}
|
||||
.modal-content {
|
||||
width: 448px;
|
||||
max-height: 436px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 14px 28px 0 rgba(26, 24, 29, 0.24), 0 10px 10px 0 rgba(26, 24, 29, 0.28);
|
||||
}
|
||||
.modal-body{
|
||||
padding: 0px;
|
||||
margin-left: 12px;
|
||||
margin-right: 12px;
|
||||
}
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
right: 16px;
|
||||
cursor: pointer;
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import paymentsMixin from '../../mixins/payments';
|
||||
import { mapState } from '@/libs/store';
|
||||
import paymentsButtons from '@/components/payments/buttons/list';
|
||||
import selectTranslatedArray from '@/components/tasks/modal-controls/selectTranslatedArray';
|
||||
import lockableLabel from '@/components/tasks/modal-controls/lockableLabel';
|
||||
import * as Analytics from '@/libs/analytics';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
paymentsButtons,
|
||||
selectTranslatedArray,
|
||||
lockableLabel,
|
||||
},
|
||||
mixins: [paymentsMixin],
|
||||
data () {
|
||||
return {
|
||||
amazonPayments: {},
|
||||
PAGES: {
|
||||
CREATE_GROUP: 'create-group',
|
||||
// UPGRADE_GROUP: 'upgrade-group',
|
||||
PAY: 'pay',
|
||||
},
|
||||
PAYMENTS: {
|
||||
AMAZON: 'amazon',
|
||||
STRIPE: 'stripe',
|
||||
},
|
||||
paymentMethod: '',
|
||||
newGroup: {
|
||||
type: 'guild',
|
||||
privacy: 'private',
|
||||
name: '',
|
||||
description: '',
|
||||
leaderOnly: {
|
||||
challenges: false,
|
||||
},
|
||||
demographics: null,
|
||||
user: '',
|
||||
},
|
||||
activePage: 'create-group',
|
||||
type: 'guild',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data' }),
|
||||
newGroupIsReady () {
|
||||
return Boolean(this.newGroup.name) && Boolean(this.newGroup.demographics);
|
||||
},
|
||||
charactersRemaining () {
|
||||
const currentLength = this.newGroup.description ? this.newGroup.description.length : 0;
|
||||
return 250 - currentLength;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
close () {
|
||||
this.$root.$emit('bv::hide::modal', 'create-group');
|
||||
},
|
||||
changePage (page) {
|
||||
this.activePage = page;
|
||||
},
|
||||
createGroup () {
|
||||
this.changePage(this.PAGES.PAY);
|
||||
},
|
||||
pay (paymentMethod) {
|
||||
const subscriptionKey = 'group_monthly'; // @TODO: Get from content API?
|
||||
const demographicsKey = this.newGroup.demographics;
|
||||
const paymentData = {
|
||||
subscription: subscriptionKey,
|
||||
coupon: null,
|
||||
demographics: demographicsKey,
|
||||
};
|
||||
|
||||
Analytics.track({
|
||||
hitType: 'event',
|
||||
eventName: 'group plan create',
|
||||
eventAction: 'group plan create',
|
||||
eventCategory: 'behavior',
|
||||
demographics: this.newGroup.demographics,
|
||||
type: this.newGroup.type,
|
||||
}, { trackOnClient: true });
|
||||
|
||||
if (this.upgradingGroup && this.upgradingGroup._id) {
|
||||
paymentData.groupId = this.upgradingGroup._id;
|
||||
paymentData.group = this.upgradingGroup;
|
||||
} else {
|
||||
paymentData.groupToCreate = this.newGroup;
|
||||
}
|
||||
|
||||
this.paymentMethod = paymentMethod;
|
||||
|
||||
if (this.paymentMethod === this.PAYMENTS.AMAZON) {
|
||||
paymentData.type = 'subscription';
|
||||
return paymentData;
|
||||
}
|
||||
|
||||
if (this.paymentMethod === this.PAYMENTS.STRIPE) {
|
||||
this.redirectToStripe(paymentData);
|
||||
}
|
||||
|
||||
return null;
|
||||
},
|
||||
|
||||
onHide () {
|
||||
this.sendingInProgress = false;
|
||||
},
|
||||
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -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;
|
||||
|
||||
@@ -379,6 +379,7 @@ import informationIcon from '@/assets/svg/information.svg';
|
||||
|
||||
import { MAX_SUMMARY_SIZE_FOR_GUILDS } from '@/../../common/script/constants';
|
||||
import { userStateMixin } from '../../mixins/userState';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
// @TODO: Not sure the best way to pass party creating status
|
||||
// Since we need the modal in the header, passing props doesn't work
|
||||
@@ -410,64 +411,7 @@ export default {
|
||||
allowGuildInvitationsFromNonMembers: true,
|
||||
bannedWordsAllowed: null,
|
||||
},
|
||||
categoryOptions: [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'recovery_support_groups',
|
||||
key: 'recovery_support_groups',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
],
|
||||
categoryOptions: CategoryOptions,
|
||||
showCategorySelect: false,
|
||||
members: [],
|
||||
inviteMembers: false,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<template>
|
||||
<!-- @TODO: Move to group plans folder-->
|
||||
<div>
|
||||
<group-plan-creation-modal />
|
||||
<div>
|
||||
<div class="header">
|
||||
<h1 class="text-center">
|
||||
@@ -51,6 +52,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Upgrading an existing group -->
|
||||
<div
|
||||
v-if="upgradingGroup._id"
|
||||
id="upgrading-group"
|
||||
@@ -100,153 +102,53 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Create a new group -->
|
||||
<div
|
||||
v-if="!upgradingGroup._id"
|
||||
class="container col-6 offset-3 create-option"
|
||||
>
|
||||
<div class="row">
|
||||
<h1 class="col-12 text-center purple-header">
|
||||
Create your Group today!
|
||||
Create Your Group Today!
|
||||
</h1>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 text-center">
|
||||
<button
|
||||
class="btn btn-primary create-group"
|
||||
@click="launchModal('create')"
|
||||
@click="launchModal('create-page')"
|
||||
>
|
||||
Create Your New Group
|
||||
Create Your New Group!
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row pricing">
|
||||
<div class="col-5">
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="number">
|
||||
9
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Group Owner</div>
|
||||
<div>Subscription</div>
|
||||
</div>
|
||||
<div class="row pricing justify-content-center align-items-center">
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="col-1">
|
||||
<div class="plus">
|
||||
+
|
||||
</div>
|
||||
<div class="number">
|
||||
9
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="number">
|
||||
3
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Each Additional</div>
|
||||
<div>Member</div>
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Group Owner</div>
|
||||
<div>Subscription</div>
|
||||
</div>
|
||||
<div class="plus">
|
||||
+
|
||||
</div>
|
||||
<div class="dollar">
|
||||
$
|
||||
</div>
|
||||
<div class="number">
|
||||
3
|
||||
</div>
|
||||
<div class="name">
|
||||
<div>Each Additional</div>
|
||||
<div>Member</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<b-modal
|
||||
id="group-plan-modal"
|
||||
:title="activePage === PAGES.CREATE_GROUP ? 'Create your Group' : 'Select Payment'"
|
||||
size="md"
|
||||
hide-footer="hide-footer"
|
||||
>
|
||||
<div
|
||||
v-if="activePage === PAGES.CREATE_GROUP"
|
||||
class="col-12"
|
||||
>
|
||||
<div class="form-group">
|
||||
<label
|
||||
class="control-label"
|
||||
for="new-group-name"
|
||||
>Name</label>
|
||||
<input
|
||||
id="new-group-name"
|
||||
v-model="newGroup.name"
|
||||
class="form-control input-medium option-content"
|
||||
required="required"
|
||||
type="text"
|
||||
placeholder="Name"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="new-group-description">{{ $t('description') }}</label>
|
||||
<textarea
|
||||
id="new-group-description"
|
||||
v-model="newGroup.description"
|
||||
class="form-control option-content"
|
||||
cols="3"
|
||||
:placeholder="$t('description')"
|
||||
></textarea>
|
||||
</div>
|
||||
<div
|
||||
v-if="type === 'guild'"
|
||||
class="form-group"
|
||||
>
|
||||
<div class="custom-control custom-radio">
|
||||
<input
|
||||
v-model="newGroup.privacy"
|
||||
class="custom-control-input"
|
||||
type="radio"
|
||||
name="new-group-privacy"
|
||||
value="private"
|
||||
>
|
||||
<label class="custom-control-label">{{ $t('inviteOnly') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="custom-control custom-checkbox">
|
||||
<input
|
||||
id="create-group-leaderOnlyChallenges-checkbox"
|
||||
v-model="newGroup.leaderOnly.challenges"
|
||||
class="custom-control-input"
|
||||
type="checkbox"
|
||||
>
|
||||
<label
|
||||
class="custom-control-label"
|
||||
for="create-group-leaderOnlyChallenges-checkbox"
|
||||
>{{ $t('leaderOnlyChallenges') }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="type === 'party'"
|
||||
class="form-group"
|
||||
>
|
||||
<button
|
||||
class="btn btn-secondary form-control"
|
||||
:value="$t('create')"
|
||||
@click="createGroup()"
|
||||
></button>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<button
|
||||
class="btn btn-primary btn-lg btn-block"
|
||||
:disabled="!newGroupIsReady"
|
||||
@click="createGroup()"
|
||||
>
|
||||
{{ $t('create') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="activePage === PAGES.PAY"
|
||||
class="col-12"
|
||||
>
|
||||
<div class="text-center">
|
||||
<payments-buttons
|
||||
:stripe-fn="() => pay(PAYMENTS.STRIPE)"
|
||||
:amazon-data="pay(PAYMENTS.AMAZON)"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -258,8 +160,8 @@
|
||||
|
||||
.dollar {
|
||||
position: absolute;
|
||||
left: -1em;
|
||||
top: 1em;
|
||||
left: -16px;
|
||||
top: 16px;
|
||||
}
|
||||
|
||||
.purple-box {
|
||||
@@ -291,9 +193,9 @@
|
||||
background: #432874;
|
||||
background: linear-gradient(180deg, #4F2A93 0%, #432874 100%);
|
||||
color: #fff;
|
||||
padding: 2em;
|
||||
padding: 32px;
|
||||
height: 340px;
|
||||
margin-bottom: 2em;
|
||||
margin-bottom: 32px;
|
||||
margin-left: -12px;
|
||||
margin-right: -12px;
|
||||
|
||||
@@ -317,6 +219,7 @@
|
||||
|
||||
.box {
|
||||
height: 416px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
@@ -359,17 +262,19 @@
|
||||
button.create-group {
|
||||
width: 330px;
|
||||
height: 96px;
|
||||
border-radius: 8px;
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.purple-header {
|
||||
color: #6133b4;
|
||||
font-size: 48px;
|
||||
margin-top: 1em;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.pricing {
|
||||
margin-top: 2em;
|
||||
margin-bottom: 4em;
|
||||
margin-top: 32px;
|
||||
margin-bottom: 64px;
|
||||
|
||||
.dollar, .number, .name {
|
||||
display: inline-block;
|
||||
@@ -378,30 +283,32 @@
|
||||
}
|
||||
|
||||
.plus {
|
||||
font-size: 34px;
|
||||
font-size: 2.125rem;
|
||||
color: #a5a1ac;
|
||||
margin-left: 16px;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
.dollar {
|
||||
margin-bottom: 1.5em;
|
||||
font-size: 32px;
|
||||
margin-bottom: 24px;
|
||||
font-size: 2rem;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.name {
|
||||
font-size: 24px;
|
||||
margin-bottom: .8em;
|
||||
margin-left: .5em;
|
||||
font-size: 1.5rem;
|
||||
margin-left: 8px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.number {
|
||||
font-size: 72px;
|
||||
font-size: 4.5rem;
|
||||
font-weight: bolder;
|
||||
}
|
||||
}
|
||||
|
||||
.payment-options {
|
||||
margin-bottom: 4em;
|
||||
margin-bottom: 64px;
|
||||
|
||||
h4 {
|
||||
color: #34313a;
|
||||
@@ -410,7 +317,7 @@
|
||||
.purple-box {
|
||||
background-color: #4f2a93;
|
||||
color: #fff;
|
||||
padding: .5em;
|
||||
padding: 8px;
|
||||
border-radius: 8px;
|
||||
width: 200px;
|
||||
height: 215px;
|
||||
@@ -424,7 +331,7 @@
|
||||
|
||||
.name {
|
||||
width: 100px;
|
||||
margin-left: .3em;
|
||||
margin-left: 4.8px;
|
||||
}
|
||||
|
||||
.plus {
|
||||
@@ -449,10 +356,12 @@ import paymentsMixin from '../../mixins/payments';
|
||||
import { mapState } from '@/libs/store';
|
||||
import positiveIcon from '@/assets/svg/positive.svg';
|
||||
import paymentsButtons from '@/components/payments/buttons/list';
|
||||
import groupPlanCreationModal from '../group-plans/groupPlanCreationModal';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
paymentsButtons,
|
||||
groupPlanCreationModal,
|
||||
},
|
||||
mixins: [paymentsMixin],
|
||||
data () {
|
||||
@@ -501,12 +410,7 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
launchModal () {
|
||||
this.changePage(this.PAGES.CREATE_GROUP);
|
||||
this.$root.$emit('bv::show::modal', 'group-plan-modal');
|
||||
},
|
||||
changePage (page) {
|
||||
this.activePage = page;
|
||||
window.scrollTo(0, 0);
|
||||
this.$root.$emit('bv::show::modal', 'create-group');
|
||||
},
|
||||
createGroup () {
|
||||
this.changePage(this.PAGES.PAY);
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
import throttle from 'lodash/throttle';
|
||||
import FilterSidebar from '@/components/ui/filterSidebar';
|
||||
import FilterGroup from '@/components/ui/filterGroup';
|
||||
import CategoryOptions from '@/../../common/script/content/categoryOptions';
|
||||
|
||||
// TODO use checkbox-component to add/remove entries to *Filters, but without the v-model binding
|
||||
|
||||
@@ -94,64 +95,7 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
categoryFilters: [],
|
||||
categoryOptions: [
|
||||
{
|
||||
label: 'habitica_official',
|
||||
key: 'habitica_official',
|
||||
},
|
||||
{
|
||||
label: 'academics',
|
||||
key: 'academics',
|
||||
},
|
||||
{
|
||||
label: 'advocacy_causes',
|
||||
key: 'advocacy_causes',
|
||||
},
|
||||
{
|
||||
label: 'creativity',
|
||||
key: 'creativity',
|
||||
},
|
||||
{
|
||||
label: 'entertainment',
|
||||
key: 'entertainment',
|
||||
},
|
||||
{
|
||||
label: 'finance',
|
||||
key: 'finance',
|
||||
},
|
||||
{
|
||||
label: 'health_fitness',
|
||||
key: 'health_fitness',
|
||||
},
|
||||
{
|
||||
label: 'hobbies_occupations',
|
||||
key: 'hobbies_occupations',
|
||||
},
|
||||
{
|
||||
label: 'location_based',
|
||||
key: 'location_based',
|
||||
},
|
||||
{
|
||||
label: 'mental_health',
|
||||
key: 'mental_health',
|
||||
},
|
||||
{
|
||||
label: 'getting_organized',
|
||||
key: 'getting_organized',
|
||||
},
|
||||
{
|
||||
label: 'recovery_support_groups',
|
||||
key: 'recovery_support_groups',
|
||||
},
|
||||
{
|
||||
label: 'spirituality',
|
||||
key: 'spirituality',
|
||||
},
|
||||
{
|
||||
label: 'time_management',
|
||||
key: 'time_management',
|
||||
},
|
||||
],
|
||||
categoryOptions: CategoryOptions,
|
||||
roleFilters: [],
|
||||
roleOptions: [
|
||||
{
|
||||
|
||||
@@ -267,7 +267,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-4">
|
||||
<sidebar-section :title="$t('staffAndModerators')">
|
||||
<sidebar-section :title="$t('staff')">
|
||||
<div class="row">
|
||||
<div
|
||||
v-for="user in staff"
|
||||
@@ -289,19 +289,6 @@
|
||||
class="svg-icon staff-icon"
|
||||
v-html="icons.tierStaff"
|
||||
></div>
|
||||
<div
|
||||
v-if="user.type === 'Moderator' && user.name !== 'It\'s Bailey'"
|
||||
class="svg-icon mod-icon"
|
||||
v-html="icons.tierMod"
|
||||
></div>
|
||||
<div
|
||||
v-if="user.name === 'It\'s Bailey'"
|
||||
class="svg-icon npc-icon"
|
||||
v-html="icons.tierNPC"
|
||||
></div>
|
||||
</div>
|
||||
<div class="type">
|
||||
{{ user.type }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -787,18 +787,15 @@ export default {
|
||||
if (sortBy === 'sortByColor') {
|
||||
groupKey = 'potionKey';
|
||||
} else if (sortBy === 'AZ') {
|
||||
groupKey = '';
|
||||
groupKey = i => i.eggName[0];
|
||||
} else if (sortBy === 'sortByHatchable') {
|
||||
groupKey = i => (i.isHatchable() ? 0 : 1);
|
||||
}
|
||||
const groupedPets = groupBy(pets, groupKey);
|
||||
|
||||
// Pets are rendered as grouped "rows". Count helps decide if show more button is necessary.
|
||||
if (sortBy === 'AZ') {
|
||||
this.petRowCount[animalGroup.key] = 1;
|
||||
} else {
|
||||
this.petRowCount[animalGroup.key] = Object.keys(groupedPets).length;
|
||||
}
|
||||
this.petRowCount[animalGroup.key] = Object.keys(groupedPets).length;
|
||||
|
||||
return groupedPets;
|
||||
},
|
||||
mounts (animalGroup, hideMissing, sortBy, searchText) {
|
||||
@@ -814,14 +811,12 @@ export default {
|
||||
if (sortBy === 'sortByColor') {
|
||||
groupKey = 'potionKey';
|
||||
} else if (sortBy === 'AZ') {
|
||||
groupKey = '';
|
||||
groupKey = i => i.eggName[0];
|
||||
}
|
||||
const groupedMounts = groupBy(mounts, groupKey);
|
||||
if (sortBy === 'AZ') {
|
||||
this.mountRowCount[animalGroup.key] = 1;
|
||||
} else {
|
||||
this.mountRowCount[animalGroup.key] = Object.keys(groupedMounts).length;
|
||||
}
|
||||
|
||||
this.mountRowCount[animalGroup.key] = Object.keys(groupedMounts).length;
|
||||
|
||||
return groupedMounts;
|
||||
},
|
||||
// Actions
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -196,7 +196,7 @@ export default {
|
||||
appState.group = pick(this.amazonPayments.groupToCreate, ['_id', 'memberCount', 'name']);
|
||||
} else {
|
||||
appState.newGroup = false;
|
||||
appState.group = pick(this.amazonPayments.group, ['_id', 'memberCount', 'name']);
|
||||
appState.group = pick(this.amazonPayments.group, ['_id', 'memberCount', 'name', 'type']);
|
||||
}
|
||||
} else if (paymentType && paymentType.indexOf('gift-') === 0) {
|
||||
appState.gift = this.amazonPayments.gift;
|
||||
|
||||
@@ -161,6 +161,19 @@
|
||||
})"
|
||||
:amazon-data="{type: 'single', gemsBlock: selectedGemsBlock}"
|
||||
/>
|
||||
<div
|
||||
v-if="eventName === 'fall_extra_gems' || eventName === 'spooky_extra_gems'"
|
||||
class="d-flex flex-column justify-content-center"
|
||||
>
|
||||
<h4 class="mt-3 mx-auto"> {{ $t('howItWorks') }}</h4>
|
||||
<small class="text-center">
|
||||
{{ $t('gemSaleHow', { eventStartMonth, eventStartOrdinal, eventEndOrdinal }) }}
|
||||
</small>
|
||||
<h4 class="mt-3 mx-auto"> {{ $t('limitations') }}</h4>
|
||||
<small class="text-center">
|
||||
{{ $t('gemSaleLimitations', { eventStartMonth, eventStartOrdinal, eventEndOrdinal }) }}
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</div>
|
||||
@@ -170,6 +183,13 @@
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
#buy-gems {
|
||||
small {
|
||||
color: $gray-100;
|
||||
font-size: 12px;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.close-icon svg path {
|
||||
stroke: $purple-400;
|
||||
}
|
||||
@@ -339,8 +359,8 @@
|
||||
|
||||
.svg-icon.check {
|
||||
color: $purple-400;
|
||||
width: 0.77rem;
|
||||
height: 0.615rem;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
.text-leadin {
|
||||
@@ -415,6 +435,15 @@ export default {
|
||||
}
|
||||
return '';
|
||||
},
|
||||
eventStartMonth () {
|
||||
return moment(this.currentEvent.start).format('MMMM');
|
||||
},
|
||||
eventStartOrdinal () {
|
||||
return moment(this.currentEvent.start).format('Do');
|
||||
},
|
||||
eventEndOrdinal () {
|
||||
return moment(this.currentEvent.end).format('Do');
|
||||
},
|
||||
isGemsPromoActive () {
|
||||
const currEvt = this.currentEvent;
|
||||
if (currEvt && currEvt.gemsPromo && moment().isBefore(currEvt.end)) {
|
||||
|
||||
@@ -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);
|
||||
},
|
||||
|
||||
@@ -1,11 +1,22 @@
|
||||
<template>
|
||||
<b-modal
|
||||
id="payments-success-modal"
|
||||
:title="$t('accountSuspendedTitle')"
|
||||
:hide-footer="isFromBalance"
|
||||
:modal-class="isFromBalance ? ['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,13 @@
|
||||
v-html="icons.check"
|
||||
></div>
|
||||
</div>
|
||||
<h2>{{ $t(isFromBalance ? 'success' : 'paymentSuccessful') }}</h2>
|
||||
</div>
|
||||
<div slot="modal-footer">
|
||||
<div
|
||||
v-once
|
||||
class="small-text"
|
||||
>
|
||||
{{ $t('giftSubscriptionText4') }}
|
||||
</div>
|
||||
<h2>{{ $t(isGemsBalance ? 'success' : 'paymentSuccessful') }}</h2>
|
||||
</div>
|
||||
<!-- BODY -->
|
||||
<div class="row">
|
||||
<div class="col-12 modal-body-col">
|
||||
<template v-if="paymentData.paymentType === 'gems'">
|
||||
<!-- buy gems for self -->
|
||||
<template v-if="isGems">
|
||||
<strong v-once>{{ $t('paymentYouReceived') }}</strong>
|
||||
<div class="details-block gems">
|
||||
<div
|
||||
@@ -36,9 +41,9 @@
|
||||
<span>{{ paymentData.gemsBlock.gems }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- buy gems to someone else OR send gems from balance-->
|
||||
<template
|
||||
v-if="paymentData.paymentType === 'gift-gems'
|
||||
|| paymentData.paymentType === 'gift-gems-balance'"
|
||||
v-if="isGiftGems || isGemsBalance"
|
||||
>
|
||||
<span v-html="$t('paymentYouSentGems', {name: paymentData.giftReceiver})"></span>
|
||||
<div class="details-block gems">
|
||||
@@ -50,13 +55,17 @@
|
||||
<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>
|
||||
<div>
|
||||
<span
|
||||
v-html="$t('paymentYouSentSubscription', {
|
||||
name: paymentData.giftReceiver, months: paymentData.subscription.months})"
|
||||
></span>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="paymentData.paymentType === 'subscription'">
|
||||
<!-- buy self subscription (recurring) -->
|
||||
<template v-if="isSubscription">
|
||||
<strong v-once>{{ $t('nowSubscribed') }}</strong>
|
||||
<div class="details-block">
|
||||
<span
|
||||
@@ -65,48 +74,238 @@
|
||||
></span>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="paymentData.paymentType === 'groupPlan'">
|
||||
<!-- group plan new or upgraded -->
|
||||
<template v-if="isGroupPlan">
|
||||
<span
|
||||
v-html="$t(paymentData.newGroup
|
||||
v-html="$t(isNewGroup
|
||||
? 'groupPlanCreated' : 'groupPlanUpgraded', {groupName: paymentData.group.name})"
|
||||
></span>
|
||||
<div class="details-block">
|
||||
<span
|
||||
v-html="$t('paymentSubBilling', {
|
||||
amount: groupPlanCost, months: paymentData.subscription.months})"
|
||||
></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="paymentData.paymentType === 'groupPlan'
|
||||
|| paymentData.paymentType === 'subscription'"
|
||||
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="close()"
|
||||
@click="submit()"
|
||||
>
|
||||
{{ $t('onwards') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<!-- FOOTER -->
|
||||
<div slot="modal-footer">
|
||||
<!-- gift gems balance & buy, gift subscription -->
|
||||
<div
|
||||
v-if="isGemsBalance || isGiftGems || isGiftSubscription"
|
||||
class="message mx-auto"
|
||||
>
|
||||
<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-if="isUpgradedGroup"
|
||||
class="demographics d-flex flex-column justify-content-center"
|
||||
>
|
||||
<lockable-label
|
||||
:text="$t('groupUse')"
|
||||
class="mx-auto label-text"
|
||||
/>
|
||||
<select-translated-array
|
||||
:items="[
|
||||
'groupParentChildren',
|
||||
'groupCouple',
|
||||
'groupFriends',
|
||||
'groupCoworkers',
|
||||
'groupManager',
|
||||
'groupTeacher'
|
||||
]"
|
||||
class="group-input"
|
||||
:placeholder="'groupUseDefault'"
|
||||
:value="upgradedGroup.demographics"
|
||||
@select="upgradedGroup.demographics = $event"
|
||||
/>
|
||||
<button
|
||||
v-if="!paymentData.newGroup"
|
||||
class="btn btn-primary mx-auto"
|
||||
:disabled="!upgradedGroup.demographics"
|
||||
@click="submit()"
|
||||
>
|
||||
{{ $t('submit') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</b-modal>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
#payments-success-modal .modal-md {
|
||||
max-width: 20.5rem;
|
||||
}
|
||||
#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 {
|
||||
@@ -114,119 +313,123 @@
|
||||
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;
|
||||
.demographics {
|
||||
background-color: $gray-700;
|
||||
|
||||
h2 {
|
||||
color: white;
|
||||
.label-text {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.check-container {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border-radius: 50%;
|
||||
background: #1CA372;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 16px;
|
||||
.group-input {
|
||||
width: 400px !important;
|
||||
margin-top: -24px !important;
|
||||
}
|
||||
|
||||
.check {
|
||||
width: 35.1px;
|
||||
height: 28px;
|
||||
color: white;
|
||||
.btn {
|
||||
margin-top: 0px;
|
||||
width: 77px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
}
|
||||
.message {
|
||||
margin-bottom: 8px;
|
||||
width: 378px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
#payments-success-modal .modal-body {
|
||||
padding-top: 16px;
|
||||
padding-bottom: 24px;
|
||||
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 24px;
|
||||
margin-top: 16px;
|
||||
display: 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;
|
||||
}
|
||||
}
|
||||
|
||||
#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;
|
||||
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 {
|
||||
components: {
|
||||
selectTranslatedArray,
|
||||
lockableLabel,
|
||||
},
|
||||
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: {
|
||||
...mapState({ user: 'user.data', group: 'group.data' }),
|
||||
groupPlanCost () {
|
||||
const sub = this.paymentData.subscription;
|
||||
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 => {
|
||||
@@ -242,7 +445,30 @@ 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({
|
||||
hitType: 'event',
|
||||
eventName: 'group plan upgrade',
|
||||
eventAction: 'group plan upgrade',
|
||||
eventCategory: 'behavior',
|
||||
demographics: this.upgradedGroup.demographics,
|
||||
type: this.paymentData.group.type,
|
||||
}, { trackOnClient: true });
|
||||
}
|
||||
this.paymentData = {};
|
||||
this.$root.$emit('bv::hide::modal', 'payments-success-modal');
|
||||
},
|
||||
|
||||
@@ -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: {
|
||||
|
||||
@@ -385,7 +385,6 @@ import EquipmentAttributesGrid from '../inventory/equipment/attributesGrid.vue';
|
||||
import Item from '@/components/inventory/item';
|
||||
import Avatar from '@/components/avatar';
|
||||
|
||||
import seasonalShopConfig from '@/../../common/script/libs/shops-seasonal.config';
|
||||
import { drops as dropEggs } from '@/../../common/script/content/eggs';
|
||||
import { drops as dropPotions } from '@/../../common/script/content/hatching-potions';
|
||||
|
||||
@@ -438,7 +437,6 @@ export default {
|
||||
|
||||
selectedAmountToBuy: 1,
|
||||
isPinned: false,
|
||||
endDate: seasonalShopConfig.dateRange.end,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -489,6 +487,9 @@ export default {
|
||||
nonSubscriberHourglasses () {
|
||||
return (!this.user.purchased.plan.customerId && !this.user.purchased.plan.consecutive.trinkets && this.getPriceClass() === 'hourglasses');
|
||||
},
|
||||
endDate () {
|
||||
return moment(this.item.event.end);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
item: function itemChanged () {
|
||||
|
||||
@@ -8,16 +8,6 @@
|
||||
:popover-position="'top'"
|
||||
@click="itemSelected(item)"
|
||||
>
|
||||
<span slot="popoverContent">
|
||||
<strong v-if="item.key === 'gem' && gemsLeft === 0">{{ $t('maxBuyGems') }}</strong>
|
||||
<h4 class="popover-content-title">{{ item.text }}</h4>
|
||||
<div
|
||||
v-if="item.event"
|
||||
class="mt-2"
|
||||
>
|
||||
{{ limitedString }}
|
||||
</div>
|
||||
</span>
|
||||
<template
|
||||
slot="itemBadge"
|
||||
slot-scope="ctx"
|
||||
@@ -32,11 +22,9 @@
|
||||
import _filter from 'lodash/filter';
|
||||
import _sortBy from 'lodash/sortBy';
|
||||
import _map from 'lodash/map';
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
import pinUtils from '@/mixins/pinUtils';
|
||||
import planGemLimits from '@/../../common/script/libs/planGemLimits';
|
||||
import seasonalShopConfig from '@/../../common/script/libs/shops-seasonal.config';
|
||||
|
||||
import ShopItem from '../shopItem';
|
||||
import CategoryItem from './categoryItem';
|
||||
@@ -48,12 +36,6 @@ export default {
|
||||
},
|
||||
mixins: [pinUtils],
|
||||
props: ['hideLocked', 'hidePinned', 'searchBy', 'sortBy', 'category'],
|
||||
data () {
|
||||
return {
|
||||
timer: '',
|
||||
limitedString: '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
content: 'content',
|
||||
@@ -106,43 +88,10 @@ export default {
|
||||
return result;
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.countdownString();
|
||||
this.timer = setInterval(this.countdownString, 1000);
|
||||
},
|
||||
beforeDestroy () {
|
||||
this.cancelAutoUpdate();
|
||||
},
|
||||
methods: {
|
||||
itemSelected (item) {
|
||||
this.$root.$emit('buyModal::showItem', item);
|
||||
},
|
||||
countdownString () {
|
||||
const diffDuration = moment.duration(moment(seasonalShopConfig.dateRange.end).diff(moment()));
|
||||
|
||||
if (diffDuration.asSeconds() <= 0) {
|
||||
this.limitedString = this.$t('noLongerAvailable');
|
||||
} else if (diffDuration.days() > 0 || diffDuration.months() > 0) {
|
||||
this.limitedString = this.$t('limitedAvailabilityDays', {
|
||||
days: moment(seasonalShopConfig.dateRange.end).diff(moment(), 'days'),
|
||||
hours: diffDuration.hours(),
|
||||
minutes: diffDuration.minutes(),
|
||||
});
|
||||
} else if (diffDuration.asMinutes() > 2) {
|
||||
this.limitedString = this.$t('limitedAvailabilityHours', {
|
||||
hours: diffDuration.hours(),
|
||||
minutes: diffDuration.minutes(),
|
||||
});
|
||||
} else {
|
||||
this.limitedString = this.$t('limitedAvailabilityMinutes', {
|
||||
minutes: diffDuration.minutes(),
|
||||
seconds: diffDuration.seconds(),
|
||||
});
|
||||
}
|
||||
},
|
||||
cancelAutoUpdate () {
|
||||
clearInterval(this.timer);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -263,8 +263,8 @@
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
import seasonalShopConfig from '@/../../common/script/libs/shops-seasonal.config';
|
||||
|
||||
import svgClock from '@/assets/svg/clock.svg';
|
||||
import svgClose from '@/assets/svg/close.svg';
|
||||
@@ -319,7 +319,6 @@ export default {
|
||||
|
||||
isPinned: false,
|
||||
selectedAmountToBuy: 1,
|
||||
endDate: seasonalShopConfig.dateRange.end,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -343,6 +342,9 @@ export default {
|
||||
if (this.priceType === 'hourglasses') return this.icons.hourglass;
|
||||
return this.icons.gem;
|
||||
},
|
||||
endDate () {
|
||||
return moment(this.item.event.end);
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
item: function itemChanged () {
|
||||
|
||||
@@ -402,6 +402,8 @@ import _sortBy from 'lodash/sortBy';
|
||||
import _throttle from 'lodash/throttle';
|
||||
import _groupBy from 'lodash/groupBy';
|
||||
import _map from 'lodash/map';
|
||||
import _each from 'lodash/each';
|
||||
import * as stopword from 'stopword/dist/stopword.esm.mjs';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
import ShopItem from '../shopItem';
|
||||
@@ -426,6 +428,51 @@ import SelectTranslatedArray from '@/components/tasks/modal-controls/selectTrans
|
||||
import QuestPopover from './questPopover';
|
||||
import { worldStateMixin } from '@/mixins/worldState';
|
||||
|
||||
function splitMultipleDelims (text, delims) {
|
||||
const omniDelim = 'θνι';
|
||||
let workingText = text;
|
||||
for (const delim of delims) {
|
||||
workingText = workingText.replace(new RegExp(delim, 'g'), omniDelim);
|
||||
}
|
||||
return workingText.split(omniDelim);
|
||||
}
|
||||
|
||||
function removeStopwordsFromText (text, language) {
|
||||
// list of supported languages https://www.npmjs.com/package/stopword
|
||||
const langs = {
|
||||
bg: stopword.bul,
|
||||
cs: stopword.ces,
|
||||
da: stopword.dan,
|
||||
de: stopword.deu,
|
||||
en: stopword.eng,
|
||||
en_GB: stopword.eng,
|
||||
'en@pirate': stopword.eng.concat(["th'"]),
|
||||
es: stopword.spa,
|
||||
es_419: stopword.spa,
|
||||
fr: stopword.fra,
|
||||
he: stopword.heb,
|
||||
hu: stopword.hun,
|
||||
id: stopword.ind,
|
||||
it: stopword.ita,
|
||||
ja: stopword.jpn,
|
||||
nl: stopword.nld,
|
||||
pl: stopword.pol,
|
||||
pt: stopword.por,
|
||||
pt_BR: stopword.porBr,
|
||||
ro: stopword.ron,
|
||||
ru: stopword.rus,
|
||||
sk: stopword.slv,
|
||||
// sr: stopword.,
|
||||
sv: stopword.swe,
|
||||
tr: stopword.tur,
|
||||
uk: stopword.ukr,
|
||||
zh: stopword.zho,
|
||||
zh_TW: stopword.zho,
|
||||
};
|
||||
const splitText = splitMultipleDelims(text, [' ', "'"]);
|
||||
return stopword.removeStopwords(splitText, langs[language] || stopword.eng).join(' ').toLowerCase();
|
||||
}
|
||||
|
||||
export default {
|
||||
components: {
|
||||
QuestPopover,
|
||||
@@ -539,7 +586,14 @@ export default {
|
||||
|
||||
switch (sortBy) { // eslint-disable-line default-case
|
||||
case 'AZ': {
|
||||
result = _sortBy(result, ['text']);
|
||||
if (category.identifier === 'pet' || category.identifier === 'hatchingPotion') {
|
||||
_each(result, item => {
|
||||
item.sortText = removeStopwordsFromText(item.text, this.user.preferences.language);
|
||||
});
|
||||
result = _sortBy(result, ['sortText']);
|
||||
} else {
|
||||
result = _sortBy(result, ['text']);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -31,6 +31,11 @@
|
||||
class="svg-icon inline lock"
|
||||
v-html="icons.lock"
|
||||
></span>
|
||||
<span
|
||||
v-if="item.completed"
|
||||
class="svg-icon inline check"
|
||||
v-html="icons.check"
|
||||
></span>
|
||||
<span
|
||||
v-if="item.isSuggested"
|
||||
class="suggestedDot"
|
||||
@@ -200,6 +205,15 @@
|
||||
color: $gray-200;
|
||||
}
|
||||
|
||||
span.svg-icon.inline.check {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
position: absolute;
|
||||
left: 4px;
|
||||
top: 4px;
|
||||
color: $gray-200;
|
||||
}
|
||||
|
||||
span.badge.badge-round.badge-item.badge-clock {
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
@@ -246,6 +260,7 @@ import svgGem from '@/assets/svg/gem.svg';
|
||||
import svgGold from '@/assets/svg/gold.svg';
|
||||
import svgHourglasses from '@/assets/svg/hourglass.svg';
|
||||
import svgLock from '@/assets/svg/lock.svg';
|
||||
import svgCheck from '@/assets/svg/check.svg';
|
||||
import svgClock from '@/assets/svg/clock.svg';
|
||||
|
||||
import EquipmentAttributesPopover from '@/components/inventory/equipment/attributesPopover';
|
||||
@@ -297,6 +312,7 @@ export default {
|
||||
gems: svgGem,
|
||||
gold: svgGold,
|
||||
lock: svgLock,
|
||||
check: svgCheck,
|
||||
hourglasses: svgHourglasses,
|
||||
clock: svgClock,
|
||||
}),
|
||||
@@ -350,6 +366,7 @@ export default {
|
||||
'highlight-border': this.highlightBorder,
|
||||
suggested: this.item.isSuggested,
|
||||
locked: this.item.locked,
|
||||
completed: this.item.completed,
|
||||
};
|
||||
},
|
||||
countdownString () {
|
||||
|
||||
@@ -13,25 +13,29 @@
|
||||
:key="index"
|
||||
class="faq-question"
|
||||
>
|
||||
<h2
|
||||
v-b-toggle="heading"
|
||||
role="tab"
|
||||
variant="info"
|
||||
@click="handleClick($event)"
|
||||
<div
|
||||
v-if="heading !== 'world-boss'"
|
||||
>
|
||||
{{ $t(`faqQuestion${index}`) }}
|
||||
</h2>
|
||||
<b-collapse
|
||||
:id="heading"
|
||||
:visible="isVisible(heading)"
|
||||
accordion="faq"
|
||||
role="tabpanel"
|
||||
>
|
||||
<div
|
||||
v-markdown="$t(`webFaqAnswer${index}`, replacements)"
|
||||
class="card-body"
|
||||
></div>
|
||||
</b-collapse>
|
||||
<h2
|
||||
v-b-toggle="heading"
|
||||
role="tab"
|
||||
variant="info"
|
||||
@click="handleClick($event)"
|
||||
>
|
||||
{{ $t(`faqQuestion${index}`) }}
|
||||
</h2>
|
||||
<b-collapse
|
||||
:id="heading"
|
||||
:visible="isVisible(heading)"
|
||||
accordion="faq"
|
||||
role="tabpanel"
|
||||
>
|
||||
<div
|
||||
v-markdown="$t(`webFaqAnswer${index}`, replacements)"
|
||||
class="card-body"
|
||||
></div>
|
||||
</b-collapse>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
<p v-markdown="$t('webFaqStillNeedHelp')"></p>
|
||||
|
||||
@@ -363,7 +363,7 @@
|
||||
|
||||
#front {
|
||||
.form-text a {
|
||||
color: #fff !important;
|
||||
color: $white !important;
|
||||
}
|
||||
|
||||
.container-fluid {
|
||||
@@ -375,30 +375,24 @@
|
||||
padding-bottom: 5em;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 128px;
|
||||
height: 28px;
|
||||
color: purple;
|
||||
}
|
||||
|
||||
.purple-1, .purple-2, .purple-3, .purple-4, h1, h2, h3, h4, h5 {
|
||||
color: #fff;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
.purple-1 {
|
||||
background-color: #6133b4;
|
||||
background-color: $purple-300;
|
||||
}
|
||||
|
||||
.purple-2 {
|
||||
background-color: #432874;
|
||||
background-color: $purple-100;
|
||||
}
|
||||
|
||||
.purple-3 {
|
||||
background-color: #36205d;
|
||||
background-color: $purple-50;
|
||||
}
|
||||
|
||||
.purple-4 {
|
||||
background-color: #271b3d;
|
||||
background-color: $header-dark-background;
|
||||
}
|
||||
|
||||
p.section-main {
|
||||
@@ -419,15 +413,15 @@
|
||||
}
|
||||
|
||||
.pixel-horizontal {
|
||||
color: #6133b4;
|
||||
color: $purple-300;
|
||||
}
|
||||
|
||||
.pixel-horizontal-2 {
|
||||
color: #432874;
|
||||
color: $purple-100;
|
||||
}
|
||||
|
||||
.pixel-horizontal-3 {
|
||||
color: #271b3d;
|
||||
color: $header-dark-background;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6, button, .strike > span, input {
|
||||
@@ -455,13 +449,13 @@
|
||||
|
||||
.social-button {
|
||||
border-radius: 2px;
|
||||
border: solid 2px #bda8ff;
|
||||
border: solid 2px $purple-500;
|
||||
width: 100%;
|
||||
min-height: 40px;
|
||||
padding: .5em;
|
||||
background: transparent;
|
||||
margin-bottom: .5em;
|
||||
color: #bda8ff;
|
||||
color: $purple-500;
|
||||
transition: .5s;
|
||||
|
||||
span {
|
||||
@@ -471,8 +465,8 @@
|
||||
|
||||
.social-button:hover {
|
||||
cursor: pointer;
|
||||
border-color: #fff;
|
||||
color: #fff;
|
||||
border-color: $white;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
.social-icon {
|
||||
@@ -531,8 +525,8 @@
|
||||
input {
|
||||
margin-bottom: 1em;
|
||||
border-radius: 2px;
|
||||
background-color: #432874;
|
||||
border-color: #432874;
|
||||
background-color: $purple-100;
|
||||
border-color: $purple-100;
|
||||
color: $purple-400;
|
||||
border: solid 2px transparent;
|
||||
transition-timing-function: ease;
|
||||
@@ -544,17 +538,17 @@
|
||||
}
|
||||
|
||||
.input-valid {
|
||||
color: #fff;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
input:focus {
|
||||
border: solid 2px #9a62ff;
|
||||
border: solid 2px $purple-400;
|
||||
color: #fff;
|
||||
background-color: #36205d;
|
||||
background-color: $purple-50;
|
||||
}
|
||||
|
||||
input:hover {
|
||||
background-color: #36205d;
|
||||
background-color: $purple-50;
|
||||
}
|
||||
|
||||
.sign-up {
|
||||
@@ -657,7 +651,7 @@
|
||||
width: 411px;
|
||||
height: 48px;
|
||||
border-radius: 2px;
|
||||
background-color: #9a62ff;
|
||||
background-color: $purple-400;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.24), 0 1px 4px 0 rgba(26, 24, 29, 0.16);
|
||||
margin-bottom: 5em;
|
||||
}
|
||||
@@ -674,7 +668,7 @@
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background-color: #5d3b9c;
|
||||
background-color: $purple-50;
|
||||
box-shadow: 0 4px 4px 0 rgba(26, 24, 29, 0.16), 0 1px 8px 0 rgba(26, 24, 29, 0.12);
|
||||
}
|
||||
}
|
||||
@@ -693,7 +687,7 @@
|
||||
|
||||
.svg-icon {
|
||||
vertical-align: bottom;
|
||||
color: #d5c8ff;
|
||||
color: $purple-600;
|
||||
display: inline-block;
|
||||
margin-right: 1em;
|
||||
}
|
||||
@@ -760,6 +754,7 @@
|
||||
height: 500px;
|
||||
width: 100%;
|
||||
opacity: .5;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -776,7 +771,7 @@
|
||||
}
|
||||
|
||||
.input-error {
|
||||
color: #fff;
|
||||
color: $white;
|
||||
font-size: 90%;
|
||||
width: 100%;
|
||||
margin-bottom: 1em;
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
:right="right"
|
||||
:hide-icon="false"
|
||||
:inline-dropdown="inlineDropdown"
|
||||
:placeholder="placeholder"
|
||||
@select="selectItem($event)"
|
||||
>
|
||||
<template v-slot:item="{ item }">
|
||||
@@ -70,6 +71,9 @@ export default {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="task-wrapper">
|
||||
<div class="task-wrapper" draggable>
|
||||
<div
|
||||
class="task transition"
|
||||
:class="[{
|
||||
@@ -773,9 +773,9 @@
|
||||
}
|
||||
|
||||
.check.svg-icon {
|
||||
width: 12.3px;
|
||||
height: 9.8px;
|
||||
margin: 9px 8px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.challenge.broken {
|
||||
|
||||
@@ -1,105 +1,308 @@
|
||||
<template>
|
||||
<div class="row">
|
||||
<div class="col-6">
|
||||
<h1>{{ $t('gemTransactions') }}</h1>
|
||||
<span v-if="gemTransactions.length === 0">{{ $t('noGemTransactions') }}</span>
|
||||
<table class="table">
|
||||
<tr
|
||||
v-for="entry in gemTransactions"
|
||||
:key="entry.createdAt"
|
||||
<div>
|
||||
<div class="clearfix">
|
||||
<div class="mb-4 float-left">
|
||||
<button
|
||||
class="page-header btn-flat tab-button textCondensed"
|
||||
:class="{'active': selectedTab === 'gems'}"
|
||||
@click="selectTab('gems')"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span
|
||||
class="svg-icon inline icon-24"
|
||||
aria-hidden="true"
|
||||
v-html="icons.gem"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
:class="entry.amount < 0 ? 'deducted' : 'added'"
|
||||
>{{ entry.amount * 4 }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span>{{ transactionTypeText(entry.transactionType) }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-html="entryReferenceText(entry)"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<h1>{{ $t('hourglassTransactions') }}</h1>
|
||||
<span v-if="hourglassTransactions.length === 0">{{ $t('noHourglassTransactions') }}</span>
|
||||
<table class="table">
|
||||
<tr
|
||||
v-for="entry in hourglassTransactions"
|
||||
:key="entry.createdAt"
|
||||
{{ $t('gems') }}
|
||||
</button>
|
||||
<button
|
||||
class="page-header btn-flat tab-button textCondensed"
|
||||
:class="{'active': selectedTab === 'hourglass'}"
|
||||
@click="selectTab('hourglass')"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span
|
||||
class="svg-icon inline icon-24"
|
||||
aria-hidden="true"
|
||||
v-html="icons.hourglass"
|
||||
></span>
|
||||
<span
|
||||
class="amount hourglasses"
|
||||
:class="entry.amount < 0 ? 'deducted' : 'added'"
|
||||
>{{ entry.amount }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span>{{ transactionTypeText(entry.transactionType) }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-html="entryReferenceText(entry)"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{{ $t('mysticHourglass', { amount: ''}) }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-12" v-if="selectedTab === 'gems'">
|
||||
<span v-if="gemTransactions.length === 0">
|
||||
{{ $t('noGemTransactions') }}
|
||||
</span>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th v-once class="timestamp-column">
|
||||
{{ $t('timestamp')}}
|
||||
</th>
|
||||
<th v-once class="amount-column">
|
||||
{{ $t('amount')}}
|
||||
</th>
|
||||
<th v-once class="action-column">
|
||||
{{ $t('action')}}
|
||||
</th>
|
||||
<th v-once class="note-column">
|
||||
{{ $t('note')}}
|
||||
</th>
|
||||
</tr>
|
||||
<tr
|
||||
v-for="entry in gemTransactions"
|
||||
:key="entry.createdAt"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="amount-with-icon" :id="entry.id">
|
||||
<span
|
||||
class="svg-icon inline icon-16 my-1"
|
||||
aria-hidden="true"
|
||||
v-html="entry.amount < 0 ? icons.gemRed : icons.gem"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
:class="entry.amount | addedDeducted"
|
||||
>{{ entry.amount * 4 }}</span>
|
||||
</div>
|
||||
|
||||
<b-popover
|
||||
v-if="typeof entry.currentAmount !== 'undefined'"
|
||||
ref="popover"
|
||||
:target="entry.id"
|
||||
triggers="hover focus click"
|
||||
placement="bottom"
|
||||
>
|
||||
<div class="remaining-amount-popover-content">
|
||||
{{ $t('remainingBalance') }}:
|
||||
<span
|
||||
class="svg-icon inline icon-16 ml-1"
|
||||
aria-hidden="true"
|
||||
v-html="icons.gem"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
>{{ entry.currentAmount * 4 }}</span>
|
||||
</div>
|
||||
</b-popover>
|
||||
</td>
|
||||
<td class="entry-action">
|
||||
<span v-html="transactionTypeText(entry.transactionType)"></span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-if="transactionTypes.gifted.includes(entry.transactionType)">
|
||||
<router-link
|
||||
class="user-link"
|
||||
:to="{'name': 'userProfile', 'params': {'userId': entry.reference}}"
|
||||
>
|
||||
@{{ entry.referenceText }}
|
||||
</router-link>
|
||||
</span>
|
||||
<span v-else-if="transactionTypes.challenges.includes(entry.transactionType)">
|
||||
<router-link
|
||||
class="challenge-link"
|
||||
:to="{ name: 'challenge', params: { challengeId: entry.reference } }">
|
||||
<span
|
||||
v-markdown="entry.referenceText"
|
||||
></span>
|
||||
</router-link>
|
||||
</span>
|
||||
<span v-else v-html="entryReferenceText(entry)"></span>
|
||||
|
||||
<span v-if="entry.reference">
|
||||
({{entry.reference}})
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="col-12" v-if="selectedTab === 'hourglass'">
|
||||
<span v-if="hourglassTransactions.length === 0">
|
||||
{{ $t('noHourglassTransactions') }}
|
||||
</span>
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th v-once class="timestamp-column">
|
||||
{{ $t('timestamp')}}
|
||||
</th>
|
||||
<th v-once class="amount-column">
|
||||
{{ $t('amount')}}
|
||||
</th>
|
||||
<th v-once class="action-column">
|
||||
{{ $t('action')}}
|
||||
</th>
|
||||
<th v-once class="note-column">
|
||||
{{ $t('note')}}
|
||||
</th>
|
||||
</tr>
|
||||
<tr
|
||||
v-for="entry in hourglassTransactions"
|
||||
:key="entry.createdAt"
|
||||
>
|
||||
<td>
|
||||
<span
|
||||
v-b-tooltip.hover="entry.createdAt"
|
||||
>{{ entry.createdAt | timeAgo }}</span>
|
||||
</td>
|
||||
<td>
|
||||
<div class="amount-with-icon" :id="entry.id">
|
||||
<span
|
||||
class="svg-icon inline icon-16 my-1"
|
||||
aria-hidden="true"
|
||||
v-html="entry.amount < 0 ? icons.hourglassRed : icons.hourglass"
|
||||
></span>
|
||||
<span
|
||||
class="amount hourglasses"
|
||||
:class="entry.amount | addedDeducted"
|
||||
>{{ entry.amount }}</span>
|
||||
</div>
|
||||
|
||||
<b-popover
|
||||
v-if="typeof entry.currentAmount !== 'undefined'"
|
||||
ref="popover"
|
||||
:target="entry.id"
|
||||
triggers="hover focus click"
|
||||
placement="bottom"
|
||||
>
|
||||
<div class="remaining-amount-popover-content">
|
||||
{{ $t('remainingBalance') }}:
|
||||
<span
|
||||
class="svg-icon inline icon-16 ml-1"
|
||||
aria-hidden="true"
|
||||
v-html="icons.hourglass"
|
||||
></span>
|
||||
<span
|
||||
class="amount gems"
|
||||
>{{ entry.currentAmount }}</span>
|
||||
</div>
|
||||
</b-popover>
|
||||
</td>
|
||||
<td class="entry-action">
|
||||
<span v-html="transactionTypeText(entry.transactionType)"></span>
|
||||
</td>
|
||||
<td>
|
||||
<span v-html="entryReferenceText(entry)"></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
.page-header.btn-flat {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.tab-button {
|
||||
height: 2rem;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
font-stretch: condensed;
|
||||
line-height: 1.33;
|
||||
letter-spacing: normal;
|
||||
color: $gray-10;
|
||||
|
||||
margin-right: 1.125rem;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-bottom: 2.5rem;
|
||||
|
||||
&.active, &:hover {
|
||||
color: $purple-300;
|
||||
box-shadow: 0px -0.25rem 0px $purple-300 inset;
|
||||
outline: none;
|
||||
}
|
||||
}
|
||||
|
||||
.amount-column {
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.svg-icon {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.amount {
|
||||
font-weight: bold;
|
||||
font-size: 1.1rem;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
|
||||
.added::before {
|
||||
content: "+";
|
||||
}
|
||||
|
||||
.gems {
|
||||
color: $gems-color;
|
||||
color: $green-10;
|
||||
|
||||
&.deducted {
|
||||
color: $red-10;
|
||||
color: $maroon-50;
|
||||
}
|
||||
}
|
||||
|
||||
.hourglasses {
|
||||
font-weight: bold;
|
||||
color: $hourglass-color;
|
||||
color: $green-10;
|
||||
&.deducted {
|
||||
color: $red-10;
|
||||
color: $maroon-50;
|
||||
}
|
||||
}
|
||||
|
||||
.amount-with-icon {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
.remaining-amount-popover-content {
|
||||
display: flex;
|
||||
font-size: 12px;
|
||||
line-height: 1.33;
|
||||
color: $white;
|
||||
}
|
||||
|
||||
table {
|
||||
line-height: 1.71;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
th {
|
||||
border-top: 0 !important;
|
||||
padding: 0.25rem 0.5rem !important;
|
||||
font-weight: bold;
|
||||
line-height: 1.71;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
td {
|
||||
padding-left: 0.5rem !important;
|
||||
padding-right: 0.5rem !important;
|
||||
|
||||
line-height: 1.71;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
th, td {
|
||||
padding-top: 0.35rem !important;
|
||||
padding-bottom: 0.35rem !important;
|
||||
}
|
||||
|
||||
.timestamp-column, .action-column {
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
.amount-column {
|
||||
width: 10%;
|
||||
}
|
||||
|
||||
.note-column {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.challenge-link, .user-link {
|
||||
color: $blue-10 !important;
|
||||
}
|
||||
|
||||
.entry-action {
|
||||
b {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -107,9 +310,15 @@
|
||||
<script>
|
||||
import moment from 'moment';
|
||||
import svgGem from '@/assets/svg/gem.svg';
|
||||
import svgGemRed from '@/assets/svg/gem-red.svg';
|
||||
import svgHourglass from '@/assets/svg/hourglass.svg';
|
||||
import svgHourglassRed from '@/assets/svg/hourglass-red.svg';
|
||||
import markdownDirective from '@/directives/markdown';
|
||||
|
||||
export default {
|
||||
directives: {
|
||||
markdown: markdownDirective,
|
||||
},
|
||||
filters: {
|
||||
timeAgo (value) {
|
||||
return moment(value).fromNow();
|
||||
@@ -118,6 +327,13 @@ export default {
|
||||
// @TODO: Vue doesn't support this so we cant user preference
|
||||
return moment(value).toDate().toString();
|
||||
},
|
||||
addedDeducted (amount) {
|
||||
if (amount === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return amount < 0 ? 'deducted' : 'added';
|
||||
},
|
||||
},
|
||||
props: {
|
||||
gemTransactions: {
|
||||
@@ -133,11 +349,21 @@ export default {
|
||||
return {
|
||||
icons: Object.freeze({
|
||||
gem: svgGem,
|
||||
gemRed: svgGemRed,
|
||||
hourglass: svgHourglass,
|
||||
hourglassRed: svgHourglassRed,
|
||||
}),
|
||||
selectedTab: 'gems',
|
||||
transactionTypes: Object.freeze({
|
||||
gifted: ['gift_send', 'gift_receive'],
|
||||
challenges: ['create_challenge', 'create_bank_challenge'],
|
||||
}),
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
selectTab (type) {
|
||||
this.selectedTab = type;
|
||||
},
|
||||
entryReferenceText (entry) {
|
||||
if (entry.reference === undefined && entry.referenceText === undefined) {
|
||||
return '';
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<template v-slot:button-content>
|
||||
<slot
|
||||
name="item"
|
||||
:item="selected"
|
||||
:item="selected || placeholder"
|
||||
:button="true"
|
||||
>
|
||||
<!-- Fallback content -->
|
||||
@@ -114,6 +114,9 @@ export default {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
placeholder: {
|
||||
type: String,
|
||||
},
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
|
||||
@@ -1028,9 +1028,10 @@ export default {
|
||||
this.$store.dispatch('hall:updateHero', { heroDetails: this.hero });
|
||||
},
|
||||
adminBlockUser () {
|
||||
this.hero.auth.blocked = true;
|
||||
|
||||
this.$store.dispatch('hall:updateHero', { heroDetails: this.hero });
|
||||
if (window.confirm('Ban user and auto-hide all posts?')) {
|
||||
this.hero.auth.blocked = true;
|
||||
this.$store.dispatch('hall:updateHero', { heroDetails: this.hero });
|
||||
}
|
||||
},
|
||||
adminUnblockUser () {
|
||||
this.hero.auth.blocked = false;
|
||||
|
||||
@@ -34,44 +34,4 @@ export default [
|
||||
type: 'Staff',
|
||||
uuid: 'f4e5c6da-0617-48bf-b3bd-9f97636774a8',
|
||||
},
|
||||
{
|
||||
name: 'Alys',
|
||||
type: 'Moderator',
|
||||
uuid: 'd904bd62-da08-416b-a816-ba797c9ee265',
|
||||
},
|
||||
{
|
||||
name: 'Cantras',
|
||||
type: 'Moderator',
|
||||
uuid: '28771972-ca6d-4c03-8261-e1734aa7d21d',
|
||||
},
|
||||
{
|
||||
name: 'deilann',
|
||||
type: 'Moderator',
|
||||
uuid: 'e7b5d1e2-3b6e-4192-b867-8bafdb03eeec',
|
||||
},
|
||||
{
|
||||
name: 'Dewines',
|
||||
type: 'Moderator',
|
||||
uuid: '262a7afb-6b57-4d81-88e0-80d2e9f6cbdc',
|
||||
},
|
||||
{
|
||||
name: 'Fox_town',
|
||||
type: 'Moderator',
|
||||
uuid: 'a05f0152-d66b-4ef1-93ac-4adb195d0031',
|
||||
},
|
||||
{
|
||||
name: 'MaybeSteveRogers',
|
||||
type: 'Moderator',
|
||||
uuid: '767e5d92-0e13-4e30-acb1-d8bba62824fc',
|
||||
},
|
||||
{
|
||||
name: 'Nakonana',
|
||||
type: 'Moderator',
|
||||
uuid: '33bb14bd-814d-40cb-98a4-7b76a752761c',
|
||||
},
|
||||
{
|
||||
name: 'shanaqui',
|
||||
type: 'Moderator',
|
||||
uuid: 'bb089388-28ae-4e42-a8fa-f0c2bfb6f779',
|
||||
},
|
||||
];
|
||||
|
||||
@@ -39,6 +39,13 @@ export default {
|
||||
return moment(this.user.purchased.plan.dateTerminated)
|
||||
.format(this.user.preferences.dateFormat.toUpperCase());
|
||||
},
|
||||
renewalDate () {
|
||||
const renewalDate = moment().add(1, 'months');
|
||||
if (!this.user.preferences || !this.user.preferences.dateFormat) {
|
||||
return renewalDate;
|
||||
}
|
||||
return renewalDate.format(this.user.preferences.dateFormat.toUpperCase());
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
encodeGift (uuid, gift) {
|
||||
@@ -140,6 +147,7 @@ export default {
|
||||
if (data.subscription) postData.sub = sub.key;
|
||||
if (data.coupon) postData.coupon = data.coupon;
|
||||
if (data.groupId) postData.groupId = data.groupId;
|
||||
if (data.demographics) postData.demographics = data.demographics;
|
||||
|
||||
const response = await axios.post(url, postData);
|
||||
|
||||
@@ -267,6 +275,10 @@ export default {
|
||||
this.amazonPayments.groupToCreate = data.groupToCreate;
|
||||
}
|
||||
|
||||
if (data.demographics) { // sending demographics
|
||||
this.amazonPayments.demographics = data.demographics;
|
||||
}
|
||||
|
||||
this.amazonPayments.gift = data.gift;
|
||||
this.amazonPayments.type = data.type;
|
||||
},
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
"foundNewItemsExplanation": "القيام بمهامك يمنحك الفرصة للفوز بقطع جديدة مثل البيضات، جرعات التفقيس، وطعام الحيوانات الأليفة.",
|
||||
"onboardingProgress": "التقدم <%= percentage %>%",
|
||||
"achievementCreatedTask": "إصنع مهمتك الأولى",
|
||||
"achievementJustAddWaterModalText": "لقد أكملت جميع مغامرات حيوانات الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين الأليفة!",
|
||||
"achievementJustAddWaterText": "قد أكمل جميع مغامرات حيوانات الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين الأليفة.",
|
||||
"achievementMindOverMatterModalText": "لقد أكملت جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة!",
|
||||
"achievementMindOverMatterText": "قد أكمل جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة.",
|
||||
"achievementJustAddWaterModalText": "أكملت جميع مغامرات حيوانات الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين الأليفة!",
|
||||
"achievementJustAddWaterText": "أكملت جميع مغامرات حيوانات: الأخطبوط، فرس البحر، الحبار، عارية الخيشوم، حية البحر، و الدلفين.",
|
||||
"achievementMindOverMatterModalText": "أكملت جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة!",
|
||||
"achievementMindOverMatterText": "أكملت جميع مغامرات حيوانات الصخر، اللزج، والغزل الأليفة.",
|
||||
"achievementLostMasterclasserModalText": "لقد أكملت جميع المغامرات الستة عشرة في سلسلة مغامرات الخبير و حللت لغز الخبيرة المفقودة!",
|
||||
"achievementMonsterMagusModalText": "لقد جمعت جميع الحيوانات الأليفة من الأموات الأحياء!",
|
||||
"achievementMonsterMagusText": "قد جمع جميع الحيوانات الأليفة من الأموات الأحياء.",
|
||||
@@ -37,7 +37,7 @@
|
||||
"achievementBackToBasicsModalText": "لقد جمعت جميع الحيوانات الأليفة الأساسية!",
|
||||
"achievementBackToBasicsText": "قد جمع جميع الحيوانات الأليفة الأساسية.",
|
||||
"achievementBackToBasics": "عودة إلى الأساسيات",
|
||||
"achievementJustAddWater": "أضف الماء وحسب",
|
||||
"achievementJustAddWater": "أضف الماء فقط",
|
||||
"achievementMindOverMatter": "العقل فوق المادة",
|
||||
"achievementFedPet": "أطعم/ي حيواناً أليفاً",
|
||||
"achievementHatchedPetModalText": "إذهب/ي إلى قائمة أغراضك وحاول/ي جمع بيضة وجرعة تفقيس معاً",
|
||||
@@ -49,8 +49,8 @@
|
||||
"achievementAridAuthorityModalText": "لقد أكملت ترويض جميع حيوانات الركوب الصحراوية!",
|
||||
"achievementAridAuthorityText": "أكملوا ترويض جميع حيوانات الركوب الصحراوية.",
|
||||
"achievementPartyUp": "لقد كونت فريقاً مع عضو من مجموعتك!",
|
||||
"achievementAllYourBaseModalText": "لقد أكملت ترويض جميع حيوانات الركوب الأساسية!",
|
||||
"achievementAllYourBaseText": "أكمل(ت) ترويض جميع حيوانات الركوب الأساسية.",
|
||||
"achievementAllYourBaseModalText": "أكملت ترويض جميع حيوانات الركوب الأساسية!",
|
||||
"achievementAllYourBaseText": "أكملت ترويض جميع حيوانات الركوب الأساسية.",
|
||||
"achievementAllYourBase": "كل قاعدتك ملكنا الأن",
|
||||
"achievementFedPetText": "أطعموا حيوانهم الأليف الأول.",
|
||||
"achievementBugBonanza": "حفلة الحشرات",
|
||||
@@ -118,22 +118,25 @@
|
||||
"achievementDomesticatedModalText": "لقد جمعت كل الحيوانات الأليفة المستأنسة!",
|
||||
"achievementDomesticatedText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة المستأنسة: النمس ، وخنزير غينيا ، والديك ، والخنزير الطائر ، والجرذ ، والأرنب ، والحصان ، والبقر!",
|
||||
"achievementDomesticated": "ا-يا-ا-يا-يو",
|
||||
"achievementBirdsOfAFeatherModalText": "تقوم بجمع كل الحيوانات الأليفة الطائرة!",
|
||||
"achievementBirdsOfAFeatherModalText": "لقد قمت بجمع كل الحيوانات الأليفة الطائرة!",
|
||||
"achievementZodiacZookeeperText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة في الأبراج: الجرذ ، البقرة ، الأرنب ، الأفعى ، الحصان ، الأغنام ، القرد ، الديك ، الذئب ، النمر ، الخنزير الطائر ، والتنين!",
|
||||
"achievementGroupsBeta2022ModalText": "لقد ساعدت أنت ومجموعاتك Habitica من خلال الاختبار وتقديم التعليقات!",
|
||||
"achievementGroupsBeta2022": "اختبار تجريبي تفاعلي",
|
||||
"achievementGroupsBeta2022Text": "قدمت أنت ومجموعتك تعليقات لا تقدر بثمن لمساعدة Habitica في الاختبار.",
|
||||
"achievementReptacularRumble": "الدمدمة الزاحفة",
|
||||
"achievementReptacularRumbleModalText": "لقد جمعت كل الزواحف الأليفة!",
|
||||
"achievementReptacularRumbleText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الزواحف: التمساح ، الزاحف المجنح ، الأفعى ، ترايسيراتوبس ، السلحفاة ، التيرانوصور ريكس ، وفيلوسيرابتور!",
|
||||
"achievementBirdsOfAFeather": "متشابهون",
|
||||
"achievementReptacularRumbleText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الزواحف: التمساح، الزاحف المجنح، الأفعى، ترايسيراتوبس، السلحفاة، التيرانوصور ريكس وفيلوسيرابتور!",
|
||||
"achievementBirdsOfAFeather": "أصدقاء الطيران",
|
||||
"achievementZodiacZookeeper": "حارس حديقة الحيوانات الفلكية",
|
||||
"achievementShadyCustomerText": "لقد جمع كل حيوانات الظل الأليفة.",
|
||||
"achievementShadyCustomerModalText": "لقد قمت بتجميع كل حيوانات الظل الأليفة!",
|
||||
"achievementZodiacZookeeperModalText": "لقد قمت بتجميع كل الحيوانات الفلكية الأليفة!",
|
||||
"achievementBirdsOfAFeatherText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الطائرة: الخنزير الطائر ، البومة ، الببغاء ، الزاحف المجنح ، الجريفون ، فالكون ، الطاووس ، والديك!",
|
||||
"achievementShadeOfItAllModalText": "لقد قمت بترويض كل حيوانات الظل للركوب!",
|
||||
"achievementShadyCustomer": "زبون الظل",
|
||||
"achievementShadeOfItAll": "ظل كل شيء",
|
||||
"achievementShadeOfItAllText": "لقد ربي كل حيوانات الظل للترويض."
|
||||
"achievementShadyCustomerText": "جمع كل حيوانات الظل الأليفة.",
|
||||
"achievementShadyCustomerModalText": "لقد جمعت كل حيوانات الظل الأليفة!",
|
||||
"achievementZodiacZookeeperModalText": "لقد جمعت كل الحيوانات الأليفة الفلكية!",
|
||||
"achievementBirdsOfAFeatherText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة الطائرة: الخنزير الطائر، البومة، الببغاء، الزاحف المجنح، الجرايفون، فالكون، الطاووس والديك!",
|
||||
"achievementShadeOfItAllModalText": "قمت بترويض كل الحيوانات السوداء",
|
||||
"achievementShadyCustomer": "عميل الظل",
|
||||
"achievementShadeOfItAll": "الظل فوق كل شيء",
|
||||
"achievementShadeOfItAllText": "روض كل حيوانات الظل السوداء.",
|
||||
"achievementWoodlandWizard": "ساحر الغابة",
|
||||
"achievementWoodlandWizardText": "لقد فقس جميع الألوان القياسية لمخلوقات الغابة: الغرير، الدب، الغزال، الثعلب، الضفدع، القنفذ، البومة، الأفعى، السنجاب والشجيرة!",
|
||||
"achievementWoodlandWizardModalText": "لقد جمعت كل حيوانات الغابة الأليفة!"
|
||||
}
|
||||
|
||||
@@ -306,5 +306,35 @@
|
||||
"foodSaddleText": "سرج",
|
||||
"foodSaddleNotes": "يحول حيوانًا أليفًا إلى مركب فورًا.",
|
||||
"foodSaddleSellWarningNote": "Hey! This is a pretty useful item! Are you familiar with how to use a Saddle with your Pets?",
|
||||
"foodNotes": "إطعام أحد الحيوانات الأليفة بهذا يمكنه من النمو ليصبح مركبًا قويًا."
|
||||
"foodNotes": "إطعام أحد الحيوانات الأليفة بهذا يمكنه من النمو ليصبح مركبًا قويًا.",
|
||||
"hatchingPotionBronze": "البرونز",
|
||||
"hatchingPotionWatery": "المائي",
|
||||
"hatchingPotionPolkaDot": "نقاط البولكا",
|
||||
"hatchingPotionBlackPearl": "اللؤلؤ الأسود",
|
||||
"hatchingPotionAutumnLeaf": "ورقة الخريف",
|
||||
"hatchingPotionVampire": "مصاص الدماء",
|
||||
"hatchingPotionDessert": "حلويات",
|
||||
"hatchingPotionVeggie": "حديقة",
|
||||
"questEggRobotAdjective": "مستقبلي",
|
||||
"hatchingPotionFluorite": "الفلوريت",
|
||||
"questEggRobotText": "حيوان الروبوت الأليف",
|
||||
"questEggDolphinMountText": "حيوان الدولفين للركوب",
|
||||
"hatchingPotionSolarSystem": "المجموعة الشمسية",
|
||||
"hatchingPotionMoonglow": "لمعان القمر",
|
||||
"questEggRobotMountText": "حيوان الروبوت للركوب",
|
||||
"hatchingPotionAmber": "العنبر",
|
||||
"hatchingPotionAurora": "الشفق القطبي",
|
||||
"hatchingPotionSandSculpture": "تمثال رملي",
|
||||
"hatchingPotionStainedGlass": "الزجاج الملون",
|
||||
"questEggDolphinText": "حيوان الدولفين الأليف",
|
||||
"hatchingPotionSunset": "غروب الشمس",
|
||||
"hatchingPotionShadow": "الظل",
|
||||
"hatchingPotionSilver": "الفضي",
|
||||
"hatchingPotionTurquoise": "التيركواز",
|
||||
"hatchingPotionSunshine": "شعاع الشمس",
|
||||
"hatchingPotionVirtualPet": "حيوان افتراضي أليف",
|
||||
"hatchingPotionWindup": "الزنبرك",
|
||||
"hatchingPotionPorcelain": "الخزف الملون",
|
||||
"hatchingPotionBirchBark": "لحاء الشجر",
|
||||
"hatchingPotionRuby": "الياقوت"
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"defaultHabit1Text": "عمل منتج (اضغط على القلم للتحرير)",
|
||||
"defaultHabit2Text": "أكل طعام غير صحى (أنقر على القلم للتعديل)",
|
||||
"defaultHabit3Text": "صعود السلم/استخدام المصعد (اضغط على قلم الرصاص للتعديل)",
|
||||
"defaultHabit4Text": "Add a task to Habitica",
|
||||
"defaultHabit4Notes": "Either a Habit, a Daily, or a To-Do",
|
||||
"defaultHabit4Text": "أضف مهمة إلى Habitica",
|
||||
"defaultHabit4Notes": "إما عادة أو يومية أو مهمة",
|
||||
"defaultTodo1Text": "الانضمام إلى Habitica (عَلِّم عليَّ)",
|
||||
"defaultTodoNotes": "بإمكانك أن تكمل هذه المهمة، تعدلها، أو تحذفها.",
|
||||
"defaultReward1Text": "15 دقيقة استراحة",
|
||||
@@ -11,9 +11,46 @@
|
||||
"defaultReward2Notes": "شاهد التلفاز، إلعب لعبة، كل حلوى، الأمر يعود لك!",
|
||||
"defaultTag1": "عمل",
|
||||
"defaultTag2": "تمرين",
|
||||
"defaultTag3": "Health + Wellness",
|
||||
"defaultTag3": "الصحة + الراحة",
|
||||
"defaultTag4": "مدرسة",
|
||||
"defaultTag5": "فرق",
|
||||
"defaultTag6": "Chores",
|
||||
"defaultTag7": "الإبداع"
|
||||
"defaultTag6": "عمل منزلي",
|
||||
"defaultTag7": "إبداع",
|
||||
"workTodoProject": "مشروع العمل >> إكمال مشروع العمل",
|
||||
"workDailyImportantTask": "أهم مهمة >> عملت على أهم مهمة اليوم",
|
||||
"workHabitMail": "معالجة البريد الإلكتروني",
|
||||
"workDailyImportantTaskNotes": "انقر لتحديد أهم مهمة لديك",
|
||||
"workTodoProjectNotes": "انقر لتحديد اسم مشروعك الحالي + تعيين تاريخ الاستحقاق!",
|
||||
"exerciseDailyText": "التمدد (ستريتش) >> روتين التمرين اليومي",
|
||||
"healthDailyNotes": "انقر للتعديل!",
|
||||
"exerciseTodoText": "إعداد جدول التمرين",
|
||||
"healthTodoNotes": "انقر لإضافة قائمة مراجعة!",
|
||||
"creativityDailyText": "العمل على مشروع إبداعي",
|
||||
"schoolDailyNotes": "انقر لاختيار جدول الواجبات المنزلية!",
|
||||
"creativityDailyNotes": "انقر لتسمية مشروعك الحالي + تحديد جدول المواعيد!",
|
||||
"selfCareDailyText": "5 دقائق للتنفس بهدوء",
|
||||
"creativityTodoText": "إنهاء مشروع إبداعي",
|
||||
"selfCareDailyNotes": "انقر لاختيار الجدول!",
|
||||
"selfCareTodoNotes": "انقر لتحديد خطة العمل!",
|
||||
"defaultHabitText": "انقر هنا لتحديد أن هذه العادة سلبية، وتريد أن تقلع عنها",
|
||||
"defaultHabitNotes": "أو قم بالحذف من نافذة التعديل",
|
||||
"choresDailyNotes": "انقر لاختيار جدولك!",
|
||||
"creativityHabit": "احترف المهارة >> + مارس تقنية إبداعية جديدة",
|
||||
"exerciseHabit": "10 دقائق كارديو >> + 10 دقائق كارديو",
|
||||
"healthTodoText": "حدد موعداً للمراجعة >> تفكر في تغيير صحي",
|
||||
"schoolHabit": "دراسة / مماطلة",
|
||||
"selfCareHabit": "خذ استراحة قصيرة",
|
||||
"exerciseTodoNotes": "انقر لإضافة قائمة تدقيق!",
|
||||
"choresHabit": "10 دقائق تنظيف",
|
||||
"schoolTodoText": "إنهاء واجب دراسي",
|
||||
"healthHabit": "غذاء صحي/ غذاء غير صحي",
|
||||
"choresTodoText": "ترتيب الخزانة >> ترتيب الفوضى",
|
||||
"choresTodoNotes": "انقر لتحديد منطقة الفوضى!",
|
||||
"exerciseDailyNotes": "انقر لاختيار الجدول وتحديد التمارين!",
|
||||
"schoolTodoNotes": "انقر لتسمية الواجب المنزلي وتحديد وقت الانتهاء!",
|
||||
"creativityTodoNotes": "انقر لتسمية مشروعك",
|
||||
"selfCareTodoText": "شارك في فعالية ممتعة",
|
||||
"healthDailyText": "خيط الأسنان",
|
||||
"schoolDailyText": "إنهاء واجبات منزلية",
|
||||
"choresDailyText": "غسيل الصحون"
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
"forgotPassword": "هل نسيت كلمة المرور؟",
|
||||
"logout": "تسجيل الخروج",
|
||||
"footerMobile": "هاتف",
|
||||
"companyDonate": "تبرع",
|
||||
"companyDonate": "تبرع لصالح Habitica",
|
||||
"login": "تسجيل الدخول",
|
||||
"companyBlog": "مقالات",
|
||||
"communityInstagram": "Instagram",
|
||||
"guidanceForBlacksmiths": "إرشادات للحدادين (المبرمجين)",
|
||||
"companyContribute": "ساهم",
|
||||
"companyContribute": "ساهم في تطوير Habitica",
|
||||
"marketing1Header": "حسن عاداتك من خلال اللعب",
|
||||
"footerCompany": "الشركة",
|
||||
"companyAbout": "كيف يعمل",
|
||||
@@ -20,31 +20,165 @@
|
||||
"emailNewPass": "إرسال رابط إعادة تعيين كلمة المرور الى البريد الإلكتروني",
|
||||
"footerSocial": "منصات التواصل الاجتماعي",
|
||||
"free": "الإنضمام مجاناً",
|
||||
"marketing1Lead1": "Habitica هي لعبة تساعدك على تحسين عادات الحياة الواقعية. إنها \"تحاكي\" حياتك عن طريق تحويل كل مهامك (العادات ، الأعمال اليومية ، المهام) إلى وحوش صغيرة عليك التغلب عليها. كلما كنت أفضل في هذا ، كلما تقدمت في اللعبة. إذا تعثرت في الحياة ، تبدأ شخصيتك بالتراجع في اللعبة.",
|
||||
"marketing1Lead1": "Habitica هي لعبة تساعدك على تحسين عادات الحياة الواقعية. إنها \"تحاكي\" حياتك عن طريق تحويل كل مهامك (العادات، الأعمال اليومية، المهام) إلى وحوش صغيرة عليك التغلب عليها. كلما كنت أفضل في هذا، كلما تقدمت في اللعبة. إذا تعثرت في الحياة، تبدأ شخصيتك بالتراجع في اللعبة.",
|
||||
"termsAndAgreement": "بالنقر على الزر ادناه، فإنك تشير الى كونك قد قرأت ووافقت على <a href='/static/terms'>شروط الخدمة</a> و <a href='/static/privacy'>سياسة الخصوصية</a>.",
|
||||
"clearBrowserData": "حذف بيانات المتصفح",
|
||||
"communityExtensions": "<a href='https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>الإضافات</a>",
|
||||
"forgotPasswordSteps": "أدخل عنوان البريد الإلكتروني الذي استخدمته لتسجيل حسابك في Habitica.",
|
||||
"pkQuestion1": "ما الذي ألهم Habitica؟ كيف بدأ؟",
|
||||
"mobileAndroid": "Android",
|
||||
"communityExtensions": "الإضافات والتطويرات",
|
||||
"forgotPasswordSteps": "أدخل اسم المستخدم أو عنوان البريد الإلكتروني الخاص بك لتسجيل حسابك في Habitica.",
|
||||
"pkQuestion1": "ما الذي ألهم Habitica؟ كيف بدأت؟",
|
||||
"mobileAndroid": "تطبيق آندرويد",
|
||||
"playButton": "العب",
|
||||
"playButtonFull": "دخول Habitica",
|
||||
"password": "كلمة المرور",
|
||||
"newsArchive": "أرشيف الأخبار في ويكيا (متعدد اللغات)",
|
||||
"marketing4Lead3-1": "تريد تحويل حياتك الى لعبة؟",
|
||||
"marketing4Lead3-1": "هل تريد إدخال نظام اللعب لتطوير حياتك؟",
|
||||
"marketing2Lead3Title": "تحدوا بعضكم",
|
||||
"marketing2Lead2Title": "حارب الوحوش",
|
||||
"marketing4Lead3-2": "مهتم بإدارة مجموعة في التعليم، الصحة، وغير ذلك؟",
|
||||
"mobileIOS": "iOS",
|
||||
"mobileIOS": "تطبيق آيفون",
|
||||
"marketing1Lead1Title": "حياتك، لعبة تقمص الأدوار",
|
||||
"marketing3Header": "التطبيقات والإضافات",
|
||||
"marketing2Lead1Title": "الإنتاجية الاجتماعية",
|
||||
"marketing4Lead2": "تكاليف الرعاية الصحية في إزدياد، ويجب فعل شيء ما. تم إنشاء مئات البرامج لتقليل التكاليف وتحسين الصحة. نعتقد أن Habitica قادر على تمهيد طريق حقيقي نحو أنماط حياة صحية.",
|
||||
"marketing4Lead2": "تكاليف الرعاية الصحية في ازدياد، ويجب فعل شيء ما. تم إنشاء مئات البرامج لتقليل التكاليف وتحسين الصحة. نعتقد أن Habitica قادرة على تمهيد طريق حقيقي نحو أنماط حياة صحية.",
|
||||
"oldNews": "أخبار",
|
||||
"setNewPass": "تعيين كلمة مرور جديدة",
|
||||
"presskitText": "شكراً لاهتمامك ب Habitica! يمكن استخدام الصور التالية للمقالات أو مقاطع الفيديو حول Habitica. لمزيد من المعلومات، يرجى التواصل معنا على <٪ = pressEnquiryEmail٪>.",
|
||||
"presskitText": "شكراً لاهتمامك ب Habitica! يمكن استخدام الصور التالية للمقالات أو مقاطع الفيديو حول Habitica. لمزيد من المعلومات، يرجى التواصل معنا على <٪ = pressEnquiryEmail٪>.",
|
||||
"invalidEmail": "إجراء إعادة تعيين كلمة المرور يتطلب عنوان بريد الكتروني صالح.",
|
||||
"marketing1Lead2": "حسن عاداتك لبناء صورتك الرمزية، تباهى بالعتاد الذي كسبته!",
|
||||
"marketing2Lead2": "ما هي لعبة تقمص الأدوار من دون معارك؟ حارب الوحوش مع فريقك. الوحوش هي \"super accountability mode\" - اليوم الذي تتغيب فيه عن النادي الرياضي هو يوم يؤذي فيه الوحش * الجميع! *",
|
||||
"marketing3Lead1": "تتيح لك تطبيقات ** الايفون و الاندرويد ** الاعتناء بالأعمال أثناء التنقل. نحن ندرك أن تسجيل الدخول إلى موقع الويب للنقر على الأزرار يمكن أن يشكل عائق."
|
||||
"marketing2Lead2": "ما هي لعبة تقمص الأدوار من دون معارك؟ حارب الوحوش مع فريقك. الوحوش هي \"super accountability mode\" - اليوم الذي تتغيب فيه عن النادي الرياضي هو يوم يؤذي فيه الوحش *الجميع!*",
|
||||
"marketing3Lead1": "تتيح لك تطبيقات **الآيفون والآندرويد** الاعتناء بالأعمال أثناء التنقل. نحن ندرك أن تسجيل الدخول إلى موقع الويب والنقر على الأزرار يمكن أن يشكل عائقاً.",
|
||||
"chores": "الواجبات المنزلية",
|
||||
"footerProduct": "منتج",
|
||||
"marketing2Header": "تنافس مع الأصدقاء، وانضم إلى مجموعات من اهتماماتك",
|
||||
"presskit": "العدة الصحفية",
|
||||
"pkAnswer1": "إذا كنت قد استثمرت وقتاً في تحسين مستوى شخصية ما في لعبة ما، فمن الصعب ألا تتساءل عن مدى روعة حياتك إذا بذلت كل هذا الجهد لتحسين نفسك في الحياة الواقعية بدلاً من الصورة الرمزية الخاصة بك. بدأنا في بناء Habitica لمعالجة هذا السؤال. <br /> تم إطلاق Habitica رسمياً مع Kickstarter في عام 2013، وبدأت الفكرة حقاً. منذ ذلك الحين، نمت لتصبح مشروعاً ضخماً، مدعوماً من قبل متطوعينا الرائعين في دعم المصدر المفتوح ومستخدمينا الكرماء.",
|
||||
"pkAnswer3": "يعد الضغط الاجتماعي عاملاً محفزاً كبيراً لكثير من الناس، لذلك عرفنا أننا نريد أن يكون لدينا مجتمع قوي يحاسب بعضنا البعض على أهدافهم ويشجع نجاحاتهم. لحسن الحظ، فإن أحد الأشياء التي تقوم بها ألعاب الفيديو متعددة اللاعبين هو تعزيز الشعور بالانتماء للمجتمع بين مستخدميها! يستعير هيكل مجتمع Habitica من هذه الأنواع من الألعاب؛ يمكنك تكوين مجموعة صغيرة من الأصدقاء المقربين، ولكن يمكنك أيضاً الانضمام إلى مجموعات مصالح مشتركة أكبر تُعرف باسم النقابة. على الرغم من أن بعض المستخدمين يختارون اللعب منفردين، فإن معظمهم يقررون تشكيل شبكة دعم تشجع المساءلة الاجتماعية من خلال ميزات مثل المهام، حيث يقوم أعضاء الحزب بتجميع إنتاجيتهم لمحاربة الوحوش معاً.",
|
||||
"pkQuestion2": "لماذا تعمل Habitica؟",
|
||||
"marketing1Lead3Title": "ابحث عن جوائز عشوائية",
|
||||
"marketing3Lead2Title": "الإدراجات",
|
||||
"marketing2Lead3": "تتيح لك التحديات التنافس مع الأصدقاء والغرباء. كل من يفعل الأفضل في نهاية التحدي يفوز بجوائز خاصة.",
|
||||
"pkQuestion3": "لماذا أضفت ميزات اجتماعية؟",
|
||||
"marketing1Lead3": "بالنسبة للبعض، فإن المغامرة التي تحفزهم: نظام يسمى \"المكافآت العشوائية\". تستوعب Habitica جميع أنماط التشجيع والعقاب: الإيجابية والسلبية والمتوقعة والعشوائية.",
|
||||
"marketing2Lead1": "بينما يمكنك لعب Habitica منفرداً، فإن الأضواء تضيء حقاً عندما تبدأ في التعاون والمنافسة وتحميل بعضكم المسؤولية. الجزء الأكثر فعالية في أي برنامج لتحسين الذات هو تحمل المسؤولية الاجتماعية، وهل هناك بيئة للمساءلة والمنافسة أفضل من لعبة فيديو؟",
|
||||
"marketing3Lead2": "**أدوات الطرف الثالث الأخرى** تربط Habitica بجوانب مختلفة من حياتك. توفر واجهة برمجة التطبيقات الخاصة بنا تكاملاً سهلاً لأشياء مثل [Chrome Extension](https://chrome.google.com/webstore/detail/habitica/pidkmpibnnnhneohdgjclfdjpijggmjj?hl=en-US)، التي تفقدك نقاطاً عند تصفح مواقع الويب غير المنتجة، وتكسبك نقاطاً عندما تكون المواقع منتجة. [شاهد المزيد هنا](https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations).",
|
||||
"pkAnswer2": "إن تكوين عادة جديدة أمر صعب لأن الناس يحتاجون حقاً إلى تلك المكافأة الفورية الواضحة. على سبيل المثال، من الصعب البدء في تنظيف الأسنان بالخيط، لأنه على الرغم من أن طبيب الأسنان لدينا يخبرنا أنه أكثر صحة على المدى الطويل، إلا أنه في الوقت الحالي يتسبب في إصابة لثتك. <br /> يضيف أسلوب اللعب في Habitica إحساساً بالإشباع الفوري للأهداف اليومية من خلال مكافأة مهمة صعبة وإعطائك الخبرة، والذهب ... وربما حتى جائزة عشوائية، مثل بيضة التنين! يساعد هذا في الحفاظ على تحفيز الأشخاص حتى عندما لا يكون للمهمة نفسها مكافأة جوهرية، وقد رأينا أشخاصاً يغيرون حياتهم نتيجة لذلك. يمكنك التحقق من قصص النجاح هنا: https://habitversary.tumblr.com",
|
||||
"marketing1Lead2Title": "احصل على معدات رائعة",
|
||||
"enterHabitica": "ادخل Habitica",
|
||||
"pkQuestion6": "من هو مستخدم Habitica التقليدي؟",
|
||||
"pkQuestion8": "كيف أثرت Habitica على حياة الناس الحقيقية؟",
|
||||
"pkLogo": "شعارات",
|
||||
"register": "تسجيل",
|
||||
"teams": "مجموعات",
|
||||
"terms": "الأحكام والشروط",
|
||||
"reportAccountProblems": "الإبلاغ عن مشاكل الحساب",
|
||||
"subscriptionPaymentIssues": "قضايا الاشتراك والدفع",
|
||||
"generalQuestionsSite": "أسئلة عامة حول الموقع",
|
||||
"businessInquiries": "استفسارات الأعمال / التسويق",
|
||||
"merchandiseInquiries": "استفسارات عن البضائع المادية (قمصان، ملصقات)",
|
||||
"socialAlreadyExists": "تسجيل الدخول الاجتماعي هذا مرتبط بالفعل بحساب Habitica موجود.",
|
||||
"invalidReqParams": "معلمات الطلب غير صالحة.",
|
||||
"confirmPassword": "تأكيد كلمة المرور",
|
||||
"emailPlaceholder": "على سبيل المثال، gryphon@example.com",
|
||||
"emailUsernamePlaceholder": "على سبيل المثال، HabitRabbit أو gryphon@example.com",
|
||||
"passwordPlaceholder": "على سبيل المثال، ******************",
|
||||
"confirmPasswordPlaceholder": "تأكد من أنها نفس كلمة المرور!",
|
||||
"joinHabitica": "انضم إلى Habitica",
|
||||
"or": "أو",
|
||||
"gamifyYourLife": "حول حياتك إلى لعبة",
|
||||
"aboutHabitica": "Habitica هو تطبيق مجاني لبناء العادات والإنتاجية يتعامل مع حياتك الواقعية وكأنها لعبة. من خلال المكافآت والعقوبات داخل اللعبة لتحفيزك وشبكة اجتماعية قوية لإلهامك، يمكن أن تساعدك Habitica في تحقيق أهدافك لتصبح صحياً وتعمل بجد وسعادة.",
|
||||
"trackYourGoalsDesc": "كن مسؤولاً عن طريق تتبع وإدارة عاداتك وأهدافك اليومية وقائمة المهام مع تطبيقات الجوال سهلة الاستخدام وواجهة الويب من Habitica.",
|
||||
"battleMonstersDesc": "حارب الوحوش مع مستخدمي Habitica الآخرين! استخدم الذهب الذي تربحه لشراء مكافآت داخل اللعبة أو المكافآت الخاصة، مثل مشاهدة حلقة من برنامجك التلفزيوني المفضل.",
|
||||
"healthAndFitnessDesc": "ليس لديك الحافز لاستعمال خيط الأسنان؟ لا يبدو أنك تريد الذهاب إلى النادي الرياضي؟ Habitica تجعل أخيراً الحصول على صحة جيدة تحدياً ممتعاً.",
|
||||
"schoolAndWorkDesc": "سواء كنت تقوم بإعداد تقرير لمعلمك أو لرئيسك في العمل، فمن السهل تتبع تقدمك وأنت تتعامل مع أصعب مهامك.",
|
||||
"muchmuchMoreDesc": "تعني قائمة مهامنا القابلة للتخصيص بالكامل أنه يمكنك تشكيل Habitica لتناسب أهدافك الشخصية. اعمل على مشاريع إبداعية، أو ركز على الرعاية الذاتية، أو اسعى وراء حلم مختلف - الأمر كله متروك لك.",
|
||||
"levelUpAnywhereDesc": "تجعل تطبيقات الأجهزة المحمولة الخاصة بنا من السهل تتبع مهامك أثناء التنقل. حقق أهدافك بنقرة واحدة، بغض النظر عن مكانك.",
|
||||
"getStarted": "انطلق!",
|
||||
"marketing4Lead2Title": "نظام الصحة والراحة عن طريق اللعب",
|
||||
"marketing4Lead3Title": "أدخل نظام اللعب إلى كل شيء",
|
||||
"pkQuestion4": "لماذا تنقص الصحة الشخصية عند عدم إتمام المهام؟",
|
||||
"pkAnswer4": "إذا لم تؤدي أحد أهدافك اليومية، فستفقد بعضاً من صحة شخصيتك الرمزية. يعد هذا العامل التحفيزي مهماً جداً لتشجيع الناس على متابعة أهدافهم اليومية، لأن الناس يكرهون حقاً إيذاء صورتهم الرمزية الصغيرة! بالإضافة إلى ذلك، تعد المساءلة الاجتماعية أمراً بالغ الأهمية لكثير من الأشخاص: أي إذا كنت تقاتل وحشاً مع أصدقائك، فإن تخطي مهامك يضر بصحتهم الرمزية أيضاً.",
|
||||
"pkAnswer5": "إحدى الطرق التي نجحت بها Habitica في استخدام التحفيز هي أننا بذلنا الكثير من الجهد في التفكير في جوانب اللعبة للتأكد من أنها ممتعة بالفعل. لقد قمنا أيضاً بتضمين العديد من المكونات الاجتماعية، لأننا نشعر أن بعض الألعاب الأكثر تحفيزاً تتيح لك اللعب مع الأصدقاء، ولأن الأبحاث أظهرت أنه من الأسهل تكوين عادات عندما تكون لديك مسؤولية تجاه الآخرين.",
|
||||
"pkAnswer6": "يستخدم الكثير من الأشخاص المختلفين Habitica! أكثر من نصف مستخدمينا تتراوح أعمارهم بين 18 و 34 عاماً، لكن لدينا أجداد يستخدمون الموقع مع أحفادهم الصغار وفي كل الأعمار. غالباً ما تنضم العائلات إلى الحفلة وتقاتل الوحوش معاً. <br /> يتمتع العديد من مستخدمينا بمعرفة في الألعاب، ولكن من المدهش أنه عندما أجرينا استطلاعاً منذ فترة، تم تحديد 40٪ من مستخدمينا على أنهم ليسوا لاعبين! لذلك يبدو أن طريقتنا يمكن أن تكون فعالة لأي شخص يريد أن يشعر بالإنتاجية والعافية ليشعر بمزيد من المرح.",
|
||||
"pkAnswer7": "تستخدم Habitica فن البكسل لعدة أسباب، بالإضافة إلى عامل الحنين الممتع، فإن فن البكسل سهل للغاية بالنسبة لفنانينا المتطوعين الذين يرغبون في المشاركة. من الأسهل كثيراً الحفاظ على اتساق فن البكسل حتى عندما يساهم الكثير من الفنانين المختلفين، ويتيح لنا إنشاء الكثير من الأعمال الجديدة بسرعة وزيادة المحتوى!",
|
||||
"localStorageTryFirst": "إذا كنت تواجه مشكلات في Habitica ، فانقر فوق الزر أدناه لمسح التخزين المحلي ومعظم ملفات تعريف الارتباط لهذا الموقع (لن تتأثر مواقع الويب الأخرى). ستحتاج إلى تسجيل الدخول مرة أخرى بعد ذلك، لذا تأكد أولاً من أنك تعرف معلومات تسجيل الدخول الخاصة بك من اسم مستخدم وكلمة سر. يمكن العثور عليها في الإعدادات -> <%= linkStart %>Site<%= linkEnd %>.",
|
||||
"missingUsernameEmail": "اسم المستخدم أو البريد الإلكتروني مفقود.",
|
||||
"emailTaken": "عنوان البريد الإلكتروني مستخدم بالفعل في الحساب.",
|
||||
"usernameInfo": "أصبحت الآن أسماء تسجيل دخول المستخدمين فريدة ستظهر بجانب اسم العرض الخاص بك وتستخدم للدعوات وإشارات @ للدردشة والمراسلة.<br> <br> إذا كنت ترغب في معرفة المزيد حول هذا التغيير، <a href='https://habitica.fandom.com/wiki/Player_Names' target='_blank'>قم بزيارة موقع wiki الخاص بنا</a>.",
|
||||
"passwordConfirmationMatch": "تأكيد كلمة المرور لا يتطابق مع كلمة المرور.",
|
||||
"invalidLoginCredentialsLong": "عذراً، عنوان بريدك الإلكتروني / اسم المستخدم أو كلمة المرور غير صحيحين.\n- تأكد من كتابتها بشكل صحيح. اسم المستخدم وكلمة المرور حساسان لحالة الأحرف الكبيرة والصغيرة.\n- ربما تكون قد اشتركت في حساب Facebook أو Google، وليس عبر البريد الإلكتروني، لذا تحقق جيداً من خلال تجربتها.\n- إذا نسيت كلمة المرور الخاصة بك، انقر فوق \"نسيت كلمة المرور\".",
|
||||
"alreadyHaveAccountLogin": "لديك بالفعل حساب Habitica؟ <strong> تسجيل الدخول </strong>",
|
||||
"earnRewardsDesc": "أنجز المهام لترفع مستوى شخصيتك الرمزية الخاصة بك وفتح الميزات داخل اللعبة مثل درع المعركة والحيوانات الأليفة الغامضة والمهارات السحرية وحتى المهام!",
|
||||
"featuredIn": "أعلن عنها في",
|
||||
"usernameTOSRequirements": "يجب أن تتوافق أسماء المستخدمين مع <a href='/static/terms' target='_blank'> شروط الخدمة </a> و <a href='/static/community-guidelines' target='_blank'> إرشادات المجتمع < / أ>. إذا لم تكن قد قمت بتعيين اسم تسجيل دخول من قبل، فسيتم إنشاء اسم المستخدم تلقائياً.",
|
||||
"accountSuspended": "تم حظر هذا الحساب، للمستخدم \"<%= userId %>\"، لخرقه إرشادات المجتمع (https://habitica.com/static/community-guidelines) أو شروط الخدمة (https://habitica.com/static/community-guidelines). للحصول على تفاصيل أو لطلب إلغاء الحظر، يرجى إرسال بريد إلكتروني إلى مدير المجتمع لدينا على <%= communityManagerEmail %> أو اطلب من والديك أو الوصي عليك إرسال بريد إلكتروني إليهم. الرجاء تضمين اسم المستخدم @ في البريد الإلكتروني.",
|
||||
"cannotFulfillReq": "لا يمكن تلبية طلبك. أرسل بريداً إلكترونياً إلى admin@habitica.com إذا استمر هذا الخطأ.",
|
||||
"pkAnswer8": "يمكنك العثور على الكثير من الشهادات حول كيفية مساعدة Habitica للأشخاص هنا: https://habitversary.tumblr.com",
|
||||
"sync": "تحديث",
|
||||
"tumblr": "تمبلر Tumblr",
|
||||
"emailOrUsername": "البريد الإلكتروني أو اسم المستخدم (مع الانتباه للأحرف الكبيرة والصغيرة)",
|
||||
"missingUsername": "اسم المستخدم مفقود.",
|
||||
"wrongPassword": "كلمة مرور خاطئة.",
|
||||
"incorrectDeletePhrase": "يرجى كتابة <%= magicWord %> بأحرف كبيرة لحذف حسابك.",
|
||||
"newEmailRequired": "عنوان البريد الإلكتروني الجديد مفقود.",
|
||||
"accountSuspendedTitle": "تم تعليق حسابك",
|
||||
"unsupportedNetwork": "هذه الشبكة غير مدعومة حالياً.",
|
||||
"onlySocialAttachLocal": "يمكن إضافة المصادقة المحلية إلى تسجيل دخول حساب اجتماعي فقط.",
|
||||
"loginWithSocial": "قم بالدخول عن طريق <%= social %>",
|
||||
"usernamePlaceholder": "على سبيل المثال، HabitRabbit",
|
||||
"motivateYourself": "حفز نفسك لتحقيق أهدافك.",
|
||||
"timeToGetThingsDone": "حان الوقت للاستمتاع عندما تنجز الأشياء! انضم إلى أكثر من <%= userCountInMillions %> مليون مواطن وحسن حياتك مهمة واحدة في كل مرة.",
|
||||
"earnRewards": "اكسب مكافآت مقابل تحقيق أهدافك",
|
||||
"playersUseToImprove": "يستخدم اللاعبون Habitica للترقي",
|
||||
"healthAndFitness": "الصحة واللياقة",
|
||||
"muchmuchMore": "والكثير الكثير!",
|
||||
"joinMany": "انضم إلى أكثر من <%= userCountInMillions %> مليون شخص يستمتعون خلال تحقيق أهدافهم!",
|
||||
"work": "العمل",
|
||||
"levelUpAnywhere": "تقدم في المستوى من أي مكان",
|
||||
"learnMore": "تعلم أكثر",
|
||||
"usernameTaken": "اسم المستخدم غير متاح.",
|
||||
"pkBoss": "وحوش",
|
||||
"username": "اسم المستخدم",
|
||||
"trackYourGoals": "تتبع عاداتك وأهدافك",
|
||||
"notAnEmail": "عنوان البريد الإلكتروني غير صالح.",
|
||||
"missingEmail": "البريد الإلكتروني مفقود.",
|
||||
"dontHaveAccountSignup": "ليس لديك حساب Habitica؟ <strong> إنشاء حساب </strong>",
|
||||
"pkQuestion7": "لماذا تستخدم Habitica فن البكسل؟",
|
||||
"tasks": "المهام",
|
||||
"localStorageTryNext": "إذا استمرت المشكلة، يرجى <%= linkStart %>الإبلاغ عن الخطأ<%= linkEnd %> إذا لم تكن قد قمت ذلك.",
|
||||
"pkMoreQuestions": "هل لديك سؤال غير موجود في هذه القائمة؟ أرسل بريد إلكتروني إلى admin@habitica.com!",
|
||||
"mobileApps": "تطبيقات الموبايل",
|
||||
"localStorageClearExplanation": "سيؤدي هذا الزر إلى مسح التخزين المحلي ومعظم ملفات تعريف الارتباط وتسجيل خروجك.",
|
||||
"marketing4Header": "لاستخدام المنظمات",
|
||||
"pkQuestion5": "ما الذي يميز Habitica عن برامج التلعيب (إضافة نظام اللعب) الأخرى؟",
|
||||
"marketing4Lead1": "التعليم هو أحد أفضل القطاعات لتطبيق نظام اللعب. نعلم جميعاً مدى تعلق الطلاب بالهواتف والألعاب هذه الأيام؛ نعم لتسخير تلك القوة! إن كنت معلماً؛ حرض طلابك ضد بعضهم البعض في منافسة ودية، وكافئ السلوك الجيد بجوائز نادرة، تشاهد درجاتهم وسلوكهم يرتفع.",
|
||||
"usernameTime": "حان الوقت لتعيين اسم المستخدم الخاص بك!",
|
||||
"missingPassword": "كلمة المرور مفقودة.",
|
||||
"joinToday": "انضم إلى Habitica اليوم",
|
||||
"marketing4Lead1Title": "نظام التعليم عن طريق اللعب",
|
||||
"memberIdRequired": "\"member\" يجب أن يكون معرف UUID صالحاً.",
|
||||
"modelNotFound": "هذا النموذج غير موجود.",
|
||||
"signUpWithSocial": "قم بالتسجيل عن طريق <%= social %>",
|
||||
"pkSamples": "عينات لقطات شاشة",
|
||||
"pkWebsite": "موقع",
|
||||
"schoolAndWork": "الدراسة والعمل",
|
||||
"invalidEmailDomain": "لا يمكنك تسجيل البريد الإلكتروني من المخدمات التالية: <%= domains %>",
|
||||
"missingNewPassword": "كلمة المرور الجديدة مفقودة.",
|
||||
"heroIdRequired": "\"heroId\" يجب أن يكون معرف UUID صالحاً.",
|
||||
"signup": "اشتراك",
|
||||
"minPasswordLength": "يجب أن تتكون كلمة المرور من 8 أحرف أو أكثر.",
|
||||
"singUpForFree": "سجل مجاناً",
|
||||
"localStorageClear": "مسح البيانات المحلية",
|
||||
"pkPromo": "إجراءات",
|
||||
"tweet": "تغريد",
|
||||
"privacy": "سياسة الخصوصية",
|
||||
"reportCommunityIssues": "الإبلاغ عن مشاكل المجتمع",
|
||||
"checkOutMobileApps": "جرب تطبيقات الجوال!",
|
||||
"school": "المدرسة",
|
||||
"missingAuthHeaders": "سلاسل المصادقة مفقودة.",
|
||||
"passwordReset": "إذا كان لدينا بريدك الإلكتروني أو اسم المستخدم الخاصين بك في الملف، فقد تم إرسال تعليمات تعيين كلمة مرور جديدة إلى بريدك الإلكتروني.",
|
||||
"invalidCredentials": "لا يوجد حساب يستخدم بيانات الاعتماد هذه.",
|
||||
"cantDetachSocial": "يفتقر الحساب إلى طريقة مصادقة أخرى؛ لا يمكن فصل طريقة المصادقة هذه.",
|
||||
"usernameLimitations": "يجب أن يكون اسم المستخدم من 1 إلى 20 حرفاً، ويحتوي فقط على الأحرف، والأرقام من 0 إلى 9، والواصلات، أو الشرطات السفلية، ولا يمكن أن يتضمن أي مصطلحات غير ملائمة.",
|
||||
"battleMonsters": "حارب الوحوش مع الأصدقاء",
|
||||
"passwordResetPage": "إعادة تعيين كلمة المرور"
|
||||
}
|
||||
|
||||
@@ -1,39 +1,39 @@
|
||||
{
|
||||
"languageName": "العربية",
|
||||
"stringNotFound": "سلسلة المحارف '<%= string %>' لم توجد.",
|
||||
"stringNotFound": "سلسلة المحارف '<%= string %>' غير موجودة.",
|
||||
"habitica": "Habitica",
|
||||
"onward": "إلي الأمام!",
|
||||
"done": "Done",
|
||||
"gotIt": "Got it!",
|
||||
"onward": "إلى الأمام!",
|
||||
"done": "انتهى",
|
||||
"gotIt": "فهمت!",
|
||||
"titleTimeTravelers": "مسافرين عبر الزمن",
|
||||
"titleSeasonalShop": "المتجر الموسمي",
|
||||
"saveEdits": "Save Edits",
|
||||
"showMore": "Show More",
|
||||
"showLess": "Show Less",
|
||||
"markdownHelpLink": "Markdown formatting help",
|
||||
"bold": "**Bold**",
|
||||
"saveEdits": "حفظ التغييرات",
|
||||
"showMore": "إظهار المزيد",
|
||||
"showLess": "عرض أقل",
|
||||
"markdownHelpLink": "تعليمات تنسيق لغة Markdown",
|
||||
"bold": "**سميك**",
|
||||
"markdownImageEx": "",
|
||||
"code": "`code`",
|
||||
"achievements": "الإنجازات",
|
||||
"basicAchievs": "Basic Achievements",
|
||||
"seasonalAchievs": "Seasonal Achievements",
|
||||
"specialAchievs": "Special Achievements",
|
||||
"basicAchievs": "الإنجازات الأساسية",
|
||||
"seasonalAchievs": "الإنجازات الموسمية",
|
||||
"specialAchievs": "الإنجازات الخاصة",
|
||||
"modalAchievement": "إنجاز!",
|
||||
"special": "خاص",
|
||||
"site": "الموقع",
|
||||
"help": "مساعدة",
|
||||
"user": "المستخدم",
|
||||
"market": "المتجر",
|
||||
"newSubscriberItem": "You have new <span class=\"notification-bold-blue\">Mystery Items</span>",
|
||||
"newSubscriberItem": "لديك <span class=\"notification-bold-blue\"> عناصر غامضة جديدة </span>",
|
||||
"subscriberItemText": "كل شهر يحصل المشتركون على غرض غامض. عادةً يصبح متاحا في بداية الشهر. راجع صفحة الويكي \"الغرض الغامض\" للمزيد من المعلومات.",
|
||||
"all": "الجميع",
|
||||
"none": "لا شيء",
|
||||
"more": "<%= count %> more",
|
||||
"more": "<%= count %> أكثر",
|
||||
"and": "و",
|
||||
"submit": "إرسال",
|
||||
"close": "إغلاق",
|
||||
"saveAndClose": "حفظ وإغلاق",
|
||||
"saveAndConfirm": "Save & Confirm",
|
||||
"saveAndConfirm": "حفظ & تأكيد",
|
||||
"cancel": "إلغاء",
|
||||
"ok": "حسناً",
|
||||
"add": "إضافة",
|
||||
@@ -47,29 +47,29 @@
|
||||
"delete": "حذف",
|
||||
"gemsPopoverTitle": "جواهر",
|
||||
"gems": "الجواهر",
|
||||
"needMoreGems": "Need More Gems?",
|
||||
"needMoreGemsInfo": "Purchase Gems now, or become a subscriber to buy Gems with Gold, get monthly mystery items, enjoy increased drop caps and more!",
|
||||
"needMoreGems": "تحتاج المزيد من الأحجار الكريمة؟",
|
||||
"needMoreGemsInfo": "قم بشراء الأحجار الكريمة الآن، أو اشترك لتكون قادراً على شراء الأحجار الكريمة بالذهب، واحصل على عناصر غامضة شهرياً، واستمتع بالتميز والجوائز المتزايدة والمزيد!",
|
||||
"veteran": "متمرس",
|
||||
"veteranText": "نجا من \"العادة الرمادية\" (موقعنا السابق)، وحصل على العديد من ندب المعارك من أخطائه.",
|
||||
"originalUser": "مستخدم أصلي!",
|
||||
"originalUserText": "واحد من المتبنين <em>الأوائل</em>. نتكلم عن مجرب منذ البداية!",
|
||||
"habitBirthday": "حفلة يوم ميلاد Habitica",
|
||||
"habitBirthdayText": "احتفل بيوم ميلاد Habitica!",
|
||||
"habitBirthdayPluralText": "Celebrated <%= count %> Habitica Birthday Bashes!",
|
||||
"habitBirthdayPluralText": "احتفل <%= count %> أيام ميلاد Habitica!",
|
||||
"habiticaDay": "يوم تسمية Habitica",
|
||||
"habiticaDaySingularText": "احتفل بيوم تسمية Habitica! شكراً لكونك مستخدماً رائعاً.",
|
||||
"habiticaDayPluralText": "Celebrated <%= count %> Naming Days! Thanks for being a fantastic user.",
|
||||
"habiticaDayPluralText": "احتفل <%= count %> بأيام تسمية Habitica! شكراً لكونك مستخدماً رائعاً.",
|
||||
"achievementDilatory": "المنقذ من المماطلة",
|
||||
"achievementDilatoryText": "ساعد على هزيمة تنين المماطلة المروع خلال احتفال صيف 2014!",
|
||||
"costumeContest": "متسابق الأزياء التنكرية",
|
||||
"costumeContestText": "Participated in the Habitoween Costume Contest. See some of the awesome entries at blog.habitrpg.com!",
|
||||
"costumeContestTextPlural": "Participated in <%= count %> Habitoween Costume Contests. See some of the awesome entries at blog.habitrpg.com!",
|
||||
"newPassSent": "If we have your email on file, instructions for setting a new password have been sent to your email.",
|
||||
"costumeContestText": "شارك في مسابقة أزياء الهالوين. شاهد بعض الأفكار الرائعة على blog.habitrpg.com!",
|
||||
"costumeContestTextPlural": "شارك في <%= count %> مسابقات أزياء الهالوين. شاهد بعض الأفكار الرائعة على blog.habitrpg.com!",
|
||||
"newPassSent": "إذا كان لدينا بريدك الإلكتروني في الملف، فقد تم إرسال تعليمات تعيين كلمة مرور جديدة إلى بريدك الإلكتروني.",
|
||||
"error": "خطأ",
|
||||
"menu": "القائمة",
|
||||
"notifications": "الإشعارات",
|
||||
"noNotifications": "You're all caught up!",
|
||||
"noNotificationsText": "The notification fairies give you a raucous round of applause! Well done!",
|
||||
"noNotifications": "لديك آخر التحديثات!",
|
||||
"noNotificationsText": "تمنحك جنيات الإشعارات جولة من التصفيق الصاخب! أحسنت!",
|
||||
"clear": "إزالة",
|
||||
"audioTheme": "سمة الصوت",
|
||||
"audioTheme_off": "تعطيل",
|
||||
@@ -77,17 +77,17 @@
|
||||
"audioTheme_wattsTheme": "سمة واتس",
|
||||
"audioTheme_gokulTheme": "سمة غوكل",
|
||||
"audioTheme_luneFoxTheme": "سمة لونفوكس",
|
||||
"audioTheme_rosstavoTheme": "Rosstavo's Theme",
|
||||
"audioTheme_dewinTheme": "Dewin's Theme",
|
||||
"audioTheme_airuTheme": "Airu's Theme",
|
||||
"audioTheme_beatscribeNesTheme": "Beatscribe's NES Theme",
|
||||
"audioTheme_arashiTheme": "Arashi's Theme",
|
||||
"audioTheme_triumphTheme": "Triumph Theme",
|
||||
"audioTheme_lunasolTheme": "Lunasol Theme",
|
||||
"audioTheme_spacePenguinTheme": "SpacePenguin's Theme",
|
||||
"audioTheme_maflTheme": "MAFL Theme",
|
||||
"audioTheme_pizildenTheme": "Pizilden's Theme",
|
||||
"audioTheme_farvoidTheme": "Farvoid Theme",
|
||||
"audioTheme_rosstavoTheme": "سمة روسستافو",
|
||||
"audioTheme_dewinTheme": "سمة ديوين",
|
||||
"audioTheme_airuTheme": "سمة آيرو",
|
||||
"audioTheme_beatscribeNesTheme": "سمة بيتسكرايب NES",
|
||||
"audioTheme_arashiTheme": "سمة أراشي",
|
||||
"audioTheme_triumphTheme": "سمة الانتصار الساحق",
|
||||
"audioTheme_lunasolTheme": "سمة لوناسول",
|
||||
"audioTheme_spacePenguinTheme": "سمة بطريق الفضاء",
|
||||
"audioTheme_maflTheme": "سمة مافل",
|
||||
"audioTheme_pizildenTheme": "سمة بيزيلدن",
|
||||
"audioTheme_farvoidTheme": "سمة فارفويد",
|
||||
"reportBug": "بلّغ عن خطأ",
|
||||
"overview": "لمحة عامة للمستخدمين الجدد",
|
||||
"dateFormat": "صيغة التاريخ",
|
||||
@@ -95,110 +95,110 @@
|
||||
"achievementStressbeastText": "ساعد على هزيمة وحش التوتر الفظيع خلال احتفال شتاء 2014!",
|
||||
"achievementBurnout": "المنقذ من الحقول المزدهرة",
|
||||
"achievementBurnoutText": "ساعد على هزيمة احتراقي واستعادة أشباح العادم خلال احتفال خريف 2015!",
|
||||
"achievementBewilder": "Savior of Mistiflying",
|
||||
"achievementBewilderText": "Helped defeat the Be-Wilder during the 2016 Spring Fling Event!",
|
||||
"achievementDysheartener": "Savior of the Shattered",
|
||||
"achievementDysheartenerText": "Helped defeat the Dysheartener during the 2018 Valentine's Event!",
|
||||
"cards": "Cards",
|
||||
"sentCardToUser": "You sent a card to <%= profileName %>",
|
||||
"cardReceived": "You received a <span class=\"notification-bold-blue\"><%= card %></span>",
|
||||
"achievementBewilder": "المنقذ من الخطأ",
|
||||
"achievementBewilderText": "ساعد في هزيمة Be-Wilder خلال حدث Spring Fling لعام 2016!",
|
||||
"achievementDysheartener": "منقذ المحطمين",
|
||||
"achievementDysheartenerText": "ساعد في هزيمة Dysheartener خلال حدث عيد الحب 2018!",
|
||||
"cards": "البطاقات",
|
||||
"sentCardToUser": "لقد أرسلت بطاقة إلى <%= profileName %>",
|
||||
"cardReceived": "لقد وصلتك <span class=\"notification-bold-blue\"><%= card %></span>",
|
||||
"greetingCard": "بطاقة معايدة",
|
||||
"greetingCardExplanation": "كلاكما ستحصلان على إنجاز الصاحب المبتهج!",
|
||||
"greetingCardNotes": "أرسل بطاقة تحية لعضو بالفريق.",
|
||||
"greeting0": "مرحباً!",
|
||||
"greeting1": "فقط أحببت أن أقول مرحباً :)",
|
||||
"greeting2": "`waves frantically`",
|
||||
"greeting2": "`موجات حميمية`",
|
||||
"greeting3": "مرحباً يا!",
|
||||
"greetingCardAchievementTitle": "الصاحب المبتهج",
|
||||
"greetingCardAchievementText": "Hey! Hi! Hello! Sent or received <%= count %> greeting cards.",
|
||||
"greetingCardAchievementText": "مرحباً! لقد أرسلت أو استلمت <%= count %> بطاقة تحية.",
|
||||
"thankyouCard": "بطاقة شكر",
|
||||
"thankyouCardExplanation": "كلاكما ستحصلان على إنجاز الممتن كثيراً!",
|
||||
"thankyouCardNotes": "أرسل بطاقة شكر لعضو فريق.",
|
||||
"thankyou0": "شكراً جزيلاً لك!",
|
||||
"thankyou1": "شكراً، شكراً، شكراً!",
|
||||
"thankyou1": "شكراً جزيلاً، شكراً!",
|
||||
"thankyou2": "أرسل لك ألف شكر.",
|
||||
"thankyou3": "أنا ممتن كثيراً، شكراً لك!",
|
||||
"thankyouCardAchievementTitle": "ممتن لك بشدة",
|
||||
"thankyouCardAchievementText": "Thanks for being thankful! Sent or received <%= count %> Thank-You cards.",
|
||||
"thankyouCardAchievementText": "شكراً لكونك ممتناً! لقد أرسلت أو استلمت <%= count %> رسالة شكر.",
|
||||
"birthdayCard": "بطاقة تهنئة بيوم الميلاد",
|
||||
"birthdayCardExplanation": "كلاكما تحصلان على إنجاز يوم الميلاد المليء بالحظ!",
|
||||
"birthdayCardNotes": "أرسل بطاقة تهنة يوم الميلاد لأحد أعضاء فريقك.",
|
||||
"birthday0": "يوم ميلاد سعيد!",
|
||||
"birthdayCardAchievementTitle": "يوم ميلاد مليء بالحظ",
|
||||
"birthdayCardAchievementText": "Many happy returns! Sent or received <%= count %> birthday cards.",
|
||||
"congratsCard": "Congratulations Card",
|
||||
"congratsCardExplanation": "You both receive the Congratulatory Companion achievement!",
|
||||
"congratsCardNotes": "Send a Congratulations card to a party member.",
|
||||
"congrats0": "Congratulations on your success!",
|
||||
"congrats1": "I'm so proud of you!",
|
||||
"congrats2": "Well done!",
|
||||
"congrats3": "A round of applause for you!",
|
||||
"congrats4": "Bask in your well-deserved success!",
|
||||
"congratsCardAchievementTitle": "Congratulatory Companion",
|
||||
"congratsCardAchievementText": "It's great to celebrate your friends' achievements! Sent or received <%= count %> congratulations cards.",
|
||||
"getwellCard": "Get Well Card",
|
||||
"getwellCardExplanation": "You both receive the Caring Confidant achievement!",
|
||||
"getwellCardNotes": "Send a Get Well card to a party member.",
|
||||
"getwell0": "Hope you feel better soon!",
|
||||
"getwell1": "Take care! <3",
|
||||
"getwell2": "You're in my thoughts!",
|
||||
"getwell3": "Sorry you're not feeling your best!",
|
||||
"getwellCardAchievementTitle": "Caring Confidant",
|
||||
"getwellCardAchievementText": "Well-wishes are always appreciated. Sent or received <%= count %> get well cards.",
|
||||
"goodluckCard": "Good Luck Card",
|
||||
"goodluckCardExplanation": "You both receive the Lucky Letter achievement!",
|
||||
"goodluckCardNotes": "Send a good luck card to a party member.",
|
||||
"goodluck0": "May luck always follow you!",
|
||||
"goodluck1": "Wishing you lots of luck!",
|
||||
"goodluck2": "I hope luck is on your side today and always!!",
|
||||
"goodluckCardAchievementTitle": "Lucky Letter",
|
||||
"goodluckCardAchievementText": "Wishes for good luck are great encouragement! Sent or received <%= count %> good luck cards.",
|
||||
"streakAchievement": "You earned a streak achievement!",
|
||||
"firstStreakAchievement": "21-Day Streak",
|
||||
"streakAchievementCount": "<%= streaks %> 21-Day Streaks",
|
||||
"twentyOneDays": "You've completed your Daily for 21 days in a row!",
|
||||
"dontBreakStreak": "Amazing job. Don't break the streak!",
|
||||
"birthdayCardAchievementText": "العديد من عوائد سعيدة! لقد أرسلت أو استلمت <%= count %> بطاقة عيد ميلاد سعيد.",
|
||||
"congratsCard": "بطاقة تهنئة",
|
||||
"congratsCardExplanation": "كلاكما تلقى إنجاز الرفيق المهنئ!",
|
||||
"congratsCardNotes": "أرسل بطاقة تهنئة لعضو الفريق.",
|
||||
"congrats0": "مبارك نجاحك!",
|
||||
"congrats1": "أنا فخور جداً بك!",
|
||||
"congrats2": "أحسنت!",
|
||||
"congrats3": "جولة من التصفيق لك!",
|
||||
"congrats4": "تشرق في نجاحك الذي تستحقه!",
|
||||
"congratsCardAchievementTitle": "الرفيق المهنئ",
|
||||
"congratsCardAchievementText": "إنه لأمر رائع أن تحتفل بإنجازات أصدقائك! لقد أرسلت أو استلمت <%= count %> بطاقة تهنئة.",
|
||||
"getwellCard": "بطاقة التعافي والشفاء العاجل",
|
||||
"getwellCardExplanation": "كلاكما حصل على إنجاز رعاية المقرب!",
|
||||
"getwellCardNotes": "أرسل بطاقة تمنيات بالشفاء العاجل إلى أحد أعضاء الفريق.",
|
||||
"getwell0": "أتمنى أن تشعر بتحسن عما قريب!",
|
||||
"getwell1": "اعتن بنفسك! <3",
|
||||
"getwell2": "أنت في أفكاري!",
|
||||
"getwell3": "آسف لأنك لست في أفضل حالاتك!",
|
||||
"getwellCardAchievementTitle": "رعاية المقرب",
|
||||
"getwellCardAchievementText": "إنه لموضع تقدير، التمنيات الطيبة. لقد أرسلت أو استلمت <%= count %> بطاقة تمنيات طيبة.",
|
||||
"goodluckCard": "بطاقة حظ سعيد",
|
||||
"goodluckCardExplanation": "كلاكما تلقيت إنجاز البريد المحظوظ!",
|
||||
"goodluckCardNotes": "أرسل بطاقة حظ سعيد إلى أحد أعضاء الفريق.",
|
||||
"goodluck0": "فليتبعك الحظ دائماً!",
|
||||
"goodluck1": "أتمنى لك الكثير من الحظ!",
|
||||
"goodluck2": "أتمنى أن يكون الحظ بجانبك اليوم ودائماً !!",
|
||||
"goodluckCardAchievementTitle": "البريد المحظوظ",
|
||||
"goodluckCardAchievementText": "التمنيات بالتوفيق هي تشجيع كبير! لقد أرسلت أو استلمت <%= count %> بطاقة حظ سعيد.",
|
||||
"streakAchievement": "لقد ربحت إنجازاً متتالياً!",
|
||||
"firstStreakAchievement": "ضربة 21-يوماً",
|
||||
"streakAchievementCount": "<%= streaks %> ضربة 21-يوماً",
|
||||
"twentyOneDays": "لقد أكملت برنامجك اليومي لمدة 21 يوماً على التوالي!",
|
||||
"dontBreakStreak": "عمل مبهر. لا تكسر الضربة المتتالية!",
|
||||
"dontStop": "لا تتوقف الآن!",
|
||||
"wonChallengeShare": "فزت بتحد في Habitica!",
|
||||
"orderBy": "Order By <%= item %>",
|
||||
"you": "(you)",
|
||||
"loading": "Loading...",
|
||||
"userIdRequired": "User ID is required",
|
||||
"resetFilters": "Clear all filters",
|
||||
"applyFilters": "Apply Filters",
|
||||
"wantToWorkOn": "I want to work on:",
|
||||
"categories": "Categories",
|
||||
"animals": "Animals",
|
||||
"exercise": "Exercise",
|
||||
"creativity": "Creativity",
|
||||
"health_wellness": "Health & Wellness",
|
||||
"self_care": "Self-Care",
|
||||
"habitica_official": "Habitica Official",
|
||||
"academics": "Academics",
|
||||
"advocacy_causes": "Advocacy + Causes",
|
||||
"entertainment": "Entertainment",
|
||||
"finance": "Finance",
|
||||
"orderBy": "ترتيب حسب <%= item %>",
|
||||
"you": "(أنت)",
|
||||
"loading": "تحميل...",
|
||||
"userIdRequired": "مطلوب ID المستخدم (User ID)",
|
||||
"resetFilters": "امسح كل عوامل التصفية",
|
||||
"applyFilters": "تطبيق عوامل التصفية",
|
||||
"wantToWorkOn": "أريد العمل على:",
|
||||
"categories": "الفئات",
|
||||
"animals": "الحيوانات",
|
||||
"exercise": "التمرين",
|
||||
"creativity": "الإِبداع",
|
||||
"health_wellness": "الصحة & الراحة",
|
||||
"self_care": "العناية بالنفس",
|
||||
"habitica_official": "Habitica رسمي",
|
||||
"academics": "أكاديمي",
|
||||
"advocacy_causes": "تطوع + مجتمعات الاهتمام",
|
||||
"entertainment": "وسائل الترفيه",
|
||||
"finance": "الموارد المالية",
|
||||
"health_fitness": "الصحة واللياقة البدنية",
|
||||
"hobbies_occupations": "الهوايات والمهن",
|
||||
"location_based": "Location-based",
|
||||
"location_based": "معتمد على الموقع",
|
||||
"mental_health": "الصحة العقلية + العناية الذاتية",
|
||||
"getting_organized": "Getting Organized",
|
||||
"self_improvement": "Self-Improvement",
|
||||
"spirituality": "Spirituality",
|
||||
"time_management": "Time-Management + Accountability",
|
||||
"recovery_support_groups": "Recovery + Support Groups",
|
||||
"dismissAll": "Dismiss All",
|
||||
"messages": "Messages",
|
||||
"emptyMessagesLine1": "You don't have any messages",
|
||||
"getting_organized": "أن تصبح أكثر تنظيماً",
|
||||
"self_improvement": "تطوير الذات",
|
||||
"spirituality": "الروحانية",
|
||||
"time_management": "إدارة الوقت + المسؤولية",
|
||||
"recovery_support_groups": "مجموعات التجديد + الدعم",
|
||||
"dismissAll": "امسح الكل",
|
||||
"messages": "الرسائل",
|
||||
"emptyMessagesLine1": "ليس لديك أية رسائل",
|
||||
"emptyMessagesLine2": "يمكنك إرسال رسالة جديدة إلى مستخدم من خلال زيارة ملفه الشخصي والنقر على زر \"رسالة\".",
|
||||
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> sent you a message",
|
||||
"userSentMessage": "<span class=\"notification-bold\"><%- user %></span> أرسل لك رسالة",
|
||||
"letsgo": "لنذهب!",
|
||||
"selected": "Selected",
|
||||
"howManyToBuy": "How many would you like to buy?",
|
||||
"contactForm": "Contact the Moderation Team",
|
||||
"selected": "محدد",
|
||||
"howManyToBuy": "كم تريد أن تشتري؟",
|
||||
"contactForm": "تواصل مع فريق الإشراف",
|
||||
"congratulations": "تهانينا!",
|
||||
"finish": "نهاية",
|
||||
"onboardingAchievs": "إنجازات الإعداد",
|
||||
"onboardingAchievs": "الإنجازات الترحيبية",
|
||||
"reportBugHeaderDescribe": "يُرجى وصف الخطأ الذي تواجهه وسيتواصل معك فريقنا.",
|
||||
"reportEmailText": "سيتم استخدام هذا فقط للاتصال بك بخصوص تقرير الخطأ.",
|
||||
"reportEmailPlaceholder": "عنوان بريدك الإلكتروني",
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"noItemsAvailableForType": "لا يوجد لديك <%= type %>",
|
||||
"noItemsAvailableForType": "لا يوجد لديك <%= type %>.",
|
||||
"foodItemType": "طعام الحيوانات الأليفة",
|
||||
"eggsItemType": "بيض",
|
||||
"hatchingPotionsItemType": "جرعات الفقس",
|
||||
"specialItemType": "حاجات خاصة",
|
||||
"lockedItem": "حاجة مقفلة",
|
||||
"hatchingPotionsItemType": "جرعات التلقيح",
|
||||
"specialItemType": "عناصر خاصة",
|
||||
"lockedItem": "عنصر مقفل",
|
||||
"petAndMount": "حيوان أليف وحيوان للركوب",
|
||||
"allItems": "كل العناصر"
|
||||
}
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
{
|
||||
"unlockedReward": "You have received <%= reward %>",
|
||||
"earnedRewardForDevotion": "You have earned <%= reward %> for being committed to improving your life.",
|
||||
"nextRewardUnlocksIn": "Check-ins until your next prize: <%= numberOfCheckinsLeft %>",
|
||||
"awesome": "Awesome!",
|
||||
"unlockedReward": "لقد استلمت <%= reward %>",
|
||||
"earnedRewardForDevotion": "لقد حصلت على <%= reward %> لكونك ملتزماً بتحسين حياتك.",
|
||||
"nextRewardUnlocksIn": "تسجيلات دخول للحصول على جائزتك القادمة: <%= numberOfCheckinsLeft %>",
|
||||
"awesome": "رائع!",
|
||||
"countLeft": "Check-ins until next reward: <%= count %>",
|
||||
"incentivesDescription": "When it comes to building habits, consistency is key. Each day you check-in you get closer to a prize.",
|
||||
"checkinEarned": "Your Check-In Counter went up!",
|
||||
"unlockedCheckInReward": "You unlocked a Check-In Prize!",
|
||||
"checkinProgressTitle": "Progress until next",
|
||||
"incentiveBackgroundsUnlockedWithCheckins": "Locked Plain Backgrounds will unlock with Daily Check-Ins.",
|
||||
"oneOfAllPetEggs": "one of each standard Pet Egg",
|
||||
"twoOfAllPetEggs": "two of each standard Pet Egg",
|
||||
"threeOfAllPetEggs": "three of each standard Pet Egg",
|
||||
"oneOfAllHatchingPotions": "one of each standard Hatching Potion",
|
||||
"threeOfEachFood": "three of each standard Pet Food",
|
||||
"fourOfEachFood": "four of each standard Pet Food",
|
||||
"twoSaddles": "two Saddles",
|
||||
"incentivesDescription": "عندما يتعلق الأمر ببناء العادات ، فإن الاستمرار هو المفتاح. كل يوم تقوم بتسجيل الدخول تقترب من مكافأة.",
|
||||
"checkinEarned": "ازداد عدد تسجيلات الدخول الخاص بك!",
|
||||
"unlockedCheckInReward": "لقد حررت جائزة تسجيل دخول!",
|
||||
"checkinProgressTitle": "عملية التقدم للتالي",
|
||||
"incentiveBackgroundsUnlockedWithCheckins": "التقدم حتى يتم فتح الخلفيات العادية المقفلة التالية مع تسجيلات الدخول اليومية.",
|
||||
"oneOfAllPetEggs": "واحدة من بيض كل الحيوانات الأليفة القياسية",
|
||||
"twoOfAllPetEggs": "اثنين من بيض كل الحيوانات الأليفة القياسية",
|
||||
"threeOfAllPetEggs": "ثلاثة من بيض كل الحيوانات الأليفة القياسية",
|
||||
"oneOfAllHatchingPotions": "واحدة من كل جرعات التفقيس القياسية",
|
||||
"threeOfEachFood": "ثلاثة من كل جرعات التفقيس القياسية",
|
||||
"fourOfEachFood": "أربعة من غذاء كل الحيوانات الأليفة القياسية",
|
||||
"twoSaddles": "اثنين من السروج",
|
||||
"threeSaddles": "ثلاثة سروج",
|
||||
"incentiveAchievement": "the Royally Loyal achievement",
|
||||
"royallyLoyal": "Royally Loyal",
|
||||
"royallyLoyalText": "This user has checked in over 500 times, and has earned every Check-In Prize!",
|
||||
"checkInRewards": "Check-In Rewards",
|
||||
"backloggedCheckInRewards": "You received Check-In Prizes! Visit your Inventory and Equipment to see what's new."
|
||||
"incentiveAchievement": "إنجاز الولاء الملكي",
|
||||
"royallyLoyal": "الولاء الملكي",
|
||||
"royallyLoyalText": "هذا المستخدم قد قام بتسجيل الدخول أكثر من 500 مرة، وحصل على كل مكافآت تسجيل الدخول!",
|
||||
"checkInRewards": "مكافآت تسجيل الدخول",
|
||||
"backloggedCheckInRewards": "لقد استلمت مكافآت تسجيل دخول! ادخل على مخزنك ومعداتك لترى ما هو جديد."
|
||||
}
|
||||
|
||||
@@ -609,7 +609,7 @@
|
||||
"questSeaSerpentNotes": "Your streaks have you feeling lucky—it’s the perfect time for a trip to the seahorse racetrack. You board the submarine at Diligent Docks and settle in for the trip to Dilatory, but you’ve barely submerged when an impact rocks the sub, sending its occupants tumbling. “What’s going on?” @AriesFaries shouts.<br><br>You glance through a nearby porthole and are shocked by the wall of shimmering scales passing by it. “Sea serpent!” Captain @Witticaster calls through the intercom. “Brace yourselves, it’s coming ‘round again!” As you grip the arms of your seat, your unfinished tasks flash before your eyes. ‘Maybe if we work together and complete them,’ you think, ‘we can drive this monster away!’",
|
||||
"questSeaSerpentCompletion": "Battered by your commitment, the sea serpent flees, disappearing into the depths. When you arrive in Dilatory, you breathe a sigh of relief before noticing @*~Seraphina~ approaching with three translucent eggs cradled in her arms. “Here, you should have these,” she says. “You know how to handle a sea serpent!” As you accept the eggs, you vow anew to remain steadfast in completing your tasks to ensure that there’s not a repeat occurrence.",
|
||||
"questSeaSerpentBoss": "The Mighty Sea Serpent",
|
||||
"questSeaSerpentDropSeaSerpentEgg": "Sea Serpent (Egg)",
|
||||
"questSeaSerpentDropSeaSerpentEgg": "",
|
||||
"questSeaSerpentUnlockText": "Unlocks purchasable Sea Serpent eggs in the Market",
|
||||
"questKangarooText": "Kangaroo Catastrophe",
|
||||
"questKangarooNotes": "Maybe you should have finished that last task… you know, the one you keep avoiding, even though it always comes back around? But @Mewrose and @LilithofAlfheim invited you and @stefalupagus to see a rare kangaroo troop hopping through the Sloensteadi Savannah; how could you say no?! As the troop comes into view, something hits you on the back of the head with a mighty <em>whack!</em><br><br>Shaking the stars from your vision, you pick up the responsible object--a dark red boomerang, with the very task you continually push back etched into its surface. A quick glance around confirms the rest of your party met a similar fate. One larger kangaroo looks at you with a smug grin, like she’s daring you to face her and that dreaded task once and for all!",
|
||||
@@ -635,4 +635,4 @@
|
||||
"questVelociraptorBoss": "Veloci-Rapper",
|
||||
"questVelociraptorDropVelociraptorEgg": "Velociraptor (Egg)",
|
||||
"questVelociraptorUnlockText": "Unlocks purchasable Velociraptor eggs in the Market"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
"achievementAllThatGlittersText": "Събрали сте всички оседлани Златни животни.",
|
||||
"achievementAllThatGlitters": "Златен телец",
|
||||
"achievementGoodAsGoldModalText": "Събрахте всички Златни домашни любимци!",
|
||||
"achievementGoodAsGoldText": "Събрали сте всички Златни домашни любимци.",
|
||||
"achievementGoodAsGoldText": "Събрахте всички Златни домашни любимци.",
|
||||
"achievementGoodAsGold": "Златно сърце",
|
||||
"achievementFreshwaterFriendsModalText": "Завършихте мисиите за аксолотъла, жабата и хипопотама!",
|
||||
"achievementFreshwaterFriendsText": "Завършили сте мисиите за домашни любимци за аксолотъла, жабата и хипопотама.",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "и",
|
||||
"chores": "Домакинска работа",
|
||||
"clearBrowserData": "Изчистване на данните на браузъра",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Добавки и разширения</a>",
|
||||
"communityExtensions": "Добавки и разширения",
|
||||
"communityFacebook": "Фейсбук",
|
||||
"companyAbout": "Как работи",
|
||||
"companyBlog": "Блог",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "a",
|
||||
"chores": "Domácí práce",
|
||||
"clearBrowserData": "Vyčistit data v prohlížeči",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Doplňky & Rozšírení</a>",
|
||||
"communityExtensions": "Doplňky & Rozšírení",
|
||||
"communityFacebook": "Facebook",
|
||||
"companyAbout": "Jak to funguje",
|
||||
"companyBlog": "Blog",
|
||||
|
||||
@@ -2014,5 +2014,9 @@
|
||||
"weaponMystery202102Notes": "Zářivý růžový drahokem v této hůlce dokáže šířit radost a přátelství všude možně! Nepřináší žádné výhody. Předmět pro předplatitele, únor 2021.",
|
||||
"weaponMystery202104Notes": "Tvoji nepřátele by si měli dávat pozor - máš totiž mocnou a pichlavou obranu! Nepřináší žádné výhody. Předmět pro předplatitele duben 2021.",
|
||||
"weaponMystery202102Text": "Okouzlující hůlka",
|
||||
"weaponMystery202104Text": "Hůl trnitého bodláku"
|
||||
"weaponMystery202104Text": "Hůl trnitého bodláku",
|
||||
"weaponMystery202201Notes": "O silvestrovské půlnoci vypusť oblak zlatého a stříbrného třpytu. Štastný nový rok! Kdo to teď uklidí? Nepřináší žádné výhody. Předmět pro předplatitele leden 2022.",
|
||||
"weaponMystery202201Text": "Konfetové dělo půlnoci",
|
||||
"weaponMystery202111Text": "Chronomancerova hůl",
|
||||
"weaponMystery202111Notes": "Ohýbej tok času s touto tajemnou a mocnou holí. Nepřináší žádné výhody. Předmět pro předplatitele listopad 2021."
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "og",
|
||||
"chores": "Pligter",
|
||||
"clearBrowserData": "Ryd browserdata",
|
||||
"communityExtensions": "<a href='https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Tilføjelser og udvidelser</a>",
|
||||
"communityExtensions": "Tilføjelser og udvidelser",
|
||||
"communityFacebook": "Facebook",
|
||||
"companyAbout": "Hvordan det virker",
|
||||
"companyBlog": "Blog",
|
||||
|
||||
@@ -94,8 +94,8 @@
|
||||
"achievementSkeletonCrewModalText": "Du hast alle Skelett-Reittiere gezähmt!",
|
||||
"achievementSkeletonCrewText": "Hat alle Skelett-Reittiere gezähmt.",
|
||||
"achievementSkeletonCrew": "Skelettbande",
|
||||
"achievementBoneCollectorModalText": "Du hast alle Skelett-Haustiere gesammelt!",
|
||||
"achievementBoneCollectorText": "Hat alle Skelett-Haustiere gesammelt.",
|
||||
"achievementBoneCollectorModalText": "Du hast alle Skeletthaustiere gesammelt!",
|
||||
"achievementBoneCollectorText": "Hat alle Skeletthaustiere gesammelt.",
|
||||
"achievementBoneCollector": "Knochensammler",
|
||||
"achievementRedLetterDayModalText": "Du hast alle roten Reittiere gezähmt!",
|
||||
"achievementRedLetterDayText": "Hat alle roten Reittiere gezähmt.",
|
||||
@@ -104,7 +104,7 @@
|
||||
"achievementSeeingRed": "Rot Sehen",
|
||||
"achievementRedLetterDay": "Roter Faden",
|
||||
"achievementLegendaryBestiaryModalText": "Du hast alle mystischen Haustiere gesammelt!",
|
||||
"achievementLegendaryBestiaryText": "Hat alle mystischen Haustiere ausgebrütet: Drachen-Jungtier, Fliegendes Ferkel, Greifen-Jungtier, Seeschlangen-Haustier und Einhorn-Fohlen!",
|
||||
"achievementLegendaryBestiaryText": "Hat alle mystischen Haustiere in den Standardfarben ausgebrütet: Drache, Fliegendes Ferkel, Greif, Seeschlange und Einhorn!",
|
||||
"achievementLegendaryBestiary": "Legendäres Bestiarium",
|
||||
"achievementSeasonalSpecialistModalText": "Du hast alle saisonalen Quests abgeschlossen!",
|
||||
"achievementSeasonalSpecialistText": "Hat alle Quests der Frühlings- und Winter-Saison abgeschlossen: Eierjagd, Wildernder Weihnachtswichtel, und Finde das Jungtier!",
|
||||
@@ -138,5 +138,8 @@
|
||||
"achievementGroupsBeta2022ModalText": "Du hast mit Deinen Gruppen Habitica geholfen, indem ihr getestet und Feedback geschrieben habt!",
|
||||
"achievementWoodlandWizardModalText": "Du hast alle Wald-Tiere gesammelt!",
|
||||
"achievementWoodlandWizard": "Wald-Magier",
|
||||
"achievementWoodlandWizardText": "Du hast alle Standard-Farben der Waldkreaturen ausgebrütet: Dachs, Bär, Hirsch, Fuchs, Frosch, Igel, Eule, Schlange, Eichhörnchen und Bäumling!"
|
||||
"achievementWoodlandWizardText": "Du hast alle Standard-Farben der Waldkreaturen ausgebrütet: Dachs, Bär, Hirsch, Fuchs, Frosch, Igel, Eule, Schnecke, Eichhörnchen und Bäumling!",
|
||||
"achievementBoneToPickModalText": "Du hast alle klassischen und Quest-Skeletthaustiere gesammelt!",
|
||||
"achievementBoneToPick": "Ein harter Knochen",
|
||||
"achievementBoneToPickText": "Hat alle klassischen und Quest-Skeletthaustiere ausgebrütet!"
|
||||
}
|
||||
|
||||
@@ -721,5 +721,24 @@
|
||||
"backgrounds082022": "Set 99: Veröffentlicht im August 2022",
|
||||
"backgroundMessyRoomText": "Unordentlicher Raum",
|
||||
"backgroundMessyRoomNotes": "Reinige einen unordentlichen Raum.",
|
||||
"backgroundRainbowEucalyptusNotes": "Bewundere einen Regenbogen-Eukalyptus-Hain."
|
||||
"backgroundRainbowEucalyptusNotes": "Bewundere einen Regenbogen-Eukalyptus-Hain.",
|
||||
"backgroundTheatreStageText": "Theaterbühne",
|
||||
"backgroundTheatreStageNotes": "Tritt auf einer Theaterbühne auf.",
|
||||
"backgroundAutumnPicnicText": "Herbstpicknick",
|
||||
"backgroundAutumnPicnicNotes": "Genieße ein Herbstpicknick.",
|
||||
"backgroundOldPhotoText": "Altes Foto",
|
||||
"backgroundOldPhotoNotes": "Posiere auf einem alten Foto.",
|
||||
"backgrounds092022": "Set 100: Veröffentlicht im September 2022",
|
||||
"backgrounds102022": "Set 101: Veröffentlicht im Oktober 2022",
|
||||
"backgroundSpookyRuinsText": "Gruselige Ruinen",
|
||||
"backgroundMaskMakersWorkshopText": "Masken-Macher-Werkstatt",
|
||||
"backgroundMaskMakersWorkshopNotes": "Probiere in der Masken-Macher-Werkstatt ein neues Gesicht aus.",
|
||||
"backgroundCemeteryGateText": "Friedhofstor",
|
||||
"backgroundCemeteryGateNotes": "Suche ein Friedhofstor heim.",
|
||||
"backgroundSpookyRuinsNotes": "Erkunde gruselige Ruinen.",
|
||||
"backgrounds112022": "Set 102: Veröffentlicht im November 2022",
|
||||
"backgroundAmongGiantMushroomsNotes": "Bewundere Riesige Pilze.",
|
||||
"backgroundAmongGiantMushroomsText": "Unter Riesigen Pilzen",
|
||||
"backgroundMistyAutumnForestText": "Nebeliger Herbstwald",
|
||||
"backgroundMistyAutumnForestNotes": "Durchstreife einen nebeligen Herbstwald."
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
"confirmKeepChallengeTasks": "Möchtest Du die Herausforderungsaufgaben behalten?",
|
||||
"selectParticipant": "Wähle einen Teilnehmer aus",
|
||||
"filters": "Filter",
|
||||
"wonChallengeDesc": "Du hast die Herausforderung <%= challengeName %> gewonnen! Dein Erfolg wird unter den Errungenschaften in Deinem Profil aufgezeichnet.",
|
||||
"wonChallengeDesc": "<%= challengeName %> hat Dich als Gewinner ausgewählt! Dein Gewinn wurde in Deine Errungenschaften aufgenommen.",
|
||||
"yourReward": "Deine Belohnung",
|
||||
"removeTasks": "Aufgaben entfernen"
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
"commGuideList01E": "Fange in der Taverne keine Streitgespräche an und lass Dich nicht auf solche ein.",
|
||||
"commGuideList01F": "Kein Betteln um bezahlte Artikel, kein Spamming oder große Überschriften/Großbuchstaben.",
|
||||
"commGuidePara017": "Hier ist die Kurzfassung, aber wir möchten Dich ermutigen, weiter unten mehr Details zu erfahren:",
|
||||
"commGuideList02M": "Frage nicht nach Edelsteinen, Abonnements oder der Mitgliedschaft in Gruppenabonnements. Nachfragen dieser Art sind weder in der Taverne, noch in öffentlichen oder privaten Chaträumen und auch nicht in Privatnachrichten erlaubt. Wiederholte oder extreme Betteleien, vor allem nachdem bereits eine Warnung ausgesprochen wurde, können zu einer Sperrung des Accounts führen.",
|
||||
"commGuideList02M": "Frage nicht nach oder bettle nicht um Edelsteine, Abonnements oder die Mitgliedschaft in Gruppenplänen. Nachrichten dieser Art sind weder in der Taverne, noch in öffentlichen oder privaten Chaträumen, und auch nicht in Privatnachrichten erlaubt. Wenn Du Nachrichten erhältst, in denen man Dich um bezahlte Artikel fragt, melde sie bitte über das Fähnchen. Wiederholte oder extreme Betteleien nach Edelsteinen oder Abonnements, vor allem nachdem bereits eine Warnung ausgesprochen wurde, können zu einer Kontosperre führen.",
|
||||
"commGuideList09D": "Entfernung oder Herabstufung des Mitwirkenden-Ranges",
|
||||
"commGuideList05H": "Schwerwiegende oder wiederholte Versuche, andere Spielende zu betrügen oder zu bedrängen, um an Gegenstände zu kommen, die echtes Geld kosten"
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -5,12 +5,12 @@
|
||||
"accept2Terms": "zu, sowie der",
|
||||
"chores": "Hausarbeiten",
|
||||
"clearBrowserData": "Browserdaten löschen",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Add-ons & Erweiterungen</a>",
|
||||
"communityExtensions": "Add-ons & Erweiterungen",
|
||||
"communityFacebook": "Facebook",
|
||||
"companyAbout": "So funktioniert es",
|
||||
"companyBlog": "Blog",
|
||||
"companyContribute": "Mitwirken",
|
||||
"companyDonate": "Spenden",
|
||||
"companyContribute": "Bei Habitica mitwirken",
|
||||
"companyDonate": "An Habitica spenden",
|
||||
"forgotPassword": "Passwort vergessen?",
|
||||
"emailNewPass": "Einen Link per E-Mail senden, um das Passwort zurückzusetzen",
|
||||
"forgotPasswordSteps": "Trage Deinen Benutzernamen oder die E-Mail-Adresse ein, mit der Du Deinen Habitica-Account aktiviert hast.",
|
||||
@@ -53,10 +53,10 @@
|
||||
"marketing4Lead3-1": "Willst Du Dein Leben einmal als Spiel betrachten?",
|
||||
"marketing4Lead3-2": "Willst Du eine Gruppe für Ausbildung, Wohlbefinden usw. leiten?",
|
||||
"marketing4Lead3Title": "Mache Alles zum Spiel",
|
||||
"mobileAndroid": "Android",
|
||||
"mobileIOS": "iOS",
|
||||
"mobileAndroid": "Android App",
|
||||
"mobileIOS": "iOS App",
|
||||
"oldNews": "Neuigkeiten",
|
||||
"newsArchive": "Neuigkeiten-Archiv auf Wikia (mehrsprachig)",
|
||||
"newsArchive": "Neuigkeiten-Archiv auf Fandom (mehrsprachig)",
|
||||
"setNewPass": "Neues Passwort setzen",
|
||||
"password": "Passwort",
|
||||
"playButton": "Spielen",
|
||||
@@ -187,5 +187,6 @@
|
||||
"minPasswordLength": "Das Passwort muss mindestens 8 Zeichen haben.",
|
||||
"enterHabitica": "Tritt ein in Habitica",
|
||||
"socialAlreadyExists": "Diese Social-Media-Zugangsdaten sind bereits mit einem schon bestehenden Habitica-Konto verknüpft.",
|
||||
"emailUsernamePlaceholder": "z.B., habitrabbit oder gryphon@beispiel.com"
|
||||
"emailUsernamePlaceholder": "z.B., habitrabbit oder gryphon@beispiel.com",
|
||||
"footerProduct": "Produkt"
|
||||
}
|
||||
|
||||
@@ -2694,5 +2694,51 @@
|
||||
"weaponMystery202209Text": "Magie-Anleitung",
|
||||
"weaponMystery202209Notes": "Dieses Buch wird Dich auf Deiner Reise durch die Welt der Magie verzaubern. Gewährt keinen Attributbonus. September 2022 Abonnentengegenstand.",
|
||||
"shieldMystery202209Text": "Berg magischer Bücher",
|
||||
"shieldMystery202209Notes": "Bücherberge durchzulesen ist ein guter Weg um viel Zauberei-Wissen anzusammeln – diese Ausbildung wird einfach magisch! Gewährt keinen Attributbonus. September 2022 Abonnentengegenstand."
|
||||
"shieldMystery202209Notes": "Bücherberge durchzulesen ist ein guter Weg um viel Zauberei-Wissen anzusammeln – diese Ausbildung wird einfach magisch! Gewährt keinen Attributbonus. September 2022 Abonnentengegenstand.",
|
||||
"weaponSpecialFall2022MageNotes": "Diese mächtigen Böen bleiben zurück, wenn Du Dich gen Himmel schwingst. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"armorMystery202210Text": "Bedrohliche Schlange Rüstung",
|
||||
"armorMystery202210Notes": "Probiere einmal das Schlängeln aus, Du könntest feststellen, dass es eine sehr effiziente Art der Fortbewegung ist. Gewährt keinen Attributbonus. Oktober 2022 Abonnentengegenstand.",
|
||||
"shieldSpecialFall2022WarriorText": "Orkschild",
|
||||
"shieldSpecialFall2022WarriorNotes": "Süßes oder GRAAA! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"weaponSpecialFall2022RogueText": "Gurkenklinge",
|
||||
"weaponSpecialFall2022RogueNotes": "Du kannst Dich mit dieser Gurke nicht nur verteidigen, sie gibt auch eine leckere Zwischenmahlzeit ab. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"weaponSpecialFall2022WarriorText": "Orkschwert",
|
||||
"weaponSpecialFall2022WarriorNotes": "Womöglich besser dafür geeignet, Baumstämme oder knusprige Brotlaibe zu zerschneiden als die Rüstung der Feinde, aber GRAAA! Es sieht in jedem Fall furchterregend aus! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"weaponSpecialFall2022MageText": "Windböen",
|
||||
"weaponSpecialFall2022HealerText": "Rechtes Beobachterauge",
|
||||
"weaponSpecialFall2022HealerNotes": "Um Deine Chancen zu verbessern, halte es hoch und sprich die Machtworte: \"Den Sieg fest im Blick!\" Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"armorSpecialFall2022RogueText": "Kappa Rüstung",
|
||||
"armorSpecialFall2022RogueNotes": "Ob Du schwimmst, umherschleichst oder ringst, in dieser Rüstung bist Du sicher. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"armorSpecialFall2022WarriorText": "Orkrüstung",
|
||||
"armorSpecialFall2022WarriorNotes": "GRAAA! MASSIGE SCHULTERN zeigen Du hast MASSIG KRAFT! Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"armorSpecialFall2022MageText": "Harpyienrüstung",
|
||||
"armorSpecialFall2022MageNotes": "Fliege schnell wie der Wind mit diesen wundervollen Flügeln und halte was Dir am wichtigsten ist fest in den furchterregenden Krallen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"armorSpecialFall2022HealerText": "Wuchernde Augenstiele",
|
||||
"headSpecialFall2022RogueText": "Kappa Maske",
|
||||
"headSpecialFall2022RogueNotes": "Mit dieser Metallkappe auf dem Kopf hast Du zusätzlichen Schutz für Deine Ausflüge an Land. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"headSpecialFall2022WarriorText": "Orkmaske",
|
||||
"shieldSpecialFall2022HealerNotes": "Wirf ein Auge auf dieses Kostüm und erzittere. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"headSpecialFall2022WarriorNotes": "Diese Hauer sind hart und scharf genug, um Kürbisse zu durchbohren. GRAAA! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"headSpecialFall2022MageText": "Harpyienmaske",
|
||||
"headSpecialFall2022HealerText": "Beobachtermaske",
|
||||
"headSpecialFall2022HealerNotes": "Irgendwo im Innern liegt Schönheit verborgen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Herbstausrüstung.",
|
||||
"headMystery202210Text": "Bedrohliche Schlange Helm",
|
||||
"headMystery202210Notes": "Diese schuppige Kapuze wird sicherlich Deine To-Do Liste in die Unterwerfung ängstigen! Gewährt keinen Attributbonus. Oktober 2022 Abonnentengegenstand.",
|
||||
"shieldSpecialFall2022HealerText": "Linkes Beobachterauge",
|
||||
"eyewearArmoireComedyMaskText": "Komödienmaske",
|
||||
"eyewearArmoireTragedyMaskText": "Tragödienmaske",
|
||||
"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).",
|
||||
"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.",
|
||||
"weaponArmoireMagicSpatulaText": "Magischer Pfannenwender",
|
||||
"weaponArmoireMagicSpatulaNotes": "Schau zu, wie Dein Essen durch die Luft fliegt und sich überschlägt. Du hast den Rest des Tages Glück wenn es dreimal magisch überschlägt, bevor es wieder am Pfannenwender landet. Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Küchenwerkzeugset (Gegenstand 1 von 2).",
|
||||
"shieldArmoireBubblingCauldronText": "Übersprudelnder Kessel",
|
||||
"shieldArmoireBubblingCauldronNotes": "Der perfekte Kessel, um einen Produktivitätstrank zu brühen oder eine würzige Suppe zu kochen. Um genau zu sein gibt es zwischen diesen beiden kaum einen Unterschied! Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Küchenwerkzeugset (Gegenstand 2 von 2)."
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
"dataTool": "Werkzeug zur Datenanzeige",
|
||||
"resources": "Ressourcen",
|
||||
"communityGuidelines": "Community-Richtlinien",
|
||||
"bannedWordUsed": "Hoppla! Es sieht so aus, als würde dieser Beitrag ein Schimpfwort oder einen religiösen Fluch enthalten, oder sich auf Suchtstoffe oder nicht-jugendfreie Themen beziehen (<%= swearWordsUsed %>). Habitica hat Spieler unterschiedlichster Herkunft, weswegen wir unseren Chat besonders sauber halten wollen. Du kannst Deine Nachricht gerne überarbeiten, um sie doch noch posten zu können!",
|
||||
"bannedSlurUsed": "Dein Beitrag enthielt unangebrachten Inhalt und Deine Chat Privilegien wurden Dir entzogen.",
|
||||
"bannedWordUsed": "Hoppla! Es sieht so aus, als würde dieser Beitrag ein Schimpfwort enthalten, oder sich auf Suchtstoffe oder nicht-jugendfreie Themen beziehen (<%= swearWordsUsed %>). Habitica achtet darauf, unsere Chats frei von diesen Dingen zu halten. Du kannst Deine Nachricht gerne überarbeiten und sie wieder posten! Die betroffenen Wörter musst Du allerdings löschen, nicht einfach zensieren.",
|
||||
"bannedSlurUsed": "Dein Beitrag enthielt unangebrachte Inhalte, daher wurden Dir Deine Chat-Privilegien entzogen.",
|
||||
"party": "Party",
|
||||
"usernameCopied": "Benutzername in die Zwischenablage kopiert.",
|
||||
"createGroupPlan": "Erstellen",
|
||||
@@ -107,7 +107,7 @@
|
||||
"copyMessageAsToDo": "Nachricht als To-Do übernehmen",
|
||||
"copyAsTodo": "Als To-Do kopieren",
|
||||
"messageAddedAsToDo": "Nachricht als To-Do übernommen.",
|
||||
"leaderOnlyChallenges": "Nur der Gruppenleiter kann Herausforderungen erstellen",
|
||||
"leaderOnlyChallenges": "Nur die Gruppenleitung kann Herausforderungen erstellen",
|
||||
"sendGift": "Ein Geschenk schicken",
|
||||
"inviteFriends": "Lade Freunde ein",
|
||||
"inviteByEmail": "Lade per E-Mail ein",
|
||||
@@ -123,7 +123,7 @@
|
||||
"sendGiftCost": "Insgesamt: $<%= cost %> USD",
|
||||
"sendGiftFromBalance": "Vom Saldo",
|
||||
"sendGiftPurchase": "Kauf",
|
||||
"sendGiftMessagePlaceholder": "Persönliche Nachricht (optional)",
|
||||
"sendGiftMessagePlaceholder": "Füge eine Geschenknachricht hinzu",
|
||||
"sendGiftSubscription": "<%= months %> Monat(e): $<%= price %> USD",
|
||||
"gemGiftsAreOptional": "Bitte nimm zur Kenntnis, dass Habitica niemals von Dir verlangen wird, anderen Spielern Edelsteine zu schenken. Bei anderen Spielern um Edelsteine zu betteln ist ein <strong>Verstoss gegen die Community-Richtlinien</strong>, und jedes Vorkommnis sollte bei <%= hrefTechAssistanceEmail %> gemeldet werden.",
|
||||
"battleWithFriends": "Besiege mit Freunden Monster",
|
||||
@@ -163,9 +163,9 @@
|
||||
"onlyGroupLeaderCanEditTasks": "Nicht berechtigt, Aufgaben zu bearbeiten!",
|
||||
"onlyGroupTasksCanBeAssigned": "Nur Team-Aufgaben können verteilt werden",
|
||||
"assignedTo": "Zugewiesen an",
|
||||
"assignedToUser": "<strong><%- userName %></strong> zugewiesen",
|
||||
"assignedToMembers": "<strong><%= userCount %></strong> Mitgliedern zugewiesen",
|
||||
"assignedToYouAndMembers": "Dir und <strong><%= userCount %> Mitliedern</strong> zugewiesen",
|
||||
"assignedToUser": "Zugewiesen: <strong>@<%- userName %></strong>",
|
||||
"assignedToMembers": "<%= userCount %> Mitgliedern",
|
||||
"assignedToYouAndMembers": "<strong>Dir</strong>, <%= userCount %> Mitgliedern",
|
||||
"youAreAssigned": "Dir zugewiesen",
|
||||
"taskIsUnassigned": "Diese Aufgabe ist niemandem zugewiesen",
|
||||
"confirmUnClaim": "Bist Du sicher, dass Du diese Aufgabe abgeben möchtest?",
|
||||
@@ -190,14 +190,14 @@
|
||||
"needsWork": "Benötigt Arbeit",
|
||||
"viewRequests": "Anfragen anzeigen",
|
||||
"groupSubscriptionPrice": "$9 monatlich + $3 pro Monat für jedes weitere Gruppenmitglied",
|
||||
"groupBenefitsDescription": "Wir haben gerade die Betaversion der Gruppenpläne gestartet! Das Upgrade auf den Gruppenplan schaltet einige einzigartige Funktionen frei, welche die soziale Seite von Habitica verbessern.",
|
||||
"groupBenefitsDescription": "Wir haben gerade die Beta-Version unserer Gruppenpläne gestartet! Das Upgrade auf einen Gruppenplan schaltet einige einzigartige Funktionen frei, mit denen Du die sozialen Aspekte von Habitika optimal auszunutzen kannst.",
|
||||
"teamBasedTasks": "Gruppenorientierte Aufgaben",
|
||||
"cannotDeleteActiveGroup": "Du kannst keine Gruppe mit einem laufenden Abonnement löschen",
|
||||
"groupTasksTitle": "Gruppen-Aufgabenliste",
|
||||
"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",
|
||||
@@ -273,7 +273,7 @@
|
||||
"createParty": "Erstelle eine Party",
|
||||
"inviteMembersNow": "Möchtest Du jetzt Mitglieder einladen?",
|
||||
"playInPartyTitle": "Spiele Habitica in einer Party!",
|
||||
"playInPartyDescription": "Bewältige unglaubliche Quests - mit Freunden oder auf Dich allein gestellt. Besiege Monster, erstelle Wettbewerbe und hilf Dir selbst, verantwortungsvoll zu bleiben, indem Du einer Party beitrittst.",
|
||||
"playInPartyDescription": "Bewältige unglaubliche Quests – mit Freunden oder auf Dich allein gestellt. Besiege Monster, erstelle Herausforderungen und hilf Dir selbst, verantwortungsvoll zu bleiben, indem Du einer Party beitrittst.",
|
||||
"wantToJoinPartyTitle": "Möchtest Du einer Party beitreten?",
|
||||
"wantToJoinPartyDescription": "Gib Deinen Benutzernamen einem Freund, der bereits in einer Party ist, oder gehe zur <a href='/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>Party Wanted Guild</a>, um potenzielle Verbündete zu finden!",
|
||||
"copy": "Kopieren",
|
||||
@@ -326,19 +326,19 @@
|
||||
"whatsIncludedGroup": "Was beinhaltet das Abonnement",
|
||||
"whatsIncludedGroupDesc": "Alle Mitglieder der Gruppe erhalten volle Abonnementvorteile, einschließlich der monatlichen Abonnentengegenstände, der Möglichkeit Edelsteine mit Gold zu kaufen, und das Königliche Purpurfarbene Wolpertinger-Reittier, das exklusiv für Benutzer mit einer Mitgliedschaft im Gruppenplan verfügbar ist.",
|
||||
"howDoesBillingWork": "Wie funktioniert die Verrechnung?",
|
||||
"howDoesBillingWorkDesc": "Gruppenleiter erhalten monatlich auf der Grundlage der Gruppenmitgliederzahl eine Gebühr in Rechnung gestellt. Diese Gebühr beinhaltet den Preis von $9 (USD) für das Abonnement des Gruppenleiters, plus $3 USD für jedes weitere Gruppenmitglied. Zum Beispiel: Eine Gruppe von vier Benutzern kostet $18 USD/Monat, da die Gruppe aus 1 Gruppenleiter + 3 Gruppenmitgliedern besteht.",
|
||||
"howDoesBillingWorkDesc": "Auf Grundlage der Mitgliederzahl wird der Gruppenleitung monatlich eine Gebühr in Rechnung gestellt. Diese Gebühr beinhaltet den Preis von $9 (USD) für das Abonnement der Gruppenleitung, sowie $3 USD für jedes weitere Gruppenmitglied. Zum Beispiel: Eine Gruppe von vier Personen kostet $18 USD/Monat, da die Gruppe aus 1 Gruppenleitung + 3 weiteren Mitglieder besteht.",
|
||||
"howToAssignTask": "Wie weise ich eine Aufgabe zu?",
|
||||
"howToAssignTaskDesc": "Weise eine Aufgabe einem oder mehreren Gruppenmitgliedern (einschließlich des Gruppenleiters oder dem Organisator selbst) zu, indem Du ihre Benutzernamen in das Feld \"Zuweisen an\" im Bereich \"Aufgabe erstellen\" eingibst. Du kannst eine Aufgabe auch jemandem zuzuweisen, nachdem Du sie erstellt hast, indem du die Aufgabe bearbeitest und den Benutzer im Feld \"Zuweisen an\" hinzufügst!",
|
||||
"howToAssignTaskDesc": "Weise eine Aufgabe einem oder mehreren Gruppenmitgliedern (einschließlich des Gruppenleiters oder dem Organisator selbst) zu, indem Du ihre Benutzernamen in das Feld \"Zuweisen an\" im Bereich \"Aufgabe erstellen\" einträgst. Du kannst eine Aufgabe auch jemandem zuzuweisen, nachdem Du sie erstellt hast, indem du die Aufgabe bearbeitest und den entsprechenden Namen im Feld \"Zuweisen an\" hinzufügst!",
|
||||
"howToRequireApproval": "Wie markiert man eine Aufgabe mit \"Zustimmung benötigt\"?",
|
||||
"howToRequireApprovalDesc": "Markiere die \"Zustimmung benötigt\" Einstellung, um eine Aufgabe durch einen Gruppenleiter oder einen Organisator bestätigen zu lassen. Der Benutzer, der die Aufgabe abhakt, erhält seine Belohnung für die Erledigung erst, nachdem die Zustimmung erteilt wurde.",
|
||||
"howToRequireApprovalDesc2": "Gruppenleiter und Organisatoren können erledigte Aufgaben direkt von der Aufgabenliste oder aus dem Benachrichtigungs-Panel bestätigen.",
|
||||
"howToRequireApprovalDesc": "Wähle die Option \"Zustimmung benötigt\" aus, um eine Aufgabe durch die Gruppenleitung oder die Organisation bestätigen zu lassen. Benutzende, welche die Aufgabe abhaken, erhalten ihre Belohnung hierfür erst, nachdem die Zustimmung erteilt wurde.",
|
||||
"howToRequireApprovalDesc2": "Gruppenleitung und Organisation können erledigte Aufgaben direkt von der Aufgabenliste oder aus dem Benachrichtigungs-Panel bestätigen.",
|
||||
"whatIsGroupManager": "Was ist ein Gruppen-Organisator?",
|
||||
"whatIsGroupManagerDesc": "Gruppen-Organisatoren haben keinen Zugriff auf die Rechnungs-Details einer Gruppe, aber sie können verteilte Aufgaben für Gruppenmitglieder erstellen, zuweisen und bestätigen. Die Beförderung zum Organisator erfolgt in der Mitgliederliste.",
|
||||
"goToTaskBoard": "Gehe zur Aufgabenliste",
|
||||
"sharedCompletion": "Fertigstellungsbedingung",
|
||||
"recurringCompletion": "Keine - Gruppenaufgabe kann nicht fertiggestellt werden",
|
||||
"singleCompletion": "Einzeln - Ist erledigt sobald ein zugeteilter Benutzer abschliesst",
|
||||
"allAssignedCompletion": "Alle - Ist erledigt sobald alle zugeteilten Benutzer abschliessen",
|
||||
"allAssignedCompletion": "Alle – Ist erledigt, sobald alle zugeteilten Benutzer abschliessen",
|
||||
"pmReported": "Danke dass Du diese Nachricht gemeldet hast.",
|
||||
"suggestedGroup": "Vorgeschlagen weil Du bei Habitica neu bist.",
|
||||
"taskClaimed": "<%- userName %> hat die Aufgabe <span class=\"notification-bold\"><%- taskText %></span> übernommen.",
|
||||
@@ -380,5 +380,42 @@
|
||||
"viewDetails": "Details ansehen",
|
||||
"upgradeToGroup": "Auf Gruppenplan upgraden",
|
||||
"sendGiftTotal": "Insgesamt:",
|
||||
"chatTemporarilyUnavailable": "Chat aktuell nicht verfügbar. Bitte versuche es später erneut."
|
||||
"chatTemporarilyUnavailable": "Chat aktuell nicht verfügbar. Bitte versuche es später erneut.",
|
||||
"assignTo": "Zugewiesen an",
|
||||
"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",
|
||||
"newGroupsWhatsNew": "Schau nach, was neu ist:",
|
||||
"newGroupsBullet01": "Interagiere mit Aufgaben direkt vom Geteilte-Aufgaben-Brett",
|
||||
"newGroupsBullet02": "Jeder kann eine unzugewiesene Aufgabe fertigstellen",
|
||||
"youEmphasized": "<strong>Du</strong>",
|
||||
"newGroupsBullet06": "Die Aufgabenstatusanzeige ermöglicht Dir schnell zu sehen, wer eine Aufgabe als erledigt markiert hat",
|
||||
"newGroupsBullet08": "Der Gruppenleiter und die Gruppenmanager können schnell Aufgaben vom oberen Ende der Aufgabenlisten hinzufügen",
|
||||
"sendGiftLabel": "Möchtest Du eine Geschenknachricht senden?",
|
||||
"lastCompleted": "Zuletzt fertiggestellt",
|
||||
"newGroupsBullet03": "Geteilte Aufgaben werden für alle zur selben Zeit zurückgesetzt, um die Zusammenarbeit zu erleichtern",
|
||||
"newGroupsBullet04": "Geteilte Tagesaufgaben fügen keinen Schaden zu, wenn sie nicht erledigt werden oder im Gestrige-Aktivitäten-festhalten-Fenster erscheinen",
|
||||
"newGroupsBullet07": "Schalte ein oder aus, dass geteilte Aufgaben auf Deiner persönlichen Aufgabenanzeige erscheinen",
|
||||
"newGroupsBullet10": "Zuweisungsstatus bestimmt Abschlussbedingung:",
|
||||
"newGroupsVisitFAQ": "Besuche die <a href='/static/faq#group-plans' target='_blank'>Häufigen Fragen</a> aus dem Hilfe-Dropdownmenü heraus für mehr Informationen.",
|
||||
"newGroupsBullet05": "Die Farbe geteilter Aufgaben baut sich ab, wenn sie nicht erledigt werden, was das Verfolgen des Fortschritts erleichtert",
|
||||
"newGroupsWelcome": "Wilkommen beim neuen Geteilte-Aufgaben-Brett!",
|
||||
"newGroupsBullet10a": "<strong>Weise eine Aufgabe niemandem zu</strong>, wenn sie von jedem Mitglied abgeschlossen werden kann",
|
||||
"newGroupsBullet10b": "<strong>Weise eine Aufgabe einem Mitglied zu</strong>, damit sie nur von diesem abgeschlossen werden kann",
|
||||
"newGroupsBullet10c": "<strong>Weise eine Aufgabe mehreren Mitgliedern zu</strong>, wenn sie von allen abgeschlossen werden muss",
|
||||
"newGroupsBullet09": "Eine geteilte Aufgabe kann als unfertig markiert werden um darauf aufmerksam zu machen, dass daran noch gearbeitet werden muss"
|
||||
}
|
||||
|
||||
@@ -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."
|
||||
}
|
||||
|
||||
@@ -81,13 +81,13 @@
|
||||
"newBaileyUpdate": "Neues Update von Bailey!",
|
||||
"tellMeLater": "Erzähl es mir später",
|
||||
"dismissAlert": "Als gelesen markieren",
|
||||
"donateText3": "Als Open-Source-Projekt ist Habitica auf die Hilfe unserer Benutzer angewiesen. Das Geld, was Du für Edelsteine ausgibst, hilft uns dabei unsere Server am Laufen zu halten, ein paar Mitarbeiter zu bezahlen, neue Features zu entwickeln und unseren ehrenamtlichen Programmierern Anreize zu bieten. Vielen Dank für Deine Großzügigkeit!",
|
||||
"donateText3": "Als Open-Source-Projekt ist Habitica auf die Hilfe unserer Benutzer angewiesen. Das Geld, was Du für Edelsteine ausgibst, hilft uns dabei unsere Server am Laufen zu halten, ein paar Mitarbeiter zu bezahlen, neue Features zu entwickeln und unseren ehrenamtlichen Helferlein Anreize zu bieten.",
|
||||
"card": "Kreditkarte",
|
||||
"paymentMethods": "Kauf mit",
|
||||
"paymentSuccessful": "Die Zahlung war erfolgreich!",
|
||||
"paymentYouReceived": "Du hast erhalten:",
|
||||
"paymentYouSentGems": "Du hast <strong><%- name %></strong> geschickt:",
|
||||
"paymentYouSentSubscription": "Du hast <strong><%- name %></strong> ein <%= months %>-Monate-Abo für Habitica geschickt.",
|
||||
"paymentYouSentSubscription": "Du hast <strong><%- name %></strong><br> ein <%= months %>-Monate-Abo für Habitica geschickt.",
|
||||
"paymentSubBilling": "Dein Abonnement wird mit <strong>$<%= amount %></strong> alle <strong><%= months %> Monate</strong> verrechnet.",
|
||||
"success": "Erfolg!",
|
||||
"classGear": "Klassenausrüstung",
|
||||
@@ -128,8 +128,11 @@
|
||||
"nMonthsSubscriptionGift": "<%= nMonths %> Monat(e) Abonnement (Geschenk)",
|
||||
"nGemsGift": "<%= nGems %> Edelsteine (Geschenk)",
|
||||
"limitedAvailabilityMinutes": "Für <%= minutes %>min <%= seconds %>sek verfügbar",
|
||||
"limitedAvailabilityHours": "Für <%= days %>t <%= hours %>std und <%= minutes %>min verfügbar",
|
||||
"limitedAvailabilityHours": "Für t <%= hours %>std und <%= minutes %>min verfügbar",
|
||||
"limitedAvailabilityDays": "Für <%= days %>t <%= hours %>std und <%= minutes %>min verfügbar",
|
||||
"amountExp": "<%= amount %> Exp",
|
||||
"newStuffPostedOn": "Veröffentlicht am <%= publishDate %> um <%= publishTime %>"
|
||||
"newStuffPostedOn": "Veröffentlicht am <%= publishDate %> um <%= publishTime %>",
|
||||
"helpSupportHabitica": "Hilf Habitica zu unterstützen",
|
||||
"groupsPaymentSubBilling": "Dein nächstes Rechnungsdatum ist <strong><%= renewalDate %></strong>.",
|
||||
"groupsPaymentAutoRenew": "Dieses Abonnement läuft automatisch weiter, bis es gekündigt wird. Du kannst es im Gruppen-Abrechnungs-Tab kündigen."
|
||||
}
|
||||
|
||||
@@ -31,13 +31,13 @@
|
||||
"collected": "Gesammelt",
|
||||
"abort": "Abbrechen",
|
||||
"leaveQuest": "Quest verlassen",
|
||||
"sureLeave": "Willst du die Quest wirklich abbrechen? Dein kompletter Questfortschritt wird verloren gehen.",
|
||||
"sureLeave": "Willst Du die Quest wirklich abbrechen? Dein ganzer Fortschritt wird verloren gehen.",
|
||||
"mustComplete": "Du musst vorher die <%= quest %> Quest abschließen.",
|
||||
"mustLvlQuest": "Du musst Level <%= level %> sein um diese Quest zu erwerben!",
|
||||
"unlockByQuesting": "Um diese Quest freizuschalten, musst Du erst <%= title %> abschließen.",
|
||||
"questConfirm": "Bist du sicher, dass du diese Quest starten willst? Nicht alle Mitspieler deiner Party haben die Einladung zu dieser Quest akzeptiert. Quests starten automatisch sobald alle Mitspieler die Einladung angenommen oder abgelehnt haben.",
|
||||
"questConfirm": "Bist Du sicher, dass Du diese Quest starten willst? Nicht alle Mitglieder Deiner Party haben die Einladung zu dieser Quest akzeptiert. Quests starten automatisch sobald alle Mitspieler die Einladung beantwortet haben.",
|
||||
"sureCancel": "Bist Du sicher, dass Du diese Quest abbrechen willst? Wenn Du die Quest abbrichst werden alle bereits akzeptierten und noch unbeantworteten Einladungen zurückgenommen und die Questschriftrolle wird an ihren Besitzer zurückgegeben.",
|
||||
"sureAbort": "Bist Du sicher, dass Du diese Mission abbrechen willst? Aller Questfortschritt wird verloren gehen. Die Questschriftrolle wird dem Besitzer zurückgegeben.",
|
||||
"sureAbort": "Bist Du sicher, dass Du diese Quest abbrechen willst? Der ganze Fortschritt geht verloren und die Questschriftrolle wird dem Besitzer zurückgegeben.",
|
||||
"doubleSureAbort": "Bist Du wirklich, wirklich sicher? Sei ganz sicher, dass sie Dich nicht für immer hassen werden!",
|
||||
"bossRageTitle": "Raserei",
|
||||
"bossRageDescription": "Wenn sich dieser Balken füllt, wird der Boss eine Spezialattacke ausführen!",
|
||||
@@ -90,7 +90,7 @@
|
||||
"selectQuest": "Wähle eine Quest aus",
|
||||
"noQuestToStartTitle": "Kannst Du keine Quest finden, die du beginnen möchtest?",
|
||||
"membersParticipating": "<%= accepted %> / <%= invited %> Mitglieder nehmen teil",
|
||||
"yourPartyIsNotOnQuest": "Deine Gruppe befindet sich nicht auf einer Quest",
|
||||
"yourPartyIsNotOnQuest": "Deine Party befindet sich nicht auf einer Quest",
|
||||
"questOwner": "Questbesitzer",
|
||||
"cancelQuest": "Quest abbrechen",
|
||||
"backToSelection": "Zurück zur Questauswahl",
|
||||
@@ -98,5 +98,5 @@
|
||||
"newItem": "Neuer Gegenstand",
|
||||
"ownerOnly": "Nur der Besitzer",
|
||||
"questItemsPending": "<%= amount %> Gegenstände ausstehend",
|
||||
"selectQuestModal": "Such dir eine Quest aus"
|
||||
"selectQuestModal": "Such Dir eine Quest aus"
|
||||
}
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
"questTRexCompletion": "Der wilde Dinosaurier hört endlich zu toben und zu randalieren auf, setzt sich ruhig hin und fängt an sich mit den riesigen Hähnen anzufreunden. @Urse strahlt ihn an. \"Sie sind doch gar keine so schlimmen Haustiere! Sie brauchen einfach nur ein bisschen Disziplin. Hier, nimm Dir ein paar Tyrannosaurus-Eier mit!\"",
|
||||
"questTRexBoss": "Fleischerner Tyrannosaurus",
|
||||
"questTRexUndeadText": "Der Dinosaurier aus den Tiefen der Erde",
|
||||
"questTRexUndeadNotes": "Während die uralten Dinosaurier der Stoïstillen Steppen durch HabitCity wandern, hört man auf ein mal einen angstvollen Schrei aus Richtung des Grand Museums. @Baconsaur ruft: \"Das Tyrannosaurus-Skelett im Museum fängt an sich zu bewegen! Es muss die Anwesenheit seiner Artgenossen gewittert haben!\" Das knöcherne Biest bleckt seine monströsen Zähne und klappert auf Dich zu. Wie wirst Du in der Lage sein eine Kreatur zu besiegen, die bereits tot ist? Du wirst schnell zuschlagen müssen, bevor sie sich selbst heilt!",
|
||||
"questTRexUndeadNotes": "Während die uralten Dinosaurier der Stoïstillen Steppen durch Habit City wandern, hört man auf ein mal einen angstvollen Schrei aus Richtung des Grand Museums. @Baconsaur ruft: \"Das Tyrannosaurus-Skelett im Museum fängt an sich zu bewegen! Es muss die Anwesenheit seiner Artgenossen gewittert haben!\" Das knöcherne Biest bleckt seine monströsen Zähne und klappert auf Dich zu. Wie wirst Du in der Lage sein eine Kreatur zu besiegen, die bereits tot ist? Du wirst schnell zuschlagen müssen, bevor sie sich selbst heilt!",
|
||||
"questTRexUndeadCompletion": "Die glühenden Augen des Tyrannosaurus werden dunkel und trüb und er begibt sich zurück zu seinem Sockel. Alle atmen vor Erleichterung auf. \"Seht nur!\", sagt @Baconsaur, \"einige der versteinerten Eier sind plötzlich wie neu! Vielleicht werden sie ja für Dich ausschlüpfen.\"",
|
||||
"questTRexUndeadBoss": "Skelettierter Tyrannosaurus",
|
||||
"questTRexUndeadRageTitle": "Knöcherne Heilung",
|
||||
@@ -513,7 +513,7 @@
|
||||
"questHippoDropHippoEgg": "Nilpferd (Ei)",
|
||||
"questHippoUnlockText": "Schaltet den Kauf von Nilpferdeiern auf dem Marktplatz frei",
|
||||
"farmFriendsText": "\"Farmfreunde\" Quest-Paket",
|
||||
"farmFriendsNotes": "Beinhaltet 'Die Muhtantische Kuh', 'Reite die Nacht-Mähre', und 'Der Donner-Bock'. Verfügbar bis zum 31. August.",
|
||||
"farmFriendsNotes": "Beinhaltet 'Die Muhtantische Kuh', 'Reite die Nacht-Mähre', und 'Der Donner-Bock'. Verfügbar bis zum 30. September.",
|
||||
"witchyFamiliarsText": "\"Hexenhafte Haustiere\" Quest-Paket",
|
||||
"witchyFamiliarsNotes": "Beinhaltet 'Der Rattenkönig', 'Die eisige Arachnoide', und 'Sumpf des Chaos-Froschs'. Verfügbar bis zum 31. Oktober.",
|
||||
"questGroupLostMasterclasser": "Geheimnis der Klassenmeister",
|
||||
@@ -659,7 +659,7 @@
|
||||
"questSilverUnlockText": "Schaltet den Kauf von Silbernen Schlüpfelixieren auf dem Marktplatz frei",
|
||||
"questRobotCompletion": "Als @Rev und der Rechenschafts-Buddy die letzte Schraube einsetzen, erwacht die Zeitmaschine zum Leben. @FolleMente und @McCoyly springen an Bord. „Danke für die Hilfe! Wir sehen uns in der Zukunft! Übrigens, die hier sollen Dir bei Deiner nächsten Erfindung helfen!\" Damit verschwinden die Zeitreisenden, aber im Wrack des alten Produktivitätsstabilisators verbleiben drei Eier mit Uhrwerken. Vielleicht sind das die entscheidenden Komponenten für eine neue Produktionslinie von Rechenschafts-Buddys!",
|
||||
"questRobotNotes": "Im Max Kapazitäten-Labor verleiht @Rev der neuesten Erfindung, einem robotischen Rechenschafts-Buddy , den letzten Schliff, als plötzlich ein seltsames Metallfahrzeug in einer Rauchwolke erscheint, nur wenige Zentimeter vom Fluktuationsdetektor des Roboters entfernt! Die Insassen, zwei seltsame, in Silber gekleidete Gestalten, verlassen ihr Gefährt und nehmen ihre Weltraumhelme ab, wobei sie sich als @FolleMente und @McCoyly offenbaren. <br><br>„Ich postuliere, dass unsere Produktivitätsimplementierung eine Anomalie aufwies“, meint @FolleMente verlegen. <br><br>@ McCoyly verschränkt ihre Arme. „Das bedeutet, dass sie es versäumt haben, ihre Tagesaufgaben zu erledigen, was, wie ich postuliere, zur Zersetzung unseres Produktivitätsstabilisators geführt hat. Dabei handelt es sich um eine wesentliche Komponente für Zeitreisen, die zwingend Konsistenz benötigt, um richtig funktionieren zu können. Unsere Leistungen befeuern unsere Bewegung durch Zeit und Raum! Ich habe keine Zeit, um es genauer zu erklären, @Rev. Du wirst es in 37 Jahren entdecken oder vielleicht auch Deine Verbündeten, die Mysteriösen Zeitreisenden. Kannst Du uns vorerst dabei helfen, unsere Zeitmachine zu reparieren?\"",
|
||||
"rockingReptilesNotes": "Beinhaltet den \"Insta-Gator\", \"Die Schlange der Ablenkung\" und den \"Veloci-Rpper\". Verfügbar bis zum 30. September.",
|
||||
"rockingReptilesNotes": "Beinhaltet den \"Insta-Gator\", \"Die Schlange der Ablenkung\" und den \"Veloci-Rpper\". Verfügbar bis zum 30. November.",
|
||||
"rockingReptilesText": "\"Rockendes Reptilien\"-Quest-Bundle",
|
||||
"questRobotUnlockText": "Schaltet den Kauf von Robotereiern auf dem Markplatz frei",
|
||||
"questRobotDropRobotEgg": "Roboter (Ei)",
|
||||
@@ -700,7 +700,7 @@
|
||||
"questFluoriteBoss": "Fluorit-Elementar",
|
||||
"questFluoriteText": "Ein leuchtender, furchteinflößender Fluorit",
|
||||
"questFluoriteCompletion": "Während dem Kampf scheint die kristallene Kreatur mehr und mehr durch eure Lichter abgelenkt. “Das glitzert…” murmelt sie.<br><br>“Natürlich!” ruft @nirbhao. “Das muss ein Fluorit-Elemental sein. Die wollen nur ein wenig Licht, damit sie glimmen können. Lasst uns ihm helfen, so richtig hell zu scheinen.”<br><br>Das Elemental kichert glücklich und glimmt immer heller unter euren Fackeln und den magischen Glanzlichtern. Es scheint glücklich zu sein, wieder scheinen zu können, so dass es euch zu einem reichen Lager von Fluoritkristallen führt.<br><br>“Das ist die perfekte Zutat für ein neues Schlüpfelixier” findet @nirbhao. “Eines, das unsere Haustiere gerade so hell wie unseren neuen fluoreszierenden Freund hier scheinen lassen wird.”",
|
||||
"questFluoriteNotes": "Ungewöhnliche Mineralien sind sehr gefragt dieser Tage, deshalb bist Du mit einigen Freunden auf der Suche nach aufregenden Erzen tief in die Minen der Mäander-Berge gewandert. Es ist eine lange, langweilige Expedition, bis @-Tyr- über einen grossen Stein stolpert, der genau in der Mitte des Tunnels liegt.<br><br>“Das hier sollte etwas Licht in die Sache bringen” sagt @nirbhao und zaubert eine Lichtkugel hervor.<br><br>Ein warmes Leuchten erfüllt den Tunnel, doch nun passiert etwas seltsames mit dem Stein. Vom magischen Licht zehrend, fängt er in fluoreszierendem Blau, Grün und Violett zu leuchten an. Dann richtet er sich in einer halbwegs humanoiden Form auf, inklusive glühend roten Augen, mit denen er Dich fixiert! Sofort beginnt ihr, blitzende Zaubersprüche zu sprechen und glänzende Waffen zu schwingen.",
|
||||
"questFluoriteNotes": "Ungewöhnliche Mineralien sind sehr gefragt dieser Tage, deshalb bist Du mit einigen Freunden auf der Suche nach aufregenden Erzen tief in die Minen des Mäandergebirges gewandert. Es ist eine lange, langweilige Expedition, bis @-Tyr- über einen grossen Stein stolpert, der genau in der Mitte des Tunnels liegt.<br><br>“Das hier sollte etwas Licht in die Sache bringen” sagt @nirbhao und zaubert eine Lichtkugel hervor.<br><br>Ein warmes Leuchten erfüllt den Tunnel, doch nun passiert etwas seltsames mit dem Stein. Vom magischen Licht zehrend, fängt er in fluoreszierendem Blau, Grün und Violett zu leuchten an. Dann richtet er sich in einer halbwegs humanoiden Form auf, inklusive glühend roten Augen, mit denen er Dich fixiert! Sofort beginnt ihr, blitzende Zaubersprüche zu sprechen und glänzende Waffen zu schwingen.",
|
||||
"questWindupUnlockText": "Schaltet den Kauf von Aufziehbaren Schlüpfelixieren auf dem Marktplatz frei",
|
||||
"questWindupDropWindupPotion": "Aufziehbares Schlüpfelixier",
|
||||
"questWindupText": "Zähme die zankenden Zahnräder",
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"rebirthOrb": "Hat eine Sphäre der Wiedergeburt verwendet um noch einmal von vorne zu beginnen, nachdem Level <%= level %> erreicht wurde.",
|
||||
"rebirthOrb100": "Hat eine Sphäre der Wiedergeburt verwendet um noch einmal von vorne zu beginnen, nachdem Level 100 oder höher erreicht wurde.",
|
||||
"rebirthOrbNoLevel": "Hat eine Sphäre der Wiedergeburt verwendet um noch einmal von vorne zu beginnen.",
|
||||
"rebirthPop": "Beginne sofort von vorn mit einem Charakter auf Level 1, aber behalte Erfolge, Sammelgegenstände und Ausrüstung. Deine Aufgaben und ihre Verläufe bleiben erhalten, werden aber auf gelb zurückgesetzt. Deine Strähnen verfallen, ausser für Aufgaben, die von aktiven Herausforderungen oder Gruppenplänen stammen. Gold, Erfahrung, Mana und alle Effekte von Fähigkeiten werden entfernt. All das wird sofort in Kraft treten. Für mehr Informationen schau im Wiki auf der Seite <a href='https://habitica.fandom.com/de/wiki/Sph%C3%A4re_der_Wiedergeburt' target='_blank'>Sphäre der Wiedergeburt</a> nach.",
|
||||
"rebirthPop": "Beginne sofort von vorn mit einem Charakter auf Level 1, aber behalte Erfolge, Sammelgegenstände und Ausrüstung. Deine Aufgaben und ihre Verläufe bleiben erhalten, werden aber auf gelb zurückgesetzt. Deine Strähnen verfallen, außer für Aufgaben, die von aktiven Herausforderungen oder Gruppenplänen stammen. Gold, Erfahrung, Mana und alle Effekte von Fähigkeiten werden entfernt. All das wird sofort in Kraft treten. Für mehr Informationen, schau im Wiki auf der Seite <a href='https://habitica.fandom.com/de/wiki/Sphäre_der_Wiedergeburt' target='_blank'>Sphäre der Wiedergeburt</a> nach.",
|
||||
"rebirthName": "Sphäre der Wiedergeburt",
|
||||
"rebirthComplete": "Du wurdest wiedergeboren!",
|
||||
"nextFreeRebirth": "<strong><%= days %> Tage</strong> bis zur <strong>KOSTENLOSEN</strong> Sphäre der Wiedergeburt"
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
"APITokenWarning": "Wenn Du einen neuen API-Token brauchst (z.B. weil Du ihn versehentlich geteilt hast), schreibe eine E-Mail an <%= hrefTechAssistanceEmail %> mit Deiner Benutzer ID und dem aktuellen Schlüssel. Sobald er zurückgesetzt ist, wirst Du Dich auf der Webseite und der mobilen App aus- und neu einloggen müssen und den Schlüssel in jedem anderen Habitica Tool, das Du nutzt, einstellen müssen.",
|
||||
"thirdPartyApps": "Apps von Drittanbietern",
|
||||
"dataToolDesc": "Eine Webseite, die Dir Informationen aus Deinem Habitica-Konto anzeigt, z. B. Statistiken über Deine Aufgaben, Deine Ausrüstung und Fähigkeiten.",
|
||||
"beeminder": "Beeminder",
|
||||
"beeminder": "Bienenwächter/in",
|
||||
"beeminderDesc": "Lass Beeminder Deine Habitica-To-Dos automatisch überwachen. Du kannst Dich verpflichten, eine tägliche oder wöchentliche Mindestanzahl an To-Dos zu erledigen, oder Du kannst Dich engagieren, die Zahl Deiner unerledigten To-Dos allmählich zu verringern. (Unter \"verpflichten\" versteht Beeminder, dass Du echtes Geld zahlst, wenn Du Deine Versprechen nicht hältst! Aber Du kannst auch einfach die ausgefallenen Grafiken von Beeminder bewundern.)",
|
||||
"chromeChatExtension": "Chrome Chat-Erweiterung",
|
||||
"chromeChatExtensionDesc": "Die Chrome Chat-Erweiterung für Habitica fügt eine intuitive Chat-Box zu habitica.com hinzu. Damit kannst Du in der Taverne chatten, mit Deiner Party und mit allen Gilden, zu denen Du gehörst.",
|
||||
@@ -190,24 +190,24 @@
|
||||
"onlyPrivateSpaces": "Nur in privaten Bereichen",
|
||||
"everywhere": "Überall",
|
||||
"bannedSlurUsedInProfile": "Dein Anzeigename oder Über-Text beinhaltete eine Verunglimpfung, daher wurden Dir Deine Chat-Privilegien entzogen.",
|
||||
"transaction_subscription_perks": "Aus der Abonnement-Vergünstigung",
|
||||
"transaction_subscription_perks": "<b>Abonnement</b>-Vergünstigung",
|
||||
"transaction_reroll": "Verstärkungstrank benutzt",
|
||||
"noGemTransactions": "Du hast noch keine Edelstein-Transaktionen.",
|
||||
"transactions": "Transaktionen",
|
||||
"gemTransactions": "Edelstein-Transaktionen",
|
||||
"hourglassTransactions": "Sanduhr-Transaktionen",
|
||||
"noHourglassTransactions": "Du hast noch keine Sanduhr-Transaktionen.",
|
||||
"transaction_buy_money": "Mit Geld erworben",
|
||||
"transaction_buy_gold": "Mit Gold erworben",
|
||||
"transaction_spend": "Ausgegeben für",
|
||||
"transaction_gift_send": "Verschenkt an",
|
||||
"transaction_gift_receive": "Erhalten von",
|
||||
"transaction_create_challenge": "Herausforderung erstellt",
|
||||
"transaction_create_guild": "Gilde erstellt",
|
||||
"transaction_change_class": "Klasse geändert",
|
||||
"transaction_buy_money": "Mit Geld <b>erworben</b>",
|
||||
"transaction_buy_gold": "Mit Gold <b>erworben</b>",
|
||||
"transaction_spend": "<b>Ausgegeben</b> für",
|
||||
"transaction_gift_send": "<b>Verschenkt</b> an",
|
||||
"transaction_gift_receive": "<b>Erhalten</b> von",
|
||||
"transaction_create_challenge": "Herausforderung <b>erstellt</b>",
|
||||
"transaction_create_guild": "Gilde <b>erstellt</b>",
|
||||
"transaction_change_class": "<b>Klasse</b> geändert",
|
||||
"transaction_rebirth": "Sphäre der Wiedergeburt verwendet",
|
||||
"transaction_debug": "Debug-Aktion",
|
||||
"transaction_contribution": "Durch Beiträge",
|
||||
"transaction_contribution": "Neuer <b>Mitwirker-Rang</b>",
|
||||
"transaction_release_pets": "Haustiere freigelassen",
|
||||
"transaction_release_mounts": "Reittiere freigelassen",
|
||||
"addPasswordAuth": "Passwort hinzufügen",
|
||||
@@ -218,5 +218,13 @@
|
||||
"dayStartAdjustment": "Änderung des Tageswechsel",
|
||||
"passwordSuccess": "Passwort erfolgreich geändert",
|
||||
"giftSubscriptionRateText": "<strong>$<%= price %> $(USD)</strong> für <strong><%= months %> Monate</strong>",
|
||||
"transaction_admin_update_balance": "Admin gegeben"
|
||||
"transaction_admin_update_balance": "<b>Admin</b> gegeben",
|
||||
"transaction_admin_update_hourglasses": "<b>Admin</b> aktualisiert",
|
||||
"transaction_create_bank_challenge": "Herausforderung mit Edelsteinen des Gildenbankkontos erstellt",
|
||||
"passwordIssueLength": "Passwörter müssen zwischen 8 und 64 Zeichen lang sein.",
|
||||
"timestamp": "Zeitstempel",
|
||||
"amount": "Menge",
|
||||
"note": "Anmerkung",
|
||||
"action": "Aktion",
|
||||
"remainingBalance": "Übriger Kontostand"
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
"paypalCanceled": "Dein Abonnement wurde gekündigt",
|
||||
"choosePaymentMethod": "Wähle Deine Zahlungsmethode",
|
||||
"buyGemsSupportsDevs": "Der Kauf von Edelsteinen unterstützt die Entwickler und hilft Habitica am Laufen zu halten",
|
||||
"support": "HILFE",
|
||||
"support": "Hilfe",
|
||||
"gemBenefitLeadin": "Was kann man mit Edelsteinen kaufen?",
|
||||
"gemBenefit1": "Einzigartige und modische Verkleidungen für Deinen Avatar.",
|
||||
"gemBenefit2": "Hintergründe, die Deinen Avatar in die Welt von Habitica eintauchen lassen!",
|
||||
@@ -213,5 +213,8 @@
|
||||
"wantToSendOwnGems": "Willst Du von deinen eigenen Edelsteinen senden?",
|
||||
"needToPurchaseGems": "Willst Du Edelsteine als Geschenk kaufen?",
|
||||
"mysterySet202208": "Frecher Pferdeschwanz-Set",
|
||||
"mysterySet202209": "Magisches Gelehrten-Set"
|
||||
"mysterySet202209": "Magisches Gelehrten-Set",
|
||||
"mysterySet202210": "Bedrohliche Schlange Set",
|
||||
"mysteryset202211": "Blitzbeschwörer Set",
|
||||
"mysterySet202211": "Blitzbeschwörer Set"
|
||||
}
|
||||
|
||||
@@ -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!"
|
||||
}
|
||||
|
||||
@@ -819,6 +819,30 @@
|
||||
"backgroundOldPhotoText": "Old Photo",
|
||||
"backgroundOldPhotoNotes": "Strike a pose in an Old Photo.",
|
||||
|
||||
"backgrounds102022": "SET 101: Released October 2022",
|
||||
"backgroundSpookyRuinsText": "Spooky Ruins",
|
||||
"backgroundSpookyRuinsNotes": "Explore some Spooky Ruins.",
|
||||
"backgroundMaskMakersWorkshopText": "Mask Maker's Workshop",
|
||||
"backgroundMaskMakersWorkshopNotes": "Try on a new face at the Mask Maker's Workshop.",
|
||||
"backgroundCemeteryGateText": "Cemetery Gate",
|
||||
"backgroundCemeteryGateNotes": "Haunt a Cemetery Gate.",
|
||||
|
||||
"backgrounds112022": "SET 102: Released November 2022",
|
||||
"backgroundAmongGiantMushroomsText": "Among Giant Mushrooms",
|
||||
"backgroundAmongGiantMushroomsNotes": "Marvel at Giant Mushrooms.",
|
||||
"backgroundMistyAutumnForestText": "Misty Autumn Forest",
|
||||
"backgroundMistyAutumnForestNotes": "Wander through a Misty Autumn Forest.",
|
||||
"backgroundAutumnBridgeText": "Bridge in Autumn",
|
||||
"backgroundAutumnBridgeNotes": "Admire the beauty of a Bridge in Autumn.",
|
||||
|
||||
"backgrounds122022": "SET 103: Released December 2022",
|
||||
"backgroundBranchesOfAHolidayTreeText": "Branches of a Holiday Tree",
|
||||
"backgroundBranchesOfAHolidayTreeNotes": "Frolic on the Branches of a Holiday Tree.",
|
||||
"backgroundInsideACrystalText": "Inside A Crystal",
|
||||
"backgroundInsideACrystalNotes": "Peer out from Inside A Crystal.",
|
||||
"backgroundSnowyVillageText": "Snowy Village",
|
||||
"backgroundSnowyVillageNotes": "Admire a Snowy Village.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
||||
@@ -66,10 +66,10 @@
|
||||
"androidFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual.\n\n You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party.\n\n A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change.\n\n You can read more about [past World Bosses](https://habitica.fandom.com/wiki/World_Bosses) on the wiki.",
|
||||
"webFaqAnswer12": "World Bosses are special monsters that appear in the Tavern. All active users are automatically battling the Boss, and their tasks and Skills will damage the Boss as usual. You can also be in a normal Quest at the same time. Your tasks and Skills will count towards both the World Boss and the Boss/Collection Quest in your party. A World Boss will never hurt you or your account in any way. Instead, it has a Rage Bar that fills when users skip Dailies. If its Rage bar fills, it will attack one of the Non-Player Characters around the site and their image will change. You can read more about [past World Bosses](https://habitica.fandom.com/wiki/World_Bosses) on the wiki.",
|
||||
|
||||
"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 that’s similar to your personal task board! It’s 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 it’s 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. We’ll 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 aren’t 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 won’t 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 you’d 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 leader’s day start time. Because shared tasks reset automatically, you will not get a chance to complete yesterday’s 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 don’t 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 don’t 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## What’s the difference between a Group’s 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.",
|
||||
|
||||
"iosFaqStillNeedHelp": "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 Tavern chat under Menu > Tavern! We're happy to help.",
|
||||
"androidFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), come ask in the Tavern chat under Menu > Tavern! We're happy to help.",
|
||||
"webFaqStillNeedHelp": "If you have a question that isn't on this list or on the [Wiki FAQ](https://habitica.fandom.com/wiki/FAQ), 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 that’s similar to your personal task board! It’s 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 it’s 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. We’ll 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 aren’t 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 won’t 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 you’d 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 leader’s day start time. Because shared tasks reset automatically, you will not get a chance to complete yesterday’s 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 don’t 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 don’t 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 group’s 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## What’s the difference between a Group’s 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."
|
||||
"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."
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
"mobileAndroid": "Android App",
|
||||
"mobileIOS": "iOS App",
|
||||
"oldNews": "News",
|
||||
"newsArchive": "News archive on Wikia (multilingual)",
|
||||
"newsArchive": "News archive on Fandom (multilingual)",
|
||||
"setNewPass": "Set New Password",
|
||||
"password": "Password",
|
||||
"playButton": "Play",
|
||||
|
||||
@@ -482,6 +482,10 @@
|
||||
"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.",
|
||||
"weaponMystery202212Text": "Glacial Wand",
|
||||
"weaponMystery202212Notes": "The glowing snowflake in this wand holds the power to warm hearts on even the coldest winter night! Confers no benefit. December 2022 Subscriber Item.",
|
||||
"weaponMystery301404Text": "Steampunk Cane",
|
||||
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
|
||||
|
||||
@@ -665,6 +669,10 @@
|
||||
"weaponArmoirePushBroomNotes": "Take this tidying tool on your adventures and always be able to sweep a sooty stoop or clear cobwebs from corners. Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set (Item 1 of 3)",
|
||||
"weaponArmoireFeatherDusterText": "Feather Duster",
|
||||
"weaponArmoireFeatherDusterNotes": "Let these fancy feathers fly over all your old objects to make them shine like new. Just beware of the disturbed dust so you don’t sneeze! Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set (Item 2 of 3)",
|
||||
"weaponArmoireMagicSpatulaText": "Magic Spatula",
|
||||
"weaponArmoireMagicSpatulaNotes": "Watch your food fly and flip in the air. You get good luck for the day if it magically flips over three times and then lands back on your spatula. Increases Perception by <%= per %>. Enchanted Armoire: Cooking Implements Set (Item 1 of 2).",
|
||||
"weaponArmoireFinelyCutGemText": "Finely Cut Gem",
|
||||
"weaponArmoireFinelyCutGemNotes": "What a find! This stunning, precision-cut gem will be the prize of your collection. And it might contain some special magic, just waiting for you to tap into it. Increases Constitution by <%= con %>. Enchanted Armoire: Jeweler Set (Item 4 of 4).",
|
||||
|
||||
"armor": "armor",
|
||||
"armorCapitalized": "Armor",
|
||||
@@ -1211,6 +1219,10 @@
|
||||
"armorMystery202204Notes": "Looks like doing your tasks now requires pushing these mysterious buttons! What could they do? Confers no benefit. April 2022 Subscriber Item.",
|
||||
"armorMystery202207Text": "Jammin' Jelly Armor",
|
||||
"armorMystery202207Notes": "This armor will have you looking glamorous and gelatinous. Confers no benefit. July 2022 Subscriber Item.",
|
||||
"armorMystery202210Text": "Ominous Ophidian Armor",
|
||||
"armorMystery202210Notes": "Try slithering for a change, you may find it's quite an efficient mode of transportation! Confers no benefit. October 2022 Subscriber Item.",
|
||||
"armorMystery202212Text": "Glacial Dress",
|
||||
"armorMystery202212Notes": "The universe can be cold, but this charming dress will keep you cozy as you fly. Confers no benefit. December 2022 Subscriber Item.",
|
||||
"armorMystery301404Text": "Steampunk Suit",
|
||||
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
|
||||
"armorMystery301703Text": "Steampunk Peacock Gown",
|
||||
@@ -1388,6 +1400,10 @@
|
||||
"armorArmoireStrawRaincoatNotes": "This woven straw cape will keep you dry and your armor from rusting while on your quest. Just don’t venture too near a candle! Increases Constitution by <%= con %>. Enchanted Armoire: Straw Raincoat Set (Item 1 of 2).",
|
||||
"armorArmoireFancyPirateSuitText": "Fancy Pirate Jacket",
|
||||
"armorArmoireFancyPirateSuitNotes": "Wear this fine jacket well as you organize your ship’s library or talk it through as a crew. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Fancy Pirate Set (Item 1 of 3).",
|
||||
"armorArmoireSheetGhostCostumeText": "Sheet Ghost Costume",
|
||||
"armorArmoireSheetGhostCostumeNotes": "Boo! This is the scariest costume in all of Habitica, so wear it wisely... and watch your step so you don’t trip. Increases Constitution by <%= con %>. Enchanted Armoire: Independent Item.",
|
||||
"armorArmoireJewelersApronText": "Jeweler's Apron",
|
||||
"armorArmoireJewelersApronNotes": "This heavy-duty apron is just the thing to wear when you feel creative. Best of all, there are dozens of small pockets to hold everything you need. Increases Intelligence by <%= int %>. Enchanted Armoire: Jeweler Set (Item 1 of 4).",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
@@ -1959,7 +1975,10 @@
|
||||
"headMystery202207Notes": "Need a hand with your tasks? Will several dozen bioluminescent tentacles do? Confers no benefit. July 2022 Subscriber Item.",
|
||||
"headMystery202208Text": "Perky Ponytail",
|
||||
"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.",
|
||||
"headMystery301405Text": "Basic Top Hat",
|
||||
@@ -2532,6 +2551,11 @@
|
||||
"shieldArmoireTreasureMapNotes": "X marks the spot! You never know what you’ll find when you follow this handy map to fabled treasures: gold, jewels, relics, or perhaps a petrified orange? Increases Strength and Intelligence by <%= attrs %> each. Enchanted Armoire: Fancy Pirate Set (Item 3 of 3).",
|
||||
"shieldArmoireDustpanText": "Dustpan",
|
||||
"shieldArmoireDustpanNotes": "Have this handy handheld dustpan ready every time you clean. A vanishing spell cast on it means you never have to search for a trash can to empty it into. Increases Intelligence and Constitution by <%= attrs %> each. Enchanted Armoire: Cleaning Supplies Set (Item 3 of 3).",
|
||||
"shieldArmoireBubblingCauldronText": "Bubbling Cauldron",
|
||||
"shieldArmoireBubblingCauldronNotes": "The perfect cauldron for brewing up a productivity potion or cooking a savory soup. In fact, there is little difference between the two! Increases Constitution by <%= con %>. Enchanted Armoire: Cooking Implements Set (Item 2 of 2).",
|
||||
"shieldArmoireJewelersPliersText": "Jeweler's Pliers",
|
||||
"shieldArmoireJewelersPliersNotes": "They cut, twist, pinch, and more. This tool can help you create whatever you can imagine. Increases Strength by <%= str %>. Enchanted Armoire: Jeweler Set (Item 3 of 4).",
|
||||
|
||||
|
||||
"back": "Back Accessory",
|
||||
"backBase0Text": "No Back Accessory",
|
||||
@@ -2800,6 +2824,8 @@
|
||||
"headAccessoryMystery202203Notes": "Need an extra boost of speed? The tiny decorative wings on this circlet are more powerful than they look! Confers no benefit. March 2022 Subscriber Item.",
|
||||
"headAccessoryMystery202205Text": "Dusk-Winged Dragon Horns",
|
||||
"headAccessoryMystery202205Notes": "These dazzling horns are as bright as a desert sunset. Confers no benefit. May 2022 Subscriber Item.",
|
||||
"headAccessoryMystery202212Text": "Glacial Tiara",
|
||||
"headAccessoryMystery202212Notes": "Magnify your warmth and friendship to new heights with this ornate golden tiara. Confers no benefit. December 2022 Subscriber Item.",
|
||||
"headAccessoryMystery301405Text": "Headwear Goggles",
|
||||
"headAccessoryMystery301405Notes": "\"Goggles are for your eyes,\" they said. \"Nobody wants goggles that you can only wear on your head,\" they said. Hah! You sure showed them! Confers no benefit. August 3015 Subscriber Item.",
|
||||
|
||||
@@ -2903,6 +2929,8 @@
|
||||
"eyewearArmoireComedyMaskNotes": "Cheerily! Here is a quaint mask for thine happy heart, playing, heralding joy, and expressing merriment and mirth upon the stage. Increases Constitution by <%= con %>. Enchanted Armoire: Theatre Masks Set (Item 1 of 2).",
|
||||
"eyewearArmoireTragedyMaskText": "Tragedy Mask",
|
||||
"eyewearArmoireTragedyMaskNotes": "Alas! Here sits a heavy mask for thine poor player, strutting, fretting, and expressing woe and sorrow upon the stage. Increases Intelligence by <%= int %>. Enchanted Armoire: Theatre Masks Set (Item 2 of 2).",
|
||||
"eyewearArmoireJewelersEyeLoupeText": "Jeweler's Eye Loupe",
|
||||
"eyewearArmoireJewelersEyeLoupeNotes": "This eye loupe magnifies what you’re working on so you can see absolutely every detail. Increases Perception by <%= per %>. Enchanted Armoire: Jeweler Set (Item 2 of 4).",
|
||||
|
||||
"twoHandedItem": "Two-handed item."
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
"wiki": "Wiki",
|
||||
"resources": "Resources",
|
||||
"communityGuidelines": "Community Guidelines",
|
||||
"bannedWordUsed": "Oops! Looks like this post contains a swearword, religious oath, or reference to an addictive substance or adult topic (<%= swearWordsUsed %>). Habitica has users from all backgrounds, so we keep our chat very clean. Feel free to edit your message so you can post it!",
|
||||
"bannedWordUsed": "Oops! Looks like this post contains a swearword or reference to an addictive substance or adult topic (<%= swearWordsUsed %>). Habitica keeps our chat very clean. Feel free to edit your message so you can post it! You must remove the word, not just censor it.",
|
||||
"bannedSlurUsed": "Your post contained inappropriate language, and your chat privileges have been revoked.",
|
||||
"party": "Party",
|
||||
"usernameCopied": "Username copied to clipboard.",
|
||||
@@ -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 %>.",
|
||||
@@ -215,7 +216,7 @@
|
||||
"userIsClamingTask": "`<%= username %> has claimed:` <%= task %>",
|
||||
"approvalRequested": "Approval Requested",
|
||||
"cantDeleteAssignedGroupTasks": "Can't delete group tasks that are assigned to you.",
|
||||
"groupPlanUpgraded": "<strong><%- groupName %></strong> was upgraded to a Group Plan!",
|
||||
"groupPlanUpgraded": "<strong><%- groupName %></strong> was successfully upgraded to a Group Plan!",
|
||||
"groupPlanCreated": "<strong><%- groupName %></strong> was created!",
|
||||
"onlyGroupLeaderCanInviteToGroupPlan": "Only the group leader can invite users to a group with a subscription.",
|
||||
"paymentDetails": "Payment Details",
|
||||
@@ -342,7 +343,21 @@
|
||||
"exampleGroupName": "Example: Avengers Academy",
|
||||
"exampleGroupDesc": "For those selected to join the training academy for The Avengers Superhero Initiative",
|
||||
"thisGroupInviteOnly": "This group is invitation only.",
|
||||
"createGroup": "Create a Group",
|
||||
"groupUse": "Which best describes the use of your Group?*",
|
||||
"groupUseDefault": "Choose an answer",
|
||||
"groupParentChildren": "Parent(s) setting up tasks for children",
|
||||
"groupCouple": "Couple sharing tasks",
|
||||
"groupFriends": "Friends sharing tasks",
|
||||
"groupCoworkers": "Coworkers sharing tasks",
|
||||
"groupManager": "Manager setting up tasks for employees",
|
||||
"groupTeacher": "Teacher setting up tasks for students",
|
||||
"gettingStarted": "Getting Started",
|
||||
"nameStar": "Name*",
|
||||
"nameStarText": "Add a title",
|
||||
"descriptionOptional": "Description",
|
||||
"descriptionOptionalText": "Add a description",
|
||||
"nextPaymentMethod": "Next: Payment Method",
|
||||
"congratsOnGroupPlan": "Congratulations on creating your new Group! Here are a few answers to some of the more commonly asked questions.",
|
||||
"whatsIncludedGroup": "What's included in the subscription",
|
||||
"whatsIncludedGroupDesc": "All members of the Group receive full subscription benefits, including the monthly subscriber items, the ability to buy Gems with Gold, and the Royal Purple Jackalope mount, which is exclusive to users with a Group Plan membership.",
|
||||
|
||||
@@ -230,5 +230,7 @@
|
||||
"g1g1HowItWorks": "Type in the username of the account you’d like to gift to. From there, pick the sub length you’d like to gift and check out. Your account will automatically be rewarded with the same level of subscription you just gifted.",
|
||||
"limitations": "Limitations",
|
||||
"g1g1Limitations": "This is a limited time event that starts on December 16th at 8:00 AM ET (13:00 UTC) and will end January 6th at 8:00 PM ET (1:00 UTC). This promotion only applies when you gift to another Habitican. If you or your gift recipient already have a subscription, the gifted subscription will add months of credit that will only be used after the current subscription is canceled or expires.",
|
||||
"noLongerAvailable": "This item is no longer available."
|
||||
"noLongerAvailable": "This item is no longer available.",
|
||||
"gemSaleHow": "Between <%= eventStartMonth %> <%= eventStartOrdinal %> and <%= eventEndOrdinal %>, simply purchase any Gem bundle like usual and your account will be credited with the promotional amount of Gems. More Gems to spend, share, or save for any future releases!",
|
||||
"gemSaleLimitations": "This promotion only applies during the limited time event. This event starts on <%= eventStartMonth %> <%= eventStartOrdinal %> at 8:00 AM EDT (12:00 UTC) and will end <%= eventStartMonth %> <%= eventEndOrdinal %> at 8:00 PM EDT (00:00 UTC). The promo offer is only available when buying Gems for yourself."
|
||||
}
|
||||
|
||||
@@ -92,10 +92,12 @@
|
||||
"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>.",
|
||||
"paymentAutoRenew": "This subscription will auto-renew until it is canceled. If you need to cancel this subscription, you can do so from your settings.",
|
||||
"groupsPaymentAutoRenew": "This subscription will auto-renew until it is canceled. If you need to cancel, you can do so from the Group Billing tab.",
|
||||
"paymentCanceledDisputes": "We’ve sent a cancelation confirmation to your email. If you don’t see the email, please contact us to prevent future billing disputes.",
|
||||
"success": "Success!",
|
||||
"classGear": "Class Gear",
|
||||
|
||||
@@ -777,7 +777,7 @@
|
||||
"questRobotUnlockText": "Unlocks purchasable Robot Eggs in the Market",
|
||||
|
||||
"rockingReptilesText": "Rocking Reptiles Quest Bundle",
|
||||
"rockingReptilesNotes": "Contains 'The Insta-Gator,' 'The Serpent of Distraction,' and 'The Veloci-Rapper.' Available until September 30.",
|
||||
"rockingReptilesNotes": "Contains 'The Insta-Gator,' 'The Serpent of Distraction,' and 'The Veloci-Rapper.' Available until November 30.",
|
||||
|
||||
"delightfulDinosText": "Delightful Dinos Quest Bundle",
|
||||
"delightfulDinosNotes": "Contains 'The Pterror-dactyl,' 'The Trampling Triceratops,' and 'The Dinosaur Unearthed.' Available until May 31.",
|
||||
|
||||
@@ -178,6 +178,7 @@
|
||||
"usernameIssueForbidden": "Usernames may not contain restricted words.",
|
||||
"usernameIssueLength": "Usernames must be between 1 and 20 characters.",
|
||||
"usernameIssueInvalidCharacters": "Usernames can only contain letters a to z, numbers 0 to 9, hyphens, or underscores.",
|
||||
"passwordIssueLength": "Passwords must be between 8 and 64 characters.",
|
||||
"currentUsername": "Current username:",
|
||||
"displaynameIssueLength": "Display Names must be between 1 and 30 characters.",
|
||||
"bannedWordUsedInProfile": "Your Display Name or About text contained inappropriate language.",
|
||||
@@ -192,26 +193,32 @@
|
||||
"everywhere": "Everywhere",
|
||||
"onlyPrivateSpaces": "Only in private spaces",
|
||||
"bannedSlurUsedInProfile": "Your Display Name or About text contained a slur, and your chat privileges have been revoked.",
|
||||
"timestamp": "Timestamp",
|
||||
"amount": "Amount",
|
||||
"action": "Action",
|
||||
"note": "Note",
|
||||
"remainingBalance": "Remaining Balance",
|
||||
"transactions": "Transactions",
|
||||
"gemTransactions": "Gem Transactions",
|
||||
"hourglassTransactions": "Hourglass Transactions",
|
||||
"noGemTransactions": "You don't have any gem transactions yet.",
|
||||
"noHourglassTransactions": "You don't have any hourglass transactions yet.",
|
||||
"transaction_debug": "Debug Action",
|
||||
"transaction_buy_money": "Bought with money",
|
||||
"transaction_buy_gold": "Bought with gold",
|
||||
"transaction_contribution": "Through contribution",
|
||||
"transaction_spend": "Spent on",
|
||||
"transaction_gift_send": "Gifted to",
|
||||
"transaction_gift_receive": "Received from",
|
||||
"transaction_create_challenge": "Created challenge",
|
||||
"transaction_buy_money": "<b>Bought</b> with money",
|
||||
"transaction_buy_gold": "<b>Bought</b> with gold",
|
||||
"transaction_contribution": "<b>Tier</b> change",
|
||||
"transaction_spend": "<b>Spent</b> on",
|
||||
"transaction_gift_send": "<b>Gifted</b> to",
|
||||
"transaction_gift_receive": "<b>Received</b> from",
|
||||
"transaction_create_challenge": "<b>Created</b> challenge",
|
||||
"transaction_create_bank_challenge": "<b>Created</b> bank challenge",
|
||||
"transaction_create_bank_challenge": "Created bank challenge",
|
||||
"transaction_create_guild": "Created guild",
|
||||
"transaction_change_class": "Changed class",
|
||||
"transaction_create_guild": "<b>Created</b> guild",
|
||||
"transaction_change_class": "<b>Class</b> change",
|
||||
"transaction_rebirth": "Used Orb of Rebirth",
|
||||
"transaction_release_pets": "Released pets",
|
||||
"transaction_release_mounts": "Released mounts",
|
||||
"transaction_reroll": "Used Fortify Potion",
|
||||
"transaction_subscription_perks": "From subscription perk",
|
||||
"transaction_admin_update_balance": "Admin given"
|
||||
"transaction_subscription_perks": "<b>Subscription</b> perk",
|
||||
"transaction_admin_update_balance": "<b>Admin</b> given",
|
||||
"transaction_admin_update_hourglasses": "<b>Admin</b> updated"
|
||||
}
|
||||
|
||||
@@ -142,6 +142,9 @@
|
||||
"mysterySet202207": "Jammin' Jelly Set",
|
||||
"mysterySet202208": "Perky Ponytail Set",
|
||||
"mysterySet202209": "Magical Scholar Set",
|
||||
"mysterySet202210": "Ominous Ophidian Set",
|
||||
"mysterySet202211": "Electromancer Set",
|
||||
"mysterySet202212": "Glacial Guardian Set",
|
||||
"mysterySet301404": "Steampunk Standard Set",
|
||||
"mysterySet301405": "Steampunk Accessories Set",
|
||||
"mysterySet301703": "Peacock Steampunk Set",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "an' th'",
|
||||
"chores": "Tasks fer ye chambers",
|
||||
"clearBrowserData": "Clear yer Browser Data",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Add-ons n' Extensions</a>",
|
||||
"communityExtensions": "Add-ons n' Extensions",
|
||||
"communityFacebook": "Face-log",
|
||||
"companyAbout": "How It Be Workin'",
|
||||
"companyBlog": "Blog",
|
||||
|
||||
@@ -126,5 +126,20 @@
|
||||
"achievementShadyCustomerModalText": "You colleted all the Shade Pets!",
|
||||
"achievementShadeOfItAll": "The Shade of It All",
|
||||
"achievementShadeOfItAllText": "Has tamed all Shade Mounts.",
|
||||
"achievementShadeOfItAllModalText": "You tamed all the Shade Mounts!"
|
||||
"achievementShadeOfItAllModalText": "You tamed all the Shade Mounts!",
|
||||
"achievementReptacularRumble": "Reptacular Rumble",
|
||||
"achievementReptacularRumbleModalText": "You collected all the reptile pets!",
|
||||
"achievementReptacularRumbleText": "Has hatched all the standard colours of reptile pets: Alligator, Pterodactyl, Snake, Triceratops, Turtle, Tyrannosaurus Rex, and Velociraptor!",
|
||||
"achievementBirdsOfAFeather": "Birds of a Feather",
|
||||
"achievementBirdsOfAFeatherModalText": "You collected all the flying pets!",
|
||||
"achievementBirdsOfAFeatherText": "Has hatched all standard colours of flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, Falcon, Peacock and Rooster!",
|
||||
"achievementGroupsBeta2022": "Interactive Beta Tester",
|
||||
"achievementGroupsBeta2022Text": "You and your group provided invaluable feedback to help Habitica test.",
|
||||
"achievementGroupsBeta2022ModalText": "You and your groups helped Habitica by testing and providing feedback!",
|
||||
"achievementWoodlandWizard": "Woodland Wizard",
|
||||
"achievementWoodlandWizardText": "Has hatched all standard colours of forest creatures: Badger, Bear, Deer, Fox, Frog, Hedgehog, Owl, Snail, Squirrel, and Treeling!",
|
||||
"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!"
|
||||
}
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
{
|
||||
|
||||
"tavernCommunityGuidelinesPlaceholder": "Friendly reminder: this is an all-ages chat, so please keep content and language appropriate! Consult the Community Guidelines in the sidebar if you have questions.",
|
||||
"lastUpdated": "Last updated:",
|
||||
"commGuideHeadingWelcome": "Welcome to Habitica!",
|
||||
"commGuidePara001": "Greetings, adventurer! Welcome to Habitica, the land of productivity, healthy living, and the occasional rampaging gryphon. We have a cheerful community full of helpful people supporting each other on their way to self-improvement. To fit in, all it takes is a positive attitude, a respectful manner, and the understanding that everyone has different skills and limitations -- including you! Habiticans are patient with one another and try to help whenever they can.",
|
||||
"commGuidePara002": "To help keep everyone safe, happy, and productive in the community, we do have some guidelines. We have carefully crafted them to make them as friendly and easy-to-read as possible. Please take the time to read them before you start chatting.",
|
||||
"commGuidePara003": "These rules apply to all of the social spaces we use, including (but not necessarily limited to) Trello, GitHub, Weblate, and the Wikia (aka wiki). Sometimes, unforeseen situations will arise, like a new source of conflict or a vicious necromancer. When this happens, the mods may respond by editing these guidelines to keep the community safe from new threats. Fear not: you will be notified by an announcement from Bailey if the guidelines change.",
|
||||
"commGuidePara003": "These rules apply to all of the social spaces we use, including (but not necessarily limited to) Trello, GitHub, Weblate, and the Habitica Wiki on Fandom. As communities grow and change, their rules may adapt from time to time. When there are substantive changes to these Guidelines, you'll hear about it in a Bailey announcement and/or our social media!",
|
||||
"commGuideHeadingInteractions": "Interactions in Habitica",
|
||||
"commGuidePara015": "Habitica has two kinds of social spaces: public, and private. Public spaces include the Tavern, Public Guilds, GitHub, Trello, and the Wiki. Private spaces are Private Guilds, Party chat, and Private Messages. All Display Names must comply with the public space guidelines. To change your Display Name, go on the website to User > Profile and click on the \"Edit\" button.",
|
||||
"commGuidePara016": "When navigating the public spaces in Habitica, there are some general rules to keep everyone safe and happy. These should be easy for adventurers like you!",
|
||||
"commGuidePara015": "Habitica has two kinds of social spaces: public, and private. Public spaces include the Tavern, Public Guilds, GitHub, Trello, and the Wiki. Private spaces are Private Guilds, Party chat, and Private Messages. All Display Names and @usernames must comply with the public space guidelines. To change your Display Name and/or @username, on mobile go to Menu > Settings > Profile. On web, go to User > Settings.",
|
||||
"commGuidePara016": "When navigating the public spaces in Habitica, there are some general rules to keep everyone safe and happy.",
|
||||
"commGuideList02A": "<strong>Respect each other</strong>. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences. This is part of what makes Habitica so cool! Building a community means respecting and celebrating our differences as well as our similarities. Here are some easy ways to respect each other:",
|
||||
"commGuideList02B": "<strong>Obey all of the <a href='/static/terms' target='_blank'>Terms and Conditions</a></strong>.",
|
||||
"commGuideList02C": "<strong>Do not post images or text that are violent, threatening, or sexually explicit/suggestive, or that promote discrimination, bigotry, racism, sexism, hatred, harassment or harm against any individual or group</strong>. Not even as a joke. This includes slurs as well as statements. Not everyone has the same sense of humor, and so something that you consider a joke may be hurtful to another. Attack your Dailies, not each other.",
|
||||
@@ -120,5 +119,6 @@
|
||||
"commGuideLink05": "<a href='https://trello.com/b/mXK3Eavg/' target='_blank'>The Mobile Trello</a>: for mobile feature requests.",
|
||||
"commGuideLink06": "<a href='https://trello.com/b/vwuE9fbO/' target='_blank'>The Art Trello</a>: for submitting pixel art.",
|
||||
"commGuideLink07": "<a href='https://trello.com/b/nnv4QIRX/' target='_blank'>The Quest Trello</a>: for submitting quest writing.",
|
||||
"commGuidePara069": "The following talented artists contributed to these illustrations:"
|
||||
"commGuidePara069": "The following talented artists contributed to these illustrations:",
|
||||
"commGuidePara017": "Here's the quick version, but we encourage you to read in more detail below:"
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"accept2Terms": "and the",
|
||||
"chores": "Chores",
|
||||
"clearBrowserData": "Clear Browser Data",
|
||||
"communityExtensions": "<a href='http://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank'>Add-ons & Extensions</a>",
|
||||
"communityExtensions": "Add-ons & Extensions",
|
||||
"communityFacebook": "Facebook",
|
||||
"companyAbout": "How It Works",
|
||||
"companyBlog": "Blog",
|
||||
|
||||
@@ -635,7 +635,7 @@
|
||||
"backgroundRagingRiverText": "Río Furioso",
|
||||
"backgroundVineyardNotes": "Explora un fértil viñedo en toda su extensión.",
|
||||
"backgroundAutumnLakeshoreNotes": "Párate un momento en la orilla de un lago otoñal para apreciar el reflejo del bosque en sus aguas.",
|
||||
"backgrounds092021": "CONJUNTO 88: Publicado en septiembre de 2021",
|
||||
"backgrounds092021": "88.ª serie: publicada en septiembre de 2021",
|
||||
"backgroundAutumnPoplarsNotes": "Regocíjate en las brillantes sombras marrones y doradas de un bosque de álamos otoñales.",
|
||||
"backgroundVineyardText": "Viñedo",
|
||||
"backgroundAutumnLakeshoreText": "Orilla de lago otoñal",
|
||||
@@ -699,7 +699,7 @@
|
||||
"backgroundOnACastleWallText": "En un Muro de Castillo",
|
||||
"backgroundEnchantedMusicRoomText": "Sala de Música Encantada",
|
||||
"backgroundEnchantedMusicRoomNotes": "Tocar en una Sala de Música Encantada.",
|
||||
"backgrounds052022": "SET 96 : Publicado en Mayo de 2022",
|
||||
"backgrounds052022": "96.ª serie: publicada en mayo de 2022",
|
||||
"backgroundUnderwaterStatuesText": "Jardín de Estatuas Subacuático",
|
||||
"backgroundOnACastleWallNotes": "Mira hacia fuera desde un Muro de Castillo.",
|
||||
"backgroundUnderwaterStatuesNotes": "Intenta no parpadear en un Jardín de Estatuas Subacuático.",
|
||||
@@ -717,5 +717,12 @@
|
||||
"backgroundMountainWaterfallText": "Cascada de Montaña",
|
||||
"backgroundMountainWaterfallNotes": "Admira una cascada de montaña.",
|
||||
"backgroundSailboatAtSunsetText": "Velero en la Puesta de Sol",
|
||||
"backgroundSailboatAtSunsetNotes": "Disfruta de la belleza de un velero en la puesta de sol."
|
||||
"backgroundSailboatAtSunsetNotes": "Disfruta de la belleza de un velero en la puesta de sol.",
|
||||
"backgrounds092022": "100.ª serie: publicada en septiembre 2022",
|
||||
"backgroundTheatreStageText": "Escenario de teatro",
|
||||
"backgroundTheatreStageNotes": "Actúa en un escenario de teatro.",
|
||||
"backgroundAutumnPicnicText": "Picnic otoñal",
|
||||
"backgroundAutumnPicnicNotes": "Disfruta un picnic otoñal.",
|
||||
"backgroundOldPhotoText": "Foto antigua",
|
||||
"backgroundOldPhotoNotes": "Posa en una foto antigua."
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user