mirror of
https://github.com/HabitRPG/habitica.git
synced 2026-05-19 19:38:45 -05:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b56a4689e | |||
| 966bfde06f | |||
| 9d23693a45 | |||
| b57fb94579 | |||
| 42805a2792 | |||
| d7e7668255 | |||
| a4fda59a69 | |||
| 3b9ffae625 | |||
| dd413518f5 | |||
| c581b88213 | |||
| 0078d8f2b2 | |||
| 54ea0aab18 | |||
| 24b2a5beb8 | |||
| fe9332dff4 | |||
| c6582e4c3c | |||
| b4b7980eee | |||
| 6069fbd61f | |||
| 38a591bdd1 | |||
| 2736d8acf3 | |||
| 8fe13dbb23 | |||
| 4581bb9315 | |||
| 2999212379 | |||
| d2bd246e6e | |||
| 1482f6c225 | |||
| 1178da3a26 | |||
| 819ed2b355 | |||
| a92999fc11 | |||
| 3489b88752 |
+1
-1
Submodule habitica-images updated: 32a4678c6b...b7367f328a
Generated
+105
-7
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"version": "5.47.5",
|
||||
"version": "5.48.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "habitica",
|
||||
"version": "5.47.5",
|
||||
"version": "5.48.0",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
@@ -35,6 +35,7 @@
|
||||
"eslint-plugin-mocha": "^5.0.0",
|
||||
"express": "^4.21.1",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-sitemap-xml": "^3.1.0",
|
||||
"express-validator": "^5.2.0",
|
||||
"firebase-admin": "^12.1.1",
|
||||
"glob": "^8.1.0",
|
||||
@@ -46,7 +47,7 @@
|
||||
"gulp.spritesmith": "^6.13.0",
|
||||
"habitica-markdown": "^4.1.0",
|
||||
"heapdump": "^0.3.15",
|
||||
"helmet": "^8.1.0",
|
||||
"helmet": "^4.6.0",
|
||||
"in-app-purchase": "^1.11.3",
|
||||
"js2xmlparser": "^5.0.0",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
@@ -10140,6 +10141,30 @@
|
||||
"basic-auth": "^2.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/express-sitemap-xml": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/express-sitemap-xml/-/express-sitemap-xml-3.1.0.tgz",
|
||||
"integrity": "sha512-rhm4ydngymgQlUyKor2kiY9Xf3wWWb/tbXYVMvidxyA83D1JjKOqYo23clhMvwJ+fk2ht11KtJwcaHnhhdo4PQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/feross"
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/feross"
|
||||
},
|
||||
{
|
||||
"type": "consulting",
|
||||
"url": "https://feross.org/support"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"p-memoize": "^4.0.1",
|
||||
"xmlbuilder": "^15.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/express-validator": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/express-validator/-/express-validator-5.3.1.tgz",
|
||||
@@ -12798,11 +12823,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/helmet": {
|
||||
"version": "8.1.0",
|
||||
"resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz",
|
||||
"integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==",
|
||||
"version": "4.6.0",
|
||||
"resolved": "https://registry.npmjs.org/helmet/-/helmet-4.6.0.tgz",
|
||||
"integrity": "sha512-HVqALKZlR95ROkrnesdhbbZJFi/rIVSoNq6f3jA/9u6MIbTsPh3xZwihjeI5+DO/2sOV6HMHooXcEOuwskHpTg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18.0.0"
|
||||
"node": ">=10.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/hex2dec": {
|
||||
@@ -14861,6 +14887,18 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/map-age-cleaner": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
|
||||
"integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"p-defer": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/map-cache": {
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
|
||||
@@ -17226,6 +17264,15 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/p-defer": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
|
||||
"integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/p-event": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz",
|
||||
@@ -17305,6 +17352,32 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/p-memoize": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/p-memoize/-/p-memoize-4.0.4.tgz",
|
||||
"integrity": "sha512-ijdh0DP4Mk6J4FXlOM6vPPoCjPytcEseW8p/k5SDTSSfGV3E9bpt9Yzfifvzp6iohIieoLTkXRb32OWV0fB2Lw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"map-age-cleaner": "^0.1.3",
|
||||
"mimic-fn": "^3.0.0",
|
||||
"p-settle": "^4.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sindresorhus/p-memoize?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/p-memoize/node_modules/mimic-fn": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz",
|
||||
"integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/p-pipe": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz",
|
||||
@@ -17325,6 +17398,31 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/p-reflect": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz",
|
||||
"integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/p-settle": {
|
||||
"version": "4.1.1",
|
||||
"resolved": "https://registry.npmjs.org/p-settle/-/p-settle-4.1.1.tgz",
|
||||
"integrity": "sha512-6THGh13mt3gypcNMm0ADqVNCcYa3BK6DWsuJWFCuEKP1rpY+OKGp7gaZwVmLspmic01+fsg/fN57MfvDzZ/PuQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"p-limit": "^2.2.2",
|
||||
"p-reflect": "^2.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/p-timeout": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz",
|
||||
|
||||
+3
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "5.47.5",
|
||||
"version": "5.48.0",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.22.10",
|
||||
@@ -30,6 +30,7 @@
|
||||
"eslint-plugin-mocha": "^5.0.0",
|
||||
"express": "^4.21.1",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-sitemap-xml": "^3.1.0",
|
||||
"express-validator": "^5.2.0",
|
||||
"firebase-admin": "^12.1.1",
|
||||
"glob": "^8.1.0",
|
||||
@@ -41,7 +42,7 @@
|
||||
"gulp.spritesmith": "^6.13.0",
|
||||
"habitica-markdown": "^4.1.0",
|
||||
"heapdump": "^0.3.15",
|
||||
"helmet": "^8.1.0",
|
||||
"helmet": "^4.6.0",
|
||||
"in-app-purchase": "^1.11.3",
|
||||
"js2xmlparser": "^5.0.0",
|
||||
"jsonwebtoken": "^9.0.2",
|
||||
|
||||
@@ -32,7 +32,8 @@ describe('rateLimiter middleware', () => {
|
||||
|
||||
it('is disabled when the env var is not defined', () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns(undefined);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
attachRateLimiter(req, res, next);
|
||||
|
||||
expect(next).to.have.been.calledOnce;
|
||||
@@ -43,7 +44,8 @@ describe('rateLimiter middleware', () => {
|
||||
|
||||
it('is disabled when the env var is an not "true"', () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('false');
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
attachRateLimiter(req, res, next);
|
||||
|
||||
expect(next).to.have.been.calledOnce;
|
||||
@@ -55,7 +57,8 @@ describe('rateLimiter middleware', () => {
|
||||
it('does not throw when there are available points', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
expect(next).to.have.been.calledOnce;
|
||||
@@ -77,7 +80,8 @@ describe('rateLimiter middleware', () => {
|
||||
sandbox.stub(RateLimiterMemory.prototype, 'consume')
|
||||
.returns(Promise.reject(new Error('Unknown error.')));
|
||||
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
expect(next).to.have.been.calledOnce;
|
||||
@@ -92,7 +96,8 @@ describe('rateLimiter middleware', () => {
|
||||
it('does not throw when LIVELINESS_PROBE_KEY is correct', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('abc');
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
|
||||
req.query.liveliness = 'abc';
|
||||
await attachRateLimiter(req, res, next);
|
||||
@@ -107,7 +112,8 @@ describe('rateLimiter middleware', () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('abc');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
|
||||
req.query.liveliness = 'das';
|
||||
await attachRateLimiter(req, res, next);
|
||||
@@ -124,7 +130,8 @@ describe('rateLimiter middleware', () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns(undefined);
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
@@ -140,7 +147,8 @@ describe('rateLimiter middleware', () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('LIVELINESS_PROBE_KEY').returns('');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
|
||||
req.query.liveliness = '';
|
||||
await attachRateLimiter(req, res, next);
|
||||
@@ -156,7 +164,8 @@ describe('rateLimiter middleware', () => {
|
||||
it('throws when there are no available points remaining', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
|
||||
// call for 31 times
|
||||
for (let i = 0; i < 31; i += 1) {
|
||||
@@ -180,7 +189,8 @@ describe('rateLimiter middleware', () => {
|
||||
it('uses the user id if supplied or the ip address', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(1);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
|
||||
req.ip = 1;
|
||||
await attachRateLimiter(req, res, next);
|
||||
@@ -210,7 +220,8 @@ describe('rateLimiter middleware', () => {
|
||||
it('applies increased cost for registration calls with and without user id', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_REGISTRATION_COST').returns(3);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
req.path = '/api/v4/user/auth/local/register';
|
||||
|
||||
req.ip = 1;
|
||||
@@ -241,7 +252,8 @@ describe('rateLimiter middleware', () => {
|
||||
it('applies increased cost for unauthenticated API calls', async () => {
|
||||
nconfGetStub.withArgs('RATE_LIMITER_ENABLED').returns('true');
|
||||
nconfGetStub.withArgs('RATE_LIMITER_IP_COST').returns(10);
|
||||
const attachRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const setupRateLimiter = requireAgain(pathToRateLimiter).default;
|
||||
const attachRateLimiter = setupRateLimiter();
|
||||
|
||||
req.ip = 1;
|
||||
await attachRateLimiter(req, res, next);
|
||||
|
||||
@@ -6,6 +6,8 @@ import {
|
||||
SPAM_MESSAGE_LIMIT,
|
||||
SPAM_MIN_EXEMPT_CONTRIB_LEVEL,
|
||||
SPAM_WINDOW_LENGTH,
|
||||
MAX_CHAT_COUNT,
|
||||
MAX_SUBBED_GROUP_CHAT_COUNT,
|
||||
INVITES_LIMIT,
|
||||
model as Group,
|
||||
} from '../../../../website/server/models/group';
|
||||
@@ -18,6 +20,7 @@ import {
|
||||
import * as email from '../../../../website/server/libs/email';
|
||||
import { TAVERN_ID } from '../../../../website/common/script/constants';
|
||||
import shared from '../../../../website/common';
|
||||
import { chatModel as Chat } from '../../../../website/server/models/message';
|
||||
|
||||
describe('Group Model', () => {
|
||||
let party; let questLeader; let participatingMember;
|
||||
@@ -1356,6 +1359,29 @@ describe('Group Model', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('#getEffectiveChatLimit', () => {
|
||||
it('returns the correct chat limit', () => {
|
||||
const group = new Group();
|
||||
expect(group.getEffectiveChatLimit()).to.eql(MAX_CHAT_COUNT);
|
||||
});
|
||||
|
||||
it('returns the passed limit if it is lower than the max', () => {
|
||||
const group = new Group();
|
||||
expect(group.getEffectiveChatLimit(10)).to.eql(10);
|
||||
});
|
||||
|
||||
it('returns the max if the passed limit is higher', () => {
|
||||
const group = new Group();
|
||||
expect(group.getEffectiveChatLimit(MAX_CHAT_COUNT + 10)).to.eql(MAX_CHAT_COUNT);
|
||||
});
|
||||
|
||||
it('returns the max for group plans', () => {
|
||||
const group = new Group();
|
||||
group.purchased.plan.customerId = '110002222333';
|
||||
expect(group.getEffectiveChatLimit()).to.eql(MAX_SUBBED_GROUP_CHAT_COUNT);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#sendChat', () => {
|
||||
beforeEach(() => {
|
||||
sandbox.spy(User, 'updateOne');
|
||||
@@ -1462,6 +1488,34 @@ describe('Group Model', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('#trimChat', () => {
|
||||
it('Only checks last message when not enough messages to trim', async () => {
|
||||
sandbox.spy(Chat, 'find');
|
||||
sandbox.spy(Chat, 'deleteMany');
|
||||
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
|
||||
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
|
||||
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
|
||||
await party.trimChat();
|
||||
|
||||
expect(Chat.find).to.be.calledOnce;
|
||||
expect(Chat.deleteMany).to.not.be.called;
|
||||
expect(await Chat.countDocuments({ groupId: party._id })).to.eql(3);
|
||||
});
|
||||
it('Deletes messages over the limit', async () => {
|
||||
sandbox.spy(Chat, 'find');
|
||||
sandbox.spy(Chat, 'deleteMany');
|
||||
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
|
||||
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
|
||||
await Chat.insertOne({ groupId: party._id, timestamp: new Date() });
|
||||
|
||||
await party.trimChat(1);
|
||||
|
||||
expect(Chat.find).to.be.calledOnce;
|
||||
expect(Chat.deleteMany).to.be.calledOnce;
|
||||
expect(await Chat.countDocuments({ groupId: party._id })).to.eql(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#startQuest', () => {
|
||||
context('Failure Conditions', () => {
|
||||
it('throws an error if group is not a party', async () => {
|
||||
|
||||
@@ -91,6 +91,23 @@ describe('POST /groups/:groupId/quests/accept', () => {
|
||||
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.false;
|
||||
});
|
||||
|
||||
it('heals stuck RSVPNeeded when group already has the user accepted', async () => {
|
||||
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||
|
||||
await partyMembers[0].updateOne({ 'party.quest.RSVPNeeded': true });
|
||||
await partyMembers[0].sync();
|
||||
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.true;
|
||||
|
||||
const res = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||
expect(res).to.exist;
|
||||
|
||||
await partyMembers[0].sync();
|
||||
await questingGroup.sync();
|
||||
expect(partyMembers[0].party.quest.RSVPNeeded).to.equal(false);
|
||||
expect(questingGroup.quest.members[partyMembers[0]._id]).to.equal(true);
|
||||
});
|
||||
|
||||
it('does not accept invite for a quest already underway', async () => {
|
||||
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||
|
||||
@@ -100,6 +100,23 @@ describe('POST /groups/:groupId/quests/reject', () => {
|
||||
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.false;
|
||||
});
|
||||
|
||||
it('heals stuck RSVPNeeded when group already has the user rejected', async () => {
|
||||
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`);
|
||||
|
||||
await partyMembers[0].updateOne({ 'party.quest.RSVPNeeded': true });
|
||||
await partyMembers[0].sync();
|
||||
expect(partyMembers[0].party.quest.RSVPNeeded).to.be.true;
|
||||
|
||||
const res = await partyMembers[0].post(`/groups/${questingGroup._id}/quests/reject`);
|
||||
expect(res).to.exist;
|
||||
|
||||
await partyMembers[0].sync();
|
||||
await questingGroup.sync();
|
||||
expect(partyMembers[0].party.quest.RSVPNeeded).to.equal(false);
|
||||
expect(questingGroup.quest.members[partyMembers[0]._id]).to.equal(false);
|
||||
});
|
||||
|
||||
it('return an error when a user rejects an invite already accepted', async () => {
|
||||
await leader.post(`/groups/${questingGroup._id}/quests/invite/${PET_QUEST}`);
|
||||
await partyMembers[0].post(`/groups/${questingGroup._id}/quests/accept`);
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Habitica - FAQ</title>
|
||||
<meta name="description" content="Frequently Asked Questions about Habitica, the gamified task manager.">
|
||||
<link href="https://fonts.googleapis.com/css?family=Roboto+Condensed:400,400i,700,700i|Roboto:400,400i,700,700i" rel="stylesheet">
|
||||
<link rel="shortcut icon" sizes="48x48" href="/static/icons/favicon.ico">
|
||||
<link rel="shortcut icon" sizes="192x192" href="/static/icons/favicon_192x192.png">
|
||||
<link rel="mask-icon" href="/static/icons/favicon.ico">
|
||||
<meta property="og:image" content="/static/emails/images/meta-image.png" />
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="text/javascript" src="//cloudfront.loggly.com/js/loggly.tracker-latest.min.js" async></script>
|
||||
<!-- Translations -->
|
||||
<script type='text/javascript' src='/api/v4/i18n/core' vite-ignore></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -695,6 +695,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_beach_with_volcano {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_beach_with_volcano.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_beehive {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_beehive.png');
|
||||
width: 141px;
|
||||
@@ -2346,6 +2351,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tropical_coral_garden {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_tropical_coral_garden.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_tulip_garden {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_tulip_garden.png');
|
||||
width: 141px;
|
||||
@@ -2401,6 +2411,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_vegetable_garden {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_vegetable_garden.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_viking_ship {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_viking_ship.png');
|
||||
width: 141px;
|
||||
@@ -29880,6 +29895,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_kendoBogu {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_kendoBogu.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;
|
||||
@@ -30535,6 +30555,11 @@
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_armoire_kendoMen {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_kendoMen.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_armoire_lamplightersTopHat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_lamplightersTopHat.png');
|
||||
width: 114px;
|
||||
@@ -30920,6 +30945,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_gardenHose {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_gardenHose.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_armoire_gardenersSpade {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_armoire_gardenersSpade.png');
|
||||
width: 114px;
|
||||
@@ -31550,6 +31580,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_kendoBogu {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_kendoBogu.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;
|
||||
@@ -31930,6 +31965,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_brightRainbowKite {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_brightRainbowKite.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_buoyantBubbles {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_buoyantBubbles.png');
|
||||
width: 114px;
|
||||
@@ -32030,6 +32070,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_gardenRake {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_gardenRake.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_gardenersWateringCan {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_gardenersWateringCan.png');
|
||||
width: 114px;
|
||||
@@ -32125,6 +32170,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_kendoShinai {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_kendoShinai.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_lamplighter {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_lamplighter.png');
|
||||
width: 114px;
|
||||
@@ -32210,6 +32260,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_pastelRainbowKite {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pastelRainbowKite.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_armoire_pinkKite {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_armoire_pinkKite.png');
|
||||
width: 114px;
|
||||
@@ -34200,6 +34255,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.eyewear_mystery_202606 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_mystery_202606.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.head_mystery_202512 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202512.png');
|
||||
width: 114px;
|
||||
@@ -34220,11 +34280,31 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_mystery_202606 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_mystery_202606.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.shield_mystery_202605 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202605.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_mystery_202606 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202606.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.shield_mystery_202607 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202607.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.shield_mystery_202608 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_mystery_202608.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.slim_armor_mystery_202512 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202512.png');
|
||||
width: 114px;
|
||||
@@ -34250,6 +34330,16 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_mystery_202607 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202607.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.weapon_mystery_202608 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_mystery_202608.png');
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.back_mystery_201402 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/back_mystery_201402.png');
|
||||
width: 90px;
|
||||
@@ -37715,6 +37805,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_summer2026Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_summer2026Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Mage.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.broad_armor_special_summer2026Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Rogue.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.broad_armor_special_summer2026Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summer2026Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_special_summerHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_special_summerHealer.png');
|
||||
width: 90px;
|
||||
@@ -37965,6 +38075,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_summer2026Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_summer2026Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Mage.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.head_special_summer2026Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Rogue.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.head_special_summer2026Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summer2026Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_special_summerHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_special_summerHealer.png');
|
||||
width: 90px;
|
||||
@@ -38155,6 +38285,21 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_summer2026Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2026Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_summer2026Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2026Rogue.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.shield_special_summer2026Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summer2026Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shield_special_summerHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shield_special_summerHealer.png');
|
||||
width: 90px;
|
||||
@@ -38395,6 +38540,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_summer2026Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_summer2026Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Mage.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.slim_armor_special_summer2026Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Rogue.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.slim_armor_special_summer2026Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summer2026Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_special_summerHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_special_summerHealer.png');
|
||||
width: 90px;
|
||||
@@ -38635,6 +38800,26 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_summer2026Healer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Healer.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_summer2026Mage {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Mage.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.weapon_special_summer2026Rogue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Rogue.png');
|
||||
width: 114px;
|
||||
height: 117px;
|
||||
}
|
||||
.weapon_special_summer2026Warrior {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summer2026Warrior.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.weapon_special_summerHealer {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_summerHealer.png');
|
||||
width: 90px;
|
||||
|
||||
@@ -42,6 +42,7 @@ ul {
|
||||
font-weight: 400;
|
||||
line-height: 1.75;
|
||||
color: $purple-200;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
h4 {
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
{{ $t('tavernDiscontinued') }}
|
||||
</h1>
|
||||
<p>{{ $t('tavernDiscontinuedDetail') }}</p>
|
||||
<p v-html="$t('tavernDiscontinuedLinks')"></p>
|
||||
<p v-html="$t('tavernDiscontinuedLinks', tavernLinks)"></p>
|
||||
</div>
|
||||
<div v-else>
|
||||
<h1>
|
||||
@@ -38,6 +38,15 @@
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
tavernLinks: {
|
||||
faqLink: '<a href="/static/faq/tavern-and-guilds">',
|
||||
homeLink: '<a href="/">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState(['isUserLoggedIn']),
|
||||
retiredChatPage () {
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
<div
|
||||
v-once
|
||||
class="opt-out-description"
|
||||
v-html="$t('optOutOfClassesText')"
|
||||
v-html="$t('optOutOfClassesText', optOutLinks)"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -214,6 +214,10 @@ export default {
|
||||
wizard: wizardIcon,
|
||||
}),
|
||||
selectedClass: 'warrior',
|
||||
optOutLinks: {
|
||||
linkOpen: '<a href="/static/faq#what-classes" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
<br>
|
||||
<a
|
||||
:href="$t('conRewardsURL')"
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
>{{ $t('contribLink') }}</a>
|
||||
<br>
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
</button>
|
||||
<h4
|
||||
class="text-center"
|
||||
v-html="$t('dyingOftenTips')"
|
||||
v-html="$t('dyingOftenTips', tipLinks)"
|
||||
></h4>
|
||||
</div>
|
||||
</div>
|
||||
@@ -86,6 +86,10 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
maxHealth,
|
||||
tipLinks: {
|
||||
linkOpen: '<a href="/static/faq#prevent-damage" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
&& user.achievements.ultimateGearSets.rogue
|
||||
&& user.achievements.ultimateGearSets.warrior"
|
||||
>
|
||||
<p v-html="$t('moreGearAchievements')"></p>
|
||||
<p v-html="$t('moreGearAchievements', gearAchievementLinks)"></p>
|
||||
<br>
|
||||
</div>
|
||||
<Sprite image-name="shop_armoire" />
|
||||
@@ -95,6 +95,14 @@ export default {
|
||||
achievementAvatar,
|
||||
Sprite,
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
gearAchievementLinks: {
|
||||
linkOpen: '<a href="/user/settings/site" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data' }),
|
||||
},
|
||||
|
||||
@@ -491,6 +491,7 @@
|
||||
v-if="hero.purchased.plan.paymentMethod === 'Google'"
|
||||
class="btn btn-primary btn-sm"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
:href="playOrdersUrl"
|
||||
>
|
||||
Play Console
|
||||
@@ -499,6 +500,7 @@
|
||||
v-else-if="hero.purchased.plan.paymentMethod === 'Paypal'"
|
||||
class="btn btn-primary btn-sm"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
:href="'https://www.paypal.com/billing/subscriptions/' + paymentDetails.customerId"
|
||||
>
|
||||
PayPal Dashboard
|
||||
@@ -507,6 +509,7 @@
|
||||
v-else-if="hero.purchased.plan.paymentMethod === 'Stripe'"
|
||||
class="btn btn-primary btn-sm"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
:href="'https://dashboard.stripe.com/customers/' + paymentDetails.customerId"
|
||||
>
|
||||
Stripe Dashboard
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<li>
|
||||
<a
|
||||
href="https://itunes.apple.com/us/app/habitica/id994882113?ls=1&mt=8"
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
>{{ $t('mobileIOS') }}
|
||||
</a>
|
||||
@@ -18,6 +19,7 @@
|
||||
<li>
|
||||
<a
|
||||
href="https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica"
|
||||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
>{{ $t('mobileAndroid') }}
|
||||
</a>
|
||||
@@ -52,6 +54,7 @@
|
||||
<a
|
||||
href="https://habitica.wordpress.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('companyBlog') }}
|
||||
</a>
|
||||
</li>
|
||||
@@ -71,6 +74,7 @@
|
||||
<li>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/static/community-guidelines"
|
||||
>{{ $t('communityGuidelines') }}
|
||||
</a>
|
||||
@@ -84,6 +88,7 @@
|
||||
<a
|
||||
href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('companyContribute') }}
|
||||
</a>
|
||||
</li>
|
||||
@@ -91,6 +96,7 @@
|
||||
<a
|
||||
href="https://translate.habitica.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('translateHabitica') }}
|
||||
</a>
|
||||
</li>
|
||||
@@ -111,6 +117,7 @@
|
||||
<a
|
||||
href=""
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
@@ -122,6 +129,7 @@
|
||||
<a
|
||||
href="mailto:admin@habitica.com?subject=Habitica Web Bug Report"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
@@ -130,6 +138,7 @@
|
||||
<a
|
||||
href="https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('requestFeature') }}
|
||||
</a>
|
||||
</li>
|
||||
@@ -143,6 +152,7 @@
|
||||
<a
|
||||
href="/apidoc"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('APIv3') }}
|
||||
</a>
|
||||
</li>
|
||||
@@ -150,6 +160,7 @@
|
||||
<a
|
||||
:href="getDataDisplayToolUrl"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('dataDisplayTool') }}
|
||||
</a>
|
||||
</li>
|
||||
@@ -157,6 +168,7 @@
|
||||
<a
|
||||
href="https://habitica.fandom.com/wiki/Guidance_for_Blacksmiths"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('guidanceForBlacksmiths') }}
|
||||
</a>
|
||||
</li>
|
||||
@@ -172,6 +184,7 @@
|
||||
class="social-circle mr-2"
|
||||
href="https://www.instagram.com/habitica/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<div
|
||||
class="social-icon svg-icon"
|
||||
@@ -181,6 +194,7 @@
|
||||
<a
|
||||
href="https://www.instagram.com/habitica/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ $t('communityInstagram') }}
|
||||
</a>
|
||||
@@ -190,6 +204,7 @@
|
||||
class="social-circle mr-2"
|
||||
href="https://bsky.app/profile/habitica.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<div
|
||||
class="social-icon svg-icon"
|
||||
@@ -199,6 +214,7 @@
|
||||
<a
|
||||
href="https://bsky.app/profile/habitica.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Bluesky
|
||||
</a>
|
||||
@@ -208,6 +224,7 @@
|
||||
class="social-circle mr-2"
|
||||
href="https://www.facebook.com/Habitica/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<div
|
||||
class="social-icon svg-icon"
|
||||
@@ -217,6 +234,7 @@
|
||||
<a
|
||||
href="https://www.facebook.com/Habitica/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ $t('communityFacebook') }}
|
||||
</a>
|
||||
@@ -226,6 +244,7 @@
|
||||
class="social-circle mr-2"
|
||||
href="http://blog.habitrpg.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<div
|
||||
class="social-icon svg-icon"
|
||||
@@ -235,6 +254,7 @@
|
||||
<a
|
||||
href="http://blog.habitrpg.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ $t('tumblr') }}
|
||||
</a>
|
||||
@@ -266,12 +286,14 @@
|
||||
<span class="privacy-policy">
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/static/privacy"
|
||||
>{{ $t('privacy') }}</a>
|
||||
</span>
|
||||
<span class="terms">
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/static/terms"
|
||||
>{{ $t('terms') }}</a>
|
||||
</span>
|
||||
@@ -287,12 +309,14 @@
|
||||
<div class="privacy-policy mx-auto mb-2">
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/static/privacy"
|
||||
>{{ $t('privacy') }}</a>
|
||||
</div>
|
||||
<div class="mobile-terms mx-auto mb-2">
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="/static/terms"
|
||||
>{{ $t('terms') }}</a>
|
||||
</div>
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
v-once
|
||||
class="custom-control-label purple-600"
|
||||
for="privacyTOS"
|
||||
v-html="$t('acceptPrivacyTOS')"
|
||||
v-html="$t('acceptPrivacyTOS', acceptLinks)"
|
||||
></label>
|
||||
</div>
|
||||
<button
|
||||
@@ -187,6 +187,11 @@ export default {
|
||||
privacyAccepted: false,
|
||||
usernameIssues: [],
|
||||
needsEmailField: false,
|
||||
acceptLinks: {
|
||||
termsLink: '<a href="/static/terms" target="_blank" rel="noreferrer noopener">',
|
||||
privacyLink: '<a href="/static/privacy" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
<p
|
||||
v-once
|
||||
class="w-50 mx-auto"
|
||||
v-html="$t('visitCustomizationsShop')"
|
||||
v-html="$t('visitCustomizationsShop', customizeLinks)"
|
||||
></p>
|
||||
</div>
|
||||
<customize-banner
|
||||
@@ -104,6 +104,10 @@ export default {
|
||||
headAccessory: ['bearEars', 'cactusEars', 'foxEars', 'lionEars', 'pandaEars', 'pigEars', 'tigerEars', 'wolfEars'],
|
||||
},
|
||||
chairKeys: ['none', 'black', 'blue', 'green', 'pink', 'red', 'yellow', 'handleless_black', 'handleless_blue', 'handleless_green', 'handleless_pink', 'handleless_red', 'handleless_yellow'],
|
||||
customizeLinks: {
|
||||
linkOpen: '<a href="/shops/customizations">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
<p
|
||||
v-once
|
||||
class="w-50 mx-auto"
|
||||
v-html="$t('visitCustomizationsShop')"
|
||||
v-html="$t('visitCustomizationsShop', customizeLinks)"
|
||||
></p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -95,6 +95,14 @@ export default {
|
||||
props: [
|
||||
'editing',
|
||||
],
|
||||
data () {
|
||||
return {
|
||||
customizeLinks: {
|
||||
linkOpen: '<a href="/shops/customizations">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
hairSubMenuItems () {
|
||||
const items = [
|
||||
|
||||
@@ -217,8 +217,8 @@ export default {
|
||||
mixins: [notifications, userStateMixin],
|
||||
data () {
|
||||
const abuseFlagModalBody = {
|
||||
firstLinkStart: '<a href="/static/community-guidelines" target="_blank">',
|
||||
secondLinkStart: '<a href="/static/terms" target="_blank">',
|
||||
firstLinkStart: '<a href="/static/community-guidelines" target="_blank" rel="noopener noreferrer">',
|
||||
secondLinkStart: '<a href="/static/terms" target="_blank" rel="noopener noreferrer">',
|
||||
linkEnd: '</a>',
|
||||
};
|
||||
|
||||
|
||||
@@ -208,8 +208,8 @@ export default {
|
||||
mixins: [notifications, userStateMixin],
|
||||
data () {
|
||||
const abuseFlagModalBody = {
|
||||
firstLinkStart: '<a href="/static/community-guidelines" target="_blank">',
|
||||
secondLinkStart: '<a href="/static/terms" target="_blank">',
|
||||
firstLinkStart: '<a href="/static/community-guidelines" target="_blank" rel="noopener noreferrer">',
|
||||
secondLinkStart: '<a href="/static/terms" target="_blank" rel="noopener noreferrer">',
|
||||
linkEnd: '</a>',
|
||||
};
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
</ul>
|
||||
<div
|
||||
class="mx-auto"
|
||||
v-html="$t('newGroupsVisitFAQ')"
|
||||
v-html="$t('newGroupsVisitFAQ', faqLinks)"
|
||||
></div>
|
||||
<div
|
||||
class="mx-auto"
|
||||
@@ -193,6 +193,10 @@ export default {
|
||||
close: closeIcon,
|
||||
sparkles,
|
||||
}),
|
||||
faqLinks: {
|
||||
linkOpen: '<a href="/static/faq#group-plans" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<div
|
||||
v-once
|
||||
class="col col-sm-12 col-xl-8"
|
||||
v-html="$t('communityGuidelinesIntro')"
|
||||
v-html="$t('communityGuidelinesIntro', guidelineLinks)"
|
||||
></div>
|
||||
<div class="col-md-auto col-md-12 col-xl-4">
|
||||
<button
|
||||
@@ -60,6 +60,14 @@
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
guidelineLinks: {
|
||||
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data' }),
|
||||
communityGuidelinesAccepted () {
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
class="no-quest-to-start"
|
||||
>
|
||||
<b>{{ $t('noQuestToStartTitle') }}</b> <br>
|
||||
<span v-html="$t('noQuestToStart', { questShop: '/shops/quests' })"></span>
|
||||
<span v-html="$t('noQuestToStart', questLinks)"></span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -369,6 +369,10 @@ export default {
|
||||
shareUserIdShown: false,
|
||||
quests,
|
||||
sortBy: 'AZ',
|
||||
questLinks: {
|
||||
linkOpen: '<a href="/shops/quests">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -1,889 +0,0 @@
|
||||
<template>
|
||||
<div class="row">
|
||||
<world-boss-info-modal />
|
||||
<world-boss-rage-modal />
|
||||
<div class="col-12 col-sm-8 clearfix standard-page">
|
||||
<div class="row">
|
||||
<div class="col-6 title-details">
|
||||
<h1 v-once>
|
||||
{{ $t('welcomeToTavern') }}
|
||||
</h1>
|
||||
</div>
|
||||
</div>
|
||||
<chat
|
||||
:label="$t('tavernChat')"
|
||||
:group="group"
|
||||
:placeholder="$t('tavernCommunityGuidelinesPlaceholder')"
|
||||
@fetchRecentMessages="fetchRecentMessages()"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-12 col-sm-4 sidebar">
|
||||
<div class="section">
|
||||
<div
|
||||
class="grassy-meadow-backdrop"
|
||||
:style="{'background-image': imageURLs.background}"
|
||||
>
|
||||
<div
|
||||
class="daniel_front"
|
||||
:style="{'background-image': imageURLs.npc}"
|
||||
></div>
|
||||
</div>
|
||||
<div class="boss-section">
|
||||
<div
|
||||
v-if="group && group.quest && group.quest.active"
|
||||
class="world-boss"
|
||||
:style="{
|
||||
background: questData.colors.dark,
|
||||
'border-color': questData.colors.extralight,
|
||||
'outline-color': questData.colors.light}"
|
||||
>
|
||||
<div
|
||||
class="corner-decoration"
|
||||
:style="{top: '-2px', right: '-2px'}"
|
||||
></div>
|
||||
<div
|
||||
class="corner-decoration"
|
||||
:style="{top: '-2px', left: '-2px'}"
|
||||
></div>
|
||||
<div
|
||||
class="corner-decoration"
|
||||
:style="{bottom: '-2px', right: '-2px'}"
|
||||
></div>
|
||||
<div
|
||||
class="corner-decoration"
|
||||
:style="{bottom: '-2px', left: '-2px'}"
|
||||
></div>
|
||||
<div class="text-center float-bar d-flex align-items-center">
|
||||
<span class="diamond"></span>
|
||||
<span
|
||||
class="strong reduce"
|
||||
:style="{background: questData.colors.dark}"
|
||||
>{{ $t('worldBossEvent') }}</span>
|
||||
<span class="diamond"></span>
|
||||
</div>
|
||||
<div class="boss-gradient pb-3 pt-3">
|
||||
<p
|
||||
class="text-center reduce"
|
||||
:style="{color: questData.colors.extralight}"
|
||||
>
|
||||
{{ $t(`${questData.key}ArtCredit`) }}
|
||||
</p>
|
||||
<div
|
||||
class="quest-boss"
|
||||
:class="'background_' + questData.key"
|
||||
>
|
||||
<div
|
||||
class="quest-boss"
|
||||
:class="'quest_' + questData.key"
|
||||
></div>
|
||||
<div
|
||||
class="quest-boss"
|
||||
:class="'phobia_' + questData.key"
|
||||
:style="{display: 'none'}"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="p-3">
|
||||
<div class="row d-flex align-items-center mb-2">
|
||||
<div class="col-sm-6">
|
||||
<strong class="float-left">{{ questData.boss.name() }}</strong>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
<span class="d-flex float-right">
|
||||
<div
|
||||
class="svg-icon boss-icon"
|
||||
v-html="icons.swordIcon"
|
||||
></div>
|
||||
<span
|
||||
class="ml-1 reduce"
|
||||
:style="{color: questData.colors.extralight}"
|
||||
>{{ $t('pendingDamage', {damage: pendingDamage()}) }}</span>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grey-progress-bar mb-1">
|
||||
<div
|
||||
class="boss-health-bar"
|
||||
:style="{width: (group.quest.progress.hp / questData.boss.hp) * 100 + '%'}"
|
||||
></div>
|
||||
</div>
|
||||
<span class="d-flex align-items-center">
|
||||
<div
|
||||
class="svg-icon boss-icon"
|
||||
v-html="icons.healthIcon"
|
||||
></div>
|
||||
<span
|
||||
class="reduce ml-1 pt-1"
|
||||
>{{ $t('bossHealth', {
|
||||
currentHealth: bossCurrentHealth(),
|
||||
maxHealth: questData.boss.hp.toLocaleString()}) }}</span>
|
||||
</span>
|
||||
<div class="mt-3 mb-2">
|
||||
<strong class="mr-1">{{ $t('rageAttack') }}</strong>
|
||||
<span>{{ questData.boss.rage.title() }}</span>
|
||||
</div>
|
||||
<div class="grey-progress-bar mb-1">
|
||||
<div
|
||||
class="boss-health-bar rage-bar"
|
||||
:style="{
|
||||
width: (group.quest.progress.rage / questData.boss.rage.value) * 100 + '%'}"
|
||||
></div>
|
||||
</div>
|
||||
<span class="d-flex align-items-center">
|
||||
<div
|
||||
class="svg-icon boss-icon"
|
||||
v-html="icons.rageIcon"
|
||||
></div>
|
||||
<span
|
||||
class="reduce ml-1 pt-1"
|
||||
>{{ $t('bossRage', {
|
||||
currentRage: bossCurrentRage(),
|
||||
maxRage: questData.boss.rage.value.toLocaleString()}) }}</span>
|
||||
</span>
|
||||
<div class="row d-flex align-items-center mb-2 mt-2">
|
||||
<div class="col-sm-4 d-flex">
|
||||
<strong class="mr-2">{{ $t('rageStrikes') }}</strong>
|
||||
<div
|
||||
v-b-tooltip.hover.top="questData.boss.rage.description()"
|
||||
class="svg-icon boss-icon information-icon m-auto"
|
||||
v-html="icons.informationIcon"
|
||||
></div>
|
||||
</div>
|
||||
<div class="col-sm-8 d-flex align-items-center justify-content-center">
|
||||
<div
|
||||
class="m-auto"
|
||||
@click="showWorldBossRage('seasonalShop')"
|
||||
>
|
||||
<img
|
||||
v-if="!group.quest.extra.worldDmg.seasonalShop"
|
||||
class="rage-strike"
|
||||
src="@/assets/images/world-boss/rage_strike@2x.png"
|
||||
>
|
||||
<img
|
||||
v-if="group.quest.extra.worldDmg.seasonalShop"
|
||||
class="rage-strike-active"
|
||||
src="@/assets/images/world-boss/rage_strike-seasonalShop@2x.png"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
class="m-auto"
|
||||
@click="showWorldBossRage('market')"
|
||||
>
|
||||
<img
|
||||
v-if="!group.quest.extra.worldDmg.market"
|
||||
class="rage-strike"
|
||||
src="@/assets/images/world-boss/rage_strike@2x.png"
|
||||
>
|
||||
<img
|
||||
v-if="group.quest.extra.worldDmg.market"
|
||||
class="rage-strike-active"
|
||||
src="@/assets/images/world-boss/rage_strike-market@2x.png"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
class="m-auto"
|
||||
@click="showWorldBossRage('quests')"
|
||||
>
|
||||
<img
|
||||
v-if="!group.quest.extra.worldDmg.quests"
|
||||
class="rage-strike"
|
||||
src="@/assets/images/world-boss/rage_strike@2x.png"
|
||||
>
|
||||
<img
|
||||
v-if="group.quest.extra.worldDmg.quests"
|
||||
class="rage-strike-active"
|
||||
src="@/assets/images/world-boss/rage_strike-quests@2x.png"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="boss-description p-3"
|
||||
:style="{'border-color': questData.colors.extralight}"
|
||||
@click="sections.worldBoss = !sections.worldBoss"
|
||||
>
|
||||
<strong class="float-left">{{ $t('worldBossDescription') }}</strong>
|
||||
<div class="float-right">
|
||||
<div
|
||||
v-if="!sections.worldBoss"
|
||||
class="toggle-down"
|
||||
>
|
||||
<div
|
||||
class="svg-icon boss-icon"
|
||||
v-html="icons.chevronIcon"
|
||||
></div>
|
||||
</div>
|
||||
<div
|
||||
v-if="sections.worldBoss"
|
||||
class="toggle-up"
|
||||
>
|
||||
<div
|
||||
class="svg-icon boss-icon reverse"
|
||||
v-html="icons.chevronIcon"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
v-if="sections.worldBoss"
|
||||
class="mt-3"
|
||||
v-html="questData.notes()"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- .text-center.mt-4.world-boss
|
||||
-info-button(@click="showWorldBossInfo()") {{$t('whatIsWorldBoss') }}
|
||||
-->
|
||||
</div>
|
||||
<div class="sleep px-4 py-3">
|
||||
<strong v-once>{{ $t('sleepDescription') }}</strong>
|
||||
<ul>
|
||||
<li v-once>
|
||||
{{ $t('sleepBullet1') }}
|
||||
</li>
|
||||
<li v-once>
|
||||
{{ $t('sleepBullet2') }}
|
||||
</li>
|
||||
<li v-once>
|
||||
{{ $t('sleepBullet3') }}
|
||||
</li>
|
||||
</ul>
|
||||
<button
|
||||
v-if="!user.preferences.sleep"
|
||||
v-once
|
||||
class="btn btn-secondary pause-button"
|
||||
@click="toggleSleep()"
|
||||
>
|
||||
{{ $t('pauseDailies') }}
|
||||
</button>
|
||||
<button
|
||||
v-if="user.preferences.sleep"
|
||||
v-once
|
||||
class="btn btn-secondary pause-button"
|
||||
@click="toggleSleep()"
|
||||
>
|
||||
{{ $t('unpauseDailies') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-4">
|
||||
<sidebar-section :title="$t('staff')">
|
||||
<div class="row">
|
||||
<div
|
||||
v-for="user in staff"
|
||||
:key="user.uuid"
|
||||
class="col-6 staff"
|
||||
:class="{
|
||||
staff: user.type === 'Staff',
|
||||
moderator: user.type === 'Moderator'}"
|
||||
>
|
||||
<div>
|
||||
<router-link
|
||||
class="title"
|
||||
:to="{'name': 'userProfile', 'params': {'userId': user.uuid}}"
|
||||
>
|
||||
{{ user.name }}
|
||||
</router-link>
|
||||
<div
|
||||
v-if="user.type === 'Staff'"
|
||||
class="svg-icon staff-icon"
|
||||
v-html="icons.tierStaff"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</sidebar-section>
|
||||
<sidebar-section :title="$t('helpfulLinks')">
|
||||
<ul>
|
||||
<li>
|
||||
<a href="mailto:admin@habitica.com">
|
||||
{{ $t('reportCommunityIssues') }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<router-link
|
||||
v-once
|
||||
to="/static/community-guidelines"
|
||||
>
|
||||
{{ $t('communityGuidelines') }}
|
||||
</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link
|
||||
to="/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601"
|
||||
>
|
||||
{{ $t('lookingForGroup') }}
|
||||
</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<router-link
|
||||
v-once
|
||||
to="/static/faq"
|
||||
>
|
||||
{{ $t('faq') }}
|
||||
</router-link>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href
|
||||
:style="glossary-link"
|
||||
v-html="$t('glossary')"
|
||||
></a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
v-once
|
||||
href="https://habitica.fandom.com/wiki/Habitica_Wiki"
|
||||
target="_blank"
|
||||
>{{ $t('wiki') }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
v-once
|
||||
href="https://tools.habitica.com/"
|
||||
target="_blank"
|
||||
>{{ $t('dataDisplayTool') }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
href=""
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
v-once
|
||||
href="https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link"
|
||||
target="_blank"
|
||||
>{{ $t('requestFeature') }}</a>
|
||||
</li>
|
||||
<li>
|
||||
<router-link
|
||||
to="/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a"
|
||||
>
|
||||
{{ $t('askQuestionGuild') }}
|
||||
</router-link>
|
||||
</li>
|
||||
</ul>
|
||||
</sidebar-section>
|
||||
<sidebar-section :title="$t('playerTiers')">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<p v-once>
|
||||
{{ $t('playerTiersDesc') }}
|
||||
</p>
|
||||
<ul class="tier-list">
|
||||
<li
|
||||
v-once
|
||||
class="tier1"
|
||||
>
|
||||
{{ $t('tier1') }}
|
||||
<div
|
||||
class="svg-icon tier1-icon"
|
||||
v-html="icons.tier1"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="tier2"
|
||||
>
|
||||
{{ $t('tier2') }}
|
||||
<div
|
||||
class="svg-icon tier2-icon"
|
||||
v-html="icons.tier2"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="tier3"
|
||||
>
|
||||
{{ $t('tier3') }}
|
||||
<div
|
||||
class="svg-icon tier3-icon"
|
||||
v-html="icons.tier3"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="tier4"
|
||||
>
|
||||
{{ $t('tier4') }}
|
||||
<div
|
||||
class="svg-icon tier4-icon"
|
||||
v-html="icons.tier4"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="tier5"
|
||||
>
|
||||
{{ $t('tier5') }}
|
||||
<div
|
||||
class="svg-icon tier5-icon"
|
||||
v-html="icons.tier5"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="tier6"
|
||||
>
|
||||
{{ $t('tier6') }}
|
||||
<div
|
||||
class="svg-icon tier6-icon"
|
||||
v-html="icons.tier6"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="tier7"
|
||||
>
|
||||
{{ $t('tier7') }}
|
||||
<div
|
||||
class="svg-icon tier7-icon"
|
||||
v-html="icons.tier7"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="moderator"
|
||||
>
|
||||
{{ $t('tierModerator') }}
|
||||
<div
|
||||
class="svg-icon mod-icon"
|
||||
v-html="icons.tierMod"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="staff"
|
||||
>
|
||||
{{ $t('tierStaff') }}
|
||||
<div
|
||||
class="svg-icon staff-icon"
|
||||
v-html="icons.tierStaff"
|
||||
></div>
|
||||
</li>
|
||||
<li
|
||||
v-once
|
||||
class="npc"
|
||||
>
|
||||
{{ $t('tierNPC') }}
|
||||
<div
|
||||
class="svg-icon npc-icon"
|
||||
v-html="icons.tierNPC"
|
||||
></div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</sidebar-section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<style lang='scss' scoped>
|
||||
@import '@/assets/scss/colors.scss';
|
||||
|
||||
h1 {
|
||||
color: $purple-200;
|
||||
}
|
||||
|
||||
.sidebar {
|
||||
background-color: $gray-600;
|
||||
padding: 0em;
|
||||
}
|
||||
|
||||
.pause-button {
|
||||
background-color: #ffb445 !important;
|
||||
color: $white;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.grassy-meadow-backdrop {
|
||||
background-repeat: repeat-x;
|
||||
width: 100%;
|
||||
height: 246px;
|
||||
}
|
||||
|
||||
.daniel_front {
|
||||
height: 246px;
|
||||
width: 471px;
|
||||
background-repeat: no-repeat;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.svg-icon {
|
||||
width: 10px;
|
||||
display: inline-block;
|
||||
margin-left: .5em;
|
||||
}
|
||||
|
||||
.tier1-icon, .tier2-icon {
|
||||
width: 11px;
|
||||
}
|
||||
|
||||
.tier5-icon, .tier6-icon {
|
||||
width: 8px;
|
||||
}
|
||||
|
||||
.tier7-icon {
|
||||
width: 12px;
|
||||
}
|
||||
|
||||
.mod-icon {
|
||||
width: 13px;
|
||||
}
|
||||
|
||||
.npc-icon {
|
||||
width: 8px;
|
||||
}
|
||||
|
||||
.boss-icon {
|
||||
width: 16px;
|
||||
margin-top: .1em;
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.boss-icon-large {
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
.staff {
|
||||
margin-bottom: 1em;
|
||||
|
||||
.staff-icon {
|
||||
width: 11px;
|
||||
}
|
||||
|
||||
.title {
|
||||
color: #6133b4;
|
||||
font-weight: bold;
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
|
||||
.tier-list {
|
||||
list-style-type: none;
|
||||
padding: 0;
|
||||
width: 98%;
|
||||
|
||||
li {
|
||||
border-radius: 2px;
|
||||
background-color: #edecee;
|
||||
border: solid 1px #c3c0c7;
|
||||
text-align: center;
|
||||
padding: 1em;
|
||||
margin-bottom: 1em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.tier1 {
|
||||
color: #c42870;
|
||||
}
|
||||
|
||||
.tier2 {
|
||||
color: #b01515;
|
||||
}
|
||||
|
||||
.tier3 {
|
||||
color: #d70e14;
|
||||
}
|
||||
|
||||
.tier4 {
|
||||
color: #c24d00;
|
||||
}
|
||||
|
||||
.tier5 {
|
||||
color: #9e650f;
|
||||
}
|
||||
|
||||
.tier6 {
|
||||
color: #2b8363;
|
||||
}
|
||||
|
||||
.tier7 {
|
||||
color: #167e87;
|
||||
}
|
||||
|
||||
.tier8, .moderator {
|
||||
color: #277eab;
|
||||
}
|
||||
|
||||
.tier9, .staff {
|
||||
color: #6133b4;
|
||||
}
|
||||
|
||||
.npc {
|
||||
color: $black;
|
||||
}
|
||||
}
|
||||
|
||||
.staff .title {
|
||||
color: #6133b4;
|
||||
}
|
||||
|
||||
.moderator .title {
|
||||
color: #277eab;
|
||||
}
|
||||
|
||||
.bailey .title {
|
||||
color: $black;
|
||||
}
|
||||
|
||||
.boss-section {
|
||||
padding: 1.75em;
|
||||
}
|
||||
|
||||
.world-boss {
|
||||
color: $white;
|
||||
border-style: solid;
|
||||
border-width: 2px;
|
||||
outline-style: solid;
|
||||
outline-width: 2px;
|
||||
margin: 2px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.quest-boss {
|
||||
margin: 1em auto;
|
||||
}
|
||||
|
||||
.grey-progress-bar {
|
||||
width: 100%;
|
||||
height: 15px;
|
||||
background-color: rgba(255, 255, 255, 0.24);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.boss-health-bar {
|
||||
width: 80%;
|
||||
height: 15px;
|
||||
margin-bottom: .5em;
|
||||
border-top-left-radius: 2px;
|
||||
border-bottom-left-radius: 2px;
|
||||
background-color: #f74e52;
|
||||
}
|
||||
|
||||
.boss-health-bar.rage-bar {
|
||||
background-color: #ff944c;
|
||||
}
|
||||
|
||||
.boss-gradient {
|
||||
background-image: linear-gradient(to bottom, #401f2a, #931f4d);
|
||||
margin-top: -1.4em;
|
||||
}
|
||||
|
||||
.boss-description {
|
||||
border-top: 1px solid;
|
||||
margin-left: -16px;
|
||||
margin-right: -16px;
|
||||
padding: .25em 0 0 .25em;
|
||||
}
|
||||
|
||||
.float-bar {
|
||||
position: relative;
|
||||
top: -16px;
|
||||
width: 162px;
|
||||
height: 28px;
|
||||
border-radius: 2px;
|
||||
background-color: inherit;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.corner-decoration {
|
||||
position: absolute;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
background-color: inherit;
|
||||
border: inherit;
|
||||
outline: inherit;
|
||||
}
|
||||
|
||||
.reverse {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.diamond {
|
||||
margin: auto;
|
||||
display: inline-block;
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
-webkit-transform: rotate(-45deg);
|
||||
transform: rotate(-45deg);
|
||||
background-color: #dc4069;
|
||||
border: solid 2px #931f4d;
|
||||
}
|
||||
|
||||
.reduce {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.rage-strike {
|
||||
max-width: 50px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.rage-strike-active {
|
||||
max-width: 75px;
|
||||
height: auto;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.world-boss-info-button {
|
||||
width: 100%;
|
||||
background-color: $gray-500;
|
||||
border-radius: 2px;
|
||||
font-size: 14px;
|
||||
color: $blue-10;
|
||||
padding: 1em;
|
||||
cursor: pointer;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import find from 'lodash/find';
|
||||
import { TAVERN_ID } from '@/../../common/script/constants';
|
||||
import * as quests from '@/../../common/script/content/quests';
|
||||
import { mapState } from '@/libs/store';
|
||||
import { goToModForm } from '@/libs/modform';
|
||||
|
||||
import worldBossInfoModal from '../world-boss/worldBossInfoModal';
|
||||
import worldBossRageModal from '../world-boss/worldBossRageModal';
|
||||
import sidebarSection from '../sidebarSection';
|
||||
import chat from './chat';
|
||||
|
||||
import challengeIcon from '@/assets/svg/challenge.svg?raw';
|
||||
import chevronIcon from '@/assets/svg/chevron-red.svg?raw';
|
||||
import gemIcon from '@/assets/svg/gem.svg?raw';
|
||||
import healthIcon from '@/assets/svg/health.svg?raw';
|
||||
import informationIconRed from '@/assets/svg/information-red.svg?raw';
|
||||
import questBackground from '@/assets/svg/quest-background-border.svg?raw';
|
||||
import rageIcon from '@/assets/svg/rage.svg?raw';
|
||||
import swordIcon from '@/assets/svg/sword.svg?raw';
|
||||
|
||||
import tier1 from '@/assets/svg/tier-1.svg?raw';
|
||||
import tier2 from '@/assets/svg/tier-2.svg?raw';
|
||||
import tier3 from '@/assets/svg/tier-3.svg?raw';
|
||||
import tier4 from '@/assets/svg/tier-4.svg?raw';
|
||||
import tier5 from '@/assets/svg/tier-5.svg?raw';
|
||||
import tier6 from '@/assets/svg/tier-6.svg?raw';
|
||||
import tier7 from '@/assets/svg/tier-7.svg?raw';
|
||||
import tierMod from '@/assets/svg/tier-mod.svg?raw';
|
||||
import tierNPC from '@/assets/svg/tier-npc.svg?raw';
|
||||
import tierStaff from '@/assets/svg/tier-staff.svg?raw';
|
||||
|
||||
import staffList from '../../libs/staffList';
|
||||
import reportBug from '@/mixins/reportBug.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
worldBossInfoModal,
|
||||
worldBossRageModal,
|
||||
sidebarSection,
|
||||
chat,
|
||||
},
|
||||
mixins: [reportBug],
|
||||
data () {
|
||||
return {
|
||||
groupId: TAVERN_ID,
|
||||
icons: Object.freeze({
|
||||
challengeIcon,
|
||||
chevronIcon,
|
||||
gem: gemIcon,
|
||||
healthIcon,
|
||||
informationIcon: informationIconRed,
|
||||
questBackground,
|
||||
rageIcon,
|
||||
swordIcon,
|
||||
tier1,
|
||||
tier2,
|
||||
tier3,
|
||||
tier4,
|
||||
tier5,
|
||||
tier6,
|
||||
tier7,
|
||||
tierMod,
|
||||
tierNPC,
|
||||
tierStaff,
|
||||
}),
|
||||
group: {
|
||||
chat: [],
|
||||
},
|
||||
sections: {
|
||||
worldBoss: true,
|
||||
},
|
||||
staff: staffList,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
user: 'user.data',
|
||||
currentEventList: 'worldState.data.currentEventList',
|
||||
}),
|
||||
questData () {
|
||||
if (!this.group.quest) return {};
|
||||
return quests.quests[this.group.quest.key];
|
||||
},
|
||||
imageURLs () {
|
||||
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
|
||||
if (!currentEvent) {
|
||||
return {
|
||||
background: 'url(/static/npc/normal/tavern_background.png)',
|
||||
npc: 'url(/static/npc/normal/tavern_npc.png)',
|
||||
};
|
||||
}
|
||||
return {
|
||||
background: `url(/static/npc/${currentEvent.season}/tavern_background.png)`,
|
||||
npc: `url(/static/npc/${currentEvent.season}/tavern_npc.png)`,
|
||||
};
|
||||
},
|
||||
},
|
||||
async mounted () {
|
||||
this.$store.dispatch('common:setTitle', {
|
||||
subSection: this.$t('tavern'),
|
||||
section: this.$t('guilds'),
|
||||
});
|
||||
this.group = await this.$store.dispatch('guilds:getGroup', { groupId: TAVERN_ID });
|
||||
},
|
||||
methods: {
|
||||
modForm () {
|
||||
goToModForm(this.user);
|
||||
},
|
||||
toggleSleep () {
|
||||
this.$store.dispatch('user:sleep');
|
||||
},
|
||||
|
||||
pendingDamage () {
|
||||
if (!this.user.party.quest.progress.up) return 0;
|
||||
return this.$options.filters.floor(this.user.party.quest.progress.up, 10);
|
||||
// keep user's pending damage consistent with how it's displayed on the party page
|
||||
},
|
||||
bossCurrentHealth () {
|
||||
if (!this.group.quest.progress.hp) return 0;
|
||||
|
||||
return Math.ceil(parseFloat(this.group.quest.progress.hp)).toLocaleString();
|
||||
},
|
||||
bossCurrentRage () {
|
||||
if (!this.group.quest.progress.hp) return 0;
|
||||
|
||||
return Math.floor(parseFloat(this.group.quest.progress.rage)).toLocaleString();
|
||||
},
|
||||
showWorldBossInfo () {
|
||||
this.$root.$emit('bv::show::modal', 'world-boss-info');
|
||||
},
|
||||
showWorldBossRage (npc) {
|
||||
if (this.group.quest.extra.worldDmg[npc]) {
|
||||
this.$store.state.rageModalOptions.npc = npc;
|
||||
this.$root.$emit('bv::show::modal', 'world-boss-rage');
|
||||
}
|
||||
},
|
||||
async fetchRecentMessages () {
|
||||
this.group = await this.$store.dispatch('guilds:getGroup', { groupId: TAVERN_ID });
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -3,7 +3,7 @@
|
||||
<div class="row standard-page">
|
||||
<small
|
||||
class="muted"
|
||||
v-html="$t('blurbHallContributors')"
|
||||
v-html="$t('blurbHallContributors', hallLinks)"
|
||||
></small>
|
||||
</div>
|
||||
<div class="row standard-page">
|
||||
@@ -68,6 +68,7 @@
|
||||
<a
|
||||
href="https://habitica.fandom.com/wiki/Contributor_Rewards"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>More details</a>
|
||||
</small>
|
||||
</div>
|
||||
@@ -296,6 +297,7 @@
|
||||
<div
|
||||
v-markdown="hero.contributor.contributions"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
></div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -360,6 +362,12 @@ export default {
|
||||
expandItems: false,
|
||||
expandAuth: false,
|
||||
expandTransactions: false,
|
||||
hallLinks: {
|
||||
linkRewards: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards" target="_blank" rel="noreferrer noopener">',
|
||||
linkTiers: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers" target="_blank" rel="noreferrer noopener">',
|
||||
linkContributing: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
async mounted () {
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
<template>
|
||||
<base-banner
|
||||
v-if="showChatWarning"
|
||||
banner-id="chat-warning"
|
||||
banner-class="chat-banner"
|
||||
class="chat-banner"
|
||||
height="3rem"
|
||||
:class="{faq: faqPage}"
|
||||
>
|
||||
<div
|
||||
slot="content"
|
||||
class="w-100 text-center"
|
||||
v-html="$t('chatSunsetWarning')"
|
||||
>
|
||||
</div>
|
||||
</base-banner>
|
||||
</template>
|
||||
|
||||
<style lang="scss">
|
||||
@import '@/assets/scss/colors.scss';
|
||||
|
||||
.chat-banner {
|
||||
width: 100%;
|
||||
min-height: 48px;
|
||||
padding: 8px;
|
||||
color: $orange-1;
|
||||
background-color: $orange-100;
|
||||
line-height: 1.71;
|
||||
|
||||
a {
|
||||
color: $orange-1;
|
||||
text-decoration: underline;
|
||||
|
||||
&:hover {
|
||||
color: $orange-1;
|
||||
}
|
||||
}
|
||||
|
||||
&.faq {
|
||||
position: fixed;
|
||||
top: 3.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import BaseBanner from './base';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BaseBanner,
|
||||
},
|
||||
computed: {
|
||||
faqPage () {
|
||||
return (this.$route.fullPath.indexOf('/faq')) !== -1;
|
||||
},
|
||||
showChatWarning () {
|
||||
return false;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
</script>
|
||||
@@ -6,7 +6,7 @@
|
||||
>
|
||||
<p
|
||||
class="mr-3 mb-0"
|
||||
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy')"
|
||||
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy', learnLinks)"
|
||||
>
|
||||
</p>
|
||||
<div
|
||||
@@ -89,6 +89,10 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
hidden: false,
|
||||
learnLinks: {
|
||||
linkOpen: '<a href="/static/privacy" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted () {
|
||||
|
||||
@@ -310,6 +310,7 @@
|
||||
<a
|
||||
class="topbar-dropdown-item dropdown-item"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
@@ -317,6 +318,7 @@
|
||||
<a
|
||||
class="topbar-dropdown-item dropdown-item"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
@click.prevent="openBugReportModal(true)"
|
||||
>
|
||||
{{ $t('askQuestion') }}
|
||||
@@ -325,6 +327,7 @@
|
||||
class="topbar-dropdown-item dropdown-item"
|
||||
href="https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('requestFeature') }}</a>
|
||||
</div>
|
||||
</li>
|
||||
@@ -377,6 +380,7 @@
|
||||
v-if="hasPermission(user, 'news')"
|
||||
class="topbar-dropdown-item dropdown-item"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href="https://panel.habitica.com"
|
||||
>
|
||||
{{ $t('newsroom') }}
|
||||
|
||||
@@ -6,11 +6,7 @@
|
||||
>
|
||||
<div slot="content">
|
||||
<div
|
||||
v-html="$t('invitedToPartyBy', {
|
||||
userId: notification.data.inviter,
|
||||
userName: invitingUser.auth ? invitingUser.auth.local.username : null,
|
||||
party: notification.data.name,
|
||||
})"
|
||||
v-html="$t('invitedToPartyBy', invitationInfo)"
|
||||
>
|
||||
</div>
|
||||
<div class="notifications-buttons">
|
||||
@@ -60,6 +56,10 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
...mapState({ user: 'user.data' }),
|
||||
invitationInfo: {
|
||||
usernameLink: `<a href="/profile/${this.notification.data.inviter}" target="_blank" rel="noreferrer noopener">@${this.invitingUser.auth ? this.invitingUser.auth.local.username : null}</a>`,
|
||||
partyName: `<span class="notification-bold">${this.notification.data.name}</span>`,
|
||||
},
|
||||
},
|
||||
async mounted () {
|
||||
this.invitingUser = await this.$store.dispatch('members:fetchMember', {
|
||||
|
||||
@@ -139,8 +139,8 @@ export default {
|
||||
mixins: [notifications, userStateMixin],
|
||||
data () {
|
||||
const abuseFlagModalBody = {
|
||||
firstLinkStart: '<a href="/static/community-guidelines" target="_blank">',
|
||||
secondLinkStart: '<a href="/static/terms" target="_blank">',
|
||||
firstLinkStart: '<a href="/static/community-guidelines" target="_blank" rel="noopener noreferrer">',
|
||||
secondLinkStart: '<a href="/static/terms" target="_blank" rel="noopener noreferrer">',
|
||||
linkEnd: '</a>',
|
||||
};
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@ export default {
|
||||
},
|
||||
amazonPayments: {},
|
||||
assistanceEmailObject: {
|
||||
hrefTechAssistanceEmail: `<a href="mailto:${TECH_ASSISTANCE_EMAIL}">${TECH_ASSISTANCE_EMAIL}</a>`,
|
||||
techAssistanceEmail: `<a href="mailto:${TECH_ASSISTANCE_EMAIL}">${TECH_ASSISTANCE_EMAIL}</a>`,
|
||||
},
|
||||
sendingInProgress: false,
|
||||
userReceivingGems: null,
|
||||
|
||||
@@ -67,6 +67,7 @@
|
||||
<a
|
||||
href="/static/privacy"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ $t('habiticaPrivacyPolicy') }}
|
||||
</a>
|
||||
|
||||
@@ -399,7 +399,7 @@
|
||||
</div>
|
||||
<div
|
||||
v-if="!hasGroupPlan && !canCancelSubscription"
|
||||
v-html="$t(`cancelSubInfo${user.purchased.plan.paymentMethod}`)"
|
||||
v-html="$t(`cancelSubInfo${user.purchased.plan.paymentMethod}`, cancelLinks)"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1022,6 +1022,17 @@ export default {
|
||||
|
||||
return nextHourglassMonth;
|
||||
},
|
||||
cancelLinks () {
|
||||
const links = {
|
||||
linkClose: '</a>',
|
||||
};
|
||||
if (this.user.purchased.plan.paymentMethod === this.paymentMethods.GOOGLE) {
|
||||
links.linkOpen = '<a href="https://play.google.com/store/account/subscriptions" target="_blank" rel="noopener noreferrer">';
|
||||
} else if (this.user.purchased.plan.paymentMethod === this.paymentMethods.APPLE) {
|
||||
links.linkOpen = '<a href="https://support.apple.com/en-us/HT202039" target="_blank" rel="noopener noreferrer">';
|
||||
}
|
||||
return links;
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.$store.dispatch('common:setTitle', {
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
</h2>
|
||||
<p
|
||||
class="text-center"
|
||||
v-html="$t('usernameInfo')"
|
||||
v-html="$t('usernameInfo', usernameLinks)"
|
||||
></p>
|
||||
<username-form />
|
||||
<div class="scene_veteran_pets center-block"></div>
|
||||
@@ -27,7 +27,7 @@
|
||||
</div>
|
||||
<div
|
||||
class="small text-center tos-footer"
|
||||
v-html="$t('usernameTOSRequirements')"
|
||||
v-html="$t('usernameTOSRequirements', requirementsLinks)"
|
||||
></div>
|
||||
</b-modal>
|
||||
</template>
|
||||
@@ -94,6 +94,15 @@ export default {
|
||||
icons: Object.freeze({
|
||||
helloNametag,
|
||||
}),
|
||||
usernameLinks: {
|
||||
linkOpen: '<a href="https://habitica.fandom.com/wiki/Player_Names" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
requirementsLinks: {
|
||||
termsLink: '<a href="/static/terms" target="_blank" rel="noreferrer noopener">',
|
||||
guidelinesLink: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
<div
|
||||
class="contact mx-auto"
|
||||
>
|
||||
<p v-html="$t('contactAdmin')"></p>
|
||||
<p v-html="$t('contactAdmin', { adminEmail })"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -368,6 +368,7 @@ export default {
|
||||
pixel_border: 'url(/static/npc/normal/pixel_border.png)',
|
||||
},
|
||||
staff: staffList,
|
||||
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -33,8 +33,9 @@
|
||||
class="drawer-help-text"
|
||||
href="/static/faq#pet-foods"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
<span>{{ $t('petLikeToEat') }}</span>
|
||||
<span>{{ $t('petLikeToEat', eatLinks) }}</span>
|
||||
</a>
|
||||
</div>
|
||||
</drawer-header-tabs>
|
||||
@@ -114,6 +115,10 @@ export default {
|
||||
},
|
||||
],
|
||||
selectedDrawerTab: this.defaultSelectedTab,
|
||||
eatLinks: {
|
||||
linkOpen: '<a href="/static/faq#pet-foods" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -162,6 +162,10 @@ export default {
|
||||
searchTextThrottled: null,
|
||||
unfilteredCategories: [],
|
||||
viewOptions: {},
|
||||
customizeLinks: {
|
||||
linkOpen: '<a href="">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -264,21 +268,21 @@ export default {
|
||||
const { $t } = this;
|
||||
switch (identifier) {
|
||||
case 'animalEars':
|
||||
return $t('allCustomizationsOwned');
|
||||
return $t('allCustomizationsOwned', this.customizeLinks);
|
||||
case 'animalTails':
|
||||
return $t('allCustomizationsOwned');
|
||||
return $t('allCustomizationsOwned', this.customizeLinks);
|
||||
case 'backgrounds':
|
||||
return `${$t('allCustomizationsOwned')} ${$t('checkNextMonth')}`;
|
||||
return `${$t('allCustomizationsOwned', this.customizeLinks)} ${$t('checkNextMonth')}`;
|
||||
case 'facialHair':
|
||||
return $t('allCustomizationsOwned');
|
||||
return $t('allCustomizationsOwned', this.customizeLinks);
|
||||
case 'color':
|
||||
return `${$t('allCustomizationsOwned')} ${$t('checkNextSeason')}`;
|
||||
return `${$t('allCustomizationsOwned', this.customizeLinks)} ${$t('checkNextSeason')}`;
|
||||
case 'base':
|
||||
return $t('allCustomizationsOwned');
|
||||
return $t('allCustomizationsOwned', this.customizeLinks);
|
||||
case 'shirt':
|
||||
return $t('allCustomizationsOwned');
|
||||
return $t('allCustomizationsOwned', this.customizeLinks);
|
||||
case 'skin':
|
||||
return `${$t('allCustomizationsOwned')} ${$t('checkNextSeason')}`;
|
||||
return `${$t('allCustomizationsOwned', this.customizeLinks)} ${$t('checkNextSeason')}`;
|
||||
default:
|
||||
return `Unknown identifier ${identifier}`;
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
:item-margin="24"
|
||||
:type="category.identifier"
|
||||
:fold-button="false"
|
||||
:no-items-label="$t('allEquipmentOwned')"
|
||||
:no-items-label="$t('allEquipmentOwned', equipmentLinks)"
|
||||
:click-handler="false"
|
||||
>
|
||||
<template
|
||||
@@ -229,29 +229,25 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
viewOptions: {},
|
||||
|
||||
searchText: null,
|
||||
searchTextThrottled: null,
|
||||
|
||||
icons: Object.freeze({
|
||||
hourglass: svgHourglass,
|
||||
}),
|
||||
|
||||
sortItemsBy: ['AZ', 'sortByNumber'],
|
||||
selectedSortItemsBy: 'AZ',
|
||||
|
||||
selectedItemToBuy: null,
|
||||
|
||||
hidePinned: false,
|
||||
|
||||
backgroundUpdate: new Date(),
|
||||
|
||||
currentEvent: null,
|
||||
|
||||
imageURLs: {
|
||||
background: '',
|
||||
npc: '',
|
||||
},
|
||||
equipmentLinks: {
|
||||
linkOpen: '<a href="/inventory/equipment">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
<div class="body-text">
|
||||
<p v-html="$t('sunsetFaqPara12')"></p>
|
||||
<p v-html="$t('sunsetFaqPara13')"></p>
|
||||
<p v-html="$t('sunsetFaqPara14')"></p>
|
||||
<p v-html="$t('sunsetFaqPara14', translationLinks)"></p>
|
||||
<p v-html="$t('sunsetFaqPara15')"></p>
|
||||
<p v-html="$t('sunsetFaqPara16')"></p>
|
||||
<p v-html="$t('sunsetFaqPara17')"></p>
|
||||
@@ -138,9 +138,9 @@
|
||||
</div>
|
||||
<div class="body-text">
|
||||
<ul>
|
||||
<li v-html="$t('sunsetFaqList8')"></li>
|
||||
<li v-html="$t('sunsetFaqList9')"></li>
|
||||
<li v-html="$t('sunsetFaqList10')"></li>
|
||||
<li v-html="$t('sunsetFaqList8', faqLinks)"></li>
|
||||
<li v-html="$t('sunsetFaqList9', beginnerLinks)"></li>
|
||||
<li v-html="$t('sunsetFaqList10', { adminEmail })"></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@@ -169,6 +169,23 @@ export default {
|
||||
components: {
|
||||
FaqSidebar,
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
|
||||
translationLinks: {
|
||||
linkOpen: '<a href="https://translate.habitica.com/projects/habitica/#information">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
faqLinks: {
|
||||
linkOpen: '<a href="https://habitica.com/static/faq">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
beginnerLinks: {
|
||||
linkOpen: '<a href="https://habitica.wordpress.com/beginning-adventurers-guide/">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted () {
|
||||
this.$store.dispatch('common:setTitle', {
|
||||
section: this.$t('sunsetFaqTitle'),
|
||||
|
||||
@@ -33,11 +33,11 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
localStorageTryFirst: {
|
||||
linkStart: '<a href="/user/settings/site" target="_blank">',
|
||||
linkStart: '<a href="/user/settings/site" target="_blank" rel="noopener noreferrer">',
|
||||
linkEnd: '</a>',
|
||||
},
|
||||
localStorageTryNext: {
|
||||
linkStart: '<a href="https://github.com/HabitRPG/habitica/issues/2760" target="_blank">',
|
||||
linkStart: '<a href="https://github.com/HabitRPG/habitica/issues/2760" target="_blank" rel="noopener noreferrer">',
|
||||
linkEnd: '</a>',
|
||||
},
|
||||
};
|
||||
|
||||
@@ -24,11 +24,11 @@
|
||||
<ul>
|
||||
<li><strong>{{ $t('commGuideList01A') }}</strong></li>
|
||||
<li v-html="$t('commGuideList02C')"></li>
|
||||
<li v-html="$t('commGuideList02N')"></li>
|
||||
<li v-html="$t('commGuideList02N', { adminEmail })"></li>
|
||||
<li v-html="$t('commGuideList02H')"></li>
|
||||
<li v-html="$t('commGuideList02A')"></li>
|
||||
<li v-html="$t('commGuideList02I')"></li>
|
||||
<li v-html="$t('commGuideList02G')"></li>
|
||||
<li v-html="$t('commGuideList02G', { adminEmail })"></li>
|
||||
<li v-html="$t('commGuideList02D')"></li>
|
||||
<li v-html="$t('commGuideList02E')"></li>
|
||||
<li v-html="$t('commGuideList02O')"></li>
|
||||
@@ -36,7 +36,7 @@
|
||||
<li v-html="$t('commGuideList02P')"></li>
|
||||
<li v-html="$t('commGuideList02Q')"></li>
|
||||
<li v-html="$t('commGuideList02M')"></li>
|
||||
<li v-html="$t('commGuideList02L')"></li>
|
||||
<li v-html="$t('commGuideList02L', { adminEmail })"></li>
|
||||
<li v-html="$t('commGuideList02J')"></li>
|
||||
<li v-html="$t('commGuideList02K')"></li>
|
||||
</ul>
|
||||
@@ -69,7 +69,7 @@
|
||||
<p v-html="$t('commGuidePara054')"></p>
|
||||
<p v-html="$t('commGuidePara055')"></p>
|
||||
<ul>
|
||||
<li v-html="$t('commGuideList06A')"></li>
|
||||
<li v-html="$t('commGuideList06A', { adminEmail })"></li>
|
||||
<li v-html="$t('commGuideList06C')"></li>
|
||||
<li v-html="$t('commGuideList06E')"></li>
|
||||
</ul>
|
||||
@@ -108,7 +108,7 @@
|
||||
class="mb-3"
|
||||
>
|
||||
<p v-html="$t('commGuidePara061')"></p>
|
||||
<p v-html="$t('commGuidePara063')"></p>
|
||||
<p v-html="$t('commGuidePara063', { adminEmail })"></p>
|
||||
<h2 id="meet-the-mods">
|
||||
{{ $t('commGuideHeadingMeet') }}
|
||||
</h2>
|
||||
@@ -162,15 +162,15 @@
|
||||
<h2 id="final">
|
||||
{{ $t('commGuideHeadingFinal') }}
|
||||
</h2>
|
||||
<p v-html="$t('commGuidePara067')"></p>
|
||||
<p v-html="$t('commGuidePara067', { adminEmail })"></p>
|
||||
<p v-html="$t('commGuidePara068')"></p>
|
||||
<h2 id="links">
|
||||
{{ $t('commGuideHeadingLinks') }}
|
||||
</h2>
|
||||
<ul>
|
||||
<li><a href="/static/faq">{{ $t('faq') }}</a></li>
|
||||
<li v-html="$t('commGuideLink03')"></li>
|
||||
<li v-html="$t('commGuideLink04')"></li>
|
||||
<li v-html="$t('commGuideLink03', gitHubLinks)"></li>
|
||||
<li v-html="$t('commGuideLink04', feedbackLinks)"></li>
|
||||
</ul>
|
||||
<p v-html="$t('commGuidePara069')"></p>
|
||||
<ul>
|
||||
@@ -187,3 +187,23 @@
|
||||
</ul>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
|
||||
gitHubLinks: {
|
||||
linkOpen: '<a href="https://github.com/HabitRPG/habitica" target="_blank">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
feedbackLinks: {
|
||||
linkOpen: '<a href="https://habitica.fandom.com/wiki/Habitica_Wiki" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<br>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
|
||||
@@ -135,7 +135,7 @@
|
||||
</h2>
|
||||
<p
|
||||
class="purple-600"
|
||||
v-html="$t('checkGroupPlanFAQ')"
|
||||
v-html="$t('checkGroupPlanFAQ', faqLinks)"
|
||||
></p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -329,6 +329,10 @@ export default {
|
||||
modalOption: '',
|
||||
modalPage: 'account',
|
||||
modalTitle: this.$t('register'),
|
||||
faqLinks: {
|
||||
linkOpen: '<a href="/static/faq#what-is-group-plan">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
class="nav-link"
|
||||
href="https://habitica.wordpress.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('companyBlog') }}</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
@@ -54,6 +55,7 @@
|
||||
class="nav-link"
|
||||
href="https://blog.habitrpg.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('tumblr') }}</a>
|
||||
</li>
|
||||
<router-link
|
||||
|
||||
@@ -6,7 +6,11 @@
|
||||
<noscript class="banner">
|
||||
{{ $t('jsDisabledHeadingFull') }}
|
||||
<br />
|
||||
<a href="https://www.enable-javascript.com/" target="_blank">{{ $t('jsDisabledLink') }}</a>
|
||||
<a
|
||||
href="https://www.enable-javascript.com/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('jsDisabledLink') }}</a>
|
||||
</noscript>
|
||||
<privacy-banner
|
||||
class="privacy-banner"
|
||||
@@ -254,12 +258,14 @@
|
||||
class="app svg-icon"
|
||||
href="https://play.google.com/store/apps/details?id=com.habitrpg.android.habitica"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
v-html="icons.googlePlay"
|
||||
></a>
|
||||
<a
|
||||
class="app svg-icon"
|
||||
href="https://itunes.apple.com/us/app/habitica-gamified-task-manager/id994882113?mt=8"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
v-html="icons.iosAppStore"
|
||||
></a>
|
||||
</div>
|
||||
|
||||
@@ -13,9 +13,10 @@
|
||||
<hr>
|
||||
</div>
|
||||
<p>
|
||||
<span v-html="$t('overviewQuestionsRevised')"></span>
|
||||
<span v-html="$t('overviewQuestionsRevised', overviewLinks)"></span>
|
||||
<a
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
@click.prevent="openBugReportModal(true)"
|
||||
>
|
||||
{{ $t('askQuestion') }}
|
||||
@@ -57,6 +58,10 @@ export default {
|
||||
shopUrl: '/shops/market',
|
||||
},
|
||||
},
|
||||
overviewLinks: {
|
||||
linkOpen: '<a href="/static/faq">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
};
|
||||
|
||||
@@ -100,9 +100,11 @@
|
||||
We use Google Analytics, a service which uses cookies to collect and analyze data about the use of the Services and report on activities and trends. This service may also collect data about the use of other websites, apps, and online services. You can <a
|
||||
href="https://policies.google.com/technologies/partner-sites"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>learn about</a> Google's practices, and opt out of them, by downloading the <a
|
||||
href="https://tools.google.com/dlpage/gaoptout"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>Google Analytics opt-out browser add-on</a>.
|
||||
</p>
|
||||
<h4>Controlling Cookies</h4>
|
||||
@@ -687,6 +689,7 @@
|
||||
<em>Opt - Out of the “ Sale” of Personal Information or Use of Such Information for “Targeted Advertising” or “Profiling”</em>. We engage in common marketing and advertising practices to provide more relevant content and ads to users of our Site and Services. Certain of these practices may involve the “selling” of personal information, or the use of such information for “targeted advertising” or “profiling,” as those terms are defined in the Texas Data Privacy and Security Act (“TDPSA”) and the Nebraska Data Privacy Act. We do not sell personal information under the more commonly understood meaning of that word—i.e., providing personal information to third parties in exchange for money. Nor do we have actual knowledge of selling personal information of minors under the age of 16. To opt-out of the selling of your personal information, or use of that information for targeted advertising or profiling, please submit a request to <a href="mailto:privacy@habitica.com">privacy@habitica.com</a>. Note: We also treat Global Privacy Control browser signals as opt-out of sale/disclosure for targeted advertising or profiling requests. To opt-out via the Global Privacy Control, please follow the instructions available <a
|
||||
href="https://globalprivacycontrol.org/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>here</a>.
|
||||
</p>
|
||||
<p>
|
||||
@@ -730,12 +733,15 @@
|
||||
<strong>Right to lodge a complaint:</strong> Users that reside in the UK, EEA, or Switzerland have the right to seek information and assistance or lodge a complaint about our data collection and processing actions with the supervisory authority where they reside. Contact details for data protection authorities are available here. UK: <a
|
||||
href="https://ico.org.uk/"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>https://ico.org.uk/</a> EEA: <a
|
||||
href="https://edpb.europa.eu/about-edpb/board/members_en"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>https://edpb.europa.eu/about-edpb/board/members_en</a> Switzerland: <a
|
||||
href="https//www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>https//www.edoeb.admin.ch/edoeb/en/home/deredoeb/kontakt.html</a>.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
@@ -244,13 +244,11 @@
|
||||
|
||||
<script>
|
||||
import AppFooter from '@/components/appFooter';
|
||||
import ChatBanner from '@/components/header/banners/chatBanner';
|
||||
import StaticHeader from './header.vue';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
AppFooter,
|
||||
ChatBanner,
|
||||
StaticHeader,
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
Our Service is provided by HabitRPG, Inc. ("HabitRPG"). By accepting these Terms of Service and our Privacy Policy located at: <a
|
||||
href="https://habitica.com/static/privacy"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>https://habitica.com/static/privacy</a> (collectively, the "Agreement"), using our website, Habitica.com, or our other features or services (collectively, “the Services”), or otherwise manifesting your assent to the Agreement, you acknowledge that you have read, understood, and agree to be legally bound by the Agreement. If you do not agree to (or cannot comply with) the Agreement, you are not permitted to access or use the Service. By accepting or agreeing to this Agreement on behalf of a company or other legal entity, you represent and warrant that you have the authority to bind that company or other legal entity to the Agreement and, in such event, "you" and "your" will refer and apply to that company or other legal entity. You further represent and warrant that your assent to this Agreement constitutes an electronic signature as defined by the Electronic Signatures in Global and National Commerce Act (“E-Sign”) and the Uniform Electronic Transactions Act (“UETA”) and that you have formed, executed, entered into, and accepted the terms of and otherwise authenticated the Agreement and acknowledged and agreed that the Agreement is an electronic record for purposes of E- Sign, UETA, and the Uniform Computer Information Transactions Act and, as such, is completely valid, has legal effect, is enforceable, and is binding on, and non- refutable by, you and/or any entity on whose behalf you are acting.
|
||||
</p>
|
||||
<p class="strong">
|
||||
@@ -164,6 +165,7 @@
|
||||
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
|
||||
href="https://reportaproblem.apple.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>https://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUNDS FOR APP STORE PURCHASES MADE BY CUSTOMERS.
|
||||
</p>
|
||||
|
||||
@@ -204,6 +206,7 @@
|
||||
All disputes will be resolved before a neutral arbitrator selected jointly by the parties, whose decision will be final, except for a limited right of appeal under the FAA. The arbitration shall be commenced and conducted by JAMS pursuant to its then current Comprehensive Arbitration Rules and Procedures and in accordance with the Expedited Procedures in those rules, or, where appropriate, pursuant to JAMS' Streamlined Arbitration Rules and Procedures. All applicable JAMS rules and procedures are available at the JAMS website <a
|
||||
href="https://www.jamsadr.com"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>www.jamsadr.com</a>. Each party will be responsible for paying any JAMS filing, administrative, and arbitrator fees in accordance with JAMS rules. Judgment on the arbitrator's award may be entered in any court having jurisdiction. This clause shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. The arbitration may be conducted in person, through the submission of documents, by phone, or online. If conducted in person, the arbitration shall take place in the United States county where you reside. The parties may litigate in court to compel arbitration, to stay a proceeding pending arbitration, or to confirm, modify, vacate, or enter judgment on the award entered by the arbitrator. The parties shall cooperate in good faith in the voluntary and informal exchange of all non-privileged documents and other information (including electronically stored information) relevant to the Dispute immediately after commencement of the arbitration. As set forth below, nothing in this Agreement will prevent us from seeking injunctive relief in any court of competent jurisdiction as necessary to protect our proprietary interests.
|
||||
</p>
|
||||
<p>
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
}, `type_${task.type}`
|
||||
]"
|
||||
@click="castEnd($event, task)"
|
||||
tabindex="0"
|
||||
@keypress.enter="$emit('editTask', task)"
|
||||
>
|
||||
<div
|
||||
class="d-flex"
|
||||
@@ -98,9 +100,7 @@
|
||||
<div
|
||||
class="task-clickable-area pt-1 pl-75 pb-0"
|
||||
:class="{ 'cursor-auto': !teamManagerAccess }"
|
||||
tabindex="0"
|
||||
@click="edit($event, task)"
|
||||
@keypress.enter="edit($event, task)"
|
||||
>
|
||||
<div class="d-flex justify-content-between">
|
||||
<h3
|
||||
@@ -432,10 +432,6 @@
|
||||
outline: none;
|
||||
transition: none;
|
||||
border: $purple-400 solid 1px;
|
||||
|
||||
:not(task-best-control-inner-habit) { // round icon
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
.control-bottom-box {
|
||||
@@ -462,16 +458,13 @@
|
||||
&:hover:not(.task-not-editable.task-not-scoreable),
|
||||
&:focus-within:not(.task-not-editable.task-not-scoreable) {
|
||||
box-shadow: 0 1px 8px 0 rgba($black, 0.12), 0 4px 4px 0 rgba($black, 0.16);
|
||||
z-index: 11;
|
||||
}
|
||||
}
|
||||
|
||||
.task:not(.groupTask) {
|
||||
&:hover,
|
||||
&:focus-within {
|
||||
.left-control, .right-control, .task-content {
|
||||
border-color: $purple-400;
|
||||
}
|
||||
&:hover, &:focus {
|
||||
border: none;
|
||||
outline: 1px solid $purple-400;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -522,11 +515,6 @@
|
||||
&-user {
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
&:focus {
|
||||
border-radius: 4px;
|
||||
border: $purple-400 solid 1px;
|
||||
}
|
||||
}
|
||||
|
||||
.task-title + .task-dropdown ::v-deep .dropdown-menu {
|
||||
|
||||
@@ -412,6 +412,25 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<p
|
||||
v-if="task.type === 'daily' && schedulingSummary"
|
||||
class="scheduling-summary mt-2 mb-0"
|
||||
>
|
||||
{{ schedulingSummary }}
|
||||
</p>
|
||||
<div
|
||||
v-if="task.type === 'daily' && schedulingWarning"
|
||||
class="scheduling-warning mt-2"
|
||||
>
|
||||
<span
|
||||
class="scheduling-warning-icon svg-icon color gray-50"
|
||||
v-html="icons.alert"
|
||||
></span>
|
||||
<span
|
||||
class="scheduling-warning-text"
|
||||
v-html="schedulingWarning"
|
||||
></span>
|
||||
</div>
|
||||
<div
|
||||
v-if="!groupId"
|
||||
class="tags-select option mt-3"
|
||||
@@ -1109,6 +1128,42 @@
|
||||
height: 1rem;
|
||||
}
|
||||
|
||||
.scheduling-summary {
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
color: $gray-50;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.scheduling-warning {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
font-family: 'Roboto', sans-serif;
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-size: 12px;
|
||||
line-height: 16px;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
.scheduling-warning-icon {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
flex-shrink: 0;
|
||||
margin-right: 6px;
|
||||
margin-top: -1px;
|
||||
}
|
||||
|
||||
.scheduling-warning-text {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
label {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
@@ -1298,8 +1353,8 @@ export default {
|
||||
],
|
||||
calendarHighlights: { dates: [new Date()] },
|
||||
spiLinkData: {
|
||||
firstLink: '<a href="/static/privacy#section_1" target="_blank">',
|
||||
secondLink: '<a href="/static/privacy" target="_blank">',
|
||||
firstLink: '<a href="/static/privacy#section_1" target="_blank" rel="noopener noreferrer">',
|
||||
secondLink: '<a href="/static/privacy" target="_blank" rel="noopener noreferrer">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
@@ -1377,6 +1432,87 @@ export default {
|
||||
}
|
||||
return null;
|
||||
},
|
||||
schedulingSummary () {
|
||||
if (!this.task || this.task.type !== 'daily') return '';
|
||||
const { task } = this;
|
||||
const everyXValue = +task.everyX;
|
||||
|
||||
let interval;
|
||||
if (task.frequency === 'daily') {
|
||||
interval = everyXValue === 1 ? this.$t('everyDay') : this.$t('everyXDays', { count: everyXValue });
|
||||
} else if (task.frequency === 'weekly') {
|
||||
interval = everyXValue === 1 ? this.$t('everyWeek') : this.$t('everyXWeeks', { count: everyXValue });
|
||||
} else if (task.frequency === 'monthly') {
|
||||
interval = everyXValue === 1 ? this.$t('everyMonth') : this.$t('everyXMonths', { count: everyXValue });
|
||||
} else if (task.frequency === 'yearly') {
|
||||
interval = everyXValue === 1 ? this.$t('everyYear') : this.$t('everyXYears', { count: everyXValue });
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
|
||||
let details = '';
|
||||
if (task.frequency === 'weekly') {
|
||||
const dayNames = {
|
||||
su: 'Sunday',
|
||||
m: 'Monday',
|
||||
t: 'Tuesday',
|
||||
w: 'Wednesday',
|
||||
th: 'Thursday',
|
||||
f: 'Friday',
|
||||
s: 'Saturday',
|
||||
};
|
||||
const activeDays = Object.keys(task.repeat || {}).filter(d => task.repeat[d]);
|
||||
if (activeDays.length > 0) {
|
||||
details = ` on ${activeDays.map(d => dayNames[d]).join(', ')}`;
|
||||
}
|
||||
} else if (task.frequency === 'monthly' && task.startDate) {
|
||||
const dayOfMonth = moment(task.startDate).date();
|
||||
if (task.weeksOfMonth && task.weeksOfMonth.length > 0) {
|
||||
const weekNum = task.weeksOfMonth[0] + 1;
|
||||
const weekStr = String(weekNum);
|
||||
const lastDigit = weekStr.slice(-1);
|
||||
let suffix = 'th';
|
||||
if (lastDigit === '1' && weekStr !== '11') suffix = 'st';
|
||||
if (lastDigit === '2' && weekStr !== '12') suffix = 'nd';
|
||||
if (lastDigit === '3' && weekStr !== '13') suffix = 'rd';
|
||||
const dayName = moment(task.startDate).format('dddd');
|
||||
details = ` on the ${weekNum}${suffix} ${dayName} of the month`;
|
||||
} else if (task.daysOfMonth && task.daysOfMonth.length > 0) {
|
||||
const dom = task.daysOfMonth[0];
|
||||
const domStr = String(dom);
|
||||
const lastDigit = domStr.slice(-1);
|
||||
let suffix = 'th';
|
||||
if (lastDigit === '1' && domStr !== '11') suffix = 'st';
|
||||
if (lastDigit === '2' && domStr !== '12') suffix = 'nd';
|
||||
if (lastDigit === '3' && domStr !== '13') suffix = 'rd';
|
||||
details = ` on the ${dom}${suffix}`;
|
||||
} else {
|
||||
const domStr = String(dayOfMonth);
|
||||
const lastDigit = domStr.slice(-1);
|
||||
let suffix = 'th';
|
||||
if (lastDigit === '1' && domStr !== '11') suffix = 'st';
|
||||
if (lastDigit === '2' && domStr !== '12') suffix = 'nd';
|
||||
if (lastDigit === '3' && domStr !== '13') suffix = 'rd';
|
||||
details = ` on the ${dayOfMonth}${suffix}`;
|
||||
}
|
||||
} else if (task.frequency === 'yearly' && task.startDate) {
|
||||
details = ` on ${moment(task.startDate).format('MMMM Do')}`;
|
||||
}
|
||||
|
||||
return `${this.$t('repeats')} ${interval}${details}`;
|
||||
},
|
||||
schedulingWarning () {
|
||||
if (!this.task || this.task.type !== 'daily') return '';
|
||||
const { task } = this;
|
||||
if (task.frequency === 'monthly'
|
||||
&& task.weeksOfMonth && task.weeksOfMonth.length > 0
|
||||
&& task.weeksOfMonth[0] === 4
|
||||
&& task.startDate) {
|
||||
const dayName = moment(task.startDate).format('dddd');
|
||||
return this.$t('fifthWeekWarning', { day: dayName });
|
||||
}
|
||||
return '';
|
||||
},
|
||||
repeatsOn: {
|
||||
get () {
|
||||
let repeatsOn = 'dayOfMonth';
|
||||
|
||||
@@ -222,14 +222,22 @@ export default {
|
||||
return usernames;
|
||||
},
|
||||
summarySentence () {
|
||||
let fifthWeekWarning = '';
|
||||
if (this.task.type === 'daily' && this.task.frequency === 'monthly'
|
||||
&& this.task.weeksOfMonth && this.task.weeksOfMonth.length > 0
|
||||
&& this.task.weeksOfMonth[0] === 4) {
|
||||
const activeDays = keys(pickBy(this.task.repeat, value => value === true));
|
||||
const dayName = this.expandDayString[activeDays[0]];
|
||||
fifthWeekWarning = ` ${this.$t('fifthWeekWarning', { day: dayName })}`;
|
||||
}
|
||||
if (this.task.type === 'daily' && moment().isBefore(this.task.startDate)) {
|
||||
return `This is ${this.formattedDifficulty(this.task.priority)} task that will repeat
|
||||
${this.formattedRepeatInterval(this.task.frequency, this.task.everyX)}${this.formattedDays(this.task.frequency, this.task.repeat, this.task.daysOfMonth, this.task.weeksOfMonth, this.task.startDate)}
|
||||
starting on <strong>${moment(this.task.startDate).format('MM/DD/YYYY')}</strong>.`;
|
||||
starting on <strong>${moment(this.task.startDate).format('MM/DD/YYYY')}</strong>.${fifthWeekWarning}`;
|
||||
}
|
||||
if (this.task.type === 'daily') {
|
||||
return `This is ${this.formattedDifficulty(this.task.priority)} task that repeats
|
||||
${this.formattedRepeatInterval(this.task.frequency, this.task.everyX)}${this.formattedDays(this.task.frequency, this.task.repeat, this.task.daysOfMonth, this.task.weeksOfMonth, this.task.startDate)}.`;
|
||||
${this.formattedRepeatInterval(this.task.frequency, this.task.everyX)}${this.formattedDays(this.task.frequency, this.task.repeat, this.task.daysOfMonth, this.task.weeksOfMonth, this.task.startDate)}.${fifthWeekWarning}`;
|
||||
}
|
||||
if (this.task.date) {
|
||||
return `This is ${this.formattedDifficulty(this.task.priority)} task that is due <strong>${moment(this.task.date).format('MM/DD/YYYY')}.`;
|
||||
@@ -287,25 +295,14 @@ export default {
|
||||
});
|
||||
dayStringArray.push('</strong>');
|
||||
} else if (weeksOfMonth.length > 0) {
|
||||
switch (weeksOfMonth[0]) {
|
||||
case 0:
|
||||
dayStringArray.push('first');
|
||||
break;
|
||||
case 1:
|
||||
dayStringArray.push('second');
|
||||
break;
|
||||
case 2:
|
||||
dayStringArray.push('third');
|
||||
break;
|
||||
case 3:
|
||||
dayStringArray.push('fourth');
|
||||
break;
|
||||
case 4:
|
||||
dayStringArray.push('fifth');
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
const weekNum = weeksOfMonth[0] + 1;
|
||||
const weekNumStr = String(weekNum);
|
||||
const lastDigit = weekNumStr.slice(-1);
|
||||
let ordinalSuffix = 'th';
|
||||
if (lastDigit === '1' && weekNumStr !== '11') ordinalSuffix = 'st';
|
||||
if (lastDigit === '2' && weekNumStr !== '12') ordinalSuffix = 'nd';
|
||||
if (lastDigit === '3' && weekNumStr !== '13') ordinalSuffix = 'rd';
|
||||
dayStringArray.push(`${weekNum}${ordinalSuffix}`);
|
||||
activeDays = keys(pickBy(repeat, value => value === true));
|
||||
dayStringArray.push(` ${this.expandDayString[activeDays[0]]} of the month</strong>`);
|
||||
}
|
||||
@@ -343,9 +340,8 @@ export default {
|
||||
if (numericX === 2) return '<strong>every other week</strong>';
|
||||
return `<strong>every ${numericX} weeks</strong>`;
|
||||
case 'monthly':
|
||||
if (numericX === 1) return '<strong>every month</strong>';
|
||||
if (numericX === 2) return '<strong>every other month</strong>';
|
||||
return `<strong>every ${numericX} months</strong>`;
|
||||
if (numericX === 1) return `<strong>${this.$t('everyMonth')}</strong>`;
|
||||
return `<strong>${this.$t('everyXMonths', { count: numericX })}</strong>`;
|
||||
case 'yearly':
|
||||
if (numericX === 1) return '<strong>every year</strong>';
|
||||
return `<strong>every ${everyX} years</strong>`;
|
||||
|
||||
@@ -68,8 +68,12 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
upDate (after) {
|
||||
this.value = after;
|
||||
this.$emit('update:date', after);
|
||||
// zero out the time so the server doesn't shift the day across a DST boundary on save
|
||||
const normalized = after
|
||||
? new Date(after.getFullYear(), after.getMonth(), after.getDate())
|
||||
: null;
|
||||
this.value = normalized;
|
||||
this.$emit('update:date', normalized);
|
||||
},
|
||||
setToday () {
|
||||
this.upDate(moment().toDate());
|
||||
|
||||
@@ -377,7 +377,7 @@
|
||||
<div class="">
|
||||
<div
|
||||
class="alert alert-info alert-sm"
|
||||
v-html="$t('communityGuidelinesWarning', managerEmail)"
|
||||
v-html="$t('communityGuidelinesWarning', communityGuidelineLinks)"
|
||||
></div>
|
||||
<!-- TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak-->
|
||||
<div class="form-group">
|
||||
@@ -1060,8 +1060,10 @@ export default {
|
||||
blurb: '',
|
||||
},
|
||||
hero: {},
|
||||
managerEmail: {
|
||||
hrefBlankCommunityManagerEmail: `<a href="mailto:${COMMUNITY_MANAGER_EMAIL}">${COMMUNITY_MANAGER_EMAIL}</a>`,
|
||||
communityGuidelineLinks: {
|
||||
linkOpen: '<a href="https://habitica.com/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
adminEmail: `<a href="mailto:${COMMUNITY_MANAGER_EMAIL}" target="_blank" rel="noopener noreferrer">${COMMUNITY_MANAGER_EMAIL}</a>`,
|
||||
},
|
||||
selectedPage: 'profile',
|
||||
achievements: {},
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
v-if="userLevel100Plus"
|
||||
v-once
|
||||
class="level-100-message"
|
||||
v-html="$t('noMoreAllocate')"
|
||||
v-html="$t('noMoreAllocate', allocateLinks)"
|
||||
></div>
|
||||
</div>
|
||||
<div class="row allocation-boxes-row">
|
||||
@@ -395,14 +395,12 @@ export default {
|
||||
_skip: 'skip',
|
||||
shield: this.$t('offHandCapitalized'),
|
||||
},
|
||||
|
||||
allocateStatsList: {
|
||||
str: { title: 'allocateStr', popover: 'strengthText', allocatepop: 'allocateStrPop' },
|
||||
int: { title: 'allocateInt', popover: 'intText', allocatepop: 'allocateIntPop' },
|
||||
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
|
||||
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
|
||||
},
|
||||
|
||||
stats: {
|
||||
str: {
|
||||
title: 'strength',
|
||||
@@ -422,6 +420,10 @@ export default {
|
||||
},
|
||||
},
|
||||
content: Content,
|
||||
allocateLinks: {
|
||||
linkOpen: '<a href="/shops/market">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
v-if="userLevel100Plus"
|
||||
v-once
|
||||
>
|
||||
{{ $t('noMoreAllocate') }}
|
||||
{{ $t('noMoreAllocate', allocateLinks) }}
|
||||
</p>
|
||||
<p
|
||||
v-if="user.stats.points || userLevel100Plus"
|
||||
@@ -480,6 +480,10 @@ export default {
|
||||
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
|
||||
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
|
||||
},
|
||||
allocateLinks: {
|
||||
linkOpen: '<a href="/shops/market">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
class="footer-link"
|
||||
href="https://habitica.fandom.com/wiki/World_Bosses"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>{{ $t('worldBossLink') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -10,6 +10,10 @@ export default {
|
||||
tour: {},
|
||||
chapters: {},
|
||||
loaded: false,
|
||||
partyLinks: {
|
||||
linkOpen: '<a href="/static/faq#parties">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
@@ -56,7 +60,7 @@ export default {
|
||||
party: [[
|
||||
{
|
||||
orphan: true,
|
||||
intro: this.$t('tourPartyPage'),
|
||||
intro: this.$t('tourPartyPage', this.partyLinks),
|
||||
final: true,
|
||||
proceed: this.$t('tourSplendid'),
|
||||
hideNavigation: true,
|
||||
|
||||
@@ -177,7 +177,7 @@
|
||||
<div
|
||||
v-once
|
||||
class="guidelines flex-fill"
|
||||
v-html="$t('communityGuidelinesIntro')"
|
||||
v-html="$t('communityGuidelinesIntro', guidelineLinks)"
|
||||
></div>
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
@@ -774,6 +774,10 @@ export default defineComponent({
|
||||
messages: [],
|
||||
messagesLoading: false,
|
||||
MAX_MESSAGE_LENGTH: MAX_MESSAGE_LENGTH.toString(),
|
||||
guidelineLinks: {
|
||||
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
|
||||
<div
|
||||
class="kind-text"
|
||||
v-html="$t('rememberToBeKind')"
|
||||
v-html="$t('rememberToBeKind', kindLinks)"
|
||||
></div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -62,6 +62,14 @@ import Avatar from '@/components/avatar.vue';
|
||||
|
||||
export default {
|
||||
components: { Avatar },
|
||||
data () {
|
||||
return {
|
||||
kindLinks: {
|
||||
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
props: {
|
||||
memberObj: null,
|
||||
},
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
<router-link
|
||||
to="/forgot-password"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
{{ $t('forgotPassword') }}
|
||||
</router-link>
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
class="dialog-disclaimer"
|
||||
>
|
||||
<span>{{ $t("americanEnglishGovern") }} </span>
|
||||
<span v-html="$t('helpWithTranslation')"></span>
|
||||
<span v-html="$t('helpWithTranslation', translateLinks)"></span>
|
||||
</div>
|
||||
<div class="input-area">
|
||||
<div class="settings-label">
|
||||
@@ -97,6 +97,10 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
selectedLanguage: '',
|
||||
translateLinks: {
|
||||
linkOpen: '<a href="https://translate.habitica.com" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
|
||||
@@ -166,6 +166,10 @@ export default {
|
||||
icons: Object.freeze({
|
||||
alert,
|
||||
}),
|
||||
gpcLinks: {
|
||||
linkOpen: '<a href="https://globalprivacycontrol.org/" target="_blank" rel="noreferrer noopener">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -176,11 +180,10 @@ export default {
|
||||
return navigator.globalPrivacyControl;
|
||||
},
|
||||
gpcInfo () {
|
||||
const gpcUrl = 'https://globalprivacycontrol.org/';
|
||||
if (this.user.preferences.analyticsConsent) {
|
||||
return this.$t('gpcPlusAnalytics', { url: gpcUrl });
|
||||
return this.$t('gpcPlusAnalytics', this.gpcLinks);
|
||||
}
|
||||
return this.$t('gpcWarning', { url: gpcUrl });
|
||||
return this.$t('gpcWarning', this.gpcLinks);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<div
|
||||
v-once
|
||||
class="webhooks-info mb-3"
|
||||
v-html="$t('webhooksInfo')"
|
||||
v-html="$t('webhooksInfo', hookLinks)"
|
||||
>
|
||||
</div>
|
||||
|
||||
@@ -233,6 +233,10 @@ export default {
|
||||
}),
|
||||
webhooks: [], // view copy of state
|
||||
unsaved: [],
|
||||
hookLinks: {
|
||||
linkOpen: '<a target="_blank" rel="noreferrer noopener" href="https://habitica.com/apidoc/#api-Webhook-AddWebhook">',
|
||||
linkClose: '</a>',
|
||||
},
|
||||
};
|
||||
},
|
||||
mounted () {
|
||||
|
||||
@@ -123,7 +123,6 @@ import birthdayModal from '@/components/news/birthdayModal';
|
||||
import AppMenu from '@/components/header/menu';
|
||||
import AppHeader from '@/components/header/index';
|
||||
import BirthdayBanner from '@/components/header/banners/birthdayBanner';
|
||||
import ChatBanner from '@/components/header/banners/chatBanner';
|
||||
import DamagePausedBanner from '@/components/header/banners/damagePaused';
|
||||
import GemsPromoBanner from '@/components/header/banners/gemsPromo';
|
||||
import GiftPromoBanner from '@/components/header/banners/giftPromo';
|
||||
@@ -160,7 +159,6 @@ export default {
|
||||
AppHeader,
|
||||
AppFooter,
|
||||
birthdayModal,
|
||||
ChatBanner,
|
||||
DamagePausedBanner,
|
||||
GemsPromoBanner,
|
||||
GiftPromoBanner,
|
||||
|
||||
@@ -121,6 +121,10 @@ export default defineConfig({
|
||||
include: [/moment-recur/, /node_modules/]
|
||||
},
|
||||
rollupOptions: {
|
||||
input: {
|
||||
main: path.resolve(__dirname, 'index.html'),
|
||||
faq: path.resolve(__dirname, 'index-faq.html'),
|
||||
},
|
||||
output: {
|
||||
experimentalMinChunkSize: 20000
|
||||
}
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
"backgroundStormyRooftopsNotes": "Промъквайте се върху буреносни покриви.",
|
||||
"backgroundWindyAutumnText": "Ветровита есен",
|
||||
"backgroundWindyAutumnNotes": "Гонете листа през ветровита есен.",
|
||||
"incentiveBackgrounds": "Комплект едноцветни фонове",
|
||||
"incentiveBackgrounds": "Стандартни фонове",
|
||||
"backgroundVioletText": "Виолетово",
|
||||
"backgroundVioletNotes": "Енергичен виолетов фон.",
|
||||
"backgroundBlueText": "Синьо",
|
||||
@@ -494,7 +494,7 @@
|
||||
"backgroundSnowglobeText": "Снежна топка",
|
||||
"backgroundDesertWithSnowNotes": "Бъди свидетел на рядката и мълчалива красота на Снежната пустиня.",
|
||||
"backgroundTeaPartyNotes": "Участвай в изискано Чаено парти.",
|
||||
"backgroundButterflyGardenNotes": "Забавлявайте се с опрашителите в Градина на пеперудите",
|
||||
"backgroundButterflyGardenNotes": "Купонясвайте с опрашители в градина за пеперуди",
|
||||
"backgroundAnimalCloudsText": "Животински облаци",
|
||||
"backgroundButterflyGardenText": "Градина на пеперудите",
|
||||
"backgroundWinterNocturneText": "Зимен ноктюрн",
|
||||
@@ -503,5 +503,18 @@
|
||||
"hideLockedBackgrounds": "Скрий заключените фонове",
|
||||
"backgroundSnowglobeNotes": "Разклати Снежната топка и заеми мястото си в микрокосмоса на снежния пейзаж.",
|
||||
"backgroundAmongGiantFlowersText": "Сред гигантски цветя",
|
||||
"backgroundAnimalCloudsNotes": "Използвай въображението си, за да намериш Животни в Облаците."
|
||||
"backgroundAnimalCloudsNotes": "Използвай въображението си, за да намериш Животни в Облаците.",
|
||||
"backgroundSucculentGardenNotes": "",
|
||||
"backgroundSucculentGardenText": "Градина със сукуленти",
|
||||
"backgroundHotAirBalloonText": "горещ въздух балон",
|
||||
"backgroundHeatherFieldText": "пирен поле",
|
||||
"backgroundRainyBarnyardText": "Дъждовен фермерски двор",
|
||||
"backgroundRelaxationRiverText": "Релаксация Река",
|
||||
"backgroundFlyingOverGlacierNotes": "‐",
|
||||
"backgroundUnderwaterRuinsText": "Подводен Руини",
|
||||
"backgroundBeachCabanaText": "Плаж Кабана",
|
||||
"backgroundSaltLakeText": "Сол Езеро",
|
||||
"backgroundWintryCastleText": "Зимен Замък",
|
||||
"backgroundVikingShipText": "Викинг Кораб",
|
||||
"backgroundCampingOutText": "Къмпинг Навън"
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"androidFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в кръчмата чрез Меню > Кръчма! Ще се радваме да помогнем.",
|
||||
"webFaqStillNeedHelp": "Ако имате въпрос, който не намирате в този списък или в [ЧЗВ в уикито](http://habitica.fandom.com/wiki/FAQ), задайте го в [Помощната гилдия на Хабитика](https://habitica.com/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a)! Ще се радваме да помогнем.",
|
||||
"webFaqAnswer28": "Да! Бутона \"Пауза на щетите\" може да се намери в Настройки. Той ще ви предпази от загуба на точки живот (HP) за пропуснати ежедневни задачи. Това е полезно, ако сте на ваканция, нуждаете се от почивка или по какъвто и да било друг повод, за който имате нужда от почивка. Ако участвате в мисия, вашето собствено неприключило напредване ще бъде спряно, но все още ще получавате щети от пропуснатите ежедневни задачи на членовете на вашата група.\n\nЗа да поставите на пауза конкретни ежедневни задачи, можете да редактирате графика им, за да се изпълняват на всеки 0 дни, докато не сте готови да ги стартирате отново.",
|
||||
"webFaqAnswer32": "В Habitica има четири класа: Войн, Магьосник, Крадец и Лечител. Всички играчи започват като клас \"Войн\", докато достигнат ниво 10. След като достигнете ниво 10, ще получите възможността да изберете нов клас или да продължите като Войн.\n\nВсеки клас разполага с различни Екипировка и Умения. Ако не искате да изберете клас, можете да изберете \"Отказ\". Ако изберете да се откажете, винаги можете да активирате Класовата система от Настройки по-късно.",
|
||||
"webFaqAnswer32": "Всички играчи започват като клас \"Войн\", докато достигнат ниво 10. След като достигнете ниво 10, ще получите възможността да изберете нов клас или да продължите като Войн.\n\nВсеки клас разполага с различни Екипировка и Умения. Ако не искате да изберете клас, можете да изберете \"Отказ\". Ако изберете да се откажете, винаги можете да активирате Класовата система от Настройки по-късно.\n\nАко искате да промените класа си след ниво 10, можете да го направите, като използвате Орбът на прераждането. Орбът на прераждането е достъпен в Пазара за 6 диаманта на ниво 50 или безплатен на ниво 100.\n\nСъщо така, можете да промените своя клас по всяко време от Настройки за 3 диаманта. Това няма да нулира нивото ви като Орбът на прераждането, но ще ви позволи да преразпределите точките на уменията, които сте събрали, като сте вдигнали нивото си, за да са релевантни с новия ви клас.",
|
||||
"commonQuestions": "Чести въпроси",
|
||||
"faqQuestion25": "Какви са различните видове задачи?",
|
||||
"webFaqAnswer25": "Habitica използва три различни типа задачи, за да отговори на вашите нужди: Навици, Ежедневни и Задачи.\n\nНавиците могат да бъдат положителни или отрицателни и представляват нещо, което искате да проследявате няколко пъти на ден или според незададен график. Положителните навици ще ви наградят със злато и опит (Exp), докато отрицателните навици ще ви наказват със загуба на точки живот (HP).\n\nЕжедневните задачи са повтарящи се задачи, които искате да изпълнявате по-структурирано. Например веднъж на ден, три пъти на седмица или четири пъти на месец. Пропускането на ежедневни задачи води до загуба на HP, но колкото по-трудни са, толкова по-добри са наградите!\n\nЗадачите са еднократни задачи, за които получавате награди след като ги изпълните. Задачите могат да имат срок, но няма загуба на HP, ако го пропуснете.\n\nИзберете типа задача, който най-добре отговаря на това, което искате да постигнете!",
|
||||
@@ -16,7 +16,7 @@
|
||||
"faqQuestion29": "Как да възстановя загубени точки живот (HP)?",
|
||||
"webFaqAnswer29": "Можете да възвърнете 15 HP, като закупите отвара от колоната си за Награди, за 25 злато. Освен това винаги ще възвърнете пълното си HP, когато качите ниво!",
|
||||
"faqQuestion30": "Какво става, когато изчерпам HP?",
|
||||
"webFaqAnswer30": "Ако вашите HP стигнат до нула, ще загубите едно ниво, цялото си злато и един случаен предмет, който може да бъде закупен отново.",
|
||||
"webFaqAnswer30": "Ако вашето HP стигне до нула, ще загубите едно ниво, цялото си злато и един случаен предмет, който може да бъде закупен отново.",
|
||||
"faqQuestion31": "Защо загубих HP при неотрицателна задача ?",
|
||||
"webFaqAnswer31": "Ако завършите задача и загубите HP, когато не би трябвало, сте срещнали забавяне, докато сървърът синхронизира промените, направени на други платформи. Например, ако използвате злато, мана или загубите HP в мобилното приложение и след това завършите задача в уебсайта, сървърът просто потвърждава, че всичко е синхронизирано.",
|
||||
"faqQuestion32": "Кога мога да си избера клас?",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"resetAccPop": "Започнете отначало, премахвайки всички нива, злато, екипировка, история и задачи.",
|
||||
"deleteAccount": "Изтриване на профила",
|
||||
"deleteAccPop": "Изтрива и премахва Вашия профил в Хабитика.",
|
||||
"feedback": "Ако искате да ни изпратите отзивите си, моля, въведете ги по-долу. Ще се радваме да научим какво Ви е харесало, или пък не, в Хабитика! Не говорите английски добре? Няма проблем! Пишете на който искате език.",
|
||||
"feedback": "Ако искате да ни изпратите отзивите си, моля, въведете ги по-долу. Ще се радваме да чуем обратната ви връзка! Ще бде анонимно, освен ако не изберете да въведете контактите си. Не говорите английски добре? Няма проблем! Пишете ни на езика, който предпочитате.",
|
||||
"dataExport": "Изнасяне на данни",
|
||||
"saveData": "Ето няколко възможности за запазване на данните Ви.",
|
||||
"habitHistory": "История на навиците",
|
||||
@@ -157,5 +157,24 @@
|
||||
"changeUsernameDisclaimer": "Потребителското ви име се ползва за покани, @споменавания в чата и съобщения, трябва да е от 1 до 20 символа, да съдържа само буквите от a до z, цифрите от 0 до 9, тирета или долни черти и не може да съдържа неприлични думи.",
|
||||
"verifyUsernameVeteranPet": "Един от тези любимци-ветерани ще Ви чака след като приключите с потвърждението!",
|
||||
"subscriptionReminders": "Абонаментни Напомняния",
|
||||
"newPMNotificationTitle": "Ново съобщение от <%= name %>"
|
||||
"newPMNotificationTitle": "Ново съобщение от <%= name %>",
|
||||
"resetAccount": "Нулирай акаунт",
|
||||
"generalSettings": "Общи настройки",
|
||||
"taskSettings": "Настройки на Задачите",
|
||||
"confirmCancelChanges": "Сигурни ли сте? Ще загубите незапазените промени.",
|
||||
"account": "Акаунт",
|
||||
"loginMethods": "Методи за Влизане",
|
||||
"character": "Герой",
|
||||
"siteLanguage": "Език на сайта",
|
||||
"showLevelUpModal": "Когато вдигате ниво",
|
||||
"showHatchPetModal": "Когато излюпвате Любимец",
|
||||
"showRaisePetModal": "Когато отгледате Любимец до Оседлан Любимец",
|
||||
"baileyAnnouncement": "Най-новите вести на Бейли",
|
||||
"view": "Виж",
|
||||
"feedbackPlaceholder": "Добавете обратна връзка",
|
||||
"downloadCSV": "Изтеглете CSV",
|
||||
"yourUserData": "Вашите Потребителски Данни",
|
||||
"taskHistory": "История на Задачите",
|
||||
"yourUserDataDisclaimer": "Тук можете да изтеглите копие на историята на задачите си или пълните си потребителски данни.",
|
||||
"useridCopied": "Потребителският ID е копиран."
|
||||
}
|
||||
|
||||
@@ -164,5 +164,6 @@
|
||||
"achievementRodentRulerModalText": "Nasbíral jsi všechny hlodavce!",
|
||||
"achievementCatsText": "Vylíhly se všechny standardní barvy kočičích mazlíčků: gepard, lev, šavlozubý tygr a tygr!",
|
||||
"achievementRodentRuler": "Vládce hlodavců",
|
||||
"achievementCats": "Pasák koček"
|
||||
"achievementCats": "Pasák koček",
|
||||
"achievementDomesticated": "Hejá"
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
"backgroundTavernNotes": "Navštiv krčmu města Habitica.",
|
||||
"backgrounds102015": "Sada 17: zveřejněna v říjnu 2015",
|
||||
"backgroundHarvestMoonText": "Měsíc při sklizni",
|
||||
"backgroundHarvestMoonNotes": "Kdákání pod měsícem při sklizni.",
|
||||
"backgroundHarvestMoonNotes": "Chechtej se pod sklizňovým měsícem.",
|
||||
"backgroundSlimySwampText": "Slizká bažina",
|
||||
"backgroundSlimySwampNotes": "Přebroď se slizkou bažinou.",
|
||||
"backgroundSwarmingDarknessText": "Valící se temnota",
|
||||
@@ -213,7 +213,7 @@
|
||||
"backgroundStormyRooftopsNotes": "Propliž se přes bouřlivé střechy.",
|
||||
"backgroundWindyAutumnText": "Větrný podzim",
|
||||
"backgroundWindyAutumnNotes": "Hoň se za listy během větrného podzimu.",
|
||||
"incentiveBackgrounds": "Prosté pozadí",
|
||||
"incentiveBackgrounds": "Standardní pozadí",
|
||||
"backgroundVioletText": "Fialová",
|
||||
"backgroundVioletNotes": "Živá fialová tapeta.",
|
||||
"backgroundBlueText": "Modrá",
|
||||
@@ -736,7 +736,64 @@
|
||||
"backgroundMaskMakersWorkshopNotes": "Vyzkoušej novou tvář v maskářově dílně.",
|
||||
"backgroundCemeteryGateText": "Hřbitovní brána",
|
||||
"backgroundCemeteryGateNotes": "Straš u hřbitovní brány.",
|
||||
"backgroundAutumnBridgeText": "Podzimní most",
|
||||
"backgroundAutumnBridgeNotes": "Obdivuj krásu podzimního mostu.",
|
||||
"backgroundInsideACrystalText": "Uvnitř krystalu."
|
||||
"backgroundAutumnBridgeText": "Most na podzim",
|
||||
"backgroundAutumnBridgeNotes": "Obdivuj krásu mostu na podzim.",
|
||||
"backgroundInsideACrystalText": "Uvnitř krystalu",
|
||||
"backgrounds032023": "Sada 106: Zveřejněna v březnu 2023",
|
||||
"backgroundOldTimeyBasketballCourtText": "Retro basketbalové hřiště",
|
||||
"backgroundOldTimeyBasketballCourtNotes": "Zaházej si na koš na retro basketbalovém hřišti.",
|
||||
"backgroundJungleWateringHoleText": "Napajedlo v džungli",
|
||||
"backgroundJungleWateringHoleNotes": "Zastav se na doušek u džunglového napajedla.",
|
||||
"backgroundMangroveForestText": "Mangrovový les",
|
||||
"backgroundMangroveForestNotes": "Prozkoumej okraj mangrovového lesa.",
|
||||
"backgrounds052023": "Sada 108: Zveřejněna v květnu 2023",
|
||||
"backgroundInAPaintingText": "V obraze",
|
||||
"backgroundFlyingOverHedgeMazeText": "Let nad labyrintem ze živého plotu",
|
||||
"backgroundFlyingOverHedgeMazeNotes": "Žasněte při letu nad labyrintem ze živého plotu.",
|
||||
"backgroundCretaceousForestText": "Křídový les",
|
||||
"backgroundCretaceousForestNotes": "Vychutnejte si pradávnou zeleň křídového lesa.",
|
||||
"backgroundLeafyTreeTunnelNotes": "Procházejte se tunelem z listnatých stromů.",
|
||||
"backgroundSpringtimeShowerText": "Jarní přeháňka",
|
||||
"backgroundSpringtimeShowerNotes": "Podívejte se na květnatou jarní přeháňku.",
|
||||
"backgroundUnderWisteriaText": "Pod vistérií",
|
||||
"backgrounds022023": "SADA 105: Vydáno v únoru 2023",
|
||||
"backgroundInFrontOfFountainText": "Před Fontánou",
|
||||
"backgroundInFrontOfFountainNotes": "Procházej se před Fontánou.",
|
||||
"backgroundGoldenBirdcageText": "Zlatá klec",
|
||||
"backgroundGoldenBirdcageNotes": "Schovej se v zlaté kleci.",
|
||||
"backgroundFancyBedroomText": "Luxusní ložnice",
|
||||
"backgroundFancyBedroomNotes": "Dopřej si luxus v luxusní ložnici.",
|
||||
"backgrounds042023": "Sada 107: Zveřejněna v dubnu 2023",
|
||||
"backgroundLeafyTreeTunnelText": "Tunel z listnatých stromů",
|
||||
"backgroundUnderWisteriaNotes": "Odpočiňte si pod vistérií.",
|
||||
"backgroundInAPaintingNotes": "Užijte si kreativní činnosti uvnitř obrazu.",
|
||||
"backgrounds012023": "SADA 104: Vydáno v lednu 2023",
|
||||
"backgroundRimeIceText": "Jinovatka",
|
||||
"backgroundRimeIceNotes": "Pokochej se třpytivou jinovatkou.",
|
||||
"backgroundSnowyTempleText": "Zasněžený chrám",
|
||||
"backgroundSnowyTempleNotes": "Pokochej se klidným zasněženým chrámem.",
|
||||
"backgroundWinterLakeWithSwansText": "Zimní jezero s labutěmi",
|
||||
"backgroundWinterLakeWithSwansNotes": "Užij si přírodu u zimního jezera s labutěmi.",
|
||||
"backgrounds122022": "SADA 103: Vydáno v prosinci 2022",
|
||||
"backgroundBranchesOfAHolidayTreeText": "Větve svátečního stromku",
|
||||
"backgroundBranchesOfAHolidayTreeNotes": "Dováděj na větvích svátečního stromku.",
|
||||
"backgroundInsideACrystalNotes": "Vyhlédni z nitra krystalu.",
|
||||
"backgroundSnowyVillageText": "Zasněžená vesnice",
|
||||
"backgroundSnowyVillageNotes": "Pokochej se zasněženou vesnicí.",
|
||||
"backgrounds062023": "Sada 109: Zveřejněna v červnu 2023",
|
||||
"backgroundInAnAquariumText": "V akváriu",
|
||||
"backgroundInAnAquariumNotes": "Zaplavejte si poklidně s rybkami v akváriu.",
|
||||
"backgroundInsideAdventurersHideoutText": "V úkrytu dobrodruhů",
|
||||
"backgroundInsideAdventurersHideoutNotes": "Naplánujte cestu v úkrytu dobrodruhů.",
|
||||
"backgroundCraterLakeText": "Kráterové jezero",
|
||||
"backgroundCraterLakeNotes": "Obdivujte nádherné kráterové jezero.",
|
||||
"backgrounds072023": "Sada 110: Zveřejněna v červenci 2023",
|
||||
"backgroundOnAPaddlewheelBoatText": "Na loďce s lopatkovým kolem",
|
||||
"backgroundOnAPaddlewheelBoatNotes": "Projet se na loďce s lopatkovým kolem.",
|
||||
"backgroundColorfulCoralText": "Barevný korál",
|
||||
"backgroundColorfulCoralNotes": "Potopte se mezi barevné korály.",
|
||||
"backgrounds082023": "Sada 111: zveřejněaa v srpnu 2023",
|
||||
"backgroundBonsaiCollectionText": "Sbírka bonsají",
|
||||
"backgroundBoardwalkIntoSunsetNotes": "Vydejte se po Stezce do západu slunce.",
|
||||
"backgroundBoardwalkIntoSunsetText": "Stezka do západu slunce"
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
"battleGear": "Bojová výzbroj",
|
||||
"gear": "Výbava",
|
||||
"autoEquipBattleGear": "Automaticky použít nové vybavení",
|
||||
"costume": "Kostým",
|
||||
"costume": "kostým",
|
||||
"useCostume": "Použít kostým",
|
||||
"costumePopoverText": "Vyber \"Použít kostým\", abys vybavil svého avatara, aniž bys nějak ovlivnil statistiky tvé bojové výzbroje! To znamená, že můžeš obléct svého avatara do jakéhokoliv vybavení chceš a stále mít tvojí nejlepší bojovou výzbroj na sobě.",
|
||||
"autoEquipPopoverText": "Zvol tuto možnost pro automatické nasazení koupeného vybavení.",
|
||||
@@ -184,5 +184,6 @@
|
||||
"chatCastSpellUser": "<%= username %> použil/a <%= spell %> na <%= target %>.",
|
||||
"purchasePetItemConfirm": "Tento nákup by překročil počet položek, které potřebujete k vylíhnutí všech možných <%= itemText %> domácích zvířátek. Jsi si jistá?",
|
||||
"notEnoughGold": "Nedostatek zlaťáků.",
|
||||
"chatCastSpellPartyTimes": "<%= username %> použil/a <%= spell %> pro skupinu <%= times %> times."
|
||||
"chatCastSpellPartyTimes": "<%= username %> použil/a <%= spell %> pro skupinu <%= times %> times.",
|
||||
"pointsAvailable": "Dostupné body"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"stable": "Stáj",
|
||||
"stable": "Mazlíčci a Mounty",
|
||||
"pets": "Mazlíčci",
|
||||
"activePet": "Aktivní mazlíček",
|
||||
"noActivePet": "Bez aktivního mazlíčka",
|
||||
@@ -109,5 +109,7 @@
|
||||
"wackyPets": "Šílená zvířátka",
|
||||
"invalidAmount": "Neplatný počet jídla,je vyžadováno pozitivní celé číslo",
|
||||
"tooMuchFood": "Snažíš se dát svému zvířeti moc jídla, akce byla zrušena",
|
||||
"notEnoughFood": "Nemáš dost jídla"
|
||||
"notEnoughFood": "Nemáš dost jídla",
|
||||
"veteranCactus": "Kaktus Veterán",
|
||||
"veteranDragon": "Drak Veterán"
|
||||
}
|
||||
|
||||
@@ -160,5 +160,25 @@
|
||||
"newPMNotificationTitle": "Nová zpráva od <%= name %>",
|
||||
"displaynameIssueNewline": "Zobrazovaná jména nesmí obsahovat zpětné lomítko následované písmenem N.",
|
||||
"resetAccount": "Resetovat účet",
|
||||
"giftedSubscriptionWinterPromo": "Ahoj <%= username %>, získal/a jsi <%= monthCount %> měsíce/ů předplatného jako součást naší sváteční dárkové akce!"
|
||||
"giftedSubscriptionWinterPromo": "Ahoj <%= username %>, získal/a jsi <%= monthCount %> měsíce/ů předplatného jako součást naší sváteční dárkové akce!",
|
||||
"generalSettings": "Hlavní nastavení",
|
||||
"siteData": "Údaje o webu",
|
||||
"taskSettings": "Nastavení úkolu",
|
||||
"confirmCancelChanges": "Jste si jistí? Neuložené změny přijdou vniveč.",
|
||||
"account": "Účet",
|
||||
"loginMethods": "Možnosti přihlášení",
|
||||
"character": "Postava",
|
||||
"siteLanguage": "Jazyk webu",
|
||||
"showLevelUpModal": "Při dosažení vyšší úrovně",
|
||||
"showHatchPetModal": "Při odchovu zvířátka",
|
||||
"showRaisePetModal": "Jak z domácího mazlíčka vychovat jízdní zvíře",
|
||||
"showStreakModal": "Při dosažení úspěchu v sérii",
|
||||
"baileyAnnouncement": "Nejnovější oznámení společnosti Bailey",
|
||||
"view": "Zobrazit",
|
||||
"feedbackPlaceholder": "Vlož zpětnou vazbu",
|
||||
"downloadCSV": "Stáhni si CSV",
|
||||
"downloadAs": "Ulož jako",
|
||||
"yourUserData": "Tvá uživatelská data",
|
||||
"taskHistory": "Historie",
|
||||
"yourUserDataDisclaimer": "Zde si lze stáhnout výpis historie úkolů nebo kompletní uživatelská data."
|
||||
}
|
||||
|
||||
@@ -935,5 +935,11 @@
|
||||
"backgroundWaterfallWithRainbowText": "Wasserfall mit Regenbogen",
|
||||
"backgroundWaterfallWithRainbowNotes": "Bewundere die atemberaubende Schönheit eines Wasserfalls mit Regenbogen.",
|
||||
"backgrounds042026": "SET 143: Veröffentlicht im April 2026",
|
||||
"backgrounds052026": "SET 144: Veröffentlicht im Mai 2026"
|
||||
"backgrounds052026": "SET 144: Veröffentlicht im Mai 2026",
|
||||
"backgroundRidingACometText": "Ein Kometenritt",
|
||||
"backgroundRidingACometNotes": "Reise durch das All bei einem Kometenritt!",
|
||||
"backgroundElvenCitadelText": "Elven Citadel",
|
||||
"backgroundElvenCitadelNotes": "Unternehmen Sie die malerische Reise zu einer Elfenzitadelle.",
|
||||
"backgroundOnAStrangePlanetNotes": "Wage dich dorthin, wo noch kein Habitican gewesen ist: Auf einem fremden Planeten.",
|
||||
"backgroundOnAStrangePlanetText": "un eine strange planete"
|
||||
}
|
||||
|
||||
@@ -410,5 +410,6 @@
|
||||
"questEggPlatypusText": "Schnabeltier",
|
||||
"questEggPlatypusMountText": "Schnabeltier",
|
||||
"questEggPlatypusAdjective": "ein Perfektionist",
|
||||
"hatchingPotionOpal": "Opal"
|
||||
"hatchingPotionOpal": "Opal",
|
||||
"hatchingPotionAlien": "Außerirdischer"
|
||||
}
|
||||
|
||||
@@ -187,5 +187,7 @@
|
||||
"minPasswordLengthLogin": "Dein Passwort ist mindestens 8 Zeichen lang.",
|
||||
"enterValidEmail": "Bitte gib eine gültige E-Mail-Adresse ein.",
|
||||
"whatToCallYou": "Wie sollen wir dich nennen?",
|
||||
"acceptPrivacyTOS": "Du bestätigst, dass du mindestens 18 Jahre alt bist und dass du unsere <a href='/static/terms' target='_blank'>Nutzungsbedingungen</a> und <a href='/static/privacy' target='_blank'>Datenschutz-Bestimmungen</a> gelesen hast und akzeptierst"
|
||||
"acceptPrivacyTOS": "Du bestätigst, dass du mindestens 18 Jahre alt bist und dass du unsere <a href='/static/terms' target='_blank'>Nutzungsbedingungen</a> und <a href='/static/privacy' target='_blank'>Datenschutz-Bestimmungen</a> gelesen hast und akzeptierst",
|
||||
"emailAddress": "E-Mail_adresse",
|
||||
"emailRequiredForSupport": "Wir benötigen eine E-Mail-Adresse für den Benutzersupport. Bitte geben Sie eine E-Mail-Adresse ein, um mit der Erstellung Ihres Kontos fortzufahren."
|
||||
}
|
||||
|
||||
@@ -3484,7 +3484,7 @@
|
||||
"shieldSpecialWinter2026WarriorText": "Raureif Schild",
|
||||
"shieldSpecialWinter2026WarriorNotes": "Stoppe eiskalt Hindernisse mit diesem praktischen, pieksigen Schild. Erhöht Ausdauer um %= con %>. Limitierte Ausgabe Winterausrüstung 2025-2026.",
|
||||
"headMystery202602Text": "Kirschblüte Fuchsohren",
|
||||
"headMystery202602Notes": " Diese Ohren schärfen dein Gehör so sehr, dass du im nahenden Frühling das Wachsen der Blütenknospen an den Zweigen der Bäume hören kannst. Gewährt keinen Attributbonus. Februar 2026 Abonnentengegenstand.",
|
||||
"headMystery202602Notes": "Diese Ohren schärfen dein Gehör so sehr, dass du im nahenden Frühling das Wachsen der Blütenknospen an den Zweigen der Bäume hören kannst. Gewährt keinen Attributbonus. Februar 2026 Abonnentengegenstand.",
|
||||
"headArmoireLoneCowpokeHatNotes": "Howdy Kumpel! Hasst du’s auch so, wenn du draußen auf dem Schießstand bist, an Aufgaben arbeitest und dir die Sonne in die Augen scheint? Also, gute Sache, dass du dafür jetzt ’nen Hut hast. Erhöht deine Wahrnehmung um <%= per %>. Verzauberter Schrank: Einsamer Cowboy Set (Item 1 of 2)",
|
||||
"shieldSpecialWinter2026HealerText": "Sternenexplosion",
|
||||
"shieldArmoireDoubleBassNotes": "Bom doo bom brrrr brr brr brrrr! Versammle deine Party, um euch zu erden oder zu tanzen, während ihr euch Musik von dieser tiefen Double Bass anhört. Erhört Ausdauer und Stärke um jeweils <%= attrs %>. Verzauberter Schwank: Musikinstrumente Set 2 (Gegenstand 3 von 3)",
|
||||
@@ -3497,5 +3497,9 @@
|
||||
"backMystery202602Notes": "Diese flauschigen Schweife haben die Farbe der Kirschblüte, eine Erinnerung, dass der Frühling auf dem Weg ist. Gewährt keinen Autobusbonus. Februar 2026 Abonnentengegenstand.",
|
||||
"backArmoireHarpsichordText": "Cembalo",
|
||||
"weaponSpecialSpring2026HealerText": "Schneeglöckchen Stab",
|
||||
"weaponSpecialSpring2026HealerNotes": "Eine Gelegenheit für einen Neuanfang liegt direkt vor dir, und mit diesem prächtigen Stab wirst du bereit sein! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Frühlingsausrüstung 2026."
|
||||
"weaponSpecialSpring2026HealerNotes": "Eine Gelegenheit für einen Neuanfang liegt direkt vor dir, und mit diesem prächtigen Stab wirst du bereit sein! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe Frühlingsausrüstung 2026.",
|
||||
"armorSpecialSpring2026WarriorText": "Froschrüstung",
|
||||
"armorSpecialSpring2026WarriorNotes": "Hüpf in Aktion, sobald der Schnee taut. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe Frühlingsausrüstung 2026.",
|
||||
"armorSpecialSpring2026RogueText": "Birkenrinde Rüstung",
|
||||
"armorSpecialSpring2026RogueNotes": "Trotze dem unvermeidlichen Frühlingsregen ebenso wie leichten Brisen. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe Frühlingsausrüstung 2026."
|
||||
}
|
||||
|
||||
@@ -243,5 +243,7 @@
|
||||
"newMessage": "Neue Nachricht",
|
||||
"rememberToBeKind": "Bitte sei freundlich, respektvoll, und folge den <a href='/static/community-guidelines' target='_blank'>Community-Richtlinien</a>.",
|
||||
"gem": "Edelstein",
|
||||
"confirmPurchase": "Kauf bestätigen"
|
||||
"confirmPurchase": "Kauf bestätigen",
|
||||
"avoidSPI": "vermeiden SPI",
|
||||
"avoidSPIDetails": "Zu Ihrer Privatsphäre vermeiden Sie es, <%= firstLink %>sensible persönliche Informationen<%= linkClose %> (SPI) beim Verwenden von Habitica anzugeben. Ihre Kontodaten, einschließlich Aufgaben, werden auf unseren Servern gespeichert, sodass Sie von jedem Gerät aus darauf zugreifen können.<br><br>Um mehr zu erfahren, lesen Sie unsere <%= secondLink %>Datenschutzerklärung<%= linkClose %>."
|
||||
}
|
||||
|
||||
@@ -270,14 +270,14 @@
|
||||
"winter2025StringLightsHealerSet": "Lichterketten Heiler Set",
|
||||
"winter2025SnowRogueSet": "Schneeschurken Set",
|
||||
"winter2025MooseWarriorSet": "Elchkrieger Set",
|
||||
"winter2025AuroraMageSet": "Aurora Magier Set",
|
||||
"spring2025PlumeriaHealerSet": "Plumeria Heiler Set",
|
||||
"spring2025MantisMageSet": "Fangschrecken Magier Set",
|
||||
"winter2025AuroraMageSet": "Aurora Set (Mage)",
|
||||
"spring2025PlumeriaHealerSet": "Plumeria Set (Healer)",
|
||||
"spring2025MantisMageSet": "Fangschrecken-Set (Magier)",
|
||||
"spring2025SunshineWarriorSet": "Sonnenschein Krieger Set",
|
||||
"spring2025CrystalPointRogueSet": "Kristallspitzen Schurken Set",
|
||||
"summer2025ScallopWarriorSet": "Jakobsmuschel Krieger Set",
|
||||
"summer2025SquidRogueSet": "Tintenfisch Schurken Set",
|
||||
"summer2025SeaAngelHealerSet": "Ruderschnecken Heiler Set",
|
||||
"summer2025ScallopWarriorSet": "Jakobsmuschel-Set (Krieger)",
|
||||
"summer2025SquidRogueSet": "Tintenfisch-Set (Schurken)",
|
||||
"summer2025SeaAngelHealerSet": "Ruderschnecken-Set (Heiler)",
|
||||
"summer2025FairyWrasseMageSet": "Feenlippfisch Magier Set",
|
||||
"fall2025SasquatchWarriorSet": "Sasquatch Krieger Set",
|
||||
"fall2025SkeletonRogueSet": "Skelett Schurken Set",
|
||||
@@ -289,5 +289,6 @@
|
||||
"winter2026MidwinterCandleMageSet": "Mittwinterkerzen Magier Set",
|
||||
"spring2026FrogWarriorSet": "Frosch Set (Krieger)",
|
||||
"spring2026SnowdropHealerSet": "Schneeglöckchen Set (Heiler)",
|
||||
"spring2026MaypoleMageSet": "Maibaum Set (Magier)"
|
||||
"spring2026MaypoleMageSet": "Maibaum Set (Magier)",
|
||||
"spring2026BranchRogueSet": "Fruling Ast Set (Schurke)"
|
||||
}
|
||||
|
||||
@@ -189,7 +189,7 @@
|
||||
"questTRexUndeadBoss": "Skelettierter Tyrannosaurus",
|
||||
"questTRexUndeadRageTitle": "Knöcherne Heilung",
|
||||
"questTRexUndeadRageDescription": "Diese Leiste füllt sich, wenn Du Deine Tagesaufgaben nicht erfüllst. Wenn sie voll ist, heilt sich der skelettierte Tyrannosaurus um 30% seiner übrigen Lebenspunkte!",
|
||||
"questTRexUndeadRageEffect": "'Der Skelettierte Tyrannosaurus benutzt KNÖCHERNE HEILUNG!'\n\nDas Monster lässt ein furchtbares Brüllen ertönen und einige seiner gesplitterten Knochen setzen sich wieder zusammen!",
|
||||
"questTRexUndeadRageEffect": "Skeletal Tyrannosaur uses SKELETON HEALING!\n\nThe monster lets forth an unearthly roar, and some of its damaged bones knit back together!\n\nDas Monster lässt ein furchtbares Brüllen ertönen und einige seiner gesplitterten Knochen setzen sich wieder zusammen!",
|
||||
"questTRexDropTRexEgg": "Tyrannosaurus (Ei)",
|
||||
"questTRexUnlockText": "Schaltet den Kauf von Tyrannosauruseiern auf dem Marktplatz frei",
|
||||
"questRockText": "Entkomme dem Höhlenungetüm",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"rebirthNew": "Wiedergeburt: Ein neues Abenteuer erwartet Dich!",
|
||||
"rebirthUnlock": "Du hast die Wiedergeburt freigeschaltet! Dieser besondere Gegenstand gestattet es Dir ein neues Spiel mit Level 1 zu beginnen, jedoch behältst Du Deine Aufgaben, Erfolge, Haustiere und mehr. Verwende den Gegenstand um Habitica neues Leben einzuhauchen wenn Du glaubst alles erreicht zu haben, oder um neue Features aus dem Blickwinkel eines Anfängers zu erleben!",
|
||||
"rebirthAchievement": "Du hast ein neues Abenteuer begonnen! Das ist Deine <%= number %>. Wiedergeburt. Dein höchstes jemals erreichtes Level ist <%= level %>. Um diesen Erfolg zu stapeln, beginne Dein nächstes Abenteuer wenn Du ein noch höheres Level erreicht hast!",
|
||||
"rebirthAchievement": "Du hast ube die Orb of Rebirth <strong><%+numer%<>/Strong> ohr und höchste Ebene ist <strong><%=",
|
||||
"rebirthAchievement100": "Du hast ein neues Abenteuer begonnen! Das ist Deine <%= number %>. Wiedergeburt. Dein höchstes jemals erreichtes Level ist 100 oder mehr. Um diesen Erfolg zu stapeln, beginne Dein nächstes Abenteuer wenn Du mindestens Level 100 erreicht hast!",
|
||||
"rebirthBegan": "Hat ein neues Abenteuer begonnen",
|
||||
"rebirthText": "Hat <%= rebirths %> neue Abenteuer begonnen",
|
||||
@@ -11,5 +11,12 @@
|
||||
"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.",
|
||||
"rebirthName": "Sphäre der Wiedergeburt",
|
||||
"rebirthComplete": "Du wurdest wiedergeboren!",
|
||||
"nextFreeRebirth": "<strong><%= days %> Tage</strong> bis zur <strong>KOSTENLOSEN</strong> Sphäre der Wiedergeburt"
|
||||
"nextFreeRebirth": "<strong><%= days %> Tage</strong> bis zur <strong>KOSTENLOSEN</strong> Sphäre der Wiedergeburt",
|
||||
"rebirthUnlockedNewItem": "Ort der Wiedergeburt Freigeschaltet",
|
||||
"rebirthUnlockedOrb": "Ein neues Abenteuer ist verfügbar!",
|
||||
"rebirthUnlockedDesc": "Nutze den Ort der Wiedergeburt um ein neues Leben in dein Habitica Abendteuer zu bekommen wenn du das Gefühl hast, alles erreicht zu haben. Du beginnst wieder bei Level 1 und es beginnt wieder von vorne.",
|
||||
"rebirthNewAchievement": "Neue Auszeichnung",
|
||||
"rebirthNewAdventure": "Ein neues Abenteuer beginnt nun!",
|
||||
"rebirthStackInfo": "Diese Auszeichnung kann sich stapeln, jedes Mal, wenn du den Ort der Wiedergeburt nutzt.",
|
||||
"rebirthAchievementPlural": "Du hast ube die Orb of Rebirth <strong><%+numer%<>/Strong> ohr und höchste Ebene ist <strong><%="
|
||||
}
|
||||
|
||||
@@ -274,5 +274,8 @@
|
||||
"mysterySet202601": "Winter-Ägide set",
|
||||
"subscriptionBillingFYI": "Abos verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Du kannst dein Abo in den Einstellungen unter „Abonnement“ verwalten. Die Abbuchung von deinem Konto erfolgt innerhalb von 24 Stunden nach dem Verlängerungsdatum zum gleichen Preis wie bei der ersten Abbuchung.",
|
||||
"subscriptionBillingFYIShort": "Abos verlängern sich automatisch, sofern du sie nicht mindestens 24 Stunden vor Ablauf des aktuellen Zeitraums kündigst. Die Abbuchung von deinem Konto erfolgt innerhalb von 24 Stunden nach dem Verlängerungsdatum zum gleichen Preis wie bei der ersten Abbuchung.",
|
||||
"mysterySet202602": "Sakura Fuchs Set"
|
||||
"mysterySet202602": "Sakura Fuchs Set",
|
||||
"mysterySet202603": "Glyzinie Hexa Satze",
|
||||
"mysterySet202604": "Kuhn Weltraumerkunder Set",
|
||||
"mysterySet202605": "Nachtfall Nimbus Set"
|
||||
}
|
||||
|
||||
@@ -1075,6 +1075,18 @@
|
||||
"backgroundElvenCitadelText": "Elven Citadel",
|
||||
"backgroundElvenCitadelNotes": "Take the scenic journey to an Elven Citadel.",
|
||||
|
||||
"backgrounds062026": "SET 145: Released June 2026",
|
||||
"backgroundBeachWithVolcanoText": "Beach with Volcano",
|
||||
"backgroundBeachWithVolcanoNotes": "Watch nature's wonder on a Beach with a Volcano.",
|
||||
|
||||
"backgrounds072026": "SET 146: Released July 2026",
|
||||
"backgroundTropicalCoralGardenText": "Tropical Coral Garden",
|
||||
"backgroundTropicalCoralGardenNotes": "Dive into a Tropical Coral Garden.",
|
||||
|
||||
"backgrounds082026": "SET 147: Released August 2026",
|
||||
"backgroundVegetableGardenText": "Vegetable Garden",
|
||||
"backgroundVegetableGardenNotes": "Plant tasty greens in a Vegetable Garden.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <a href='https://habitica.com/static/community-guidelines' target='_blank'>Community Guidelines</a> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= hrefBlankCommunityManagerEmail %>!",
|
||||
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <%= linkOpen %>Community Guidelines<%= linkClose %> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= adminEmail %>!",
|
||||
"profile": "Profile",
|
||||
"avatar": "Customize Avatar",
|
||||
"editAvatar": "Customize Avatar",
|
||||
@@ -65,7 +65,7 @@
|
||||
"costumeDisabled": "You have disabled your costume.",
|
||||
"gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:",
|
||||
"gearAchievementNotification": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class!",
|
||||
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <a href='/user/settings/site' target='_blank'>the Settings > Site page</a> and buy your new class's gear!",
|
||||
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <%= linkOpen %>the Settings > Site page<%= linkClose %> and buy your new class's gear!",
|
||||
"armoireUnlocked": "For more equipment, check out the <strong>Enchanted Armoire!</strong> Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.",
|
||||
"ultimGearName": "Ultimate Gear - <%= ultClass %>",
|
||||
"ultimGearText": "Has upgraded to the maximum weapon and armor set for the <%= ultClass %> class.",
|
||||
@@ -87,7 +87,7 @@
|
||||
"allocatePerPop": "Add a Point to Perception",
|
||||
"allocateInt": "Points allocated to Intelligence:",
|
||||
"allocateIntPop": "Add a Point to Intelligence",
|
||||
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <a href='/shops/market'>Orb of Rebirth</a>.",
|
||||
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <%= linkOpen %>Orb of Rebirth<%= linkClose %>.",
|
||||
"stats": "Stats",
|
||||
"strength": "Strength",
|
||||
"strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.",
|
||||
@@ -139,7 +139,7 @@
|
||||
"optOutOfClasses": "Opt Out",
|
||||
"chooseClass": "Choose your Class",
|
||||
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](/static/faq#what-classes)",
|
||||
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <a href='/static/faq#what-classes' target='_blank'>our FAQ</a> and visit Settings to enable the Class System when you're ready.",
|
||||
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <%= linkOpen %>our FAQ<%= linkClose %> and visit Settings to enable the Class System when you're ready.",
|
||||
"selectClass": "Select <%= heroClass %>",
|
||||
"select": "Select",
|
||||
"stealth": "Stealth",
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
|
||||
"commGuideList01A": "Our Guidelines and Terms of Service apply in Challenges, Parties, player profiles, and private messages.",
|
||||
"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 or meme. 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.",
|
||||
"commGuideList02N": "<strong>Report anything you see that breaks these Guidelines or our Terms of Service</strong>. You can report a message directly or notify staff via <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> for violations in profiles or Challenges. We will handle them as quickly as possible. You may contact us in your native language if that is easier for you: we may have to use Google Translate, but we want you to feel comfortable about contacting us if you have a problem.",
|
||||
"commGuideList02N": "<strong>Report anything you see that breaks these Guidelines or our Terms of Service</strong>. You can report a message directly or notify staff via <%= adminEmail %> for violations in profiles or Challenges. We will handle them as quickly as possible. You may contact us in your native language if that is easier for you: we may have to use Google Translate, but we want you to feel comfortable about contacting us if you have a problem.",
|
||||
"commGuideList02H": "<strong>All Display Names and @usernames must comply with the Terms of Service</strong>. To change your Display Name and/or @username: on mobile go to Menu > Settings > Account. On web, go to Settings from the user icon in the top navigation.",
|
||||
"commGuideList02A": "<strong>Respect each other</strong>. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences.",
|
||||
"commGuideList02I": "<strong>Challenge names should be appropriate for all spaces, as they will appear in the winner's public profile</strong>. Keep this in mind when creating Challenges as we may be forced to edit the record on their profile if there is a report.",
|
||||
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> to contact our community manager.",
|
||||
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <%= adminEmail %> to contact our community manager.",
|
||||
"commGuideList02D": "<strong>Be mindful that Habiticans are of all ages and backgrounds</strong>. Challenges and player profiles should not mention adult topics, use profanity, or promote contention or conflict.",
|
||||
"commGuideList02E": "<strong>If a staff member tells you that a term is disallowed on Habitica, even if it is a term that you did not realize was problematic, that decision is final.</strong> Additionally, slurs will be dealt with very severely, as they are also a violation of the Terms of Service.",
|
||||
"commGuideList02O": "<strong>Parties may create their own chat rules for members’ comfort and preferences</strong>. However, the admins cannot enforce chat rules in these private spaces unless there is a breach of the Terms of Service, including harassment. If someone in your Party is causing issues, we encourage the Party leader to remove them.",
|
||||
@@ -24,7 +24,7 @@
|
||||
"commGuideList02P": "<strong>We discourage the sending of unsolicited private messages</strong>. If you receive an unwanted message that makes you uncomfortable or that breaks these Guidelines or the Terms of Service, please block the sender and report it to bring it to Staff attention.",
|
||||
"commGuideList02Q": "<strong>Do not try to get around a block</strong>. If someone has blocked you from sending them private messages, do not contact them elsewhere to ask them to unblock you.",
|
||||
"commGuideList02M": "<strong>Do not ask or beg for Gems, subscriptions, or membership in Group Plans</strong>. If you see or receive unwanted messages asking for paid items, please report them. Repeated Gem or subscription begging, especially after a warning, may result in an account ban.",
|
||||
"commGuideList02L": "<strong>We highly discourage the exchange of personal information--particularly information that can be used to identify you</strong>. Identifying information can include but is not limited to: your address, your email, and your password or API token. If you are asked for personal information in a Party chat or private message, we highly recommend that you do not respond, and alert the Staff by either reporting the message or contacting <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> with screenshots of the messages if more context is needed.",
|
||||
"commGuideList02L": "<strong>We highly discourage the exchange of personal information--particularly information that can be used to identify you</strong>. Identifying information can include but is not limited to: your address, your email, and your password or API token. If you are asked for personal information in a Party chat or private message, we highly recommend that you do not respond, and alert the Staff by either reporting the message or contacting <%= adminEmail %> with screenshots of the messages if more context is needed.",
|
||||
"commGuideList02J": "<strong>Do not spam</strong>. Spamming may include, but is not limited to: sending multiple unsolicited private messages, sending nonsensical messages, sending multiple promotional messages about a Party or Challenge, or creating multiple similar or low quality Challenges in a row. Staff has discretion to determine what messages are considered spamming.",
|
||||
"commGuideList02K": "<strong>Do not send links without explanation or context</strong>. If players clicking on a link will result in any benefit to you, you need to disclose that. This applies in messages as well as Challenges.",
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"commGuideHeadingModerateInfractions": "Moderate Infractions",
|
||||
"commGuidePara054": "These infractions will have moderate consequences. When in conjunction with multiple infractions, the consequences may grow more severe.",
|
||||
"commGuidePara055": "The following are some examples of Moderate Infractions. This is not a comprehensive list.",
|
||||
"commGuideList06A": "Ignoring, disrespecting or arguing with Staff. If you are concerned about one of the rules or the behavior of the staff, please contact us at <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>.",
|
||||
"commGuideList06A": "Ignoring, disrespecting or arguing with Staff. If you are concerned about one of the rules or the behavior of the staff, please contact us at <%= adminEmail %>.",
|
||||
"commGuideList06C": "Intentionally flagging innocent Challenges, profiles, or messages.",
|
||||
"commGuideList06E": "Repeatedly Committing Minor Infractions",
|
||||
|
||||
@@ -79,8 +79,7 @@
|
||||
|
||||
"commGuideHeadingRestoration": "Restoration",
|
||||
"commGuidePara061": "Habitica is devoted to self-improvement, and we believe in second chances. <strong>If you commit an infraction and receive a consequence, view it as a chance to evaluate your actions and strive to be a better member of the community</strong>.",
|
||||
"commGuidePara062": "<strong>If you wish to ask questions about your infraction or consequences, apologize, or make a plea for reinstatement, please contact us at <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> with your User ID or @username</strong>. It is <strong>your</strong> responsibility to reach out.",
|
||||
"commGuidePara063": "If you do not understand your consequences or the nature of your infraction, or if you have other questions related to the matter, you can contact the staff to discuss it at <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a>. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.",
|
||||
"commGuidePara063": "If you do not understand your consequences or the nature of your infraction, or if you have other questions related to the matter, you can contact the staff to discuss it at <%= adminEmail %>. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.",
|
||||
|
||||
"commGuideHeadingMeet": "Meet the Staff",
|
||||
"commGuidePara007": "The Habitica Staff keep the app and sites running and can act as chat moderators. They have purple tags marked with crowns. Their title is \"Heroic\".",
|
||||
@@ -94,13 +93,12 @@
|
||||
"commGuidePara014": "Staff and Moderators Emeritus:",
|
||||
|
||||
"commGuideHeadingFinal": "The Final Section",
|
||||
"commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some EXP for reading it all. If you have any questions or concerns about these Community Guidelines, please reach out to us via <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> and we will be happy to help clarify things.",
|
||||
"commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some EXP for reading it all. If you have any questions or concerns about these Community Guidelines, please reach out to us via <%= adminEmail %> and we will be happy to help clarify things.",
|
||||
"commGuidePara068": "Now go forth, brave adventurer, and slay some Dailies!",
|
||||
|
||||
"commGuideHeadingLinks": "Useful Links",
|
||||
"commGuideLink02": "<a href='https://habitica.fandom.com/wiki/Habitica_Wiki' target='_blank'>The Wiki</a>: the biggest collection of information about Habitica. Note that this space is unofficial, being hosted by Fandom and maintained by players.",
|
||||
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: for helping with code!",
|
||||
"commGuideLink04": "<a href='https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link' target='_blank'>The Feedback Form</a>: for site and app feature requests.",
|
||||
"commGuideLink03": "<%= linkOpen %>GitHub<%= linkClose %>: for helping with code!",
|
||||
"commGuideLink04": "<%= linkOpen %>The Feedback Form<%= linkClose %>: for site and app feature requests.",
|
||||
|
||||
"commGuidePara069": "The following talented artists contributed to these illustrations:"
|
||||
}
|
||||
|
||||
@@ -45,5 +45,5 @@
|
||||
"surveysSingle": "Helped Habitica grow, either by filling out a survey or helping with a major testing effort. Thank you!",
|
||||
"surveysMultiple": "Helped Habitica grow on <%= count %> occasions, either by filling out a survey or helping with a major testing effort. Thank you!",
|
||||
"blurbHallPatrons": "This is the Hall of Patrons, where we honor the noble adventurers who backed Habitica's original Kickstarter. We thank them for helping us bring Habitica to life!",
|
||||
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards' target='_blank'>Gems, exclusive Equipment</a>, and <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers' target='_blank'>prestigious titles</a>. You can contribute to Habitica, too! <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica' target='_blank'>Find out more here.</a>"
|
||||
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <%= linkRewards %>Gems, exclusive Equipment<%= linkClose %>, and <%= linkTiers %>prestigious titles<%= linkClose %>. You can contribute to Habitica, too! <%= linkContributing %>Find out more here<%= linkClose %>."
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@
|
||||
"800ed0": "Purple",
|
||||
"915533": "Skin Tone 1",
|
||||
"98461a": "Skin Tone 6",
|
||||
"allCustomizationsOwned": "You own all of these items. You can try them on by <a href=''>customizing your avatar</a>.",
|
||||
"allEquipmentOwned": "You own all of these items. You can find them in your <a href='/inventory/equipment'>Equipment</a>. Be sure to check back later for next month's options!",
|
||||
"allCustomizationsOwned": "You own all of these items. You can try them on by <%= linkOpen %>customizing your avatar<%= linkClose %>.",
|
||||
"allEquipmentOwned": "You own all of these items. You can find them in your <%= linkOpen %>Equipment<%= linkClose %>. Be sure to check back later for next month's options!",
|
||||
"aurora": "Aurora",
|
||||
"bear": "Bear",
|
||||
"black": "Black",
|
||||
@@ -154,7 +154,7 @@
|
||||
"tropicalwater": "Tropical Water",
|
||||
"TRUred": "Crimson",
|
||||
"updo": "Updo",
|
||||
"visitCustomizationsShop": "Head over to the <a href='/shops/customizations'>Customizations Shop</a> to browse the many ways you can customize your avatar!",
|
||||
"visitCustomizationsShop": "Head over to the <%= linkOpen %>Customizations Shop<%= linkClose %> to browse the many ways you can customize your avatar!",
|
||||
"wavyLong": "Wavy Long",
|
||||
"wavyShort": "Wavy Short",
|
||||
"white": "White",
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"dontDespair": "Don't despair!",
|
||||
"deathPenaltyDetails": "You lost a Level, your Gold, and a piece of Equipment, but you can get them all back with hard work! Good luck--you'll do great.",
|
||||
"refillHealthTryAgain": "Refill Health & Try Again",
|
||||
"dyingOftenTips": "Is this happening often? <a href='/static/faq#prevent-damage' target='_blank'>Here are some tips!</a>",
|
||||
"dyingOftenTips": "Is this happening often? <%= linkOpen %>Here are some tips!<%= linkClose %>",
|
||||
"losingHealthWarning": "Careful - You're Losing Health!",
|
||||
"losingHealthWarning2": "Don't let your Health drop to zero! If you do, you'll lose a level, your Gold, and a piece of equipment.",
|
||||
"toRegainHealth": "To regain Health:",
|
||||
|
||||
@@ -185,7 +185,7 @@
|
||||
"sunsetFaqHeader8": "How does this affect Habitica contributors?",
|
||||
"sunsetFaqPara12": "As an open-source project, we welcome and encourage many types of contributions. To show our appreciation we will be sending the Heroic gear set to everyone that has a contributor tier as of <strong>August 1, 2023</strong>. When Tavern and Guild services end, there will be some changes to contributions as well. You can read more about the plan for each type below.",
|
||||
"sunsetFaqPara13": "<strong>Blacksmiths</strong><br />We still welcome open-source help through our GitHub and will continue awarding tiers for qualifying contributions. Blacksmith collaboration and discussion has largely taken place over GitHub and that will continue.",
|
||||
"sunsetFaqPara14": "<strong>Linguists</strong><br />We continue to welcome help with translating the apps and website and will still be awarding contributor tiers for qualifying contributions. However, the method with which we accept translations will be changing. We’d like to focus our resources on supporting a set selection of languages across all platforms. To do this, we will be reducing the amount of languages available for translation. Previously unfinished languages will be archived in Github. We hope this change will make the cross platform Habitica experience more consistent. You can read our most up to date translation procedure guidelines on our <a href='https://translate.habitica.com/projects/habitica/#information'>translation website</a>.",
|
||||
"sunsetFaqPara14": "<strong>Linguists</strong><br />We continue to welcome help with translating the apps and website and will still be awarding contributor tiers for qualifying contributions. However, the method with which we accept translations will be changing. We’d like to focus our resources on supporting a set selection of languages across all platforms. To do this, we will be reducing the amount of languages available for translation. Previously unfinished languages will be archived in Github. We hope this change will make the cross platform Habitica experience more consistent. You can read our most up to date translation procedure guidelines on our <%= linkOpen %>translation website<%= linkClose %>.",
|
||||
"sunsetFaqPara15": "<strong>Challengers</strong><br />The team encourages you to continue creating high quality Challenges. We would like to explore new ways of promoting Challenge discoverability in and outside of the app.",
|
||||
"sunsetFaqPara16": "<strong>Socialites</strong><br />This type of contribution will be ending with the Tavern and Guild discontinuation. We are extremely grateful for the work that our friendly and helpful players have done answering questions in our chat spaces.",
|
||||
"sunsetFaqPara17": "<strong>Comrades</strong><br />Scripts and add-ons are helpful to a shrinking section of our user base as the mobile apps increasingly become the only way that most users access Habitica. Contributors wishing to create 3rd party tools to customize their Habitica experience can continue doing so, but we will no longer be awarding Comrade tiers as we focus on contributions that enhance Habitica in a way that is accessible to our player base as a whole.",
|
||||
@@ -199,9 +199,9 @@
|
||||
"sunsetFaqList7": "Currently many Challenges have tasks that require posts in Habitica’s public chat spaces. Creators of those Challenges can adapt their tasks or move the chat requirement to posting on an outside service.",
|
||||
|
||||
"sunsetFaqHeader10": "Where will players go when they have questions about how to use Habitica?",
|
||||
"sunsetFaqList8": "Our existing <a href='https://habitica.com/static/faq'>FAQ</a> is a great resource and can be found from the Help menu, or Support on mobile. We are in the process of creating a more comprehensive and improved FAQ to help guide players moving forward.",
|
||||
"sunsetFaqList9": "This <a href='https://habitica.wordpress.com/beginning-adventurers-guide/'>blog post</a> also provides a handy guide for new players.",
|
||||
"sunsetFaqList10": "Players are also encouraged to email <a href='mailto:admin@habitica.com'>admin@habitica.com</a> with any questions for which they cannot find answers in the above links.",
|
||||
"sunsetFaqList8": "Our existing <%= linkOpen %>FAQ<%= linkClose %> is a great resource and can be found from the Help menu, or Support on mobile. We are in the process of creating a more comprehensive and improved FAQ to help guide players moving forward.",
|
||||
"sunsetFaqList9": "This <%= linkOpen %>blog post<%= linkClose %> also provides a handy guide for new players.",
|
||||
"sunsetFaqList10": "Players are also encouraged to email <%= adminEmail %> with any questions for which they cannot find answers in the above links.",
|
||||
|
||||
"sunsetFaqHeader11": "How does this affect Habitica’s Community Guidelines and Terms of Service?",
|
||||
"sunsetFaqPara20": "Habitica’s Community Guidelines will be updated at the time Tavern and Guild service is discontinued. They will reflect that community rules for conduct are now in relation to player profiles, Challenges, and messages in private spaces. Our Terms of Service have always applied to both public and private spaces and do not require an immediate update in regard to this change.",
|
||||
@@ -210,7 +210,7 @@
|
||||
"sunsetFaqPara21": "Gems in the Guild Bank will be refunded to the leader of the Guild on August 8th when Guild Services end.",
|
||||
|
||||
"anotherQuestion": "Have another question?",
|
||||
"contactAdmin": "Contact <a href='mailto:admin@habitica.com'>admin@habitica.com</a>",
|
||||
"contactAdmin": "Contact <%= adminEmail %>",
|
||||
|
||||
"contentReleaseChanges": "Content Release Changes",
|
||||
"contentFaqTitle": "Habitica Content Release Change FAQ",
|
||||
|
||||
@@ -123,8 +123,8 @@
|
||||
"emailTaken": "Email address is already used in an account.",
|
||||
"newEmailRequired": "Missing new email address.",
|
||||
"usernameTime": "It's time to set your username!",
|
||||
"usernameInfo": "Login names are now unique usernames that will be visible beside your display name and used for invitations, chat @mentions, and messaging.<br><br>If you'd like to learn more about this change, <a href='https://habitica.fandom.com/wiki/Player_Names' target='_blank'>visit our wiki</a>.",
|
||||
"usernameTOSRequirements": "Usernames must conform to our <a href='/static/terms' target='_blank'>Terms of Service</a> and <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>. If you didn’t previously set a login name, your username was auto-generated.",
|
||||
"usernameInfo": "Login names are now unique usernames that will be visible beside your display name and used for invitations, chat @mentions, and messaging.<br><br>If you'd like to learn more about this change, <%= linkOpen %>visit our wiki<%= linkClose %>.",
|
||||
"usernameTOSRequirements": "Usernames must conform to our <%= termsLink %>Terms of Service<%= linkClose %> and <%= guidelinesLink %>Community Guidelines<%= linkClose %>. If you didn’t previously set a login name, your username was auto-generated.",
|
||||
"usernameTaken": "Username already taken.",
|
||||
"passwordConfirmationMatch": "Password confirmation doesn't match password.",
|
||||
"minPasswordLength": "Password must be 8 characters or more.",
|
||||
@@ -187,7 +187,7 @@
|
||||
"learnMore": "Learn More",
|
||||
"translateHabitica": "Translate Habitica",
|
||||
"whatToCallYou": "What should we call you?",
|
||||
"acceptPrivacyTOS": "You confirm that you are at least 18 years old, and that you have read and agree to our <a href='/static/terms' target='_blank'>Terms of Service</a> and <a href='/static/privacy' target='_blank'>Privacy Policy</a>",
|
||||
"acceptPrivacyTOS": "You confirm that you are at least 18 years old, and that you have read and agree to our <%= termsLink %>Terms of Service<%= linkClose %> and <%= privacyLink %>Privacy Policy<%= linkClose %>",
|
||||
"emailAddress": "Email address",
|
||||
"emailRequiredForSupport": "We require an email address for user support. Please enter an email address to continue creating your account."
|
||||
}
|
||||
|
||||
@@ -587,6 +587,15 @@
|
||||
"weaponSpecialSpring2026MageText": "Maypole Parasol",
|
||||
"weaponSpecialSpring2026MageNotes": "An opportunity to celebrate approaches, and with this pretty parasol pole, you will be ready! Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Spring 2026 Gear.",
|
||||
|
||||
"weaponSpecialSummer2026WarriorText": "Gator Machete",
|
||||
"weaponSpecialSummer2026WarriorNotes": "This flashy, fancy weapon fits right into your swampcore aesthetic. Increases Strength by <%= str %>. Limited Edition Summer 2026 Gear.",
|
||||
"weaponSpecialSummer2026RogueText": "Tsunami Blade",
|
||||
"weaponSpecialSummer2026RogueNotes": "This clever, curvy weapon fits right into your seacore aesthetic. Increases Strength by <%= str %>. Limited Edition Summer 2026 Gear.",
|
||||
"weaponSpecialSummer2026HealerText": "Puffin Lance",
|
||||
"weaponSpecialSummer2026HealerNotes": "This fine, feather-adorned weapon fits right into your islandcore aesthetic. Increases Intelligence by <%= int %>. Limited Edition Summer 2026 Gear.",
|
||||
"weaponSpecialSummer2026MageText": "Tiger Shark Spear",
|
||||
"weaponSpecialSummer2026MageNotes": "This dangerous, double-ended weapon fits right into your oceancore aesthetic. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
|
||||
|
||||
"weaponMystery201411Text": "Pitchfork of Feasting",
|
||||
"weaponMystery201411Notes": "Stab your enemies or dig in to your favorite foods - this versatile pitchfork does it all! Confers no benefit. November 2014 Subscriber Item.",
|
||||
"weaponMystery201502Text": "Shimmery Winged Staff of Love and Also Truth",
|
||||
@@ -637,6 +646,10 @@
|
||||
"weaponMystery202601Notes": "An icy bubble shield that grants magical protection from opposing elements. Confers no benefit. January 2026 Subscriber Item.",
|
||||
"weaponMystery202603Text": "Wisteria Wizard Staff",
|
||||
"weaponMystery202603Notes": "Cast spells to warm the spring air and encourage the blossoms to bud! Confers no benefit. March 2026 Subscriber Item.",
|
||||
"weaponMystery202607Text": "Oceanmancer's Fishy Familiars",
|
||||
"weaponMystery202607Notes": "These colorful companions will channel your aqueous abilities. Confers no benefit. July 2026 Subscriber Item.",
|
||||
"weaponMystery202608Text": "Beaming Magenta Blade",
|
||||
"weaponMystery202608Notes": "Bright, beautiful, dangerous to your undone Dailies. Confers no benefit. August 2026 Subscriber Item.",
|
||||
|
||||
"weaponMystery301404Text": "Steampunk Cane",
|
||||
"weaponMystery301404Notes": "Excellent for taking a turn about town. March 3015 Subscriber Item. Confers no benefit.",
|
||||
@@ -865,6 +878,14 @@
|
||||
"weaponArmoireBambooFluteNotes": "Hwhoooo! Hu-whooooo! Gather your party for a meditation session or self-care nap while relaxing to tunes played on this bamboo flute. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Musical Instrument Set 2 (Item 2 of 3)",
|
||||
"weaponArmoirePrettyPinkParasolText": "Pretty Pink Parasol",
|
||||
"weaponArmoirePrettyPinkParasolNotes": "Pretty and practical is the preeminent permutation. And for a particularly impressive presentation, give this parasol a spin! Increases all stats by <%= attrs %> each. Enchanted Armoire: Pretty in Pink Set (Item 1 of 2)",
|
||||
"weaponArmoireBrightRainbowKiteText": "Rainbow Kite",
|
||||
"weaponArmoireBrightRainbowKiteNotes": "This kite’s colors are bright and loud. Watching it soar high will make you proud! Increases all stats by <%= attrs %> each. Enchanted Armoire: Rainbow Kite Set (Item 1 of 2).",
|
||||
"weaponArmoirePastelRainbowKiteText": "Pastel Rainbow Kite",
|
||||
"weaponArmoirePastelRainbowKiteNotes": "This kite’s colors are muted and soft. It dances and spins as it soars aloft! Increases all stats by <%= attrs %> each. Enchanted Armoire: Rainbow Kite Set (Item 2 of 2).",
|
||||
"weaponArmoireKendoShinaiText": "Kendo Shinai",
|
||||
"weaponArmoireKendoShinaiNotes": "Light and soft, you can use this bamboo practice sword as you strive to improve yourself. Increases Strength by <%= str %>. Enchanted Armoire: Kendo Set (Item 3 of 3).",
|
||||
"weaponArmoireGardenRakeText": "Garden Rake",
|
||||
"weaponArmoireGardenRakeNotes": "Step 1: Rake all the fallen leaves into a giant pile. Step 2: Celebrate a job well done by jumping into the pile. Step 3: Repeat. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set 2 (Item 1 of 2).",
|
||||
|
||||
"armor": "armor",
|
||||
"armorCapitalized": "Armor",
|
||||
@@ -1432,6 +1453,15 @@
|
||||
"armorSpecialSpring2026MageText": "Maypole Dancer Outfit",
|
||||
"armorSpecialSpring2026MageNotes": "Arrive ready to dance, picnic, and enjoy the warm weather spring brings. Increases Intelligence by <%= int %>. Limited Edition Spring 2026 Gear.",
|
||||
|
||||
"armorSpecialSummer2026WarriorText": "Gator Suit",
|
||||
"armorSpecialSummer2026WarriorNotes": "Conceal yourself in this suit, but don’t hide from your problems. Gather your gator grit and meet your tasks like the alligator you are. Increases Constitution by <%= con %>. Limited Edition Summer 2026 Gear.",
|
||||
"armorSpecialSummer2026RogueText": "Tsunami Suit",
|
||||
"armorSpecialSummer2026RogueNotes": "Cloak yourself in this tsunami suit, but don’t hide from your problems. Summon a strong storm to have your back and meet your tasks like the adventurer you are. Increases Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
|
||||
"armorSpecialSummer2026HealerText": "Puffin Suit",
|
||||
"armorSpecialSummer2026HealerNotes": "Fit yourself in this suit, but don’t hide from your problems. Produce your puffin power and tackle your tasks like the puffin you are. Increases Constitution by <%= con %>. Limited Edition Summer 2026 Gear.",
|
||||
"armorSpecialSummer2026MageText": "Tiger Shark Suit",
|
||||
"armorSpecialSummer2026MageNotes": "Slide into this suit, but don’t hide from your problems. Show your shark shine and swim right up to face those tasks like the shark you are. Increases Intelligence by <%= int %>. Limited Edition Summer 2026 Gear.",
|
||||
|
||||
"armorMystery201402Text": "Messenger Robes",
|
||||
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
||||
"armorMystery201403Text": "Forest Walker Armor",
|
||||
@@ -1826,6 +1856,8 @@
|
||||
"armorArmoireSoftYellowSuitNotes": "Yellow is an energetic color. Wear this to bed, and you will wake up with the sun the next morning ready to tackle a day full of tasks. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Yellow Loungewear Set (Item 2 of 3).",
|
||||
"armorArmoireHandstandOutfitText": "Handstand",
|
||||
"armorArmoireHandstandOutfitNotes": "Things sure do look different when you’re upside-down, don’t they? If you’re feeling stuck, it’s time for a fresh perspective! Increases Perception by <%= per %>. Enchanted Armoire: Handstand Set (Item 1 of 1).",
|
||||
"armorArmoireKendoBoguText": "Kendo Bōgu",
|
||||
"armorArmoireKendoBoguNotes": "This might be training armor, but it offers more than enough protection for your path ahead. Increases Constitution by <%= con %>. Enchanted Armoire: Kendo Set (Item 2 of 3).",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
@@ -2387,6 +2419,15 @@
|
||||
"headSpecialSpring2026MageText": "Mayflower Crown",
|
||||
"headSpecialSpring2026MageNotes": "Make a joyous statement with bright blooms encircling your head. Increases Perception by <%= per %>. Limited Edition Spring 2026 Gear.",
|
||||
|
||||
"headSpecialSummer2026WarriorText": "Gator Helm",
|
||||
"headSpecialSummer2026WarriorNotes": "Go forth and be productive! If you get any pushback, just snap back and show your sharp teeth. Increases Strength by <%= str %>. Limited Edition Summer 2026 Gear.",
|
||||
"headSpecialSummer2026RogueText": "Tsunami Helm",
|
||||
"headSpecialSummer2026RogueNotes": "Go forth and be productive! If you lose your way, just follow the flow. Increases Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
|
||||
"headSpecialSummer2026HealerText": "Puffin Helm",
|
||||
"headSpecialSummer2026HealerNotes": "Go forth and be productive! If you encounter complications, just gather them up in your colorful beak and take them somewhere else. Increases Intelligence by <%= int %>. Limited Edition Summer 2026 Gear.",
|
||||
"headSpecialSummer2026MageText": "Tiger Shark Helm",
|
||||
"headSpecialSummer2026MageNotes": "Go forth and be productive! If an obstacle dares to get in your way, just crush it with your mighty jaws. Increases Perception by <%= per %>. Limited Edition Summer 2026 Gear.",
|
||||
|
||||
"headSpecialGaymerxText": "Rainbow Warrior Helm",
|
||||
"headSpecialGaymerxNotes": "In celebration of the GaymerX Conference, this special helmet is decorated with a radiant, colorful rainbow pattern! GaymerX is a game convention celebrating LGTBQ and gaming and is open to everyone.",
|
||||
|
||||
@@ -2578,6 +2619,8 @@
|
||||
"headMystery202603Notes": "This jaunty hat not only enhances your magical ability, it also has a lovely spring scent! Confers no benefit. March 2026 Subscriber Item.",
|
||||
"headMystery202604Text": "Audacious Astronaut Helmet",
|
||||
"headMystery202604Notes": "In space, no one can hear you check off your To Do’s. But the real reward is your sense of personal accomplishment! Confers no benefit. April 2026 Subscriber Item.",
|
||||
"headMystery202606Text": "Holiday Hat",
|
||||
"headMystery202606Notes": "Holidays are made for enjoying the sunshine - but don’t get burned! Confers no benefit. June 2026 Subscriber Item.",
|
||||
|
||||
"headMystery301404Text": "Fancy Top Hat",
|
||||
"headMystery301404Notes": "A fancy top hat for the finest of gentlefolk! January 3015 Subscriber Item. Confers no benefit.",
|
||||
@@ -2812,6 +2855,8 @@
|
||||
"headArmoireFloppyYellowHatNotes": "Many spells have been sewn into this simple hat, giving it a youthful yellow color. Increases all stats by <%= attrs %> each. Enchanted Armoire: Yellow Loungewear Set (Item 1 of 3).",
|
||||
"headArmoireVerdantArmingCapText": "Verdant Page Arming Cap",
|
||||
"headArmoireVerdantArmingCapNotes": "This comfy, cushioned coif makes you battle-ready and helps you withstand anything heavy that could come your way. Increases Perception and Constitution by <%= attrs %> each. Enchanted Armoire: Verdant Page Set (Item 1 of 2).",
|
||||
"headArmoireKendoMenText": "Kendo Men",
|
||||
"headArmoireKendoMenNotes": "You might be surprised by how well you can see through the grille as you follow the way of the sword. Increases Perception by <%= per %>. Enchanted Armoire: Kendo Set (Item 1 of 3).",
|
||||
|
||||
"offhand": "off-hand item",
|
||||
"offHandCapitalized": "Off-Hand Item",
|
||||
@@ -3136,6 +3181,11 @@
|
||||
"shieldSpecialSpring2026HealerText": "Snowdrop Leaf",
|
||||
"shieldSpecialSpring2026HealerNotes": "Create a light breeze with this fan as the days grow warmer. It doubles as a writing utensil in a pinch. Increases Constitution by <%= con %>. Limited Edition Spring 2026 Gear.",
|
||||
|
||||
"shieldSpecialSummer2026WarriorText": "Gator Shield",
|
||||
"shieldSpecialSummer2026WarriorNotes": "Deflect oncoming challenges with this stylish, shiny shield. And when you’ve successfully cleared your list, crank up the music and have a party! Increases Constitution by <%= con %>. Limited Edition Summer 2026 Gear.",
|
||||
"shieldSpecialSummer2026HealerText": "Puffin Potion",
|
||||
"shieldSpecialSummer2026HealerNotes": "Keep your colony of fellow puffins healthy with this potion. It tastes great with fish! Increases Constitution by <%= con %>. Limited Edition Summer 2026 Gear.",
|
||||
|
||||
"shieldMystery201601Text": "Resolution Slayer",
|
||||
"shieldMystery201601Notes": "This blade can be used to parry away all distractions. Confers no benefit. January 2016 Subscriber Item.",
|
||||
"shieldMystery201701Text": "Time-Freezer Shield",
|
||||
@@ -3168,6 +3218,12 @@
|
||||
"shieldMystery202511Notes": "This rugged shield of icy rock protects you from bad Habits but won't freeze your hands. Confers no benefit. November 2025 Subscriber Item.",
|
||||
"shieldMystery202605Text": "Nightfall Shield",
|
||||
"shieldMystery202605Notes": "Let the moon’s shining light protect you from dangers in the dark. Confers no benefit. May 2026 Subscriber Item.",
|
||||
"shieldMystery202606Text": "Holiday Hammock",
|
||||
"shieldMystery202606Notes": "Between tasks, hop in this hammock, relax, and enjoy the scenery! Confers no benefit. June 2026 Subscriber Item.",
|
||||
"shieldMystery202607Text": "Oceanmancer's Briny Bubble",
|
||||
"shieldMystery202607Notes": "Tumultuous waters bend to your mighty magical will. Confers no benefit. July 2026 Subscriber Item.",
|
||||
"shieldMystery202608Text": "Brilliant Emerald Blade",
|
||||
"shieldMystery202608Notes": "Slice and dice all your tasks into manageable pieces! Confers no benefit. August 2026 Subscriber Item.",
|
||||
|
||||
"shieldMystery301405Text": "Clock Shield",
|
||||
"shieldMystery301405Notes": "Time is on your side with this towering clock shield! Confers no benefit. June 3015 Subscriber Item.",
|
||||
@@ -3353,7 +3409,9 @@
|
||||
"shieldArmoireSoftYellowPillowText": "Soft Yellow Pillow",
|
||||
"shieldArmoireSoftYellowPillowNotes": "The experienced warrior packs a pillow for any expedition. Grow and shine as you consolidate all you’ve learned during past adventures… even while you nap. Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Yellow Loungewear Set (Item 3 of 3).",
|
||||
"shieldArmoireVerdantBannerText": "Verdant Page Banner",
|
||||
"shieldArmoireVerdantBannerNotes": "Wave your banner high to signal friends it’s time to rally together! Intelligence by <%= int %>. Enchanted Armoire: Verdant Page Set (Item 2 of 2).",
|
||||
"shieldArmoireVerdantBannerNotes": "Wave your banner high to signal friends it’s time to rally together! Increases Intelligence by <%= int %>. Enchanted Armoire: Verdant Page Set (Item 2 of 2).",
|
||||
"shieldArmoireGardenHoseText": "Garden Hose",
|
||||
"shieldArmoireGardenHoseNotes": "This magical hose never kinks and can infinitely stretch to reach every inch of your space. All your flowers, trees, shrubs, and thirsty pets can enjoy a drink from it. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set 2 (Item 2 of 2).",
|
||||
|
||||
"back": "Back Accessory",
|
||||
"backBase0Text": "No Back Accessory",
|
||||
@@ -3805,6 +3863,8 @@
|
||||
"eyewearMystery202503Notes": "This piercing gaze will strike terror into any fighter who dares to challenge you! Confers no benefit. March 2025 Subscriber Item.",
|
||||
"eyewearMystery202510Text": "Gliding Ghoul Eyes",
|
||||
"eyewearMystery202510Notes": "These spooky eyes glow like the Harvest Moon. Confers no benefit. October 2025 Subscriber Item.",
|
||||
"eyewearMystery202606Text": "Holiday Shades",
|
||||
"eyewearMystery202606Notes": "Your eyes are shaded but your outlook is still sunny! Confers no benefit. June 2026 Subscriber Item.",
|
||||
|
||||
"eyewearMystery301404Text": "Eyewear Goggles",
|
||||
"eyewearMystery301404Notes": "No eyewear could be fancier than a pair of goggles - except, perhaps, for a monocle. Confers no benefit. April 3015 Subscriber Item.",
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
"whyReportingPlayerPlaceholder": "Reason for report",
|
||||
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habitica’s Community Guidelines.",
|
||||
"targetUserNotExist": "Target User: '<%= userName %>' does not exist.",
|
||||
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>.",
|
||||
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <%= linkOpen %>Community Guidelines<%= linkClose %>.",
|
||||
"confirmPurchase": "Confirm Purchase",
|
||||
"avoidSPI": "Avoid SPI",
|
||||
"avoidSPIDetails": "For your privacy, avoid including <%= firstLink %>sensitive personal information<%= linkClose %> (SPI) when using Habitica. Your account data, including tasks, is stored on our servers so you can access it from any device.<br><br>To learn more, review our <%= secondLink %>Privacy Policy<%= linkClose %>."
|
||||
|
||||
@@ -12,7 +12,6 @@
|
||||
"contributing": "Contributing",
|
||||
"faq": "FAQ",
|
||||
"tutorial": "Tutorial",
|
||||
"glossary": "<a target='_blank' href='https://habitica.fandom.com/wiki/Glossary'>Glossary</a>",
|
||||
"wiki": "Wiki",
|
||||
"resources": "Resources",
|
||||
"communityGuidelines": "Community Guidelines",
|
||||
@@ -28,7 +27,7 @@
|
||||
"invite": "Invite",
|
||||
"leave": "Leave",
|
||||
"invitedToParty": "You were invited to join the Party <span class=\"notification-bold\"><%= party %></span>",
|
||||
"invitedToPartyBy": "<a href=\"/profile/<%= userId %>\" target=\"_blank\">@<%= userName %></a> has invited you to join the Party <span class=\"notification-bold\"><%= party %></span>",
|
||||
"invitedToPartyBy": "<%= usernameLink %> has invited you to join the Party <%= partyName %>",
|
||||
"invitedToPrivateGuild": "You were invited to join the private Group <span class=\"notification-bold\"><%= guild %></span>",
|
||||
"invitedToPublicGuild": "You were invited to join the Group <span class=\"notification-bold-blue\"><%= guild %></span>",
|
||||
"invitationAcceptedHeader": "Your Invitation has been Accepted",
|
||||
@@ -138,7 +137,7 @@
|
||||
"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 %>.",
|
||||
"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 <%= techAssistanceEmail %>.",
|
||||
"giftMessageTooLong": "The maximum length for gift messages is <%= maxGiftMessageLength %>.",
|
||||
"battleWithFriends": "Play Habitica with Others",
|
||||
"questWithOthers": "Take on Quests with Others",
|
||||
@@ -304,7 +303,6 @@
|
||||
"playInPartyTitle": "Play Habitica in a Party!",
|
||||
"playInPartyDescription": "Take on amazing Quests with friends or on your own. Battle monsters, create Challenges, and help yourself stay accountable through Parties.",
|
||||
"wantToJoinPartyTitle": "Looking for a Party?",
|
||||
"wantToJoinPartyDescription": "Give your username to a friend who already has a Party, or head to the <a href='/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>Party Wanted Guild</a> to meet potential comrades!",
|
||||
"lookForParty": "Look for a Party",
|
||||
"currentlyLookingForParty": "You’re looking for a Party!",
|
||||
"partyFinderDescription": "Want to join a Party with others but don’t know any other players? Let Party leaders know you’re looking for an invite!",
|
||||
@@ -411,7 +409,7 @@
|
||||
"newGroupsBullet10a": "<strong>Leave a task unassigned</strong> if any member can complete it",
|
||||
"newGroupsBullet10b": "<strong>Assign a task to one member</strong> so only they can complete it",
|
||||
"newGroupsBullet10c": "<strong>Assign a task to multiple members</strong> if they all need to complete it",
|
||||
"newGroupsVisitFAQ": "Visit the <a href='/static/faq#group-plans' target='_blank'>FAQ</a> from the Help dropdown for more guidance.",
|
||||
"newGroupsVisitFAQ": "Visit the <%= linkOpen %>FAQ<%= linkClose %> from the Help dropdown for more guidance.",
|
||||
"newGroupsEnjoy": "We hope you enjoy the new Group Plans experience!",
|
||||
"checkinsLabel": "Check-ins:",
|
||||
"classLabel": "Class:",
|
||||
@@ -423,10 +421,9 @@
|
||||
"noOneLooking": "There’s no one looking for a Party right now.<br>You can check back later!",
|
||||
"tavernDiscontinued": "The Tavern and Guilds have been discontinued",
|
||||
"tavernDiscontinuedDetail": "Due to a number of factors, including changes in how our player base interacts with Habitica, the resources necessary to maintain these spaces became disproportionate to the number of people participating in them and unsustainable over the long term.",
|
||||
"tavernDiscontinuedLinks": "Read more about the <a href='/static/faq/tavern-and-guilds'>Tavern and Guild Service Discontinuation</a> or head back to the <a href='/'>homepage</a>.",
|
||||
"chatSunsetWarning": "⚠️ <strong>Habitica Guilds and Tavern chat will be discontinued on 8/8/2023.</strong> <a href='/static/faq/tavern-and-guilds'>Click here</a> to read more about this change.",
|
||||
"tavernDiscontinuedLinks": "Read more about the <%= faqLink %>Tavern and Guild Service Discontinuation<%= linkClose %> or head back to the <%= homeLink %>homepage<%= linkClose %>.",
|
||||
"interestedLearningMore": "Interested in Learning More?",
|
||||
"checkGroupPlanFAQ": "Check out the <a href='/static/faq#what-is-group-plan'>Group Plans FAQ</a> to learn how to get the most out of your shared task experience.",
|
||||
"checkGroupPlanFAQ": "Check out the <%= linkOpen %>Group Plans FAQ<%= linkClose %> to learn how to get the most out of your shared task experience.",
|
||||
"groupPlanBillingFYI": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You can cancel from the Group Billing tab of your Group Plan. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle.",
|
||||
"groupPlanBillingFYIShort": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle.",
|
||||
"chooseAnOption": "Choose an Option",
|
||||
|
||||
@@ -209,44 +209,48 @@
|
||||
"fall2023BogCreatureHealerSet": "Bog Creature (Healer)",
|
||||
"winter2024SnowyOwlRogueSet": "Snowy Owl (Rogue)",
|
||||
"winter2024FrozenHealerSet": "Frozen (Healer)",
|
||||
"winter2024PeppermintBarkWarriorSet": "Peppermint Bark Set (Warrior)",
|
||||
"winter2024NarwhalWizardMageSet": "Narwhal Wizard Set (Mage)",
|
||||
"spring2024FluoriteWarriorSet": "Fluorite Set (Warrior)",
|
||||
"spring2024HibiscusMageSet": "Hibiscus Set (Mage)",
|
||||
"spring2024BluebirdHealerSet": "Bluebird Set (Healer)",
|
||||
"spring2024MeltingSnowRogueSet": "Melting Snow Set (Rogue)",
|
||||
"summer2024WhaleSharkWarriorSet": "Whale Shark Set (Warrior)",
|
||||
"summer2024SeaAnemoneMageSet": "Sea Anemone Set (Mage)",
|
||||
"summer2024SeaSnailHealerSet": "Sea Snail Set (Healer)",
|
||||
"summer2024NudibranchRogueSet": "Nudibranch Set (Rogue)",
|
||||
"fall2024FieryImpWarriorSet": "Fiery Imp Set (Warrior)",
|
||||
"fall2024UnderworldSorcerorMageSet": "Underworld Sorceror Set (Mage)",
|
||||
"fall2024SpaceInvaderHealerSet": "Space Invader Set (Healer)",
|
||||
"fall2024BlackCatRogueSet": "Black Cat Set (Rogue)",
|
||||
"winter2025MooseWarriorSet": "Moose Set (Warrior)",
|
||||
"winter2025AuroraMageSet": "Aurora Set (Mage)",
|
||||
"winter2025StringLightsHealerSet": "String Lights Set (Healer)",
|
||||
"winter2025SnowRogueSet": "Snow Set (Rogue)",
|
||||
"spring2025SunshineWarriorSet": "Sunshine Set (Warrior)",
|
||||
"spring2025CrystalPointRogueSet": "Crystal Point Set (Rogue)",
|
||||
"spring2025PlumeriaHealerSet": "Plumeria Set (Healer)",
|
||||
"spring2025MantisMageSet": "Mantis Set (Mage)",
|
||||
"summer2025ScallopWarriorSet": "Scallop Set (Warrior)",
|
||||
"summer2025SquidRogueSet": "Squid Set (Rogue)",
|
||||
"summer2025SeaAngelHealerSet": "Sea Angel Set (Healer)",
|
||||
"summer2025FairyWrasseMageSet": "Fairy Wrasse Set (Mage)",
|
||||
"fall2025SasquatchWarriorSet": "Sasquatch Set (Warrior)",
|
||||
"fall2025SkeletonRogueSet": "Skeleton Set (Rogue)",
|
||||
"fall2025KoboldHealerSet": "Kobold Set (Healer)",
|
||||
"fall2025MaskedGhostMageSet": "Masked Ghost Set (Mage)",
|
||||
"winter2026RimeReaperWarriorSet": "Rime Reaper Set (Warrior)",
|
||||
"winter2026SkiRogueSet": "Ski Set (Rogue)",
|
||||
"winter2026PolarBearHealerSet": "Polar Bear Set (Healer)",
|
||||
"winter2026MidwinterCandleMageSet": "Midwinter Candle Set (Mage)",
|
||||
"spring2026FrogWarriorSet": "Frog Set (Warrior)",
|
||||
"spring2026BranchRogueSet": "Spring Branch Set (Rogue)",
|
||||
"spring2026SnowdropHealerSet": "Snowdrop Set (Healer)",
|
||||
"spring2026MaypoleMageSet": "Maypole Set (Mage)",
|
||||
"winter2024PeppermintBarkWarriorSet": "Peppermint Bark (Warrior)",
|
||||
"winter2024NarwhalWizardMageSet": "Narwhal Wizard (Mage)",
|
||||
"spring2024FluoriteWarriorSet": "Fluorite (Warrior)",
|
||||
"spring2024HibiscusMageSet": "Hibiscus (Mage)",
|
||||
"spring2024BluebirdHealerSet": "Bluebird (Healer)",
|
||||
"spring2024MeltingSnowRogueSet": "Melting Snow (Rogue)",
|
||||
"summer2024WhaleSharkWarriorSet": "Whale Shark (Warrior)",
|
||||
"summer2024SeaAnemoneMageSet": "Sea Anemone (Mage)",
|
||||
"summer2024SeaSnailHealerSet": "Sea Snail (Healer)",
|
||||
"summer2024NudibranchRogueSet": "Nudibranch (Rogue)",
|
||||
"fall2024FieryImpWarriorSet": "Fiery Imp (Warrior)",
|
||||
"fall2024UnderworldSorcerorMageSet": "Underworld Sorceror (Mage)",
|
||||
"fall2024SpaceInvaderHealerSet": "Space Invader (Healer)",
|
||||
"fall2024BlackCatRogueSet": "Black Cat (Rogue)",
|
||||
"winter2025MooseWarriorSet": "Moose (Warrior)",
|
||||
"winter2025AuroraMageSet": "Aurora (Mage)",
|
||||
"winter2025StringLightsHealerSet": "String Lights (Healer)",
|
||||
"winter2025SnowRogueSet": "Snow (Rogue)",
|
||||
"spring2025SunshineWarriorSet": "Sunshine (Warrior)",
|
||||
"spring2025CrystalPointRogueSet": "Crystal Point (Rogue)",
|
||||
"spring2025PlumeriaHealerSet": "Plumeria (Healer)",
|
||||
"spring2025MantisMageSet": "Mantis (Mage)",
|
||||
"summer2025ScallopWarriorSet": "Scallop (Warrior)",
|
||||
"summer2025SquidRogueSet": "Squid (Rogue)",
|
||||
"summer2025SeaAngelHealerSet": "Sea Angel (Healer)",
|
||||
"summer2025FairyWrasseMageSet": "Fairy Wrasse (Mage)",
|
||||
"fall2025SasquatchWarriorSet": "Sasquatch (Warrior)",
|
||||
"fall2025SkeletonRogueSet": "Skeleton (Rogue)",
|
||||
"fall2025KoboldHealerSet": "Kobold (Healer)",
|
||||
"fall2025MaskedGhostMageSet": "Masked Ghost (Mage)",
|
||||
"winter2026RimeReaperWarriorSet": "Rime Reaper (Warrior)",
|
||||
"winter2026SkiRogueSet": "Ski (Rogue)",
|
||||
"winter2026PolarBearHealerSet": "Polar Bear (Healer)",
|
||||
"winter2026MidwinterCandleMageSet": "Midwinter Candle (Mage)",
|
||||
"spring2026FrogWarriorSet": "Frog (Warrior)",
|
||||
"spring2026BranchRogueSet": "Spring Branch (Rogue)",
|
||||
"spring2026SnowdropHealerSet": "Snowdrop (Healer)",
|
||||
"spring2026MaypoleMageSet": "Maypole (Mage)",
|
||||
"summer2026AlligatorWarriorSet": "Alligator (Warrior)",
|
||||
"summer2026PuffinHealerSet": "Puffin (Healer)",
|
||||
"summer2026TigerSharkMageSet": "Tiger Shark (Mage)",
|
||||
"summer2026TsunamiRogueSet": "Tsunami (Rogue)",
|
||||
"winterPromoGiftHeader": "GIFT A SUBSCRIPTION, GET ONE FREE!",
|
||||
"winterPromoGiftDetails1": "Until January 6th only, when you gift somebody a subscription, you get the same subscription for yourself for free!",
|
||||
"winterPromoGiftDetails2": "Please note that if you or your gift recipient already have a recurring subscription, the gifted subscription will only start after that subscription is cancelled or has expired. Thanks so much for your support! <3",
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"pauseDailies": "Pause Damage",
|
||||
"unpauseDailies": "Unpause Damage",
|
||||
"staffAndModerators": "Staff and Moderators",
|
||||
"communityGuidelinesIntro": "Habitica tries to create a welcoming environment for users of all ages and backgrounds, especially in spaces like Groups and Parties. If you have any questions, please consult our <a href='/static/community-guidelines' target='_blank'>Community Guidelines</a>.",
|
||||
"communityGuidelinesIntro": "Habitica tries to create a welcoming environment for users of all ages and backgrounds, especially in spaces like Groups and Parties. If you have any questions, please consult our <%= linkOpen %>Community Guidelines<%= linkClose %>.",
|
||||
"acceptCommunityGuidelines": "I agree to follow the Community Guidelines",
|
||||
"worldBossEvent": "World Boss Event",
|
||||
"worldBossDescription": "World Boss Description",
|
||||
@@ -109,7 +109,7 @@
|
||||
"toDo": "To Do",
|
||||
"tourStatsPage": "This is your Stats page! Earn achievements by completing the listed tasks.",
|
||||
"tourTavernPage": "Welcome to the Tavern, an all-ages chat room! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Pause Damage\". Come say hi!",
|
||||
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <a href='/static/faq#parties'>FAQ</a> from the Help dropdown to learn more about how Parties work.",
|
||||
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <%= linkOpen %>FAQ<%= linkClose %> from the Help dropdown to learn more about how Parties work.",
|
||||
"tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win Gem prizes!",
|
||||
"tourMarketPage": "Every time you complete a task, you'll have a random chance at receiving an Egg, a Hatching Potion, or a piece of Pet Food. You can also buy these items here.",
|
||||
"tourHallPage": "Welcome to the Hall of Heroes, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned Gems, exclusive Equipment, and prestigious titles. You can contribute to Habitica, too!",
|
||||
|
||||
@@ -10,5 +10,5 @@
|
||||
"step3": "Step 3: Customize and Explore Habitica",
|
||||
"webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your Tasks with [tags](https://habitica.fandom.com/wiki/Tags) (edit a Task to add them).\n * Customize your [Avatar](https://habitica.fandom.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](https://habitica.fandom.com/wiki/Equipment) under Rewards or from the [Shops](<%= shopUrl %>), and change it under [Inventory > Equipment](<%= equipUrl %>).\n * Connect with other users via the [Looking for Party tool](https://habitica.com/looking-for-party).\n * Hatch [Pets](https://habitica.fandom.com/wiki/Pets) by collecting [Eggs](https://habitica.fandom.com/wiki/Eggs) and [Hatching Potions](https://habitica.fandom.com/wiki/Hatching_Potions). [Feed](https://habitica.fandom.com/wiki/Food) them to create [Mounts](https://habitica.fandom.com/wiki/Mounts).\n * At level 10: Choose a particular [Class](https://habitica.fandom.com/wiki/Class_System) and then use Class-specific [skills](https://habitica.fandom.com/wiki/Skills) (levels 11 to 14).\n * Form a Party with your friends (by clicking [Party](<%= partyUrl %>) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [Quests](https://habitica.fandom.com/wiki/Quests) (you will be given a quest at level 15).",
|
||||
|
||||
"overviewQuestionsRevised": "Have questions? Check out the <a href='/static/faq'>FAQ</a>! If your question isn't mentioned there, you can ask for further help using this form: "
|
||||
"overviewQuestionsRevised": "Have questions? Check out the <%= linkOpen %>FAQ<%= linkClose %>! If your question isn't mentioned there, you can ask for further help using this form: "
|
||||
}
|
||||
|
||||
@@ -47,8 +47,6 @@
|
||||
"food": "Pet Food and Saddles",
|
||||
"noFoodAvailable": "You don't have any Pet Food.",
|
||||
"noSaddlesAvailable": "You don't have any Saddles.",
|
||||
"dropsExplanation": "Get these items faster with Gems if you don't want to wait for them to drop when completing a task. <a href=\"https://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
|
||||
"dropsExplanationEggs": "Spend Gems to get eggs more quickly, if you don't want to wait for standard eggs to drop, or to repeat Quests to earn Quest eggs. <a href=\"https://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
|
||||
"premiumPotionNoDropExplanation": "Magic Hatching Potions cannot be used on eggs received from Quests. The only way to get Magic Hatching Potions is by buying them below, not from random drops.",
|
||||
"beastMasterProgress": "Beast Master Progress",
|
||||
"beastAchievement": "You have earned the \"Beast Master\" Achievement for collecting all the pets!",
|
||||
@@ -91,7 +89,7 @@
|
||||
"welcomeStable": "Welcome to your Pets and Mounts!",
|
||||
"welcomeStableText": "Welcome to the stable! I’m Matt, the beastmaster. Every time you complete a task, you'll have a random chance at receiving an Egg or a Hatching Potion to hatch Pets. When you hatch a Pet, it will appear here! Click a Pet's image to add it to your Avatar. Feed them with the Pet Food you find and they'll grow into hardy Mounts.",
|
||||
"petLikeToEat": "What does my Pet like to eat?",
|
||||
"petLikeToEatText": "Pets will grow no matter what you feed them, but they'll grow faster if you feed them the one Pet Food that they like best. Experiment to find out the pattern, or see the answers here: <br/> <a href=\"/static/faq#pet-foods\" target=\"_blank\">https://habitica.com/static/faq#pet-foods</a>",
|
||||
"petLikeToEatText": "Pets will grow no matter what you feed them, but they'll grow faster if you feed them the one Pet Food that they like best. Experiment to find out the pattern, or <%= linkOpen %>see the answers here<%= linkClose %>.",
|
||||
"filterByStandard": "Standard",
|
||||
"filterByMagicPotion": "Magic Potion",
|
||||
"filterByQuest": "Quest",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user