Compare commits
144 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a9040aefb | |||
| 723249e60d | |||
| 8b17ebd1f1 | |||
| 1c4c7b9f1e | |||
| 58887d9a3c | |||
| 664f960a8b | |||
| b608f0ad9c | |||
| d4e05835d7 | |||
| 9343c33f37 | |||
| afd1248ea3 | |||
| 0708829b2a | |||
| afa9a65933 | |||
| e93e91e57d | |||
| 53569ff983 | |||
| d0c736a7a6 | |||
| 9ce4482040 | |||
| 28660c0bea | |||
| bc15d530e5 | |||
| 34b7acb246 | |||
| 4ef369c6f5 | |||
| e17b86a1f6 | |||
| 2181ab9713 | |||
| 8cb8411cc6 | |||
| da3e6f96ba | |||
| 91511746bc | |||
| aaba400d36 | |||
| 4e107d233b | |||
| c086d7b91d | |||
| 5b93199f35 | |||
| 3b82bb9494 | |||
| 1c347fc4b8 | |||
| 2f16fe11e1 | |||
| 05cf0cb50d | |||
| fb017e1f08 | |||
| 1ca528eb95 | |||
| 0ff2a8c264 | |||
| eed6cfaf6d | |||
| 202d74b8c4 | |||
| 3498b9ccdf | |||
| 39b39387d3 | |||
| c3278a3baf | |||
| df3b871dba | |||
| 18af9f8b40 | |||
| de36afc174 | |||
| fbb40c0d07 | |||
| 34d0922bcc | |||
| 55cf2f9795 | |||
| 9ff0766910 | |||
| 06d982401a | |||
| 140372a70d | |||
| bd9754221b | |||
| d58ca4c998 | |||
| 7c53f9fd21 | |||
| ae6918d52e | |||
| d367060a82 | |||
| 8e7ec46c8f | |||
| d0d32c0b58 | |||
| 1dd3bc188e | |||
| 608ae5fc43 | |||
| 391fa541ef | |||
| bc87e8b400 | |||
| 5c4b8ce58b | |||
| 2b93ea3740 | |||
| 61956ea720 | |||
| 976e8cf242 | |||
| 2c566cb9e3 | |||
| 89d7f94fc3 | |||
| 7a15bfc140 | |||
| 265dfbbb98 | |||
| 59bd135e44 | |||
| cf04d9d0be | |||
| f918b4a68c | |||
| 4070dd7754 | |||
| d44b2fe785 | |||
| 966cc64396 | |||
| 57cf669a86 | |||
| 278ddfbf54 | |||
| 0c26d7bcf6 | |||
| a20ce7bc42 | |||
| f87bb7593e | |||
| 2554809a2e | |||
| 4eb4dc6ba3 | |||
| f08299225b | |||
| 5890b04e30 | |||
| 3e0b0972b3 | |||
| b54f185d1f | |||
| 47dd711ab9 | |||
| ce59306bd1 | |||
| 5be15eb110 | |||
| 7fcdc9f8f1 | |||
| c0d4aa9415 | |||
| ea393a245a | |||
| 7f2c54d669 | |||
| 634a2011c1 | |||
| 84f2f0b99f | |||
| 1a7ddead94 | |||
| a0cb9da64b | |||
| 5fb284abeb | |||
| f69e43a9bc | |||
| 78c3a8e4ac | |||
| 596d18588b | |||
| 5320de93a8 | |||
| 2cf4e141f1 | |||
| 8cfb2a05ef | |||
| 689c526d6b | |||
| 6b922ae7de | |||
| fde732313a | |||
| 75254c75e8 | |||
| 080f7ece30 | |||
| 2b7caf9edf | |||
| 3a46d9315e | |||
| 31fea29fcb | |||
| e0f690bc68 | |||
| 4acc42a102 | |||
| b4d4a29f8a | |||
| 1393863e12 | |||
| afea4cda1c | |||
| b2a39b794d | |||
| 216f603d27 | |||
| 76b78c3455 | |||
| 2e0603dada | |||
| 5708cb8ef1 | |||
| 3e3d4dbc00 | |||
| cb6d3cc9ca | |||
| eb652932ec | |||
| d94c6dad57 | |||
| c3307afbf5 | |||
| f1b6d95a84 | |||
| b7e796f644 | |||
| ef36d655b0 | |||
| 9af2289773 | |||
| 9cecbcbd5a | |||
| cf3b9bac4e | |||
| 253a378529 | |||
| d2c545620b | |||
| c7c89255d8 | |||
| f3fc8bd031 | |||
| f3f46a42d1 | |||
| b5fa4ff3d5 | |||
| a2161c3bf3 | |||
| 8efaf9b47f | |||
| 644e094f08 | |||
| e6efa523c1 | |||
| 492824ac90 |
@@ -1,3 +1,7 @@
|
||||
# Files not included in deployments to Heroku, to save on file size.
|
||||
|
||||
/habitica-images
|
||||
/test
|
||||
/migrations
|
||||
/scripts
|
||||
/database_reports
|
||||
|
||||
@@ -1,22 +1,22 @@
|
||||
{
|
||||
"name": "habitica",
|
||||
"description": "A habit tracker app which treats your goals like a Role Playing Game.",
|
||||
"version": "4.225.4",
|
||||
"version": "4.228.2",
|
||||
"main": "./website/server/index.js",
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.16.12",
|
||||
"@babel/core": "^7.17.9",
|
||||
"@babel/preset-env": "^7.16.11",
|
||||
"@babel/register": "^7.17.0",
|
||||
"@babel/register": "^7.17.7",
|
||||
"@google-cloud/trace-agent": "^5.1.6",
|
||||
"@parse/node-apn": "^5.1.0",
|
||||
"@parse/node-apn": "^5.1.3",
|
||||
"@slack/webhook": "^6.1.0",
|
||||
"accepts": "^1.3.8",
|
||||
"amazon-payments": "^0.2.9",
|
||||
"amplitude": "^5.2.0",
|
||||
"apidoc": "^0.50.3",
|
||||
"amplitude": "^6.0.0",
|
||||
"apidoc": "^0.51.0",
|
||||
"apple-auth": "^1.0.7",
|
||||
"bcrypt": "^5.0.1",
|
||||
"body-parser": "^1.19.1",
|
||||
"body-parser": "^1.20.0",
|
||||
"bootstrap": "^4.6.0",
|
||||
"compression": "^1.7.4",
|
||||
"cookie-session": "^2.0.0",
|
||||
@@ -27,7 +27,7 @@
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.0.0",
|
||||
"express": "^4.17.2",
|
||||
"express": "^4.17.3",
|
||||
"express-basic-auth": "^1.2.1",
|
||||
"express-validator": "^5.2.0",
|
||||
"glob": "^7.2.0",
|
||||
@@ -47,11 +47,11 @@
|
||||
"lodash": "^4.17.21",
|
||||
"merge-stream": "^2.0.0",
|
||||
"method-override": "^3.0.0",
|
||||
"moment": "^2.29.1",
|
||||
"moment": "^2.29.2",
|
||||
"moment-recur": "^1.0.7",
|
||||
"mongoose": "^5.13.7",
|
||||
"morgan": "^1.10.0",
|
||||
"nconf": "^0.11.3",
|
||||
"nconf": "^0.11.4",
|
||||
"node-gcm": "^1.0.5",
|
||||
"on-headers": "^1.0.2",
|
||||
"passport": "^0.5.0",
|
||||
@@ -67,14 +67,14 @@
|
||||
"remove-markdown": "^0.3.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"short-uuid": "^4.2.0",
|
||||
"stripe": "^8.202.0",
|
||||
"superagent": "^7.1.1",
|
||||
"stripe": "^8.216.0",
|
||||
"superagent": "^7.1.2",
|
||||
"universal-analytics": "^0.5.3",
|
||||
"useragent": "^2.1.9",
|
||||
"uuid": "^8.3.2",
|
||||
"validator": "^13.7.0",
|
||||
"vinyl-buffer": "^1.0.1",
|
||||
"winston": "^3.5.1",
|
||||
"winston": "^3.7.2",
|
||||
"winston-loggly-bulk": "^3.2.1",
|
||||
"xml2js": "^0.4.23"
|
||||
},
|
||||
@@ -110,7 +110,7 @@
|
||||
"apidoc": "gulp apidoc"
|
||||
},
|
||||
"devDependencies": {
|
||||
"axios": "^0.25.0",
|
||||
"axios": "^0.26.1",
|
||||
"chai": "^4.3.6",
|
||||
"chai-as-promised": "^7.1.1",
|
||||
"chai-moment": "^0.1.0",
|
||||
@@ -122,7 +122,7 @@
|
||||
"monk": "^7.3.4",
|
||||
"require-again": "^2.0.0",
|
||||
"run-rs": "^0.7.6",
|
||||
"sinon": "^12.0.1",
|
||||
"sinon": "^13.0.1",
|
||||
"sinon-chai": "^3.7.0",
|
||||
"sinon-stub-promise": "^4.0.0"
|
||||
},
|
||||
|
||||
@@ -128,6 +128,22 @@ describe('cron middleware', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('runs cron if previous cron was incomplete', async () => {
|
||||
user.lastCron = moment(new Date()).subtract({ days: 1 });
|
||||
user.auth.timestamps.loggedin = moment(new Date()).subtract({ days: 4 });
|
||||
const now = new Date();
|
||||
await user.save();
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
expect(moment(now).isSame(user.lastCron, 'day'));
|
||||
expect(moment(now).isSame(user.auth.timestamps.loggedin, 'day'));
|
||||
return resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('updates user.auth.timestamps.loggedin and lastCron', async () => {
|
||||
user.lastCron = moment(new Date()).subtract({ days: 2 });
|
||||
const now = new Date();
|
||||
@@ -293,4 +309,33 @@ describe('cron middleware', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('cron should not run more than once', async () => {
|
||||
user.lastCron = moment(new Date()).subtract({ days: 2 });
|
||||
await user.save();
|
||||
|
||||
sandbox.spy(cronLib, 'cron');
|
||||
|
||||
await Promise.all([new Promise((resolve, reject) => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
return resolve();
|
||||
});
|
||||
}), new Promise((resolve, reject) => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
return resolve();
|
||||
});
|
||||
}), new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
cronMiddleware(req, res, err => {
|
||||
if (err) return reject(err);
|
||||
return resolve();
|
||||
});
|
||||
}, 400);
|
||||
}),
|
||||
]);
|
||||
|
||||
expect(cronLib.cron).to.be.calledOnce;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -811,6 +811,16 @@ describe('User Model', () => {
|
||||
expect(daysMissed).to.eql(5);
|
||||
});
|
||||
|
||||
it('correctly handles a cron that did not complete', () => {
|
||||
const now = moment();
|
||||
user.lastCron = moment(now).subtract(2, 'days');
|
||||
user.auth.timestamps.loggedIn = moment(now).subtract(5, 'days');
|
||||
|
||||
const { daysMissed } = user.daysUserHasMissed(now);
|
||||
|
||||
expect(daysMissed).to.eql(5);
|
||||
});
|
||||
|
||||
it('uses timezone from preferences to calculate days missed', () => {
|
||||
const now = moment('2017-07-08 01:00:00Z');
|
||||
user.lastCron = moment('2017-07-04 13:00:00Z');
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import {
|
||||
generateUser,
|
||||
requester,
|
||||
@@ -9,15 +10,18 @@ describe('GET /user/auth/apple', () => {
|
||||
let api;
|
||||
let user;
|
||||
const appleEndpoint = '/user/auth/apple';
|
||||
|
||||
before(async () => {
|
||||
const expectedResult = { id: 'appleId', name: 'an apple user' };
|
||||
sandbox.stub(appleAuth, 'appleProfile').returns(Promise.resolve(expectedResult));
|
||||
});
|
||||
let randomAppleId = '123456';
|
||||
|
||||
beforeEach(async () => {
|
||||
api = requester();
|
||||
user = await generateUser();
|
||||
randomAppleId = generateUUID();
|
||||
const expectedResult = { id: randomAppleId, name: 'an apple user' };
|
||||
sandbox.stub(appleAuth, 'appleProfile').returns(Promise.resolve(expectedResult));
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
appleAuth.appleProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
@@ -26,7 +30,7 @@ describe('GET /user/auth/apple', () => {
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.newUser).to.be.true;
|
||||
await expect(getProperty('users', response.id, 'auth.apple.id')).to.eventually.equal('appleId');
|
||||
await expect(getProperty('users', response.id, 'auth.apple.id')).to.eventually.equal(randomAppleId);
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('an apple user');
|
||||
});
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import passport from 'passport';
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import {
|
||||
generateUser,
|
||||
requester,
|
||||
@@ -10,14 +11,15 @@ describe('POST /user/auth/social', () => {
|
||||
let api;
|
||||
let user;
|
||||
const endpoint = '/user/auth/social';
|
||||
const randomAccessToken = '123456';
|
||||
const facebookId = 'facebookId';
|
||||
const googleId = 'googleId';
|
||||
let randomAccessToken = '123456';
|
||||
let randomFacebookId = 'facebookId';
|
||||
let randomGoogleId = 'googleId';
|
||||
let network = 'NoNetwork';
|
||||
|
||||
beforeEach(async () => {
|
||||
api = requester();
|
||||
user = await generateUser();
|
||||
randomAccessToken = generateUUID();
|
||||
});
|
||||
|
||||
it('fails if network is not supported', async () => {
|
||||
@@ -32,12 +34,23 @@ describe('POST /user/auth/social', () => {
|
||||
});
|
||||
|
||||
describe('facebook', () => {
|
||||
before(async () => {
|
||||
const expectedResult = { id: facebookId, displayName: 'a facebook user' };
|
||||
beforeEach(async () => {
|
||||
randomFacebookId = generateUUID();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: `${user.auth.local.username}+facebook@example.com` },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
network = 'facebook';
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
@@ -51,7 +64,8 @@ describe('POST /user/auth/social', () => {
|
||||
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a facebook user');
|
||||
await expect(getProperty('users', response.id, 'auth.local.lowerCaseUsername')).to.exist;
|
||||
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(facebookId);
|
||||
await expect(getProperty('users', response.id, 'auth.local.email')).to.eventually.equal(`${user.auth.local.username}+facebook@example.com`);
|
||||
await expect(getProperty('users', response.id, 'auth.facebook.id')).to.eventually.equal(randomFacebookId);
|
||||
});
|
||||
|
||||
it('logs an existing user in', async () => {
|
||||
@@ -68,6 +82,57 @@ describe('POST /user/auth/social', () => {
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.newUser).to.be.false;
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
});
|
||||
|
||||
it('logs an existing user in if they have local auth with matching email', async () => {
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('logs an existing user into their social account if they have local auth with matching email', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
// This is important for existing accounts before the new social handling
|
||||
passport._strategies.facebook.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomFacebookId,
|
||||
displayName: 'a facebook user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.facebook, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.apiToken).not.to.eql(user.apiToken);
|
||||
expect(response.id).not.to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('add social auth to an existing user', async () => {
|
||||
@@ -76,11 +141,28 @@ describe('POST /user/auth/social', () => {
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('does not log into other account if social auth already exists', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
|
||||
await expect(user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('socialAlreadyExists'),
|
||||
});
|
||||
});
|
||||
|
||||
xit('enrolls a new user in an A/B test', async () => {
|
||||
await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
@@ -92,12 +174,23 @@ describe('POST /user/auth/social', () => {
|
||||
});
|
||||
|
||||
describe('google', () => {
|
||||
before(async () => {
|
||||
const expectedResult = { id: googleId, displayName: 'a google user' };
|
||||
beforeEach(async () => {
|
||||
randomGoogleId = generateUUID();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: `${user.auth.local.username}+google@example.com` },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
network = 'google';
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
passport._strategies.google.userProfile.restore();
|
||||
});
|
||||
|
||||
it('registers a new user', async () => {
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
@@ -107,7 +200,8 @@ describe('POST /user/auth/social', () => {
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.newUser).to.be.true;
|
||||
await expect(getProperty('users', response.id, 'auth.google.id')).to.eventually.equal(googleId);
|
||||
await expect(getProperty('users', response.id, 'auth.google.id')).to.eventually.equal(randomGoogleId);
|
||||
await expect(getProperty('users', response.id, 'auth.local.email')).to.eventually.equal(`${user.auth.local.username}+google@example.com`);
|
||||
await expect(getProperty('users', response.id, 'profile.name')).to.eventually.equal('a google user');
|
||||
});
|
||||
|
||||
@@ -125,6 +219,57 @@ describe('POST /user/auth/social', () => {
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.newUser).to.be.false;
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
});
|
||||
|
||||
it('logs an existing user in if they have local auth with matching email', async () => {
|
||||
passport._strategies.google.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('logs an existing user into their social account if they have local auth with matching email', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
// This is important for existing accounts before the new social handling
|
||||
passport._strategies.google.userProfile.restore();
|
||||
const expectedResult = {
|
||||
id: randomGoogleId,
|
||||
displayName: 'a google user',
|
||||
emails: [
|
||||
{ value: user.auth.local.email },
|
||||
],
|
||||
};
|
||||
sandbox.stub(passport._strategies.google, 'userProfile').yields(null, expectedResult);
|
||||
|
||||
const response = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.eql(registerResponse.apiToken);
|
||||
expect(response.id).to.eql(registerResponse.id);
|
||||
expect(response.apiToken).not.to.eql(user.apiToken);
|
||||
expect(response.id).not.to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('add social auth to an existing user', async () => {
|
||||
@@ -133,11 +278,28 @@ describe('POST /user/auth/social', () => {
|
||||
network,
|
||||
});
|
||||
|
||||
expect(response.apiToken).to.exist;
|
||||
expect(response.id).to.exist;
|
||||
expect(response.apiToken).to.eql(user.apiToken);
|
||||
expect(response.id).to.eql(user._id);
|
||||
expect(response.newUser).to.be.false;
|
||||
});
|
||||
|
||||
it('does not log into other account if social auth already exists', async () => {
|
||||
const registerResponse = await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
});
|
||||
expect(registerResponse.newUser).to.be.true;
|
||||
|
||||
await expect(user.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
network,
|
||||
})).to.eventually.be.rejected.and.eql({
|
||||
code: 401,
|
||||
error: 'NotAuthorized',
|
||||
message: t('socialAlreadyExists'),
|
||||
});
|
||||
});
|
||||
|
||||
xit('enrolls a new user in an A/B test', async () => {
|
||||
await api.post(endpoint, {
|
||||
authResponse: { access_token: randomAccessToken }, // eslint-disable-line camelcase
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import moment from 'moment';
|
||||
|
||||
import { startOfDay, daysSince } from '../../../website/common/script/cron';
|
||||
import { startOfDay, daysSince, getPlanContext } from '../../../website/common/script/cron';
|
||||
|
||||
function localMoment (timeString, utcOffset) {
|
||||
return moment(timeString).utcOffset(utcOffset, true);
|
||||
@@ -181,4 +181,63 @@ describe('cron utility functions', () => {
|
||||
expect(result).to.equal(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getPlanContext', () => {
|
||||
const now = new Date(2022, 5, 1);
|
||||
|
||||
function baseUserData (count, offset, planId) {
|
||||
return {
|
||||
purchased: {
|
||||
plan: {
|
||||
consecutive: {
|
||||
count,
|
||||
offset,
|
||||
gemCapExtra: 25,
|
||||
trinkets: 19,
|
||||
},
|
||||
quantity: 1,
|
||||
extraMonths: 0,
|
||||
gemsBought: 0,
|
||||
owner: '116b4133-8fb7-43f2-b0de-706621a8c9d8',
|
||||
nextBillingDate: null,
|
||||
nextPaymentProcessing: null,
|
||||
planId,
|
||||
customerId: 'group-plan',
|
||||
dateUpdated: '2022-05-10T03:00:00.144+01:00',
|
||||
paymentMethod: 'Group Plan',
|
||||
dateTerminated: null,
|
||||
lastBillingDate: null,
|
||||
dateCreated: '2017-02-10T19:00:00.355+01:00',
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
it('offset 0, next date in 3 months', () => {
|
||||
const user = baseUserData(60, 0, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-08-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 1, next date in 1 months', () => {
|
||||
const user = baseUserData(60, 1, 'group_plan_auto');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-06-10T02:00:00.144Z');
|
||||
});
|
||||
|
||||
it('offset 2, next date in 2 months - with any plan', () => {
|
||||
const user = baseUserData(60, 2, 'basic_3mo');
|
||||
|
||||
const planContext = getPlanContext(user, now);
|
||||
|
||||
expect(planContext.nextHourglassDate)
|
||||
.to.be.sameMoment('2022-07-10T02:00:00.144Z');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { v4 as generateUUID } from 'uuid';
|
||||
import getters from '@/store/getters';
|
||||
|
||||
export const userStyles = {
|
||||
contributor: {
|
||||
@@ -82,3 +83,25 @@ export const userStyles = {
|
||||
classSelected: true,
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
export function mockStore ({
|
||||
userData,
|
||||
...state
|
||||
}) {
|
||||
return {
|
||||
getters,
|
||||
dispatch: () => {
|
||||
},
|
||||
watch: () => {
|
||||
},
|
||||
state: {
|
||||
user: {
|
||||
data: {
|
||||
...userData,
|
||||
},
|
||||
},
|
||||
...state,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
"storybook:serve": "vue-cli-service storybook:serve -p 6006 -c config/storybook"
|
||||
},
|
||||
"dependencies": {
|
||||
"@storybook/addon-actions": "6.4.18",
|
||||
"@storybook/addon-actions": "6.4.19",
|
||||
"@storybook/addon-knobs": "6.2.9",
|
||||
"@storybook/addon-links": "6.4.17",
|
||||
"@storybook/addon-links": "6.4.18",
|
||||
"@storybook/addon-notes": "5.3.21",
|
||||
"@storybook/addons": "6.4.18",
|
||||
"@storybook/addons": "6.4.19",
|
||||
"@storybook/vue": "6.3.13",
|
||||
"@vue/cli-plugin-babel": "^4.5.15",
|
||||
"@vue/cli-plugin-eslint": "^4.5.15",
|
||||
@@ -25,14 +25,14 @@
|
||||
"@vue/cli-plugin-unit-mocha": "^4.5.15",
|
||||
"@vue/cli-service": "^4.5.15",
|
||||
"@vue/test-utils": "1.0.0-beta.29",
|
||||
"amplitude-js": "^8.16.1",
|
||||
"amplitude-js": "^8.17.0",
|
||||
"axios": "^0.25.0",
|
||||
"axios-progress-bar": "^1.2.0",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"bootstrap": "^4.6.0",
|
||||
"bootstrap-vue": "^2.21.2",
|
||||
"chai": "^4.3.6",
|
||||
"core-js": "^3.20.3",
|
||||
"core-js": "^3.21.0",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint-config-habitrpg": "^6.2.0",
|
||||
"eslint-plugin-mocha": "^5.3.0",
|
||||
@@ -40,7 +40,7 @@
|
||||
"habitica-markdown": "^3.0.0",
|
||||
"hellojs": "^1.19.5",
|
||||
"inspectpack": "^4.7.1",
|
||||
"intro.js": "^4.3.0",
|
||||
"intro.js": "^5.0.0",
|
||||
"jquery": "^3.6.0",
|
||||
"lodash": "^4.17.21",
|
||||
"moment": "^2.29.1",
|
||||
|
||||
@@ -1,36 +1,46 @@
|
||||
.quest_lostMasterclasser4 {
|
||||
background: url("~@/assets/images/animated/quest_lostMasterclasser4.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_lostMasterclasser4.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.quest_windup {
|
||||
background: url("~@/assets/images/animated/quest_windup.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_windup.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.quest_solarSystem {
|
||||
background: url("~@/assets/images/animated/quest_solarSystem.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_solarSystem.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Dessert, .Pet_HatchingPotion_Veggie, .Pet_HatchingPotion_Windup {
|
||||
.quest_virtualpet {
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/quest_virtualpet.gif") no-repeat;
|
||||
width: 219px;
|
||||
height: 219px;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Dessert, .Pet_HatchingPotion_Veggie, .Pet_HatchingPotion_Windup, .Pet_HatchingPotion_VirtualPet {
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Dessert {
|
||||
background: url("~@/assets/images/animated/Pet_HatchingPotion_Dessert.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Dessert.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Veggie {
|
||||
background: url("~@/assets/images/animated/Pet_HatchingPotion_Veggie.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Veggie.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_Windup {
|
||||
background: url("~@/assets/images/animated/Pet_HatchingPotion_Windup.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_Windup.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet_HatchingPotion_VirtualPet {
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet_HatchingPotion_VirtualPet.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Gems {
|
||||
@@ -68,7 +78,7 @@
|
||||
|
||||
/* Critical */
|
||||
.weapon_special_critical {
|
||||
background: url("~@/assets/images/animated/weapon_special_critical.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/weapon_special_critical.gif") no-repeat;
|
||||
width: 90px;
|
||||
height: 90px;
|
||||
margin-left:-12px;
|
||||
@@ -85,32 +95,32 @@
|
||||
}
|
||||
|
||||
.head_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-ShadeHelmet.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-ShadeHelmet.gif") no-repeat;
|
||||
}
|
||||
.head_special_1 {
|
||||
background: url("~@/assets/images/animated/ContributorOnly-Equip-CrystalHelmet.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/ContributorOnly-Equip-CrystalHelmet.gif") no-repeat;
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.broad_armor_special_0,.slim_armor_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-ShadeArmor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-ShadeArmor.gif") no-repeat;
|
||||
}
|
||||
.broad_armor_special_1,.slim_armor_special_1 {
|
||||
background: url("~@/assets/images/animated/ContributorOnly-Equip-CrystalArmor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/ContributorOnly-Equip-CrystalArmor.gif") no-repeat;
|
||||
}
|
||||
|
||||
.shield_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Shield-TormentedSkull.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Shield-TormentedSkull.gif") no-repeat;
|
||||
}
|
||||
|
||||
.weapon_special_0 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Weapon-DarkSoulsBlade.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Weapon-DarkSoulsBlade.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Pet-Wolf-Cerberus {
|
||||
width: 105px;
|
||||
height: 72px;
|
||||
background: url("~@/assets/images/animated/BackerOnly-Pet-CerberusPup.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Pet-CerberusPup.gif") no-repeat;
|
||||
}
|
||||
|
||||
.broad_armor_special_ks2019, .slim_armor_special_ks2019, .eyewear_special_ks2019, .head_special_ks2019, .shield_special_ks2019 {
|
||||
@@ -119,29 +129,29 @@
|
||||
}
|
||||
|
||||
.broad_armor_special_ks2019, .slim_armor_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonArmor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonArmor.gif") no-repeat;
|
||||
}
|
||||
|
||||
.eyewear_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonVisor.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonVisor.gif") no-repeat;
|
||||
}
|
||||
|
||||
.head_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonHelm.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonHelm.gif") no-repeat;
|
||||
}
|
||||
|
||||
.shield_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonShield.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonShield.gif") no-repeat;
|
||||
}
|
||||
|
||||
.weapon_special_ks2019 {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Equip-MythicGryphonGlaive.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Equip-MythicGryphonGlaive.gif") no-repeat;
|
||||
width: 120px;
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
.Pet-Gryphon-Gryphatrice {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Pet-Gryphatrice.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Pet-Gryphatrice.gif") no-repeat;
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
@@ -152,11 +162,11 @@
|
||||
}
|
||||
|
||||
.Mount_Head_Gryphon-Gryphatrice {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Mount-Head-Gryphatrice.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Mount-Head-Gryphatrice.gif") no-repeat;
|
||||
}
|
||||
|
||||
.Mount_Body_Gryphon-Gryphatrice {
|
||||
background: url("~@/assets/images/animated/BackerOnly-Mount-Body-Gryphatrice.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/BackerOnly-Mount-Body-Gryphatrice.gif") no-repeat;
|
||||
}
|
||||
|
||||
.background_airship, .background_clocktower, .background_steamworks {
|
||||
@@ -165,15 +175,15 @@
|
||||
}
|
||||
|
||||
.background_airship {
|
||||
background: url("~@/assets/images/animated/background_airship.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_airship.gif") no-repeat;
|
||||
}
|
||||
|
||||
.background_clocktower {
|
||||
background: url("~@/assets/images/animated/background_clocktower.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_clocktower.gif") no-repeat;
|
||||
}
|
||||
|
||||
.background_steamworks {
|
||||
background: url("~@/assets/images/animated/background_steamworks.gif") no-repeat;
|
||||
background: url("https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_steamworks.gif") no-repeat;
|
||||
}
|
||||
|
||||
/* FIXME figure out how to handle customize menu!!
|
||||
|
||||
@@ -633,6 +633,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_blossoming_trees {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_blossoming_trees.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_blue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_blue.png');
|
||||
width: 141px;
|
||||
@@ -903,6 +908,16 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.background_flower_shop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_flower_shop.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.customize-option.background_flower_shop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_flower_shop.png');
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.background_flowering_prairie {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_flowering_prairie.png');
|
||||
width: 141px;
|
||||
@@ -1633,6 +1648,11 @@
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_springtime_lake {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_springtime_lake.png');
|
||||
width: 141px;
|
||||
height: 147px;
|
||||
}
|
||||
.background_stable {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/background_stable.png');
|
||||
width: 141px;
|
||||
@@ -2103,6 +2123,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_blossoming_trees {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_blossoming_trees.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_blue {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_blue.png');
|
||||
width: 68px;
|
||||
@@ -2378,11 +2403,21 @@
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.icon_background_flowering_prairie {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_flowering_prairie.png');
|
||||
.icon_background_flower_shop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_flower_shop.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.customize-option.icon_background_flower_shop {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_flower_shop.png');
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
}
|
||||
.icon_background_flowering_prairie {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_flowering_prairie.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.customize-option.icon_background_flowering_prairie {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_flowering_prairie.png');
|
||||
width: 60px;
|
||||
@@ -3108,6 +3143,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_springtime_lake {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_springtime_lake.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.icon_background_stable {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/icon_background_stable.png');
|
||||
width: 68px;
|
||||
@@ -16963,6 +17003,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_strawRaincoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_strawRaincoat.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_armoire_stripedSwimsuit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_armoire_stripedSwimsuit.png');
|
||||
width: 90px;
|
||||
@@ -17383,6 +17428,11 @@
|
||||
width: 117px;
|
||||
height: 120px;
|
||||
}
|
||||
.head_armoire_strawRainHat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_strawRainHat.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.head_armoire_swanFeatherCrown {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/head_armoire_swanFeatherCrown.png');
|
||||
width: 90px;
|
||||
@@ -18123,6 +18173,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_strawRaincoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_strawRaincoat.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_armor_armoire_stripedSwimsuit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_armoire_stripedSwimsuit.png');
|
||||
width: 68px;
|
||||
@@ -18558,6 +18613,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_armoire_strawRainHat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_strawRainHat.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_head_armoire_swanFeatherCrown {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_head_armoire_swanFeatherCrown.png');
|
||||
width: 68px;
|
||||
@@ -19708,6 +19768,11 @@
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_strawRaincoat {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_strawRaincoat.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.slim_armor_armoire_stripedSwimsuit {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_armoire_stripedSwimsuit.png');
|
||||
width: 90px;
|
||||
@@ -25208,6 +25273,46 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.broad_armor_mystery_202204 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_202204.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.eyewear_mystery_202204A {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_mystery_202204A.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.eyewear_mystery_202204B {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/eyewear_mystery_202204B.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.shop_armor_mystery_202204 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_armor_mystery_202204.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_eyewear_mystery_202204A {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_mystery_202204A.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_eyewear_mystery_202204B {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_eyewear_mystery_202204B.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.shop_set_mystery_202204 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/shop_set_mystery_202204.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.slim_armor_mystery_202204 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/slim_armor_mystery_202204.png');
|
||||
width: 114px;
|
||||
height: 90px;
|
||||
}
|
||||
.broad_armor_mystery_301404 {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/broad_armor_mystery_301404.png');
|
||||
width: 90px;
|
||||
@@ -33543,6 +33648,11 @@
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_quest_scroll_virtualpet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/inventory_quest_scroll_virtualpet.png');
|
||||
width: 68px;
|
||||
height: 68px;
|
||||
}
|
||||
.inventory_quest_scroll_waffle {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/inventory_quest_scroll_waffle.png');
|
||||
width: 68px;
|
||||
@@ -50008,6 +50118,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-BearCub-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-BearCub-Watery.png');
|
||||
width: 81px;
|
||||
@@ -50433,6 +50548,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Cactus-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Cactus-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Cactus-Watery.png');
|
||||
width: 81px;
|
||||
@@ -50963,6 +51083,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Dragon-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Dragon-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Dragon-Watery.png');
|
||||
width: 81px;
|
||||
@@ -51388,6 +51513,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-FlyingPig-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-FlyingPig-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-FlyingPig-Watery.png');
|
||||
width: 81px;
|
||||
@@ -51668,6 +51798,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Fox-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Fox-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Fox-Watery.png');
|
||||
width: 81px;
|
||||
@@ -52333,6 +52468,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-LionCub-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-LionCub-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-LionCub-Watery.png');
|
||||
width: 81px;
|
||||
@@ -52828,6 +52968,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-PandaCub-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-PandaCub-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-PandaCub-Watery.png');
|
||||
width: 81px;
|
||||
@@ -54068,6 +54213,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-TigerCub-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-TigerCub-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-TigerCub-Watery.png');
|
||||
width: 81px;
|
||||
@@ -54663,6 +54813,11 @@
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Wolf-VirtualPet {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-VirtualPet.png');
|
||||
width: 81px;
|
||||
height: 99px;
|
||||
}
|
||||
.Pet-Wolf-Watery {
|
||||
background-image: url('https://habitica-assets.s3.amazonaws.com/mobileApp/images/Pet-Wolf-Watery.png');
|
||||
width: 81px;
|
||||
|
||||
|
Before Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 9.1 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 992 B |
|
Before Width: | Height: | Size: 872 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 67 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 77 KiB |
|
Before Width: | Height: | Size: 759 B |
@@ -19,6 +19,11 @@
|
||||
top: -16px !important;
|
||||
}
|
||||
|
||||
.Pet.Pet-FlyingPig-Veggie, .Pet.Pet-FlyingPig-Dessert {
|
||||
.Pet.Pet-FlyingPig-Veggie, .Pet.Pet-FlyingPig-Dessert, .Pet.Pet-FlyingPig-VirtualPet {
|
||||
top: -28px !important;
|
||||
}
|
||||
|
||||
.Pet[class*="Virtual"] {
|
||||
left: 1.25rem;
|
||||
bottom: 0.5rem;
|
||||
}
|
||||
|
||||
@@ -84,8 +84,8 @@
|
||||
</li>
|
||||
<li v-if="user">
|
||||
<a
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
@@ -224,7 +224,7 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-5 text-center text-md-left">
|
||||
© 2022 Habitica. All rights reserved.
|
||||
© {{ currentYear }} Habitica. All rights reserved.
|
||||
<div
|
||||
v-if="!IS_PRODUCTION && isUserLoaded"
|
||||
class="debug float-left"
|
||||
@@ -512,6 +512,10 @@ export default {
|
||||
if (!this.user) return null;
|
||||
return `${base}?uuid=${this.user._id}`;
|
||||
},
|
||||
currentYear () {
|
||||
const currentDate = new Date();
|
||||
return currentDate.getFullYear();
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
plusTenHealth () {
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="form-group row text-center"
|
||||
v-if="!registering"
|
||||
class="form-group row text-center"
|
||||
>
|
||||
<div class="col-12 col-md-12">
|
||||
<div
|
||||
@@ -269,13 +269,13 @@
|
||||
<label
|
||||
v-once
|
||||
for="usernameInput"
|
||||
>{{ $t('email') }}</label>
|
||||
>{{ $t('emailOrUsername') }}</label>
|
||||
<input
|
||||
id="usernameInput"
|
||||
v-model="username"
|
||||
class="form-control"
|
||||
type="text"
|
||||
:placeholder="$t('emailPlaceholder')"
|
||||
:placeholder="$t('emailUsernamePlaceholder')"
|
||||
>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
|
||||
@@ -79,7 +79,6 @@
|
||||
></span>
|
||||
<!-- Pet-->
|
||||
<span
|
||||
v-if="member.items.currentPet"
|
||||
class="current-pet"
|
||||
:class="petClass"
|
||||
></span>
|
||||
@@ -131,10 +130,12 @@
|
||||
import some from 'lodash/some';
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
import foolPet from '../mixins/foolPet';
|
||||
|
||||
import ClassBadge from '@/components/members/classBadge';
|
||||
|
||||
export default {
|
||||
mixins: [foolPet],
|
||||
components: {
|
||||
ClassBadge,
|
||||
},
|
||||
@@ -243,11 +244,12 @@ export default {
|
||||
petClass () {
|
||||
if (some(
|
||||
this.currentEventList,
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'invert',
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'virtual',
|
||||
)) {
|
||||
return `Pet-${this.member.items.currentPet} invert`;
|
||||
return this.foolPet(this.member.items.currentPet);
|
||||
}
|
||||
return `Pet-${this.member.items.currentPet}`;
|
||||
if (this.member.items.currentPet) return `Pet-${this.member.items.currentPet}`;
|
||||
return '';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
|
||||
@@ -12,12 +12,18 @@
|
||||
{{ $t('reportBug') }}
|
||||
</h2>
|
||||
|
||||
<div v-once class="report-bug-header-describe">
|
||||
<div
|
||||
v-once
|
||||
class="report-bug-header-describe"
|
||||
>
|
||||
{{ $t('reportBugHeaderDescribe') }}
|
||||
</div>
|
||||
|
||||
<div class="dialog-close">
|
||||
<close-icon @click="close()" :purple="true"/>
|
||||
<close-icon
|
||||
:purple="true"
|
||||
@click="close()"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@@ -34,7 +40,10 @@
|
||||
>
|
||||
{{ $t('email') }}
|
||||
</label>
|
||||
<div class="mb-2 description-label" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="mb-2 description-label"
|
||||
>
|
||||
{{ $t('reportEmailText') }}
|
||||
</div>
|
||||
<input
|
||||
@@ -47,7 +56,10 @@
|
||||
:class="{'input-invalid': emailInvalid, 'input-valid': emailValid}"
|
||||
>
|
||||
|
||||
<div class="error-label mt-2" v-if="emailInvalid">
|
||||
<div
|
||||
v-if="emailInvalid"
|
||||
class="error-label mt-2"
|
||||
>
|
||||
{{ $t('reportEmailError') }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -55,7 +67,10 @@
|
||||
<label v-once>
|
||||
{{ $t('reportDescription') }}
|
||||
</label>
|
||||
<div class="mb-2 description-label" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="mb-2 description-label"
|
||||
>
|
||||
{{ $t('reportDescriptionText') }}
|
||||
</div>
|
||||
<textarea
|
||||
|
||||
@@ -17,15 +17,22 @@
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="svg-icon check-icon"
|
||||
v-html="icons.checkCircleIcon"
|
||||
<span
|
||||
class="svg-icon check-icon"
|
||||
v-html="icons.checkCircleIcon"
|
||||
></span>
|
||||
|
||||
<div class="title" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="title"
|
||||
>
|
||||
{{ $t('reportSent') }}
|
||||
</div>
|
||||
|
||||
<div class="text mt-3 mb-4" v-once>
|
||||
<div
|
||||
v-once
|
||||
class="text mt-3 mb-4"
|
||||
>
|
||||
{{ $t('reportSentDescription') }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -143,12 +150,12 @@ export default {
|
||||
modalId: MODALS.BUG_REPORT_SUCCESS,
|
||||
};
|
||||
},
|
||||
computed: {},
|
||||
mounted () {},
|
||||
methods: {
|
||||
close () {
|
||||
this.$root.$emit('bv::hide::modal', MODALS.BUG_REPORT_SUCCESS);
|
||||
},
|
||||
},
|
||||
computed: {},
|
||||
mounted () {},
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -112,7 +112,7 @@ export default {
|
||||
},
|
||||
visualBuffs () {
|
||||
return {
|
||||
snowball: 'snowman',
|
||||
snowball: `avatar_snowball_${this.member.stats.class}`,
|
||||
spookySparkles: 'ghost',
|
||||
shinySeed: `avatar_floral_${this.member.stats.class}`,
|
||||
seafoam: 'seafoam_star',
|
||||
|
||||
@@ -361,8 +361,8 @@
|
||||
</li>
|
||||
<li>
|
||||
<a
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
|
||||
@@ -311,8 +311,8 @@
|
||||
</router-link>
|
||||
<a
|
||||
class="topbar-dropdown-item dropdown-item"
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
|
||||
@@ -114,11 +114,13 @@ import some from 'lodash/some';
|
||||
import moment from 'moment';
|
||||
import { v4 as uuid } from 'uuid';
|
||||
import { mapState } from '@/libs/store';
|
||||
import foolPet from '@/mixins/foolPet';
|
||||
import {
|
||||
isAllowedToFeed, isHatchable, isOwned, isSpecial,
|
||||
} from '../../../libs/createAnimal';
|
||||
|
||||
export default {
|
||||
mixins: [foolPet],
|
||||
props: {
|
||||
item: {
|
||||
type: Object,
|
||||
@@ -169,9 +171,10 @@ export default {
|
||||
getPetItemClass () {
|
||||
if (this.isOwned() && some(
|
||||
this.currentEventList,
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'invert',
|
||||
event => moment().isBetween(event.start, event.end) && event.aprilFools && event.aprilFools === 'virtual',
|
||||
)) {
|
||||
return `Pet Pet-${this.item.key} ${this.item.eggKey} invert`;
|
||||
const petString = `${this.item.eggKey}-${this.item.key}`;
|
||||
return `Pet ${this.foolPet(petString)}`;
|
||||
}
|
||||
|
||||
if (this.isOwned() || (this.mountOwned() && this.isHatchable())) {
|
||||
|
||||
@@ -7,7 +7,7 @@ import { setup as setupPayments } from '@/libs/payments';
|
||||
|
||||
setupPayments();
|
||||
|
||||
storiesOf('Payments Buttons', module)
|
||||
storiesOf('Subscriptions/Payments Buttons', module)
|
||||
.add('simple', () => ({
|
||||
components: { PaymentsButtonsList },
|
||||
template: `
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
<template>
|
||||
<div>
|
||||
<div>
|
||||
<h5>{{ $t('dayStartAdjustment') }}</h5>
|
||||
<div class="mb-4">
|
||||
{{ $t('customDayStartInfo1') }}
|
||||
</div>
|
||||
<h3 v-once>{{ $t('adjustment') }}</h3>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<div class="">
|
||||
<select
|
||||
v-model="newDayStart"
|
||||
class="form-control"
|
||||
>
|
||||
<option
|
||||
v-for="option in dayStartOptions"
|
||||
:key="option.value"
|
||||
:value="option.value"
|
||||
>
|
||||
{{ option.name }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<button
|
||||
class="btn btn-primary full-width mt-3"
|
||||
:disabled="newDayStart === user.preferences.dayStart"
|
||||
@click="openDayStartModal()"
|
||||
>
|
||||
{{ $t('save') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<small>
|
||||
<p v-html="$t('timezoneUTC', {utc: timezoneOffsetToUtc})"></p>
|
||||
<p v-html="$t('timezoneInfo')"></p>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
import moment from 'moment';
|
||||
import getUtcOffset from '../../../../common/script/fns/getUtcOffset';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
export default {
|
||||
name: 'dayStartAdjustment',
|
||||
data () {
|
||||
const dayStartOptions = [];
|
||||
for (let number = 0; number <= 12; number += 1) {
|
||||
const meridian = number < 12 ? 'AM' : 'PM';
|
||||
const hour = number % 12;
|
||||
const timeWithMeridian = `(${hour || 12}:00 ${meridian})`;
|
||||
const option = {
|
||||
value: number,
|
||||
name: `+${number} hours ${timeWithMeridian}`,
|
||||
};
|
||||
|
||||
if (number === 0) {
|
||||
option.name = `Default ${timeWithMeridian}`;
|
||||
}
|
||||
|
||||
dayStartOptions.push(option);
|
||||
}
|
||||
|
||||
return {
|
||||
newDayStart: 0,
|
||||
dayStartOptions,
|
||||
};
|
||||
},
|
||||
mounted () {
|
||||
this.newDayStart = this.user.preferences.dayStart;
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
user: 'user.data',
|
||||
}),
|
||||
timezoneOffsetToUtc () {
|
||||
const offsetString = moment().utcOffset(getUtcOffset(this.user)).format('Z');
|
||||
return `UTC${offsetString}`;
|
||||
},
|
||||
dayStart () {
|
||||
return this.user.preferences.dayStart;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
async saveDayStart () {
|
||||
this.user.preferences.dayStart = this.newDayStart;
|
||||
await axios.post('/api/v4/user/custom-day-start', {
|
||||
dayStart: this.newDayStart,
|
||||
});
|
||||
// @TODO
|
||||
// Notification.text(response.data.data.message);
|
||||
},
|
||||
openDayStartModal () {
|
||||
const nextCron = this.calculateNextCron();
|
||||
// @TODO: Add generic modal
|
||||
if (!window.confirm(this.$t('sureChangeCustomDayStartTime', { time: nextCron }))) return; // eslint-disable-line no-alert
|
||||
this.saveDayStart();
|
||||
// $rootScope.openModal('change-day-start', { scope: $scope });
|
||||
},
|
||||
calculateNextCron () {
|
||||
let nextCron = moment()
|
||||
.hours(this.newDayStart)
|
||||
.minutes(0)
|
||||
.seconds(0)
|
||||
.milliseconds(0);
|
||||
|
||||
const currentHour = moment().format('H');
|
||||
if (currentHour >= this.newDayStart) {
|
||||
nextCron = nextCron.add(1, 'day');
|
||||
}
|
||||
|
||||
return nextCron.format(`${this.user.preferences.dateFormat.toUpperCase()} @ h:mm a`);
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.full-width {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
@@ -7,9 +7,9 @@
|
||||
>
|
||||
<div class="modal-body">
|
||||
<br>
|
||||
<strong v-if="user.auth.local.email">{{ $t('deleteLocalAccountText') }}</strong>
|
||||
<strong v-if="user.auth.local.has_password">{{ $t('deleteLocalAccountText') }}</strong>
|
||||
<strong
|
||||
v-if="!user.auth.local.email"
|
||||
v-if="!user.auth.local.has_password"
|
||||
>{{ $t('deleteSocialAccountText', {magicWord: 'DELETE'}) }}</strong>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
|
||||
@@ -213,49 +213,7 @@
|
||||
{{ $t('enableClass') }}
|
||||
</button>
|
||||
<hr>
|
||||
<div>
|
||||
<h5>{{ $t('customDayStart') }}</h5>
|
||||
<div class="alert alert-warning">
|
||||
{{ $t('customDayStartInfo1') }}
|
||||
</div>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<div class="col-7">
|
||||
<select
|
||||
v-model="newDayStart"
|
||||
class="form-control"
|
||||
>
|
||||
<option
|
||||
v-for="option in dayStartOptions"
|
||||
:key="option.value"
|
||||
:value="option.value"
|
||||
>
|
||||
{{ option.name }}
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-5">
|
||||
<button
|
||||
class="btn btn-block btn-primary mt-1"
|
||||
:disabled="newDayStart === user.preferences.dayStart"
|
||||
@click="openDayStartModal()"
|
||||
>
|
||||
{{ $t('saveCustomDayStart') }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
</div>
|
||||
<h5>{{ $t('timezone') }}</h5>
|
||||
<div class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<div class="col-12">
|
||||
<p v-html="$t('timezoneUTC', {utc: timezoneOffsetToUtc})"></p>
|
||||
<p v-html="$t('timezoneInfo')"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<day-start-adjustment />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-6">
|
||||
@@ -268,7 +226,7 @@
|
||||
:key="network.key"
|
||||
>
|
||||
<button
|
||||
v-if="!user.auth[network.key].id"
|
||||
v-if="!user.auth[network.key].id && network.key !== 'facebook'"
|
||||
class="btn btn-primary mb-2"
|
||||
@click="socialAuth(network.key, user)"
|
||||
>
|
||||
@@ -291,14 +249,22 @@
|
||||
</li>
|
||||
</ul>
|
||||
<hr>
|
||||
<div v-if="!user.auth.local.email">
|
||||
<p>{{ $t('addLocalAuth') }}</p>
|
||||
<div v-if="!user.auth.local.has_password">
|
||||
<h5 v-if="!user.auth.local.email">
|
||||
{{ $t('addLocalAuth') }}
|
||||
</h5>
|
||||
<h5 v-if="user.auth.local.email">
|
||||
{{ $t('addPasswordAuth') }}
|
||||
</h5>
|
||||
<div
|
||||
class="form"
|
||||
name="localAuth"
|
||||
novalidate="novalidate"
|
||||
>
|
||||
<div class="form-group">
|
||||
<div
|
||||
v-if="!user.auth.local.email"
|
||||
class="form-group"
|
||||
>
|
||||
<input
|
||||
v-model="localAuth.email"
|
||||
class="form-control"
|
||||
@@ -421,7 +387,9 @@
|
||||
{{ $t('saveAndConfirm') }}
|
||||
</button>
|
||||
</div>
|
||||
<h5 v-if="user.auth.local.email">
|
||||
<h5
|
||||
v-if="user.auth.local.email"
|
||||
>
|
||||
{{ $t('changeEmail') }}
|
||||
</h5>
|
||||
<div
|
||||
@@ -439,7 +407,10 @@
|
||||
:placeholder="$t('newEmail')"
|
||||
>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div
|
||||
v-if="user.auth.local.has_password"
|
||||
class="form-group"
|
||||
>
|
||||
<input
|
||||
v-model="emailUpdates.password"
|
||||
class="form-control"
|
||||
@@ -455,11 +426,11 @@
|
||||
{{ $t('submit') }}
|
||||
</button>
|
||||
</div>
|
||||
<h5 v-if="user.auth.local.email">
|
||||
<h5 v-if="user.auth.local.has_password">
|
||||
{{ $t('changePass') }}
|
||||
</h5>
|
||||
<div
|
||||
v-if="user.auth.local.email"
|
||||
v-if="user.auth.local.has_password"
|
||||
class="form"
|
||||
name="changePassword"
|
||||
novalidate="novalidate"
|
||||
@@ -528,25 +499,20 @@
|
||||
|
||||
<style lang="scss" scoped>
|
||||
@import '~@/assets/scss/colors.scss';
|
||||
|
||||
input {
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
.usersettings h5 {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
.iconalert > div > span {
|
||||
line-height: 25px;
|
||||
}
|
||||
|
||||
.iconalert > div:after {
|
||||
clear: both;
|
||||
content: '';
|
||||
display: table;
|
||||
}
|
||||
|
||||
.input-error {
|
||||
color: $red-50;
|
||||
font-size: 90%;
|
||||
@@ -557,16 +523,15 @@
|
||||
|
||||
<script>
|
||||
import hello from 'hellojs';
|
||||
import moment from 'moment';
|
||||
import axios from 'axios';
|
||||
import debounce from 'lodash/debounce';
|
||||
import { mapState } from '@/libs/store';
|
||||
import restoreModal from './restoreModal';
|
||||
import resetModal from './resetModal';
|
||||
import deleteModal from './deleteModal';
|
||||
import dayStartAdjustment from './dayStartAdjustment';
|
||||
import { SUPPORTED_SOCIAL_NETWORKS } from '@/../../common/script/constants';
|
||||
import changeClass from '@/../../common/script/ops/changeClass';
|
||||
import getUtcOffset from '@/../../common/script/fns/getUtcOffset';
|
||||
import notificationsMixin from '../../mixins/notifications';
|
||||
import sounds from '../../libs/sounds';
|
||||
import { buildAppleAuthUrl } from '../../libs/auth';
|
||||
@@ -579,27 +544,15 @@ export default {
|
||||
restoreModal,
|
||||
resetModal,
|
||||
deleteModal,
|
||||
dayStartAdjustment,
|
||||
},
|
||||
mixins: [notificationsMixin],
|
||||
data () {
|
||||
const dayStartOptions = [];
|
||||
for (let number = 0; number < 24; number += 1) {
|
||||
const meridian = number < 12 ? 'AM' : 'PM';
|
||||
const hour = number % 12;
|
||||
const option = {
|
||||
value: number,
|
||||
name: `${hour || 12}:00 ${meridian}`,
|
||||
};
|
||||
dayStartOptions.push(option);
|
||||
}
|
||||
|
||||
return {
|
||||
SOCIAL_AUTH_NETWORKS: [],
|
||||
party: {},
|
||||
// Made available by the server as a script
|
||||
availableFormats: ['MM/dd/yyyy', 'dd/MM/yyyy', 'yyyy/MM/dd'],
|
||||
dayStartOptions,
|
||||
newDayStart: 0,
|
||||
temporaryDisplayName: '',
|
||||
usernameUpdates: { username: '' },
|
||||
emailUpdates: {},
|
||||
@@ -623,13 +576,6 @@ export default {
|
||||
availableAudioThemes () {
|
||||
return ['off', ...this.content.audioThemes];
|
||||
},
|
||||
timezoneOffsetToUtc () {
|
||||
const offsetString = moment().utcOffset(getUtcOffset(this.user)).format('Z');
|
||||
return `UTC${offsetString}`;
|
||||
},
|
||||
dayStart () {
|
||||
return this.user.preferences.dayStart;
|
||||
},
|
||||
hasClass () {
|
||||
return this.$store.getters['members:hasClass'](this.user);
|
||||
},
|
||||
@@ -679,7 +625,6 @@ export default {
|
||||
this.SOCIAL_AUTH_NETWORKS = SUPPORTED_SOCIAL_NETWORKS;
|
||||
// @TODO: We may need to request the party here
|
||||
this.party = this.$store.state.party;
|
||||
this.newDayStart = this.user.preferences.dayStart;
|
||||
this.usernameUpdates.username = this.user.auth.local.username || null;
|
||||
this.temporaryDisplayName = this.user.profile.name;
|
||||
this.emailUpdates.newEmail = this.user.auth.local.email || null;
|
||||
@@ -779,32 +724,6 @@ export default {
|
||||
return false;
|
||||
});
|
||||
},
|
||||
calculateNextCron () {
|
||||
let nextCron = moment().hours(this.newDayStart).minutes(0).seconds(0)
|
||||
.milliseconds(0);
|
||||
|
||||
const currentHour = moment().format('H');
|
||||
if (currentHour >= this.newDayStart) {
|
||||
nextCron = nextCron.add(1, 'day');
|
||||
}
|
||||
|
||||
return nextCron.format(`${this.user.preferences.dateFormat.toUpperCase()} @ h:mm a`);
|
||||
},
|
||||
openDayStartModal () {
|
||||
const nextCron = this.calculateNextCron();
|
||||
// @TODO: Add generic modal
|
||||
if (!window.confirm(this.$t('sureChangeCustomDayStartTime', { time: nextCron }))) return; // eslint-disable-line no-alert
|
||||
this.saveDayStart();
|
||||
// $rootScope.openModal('change-day-start', { scope: $scope });
|
||||
},
|
||||
async saveDayStart () {
|
||||
this.user.preferences.dayStart = this.newDayStart;
|
||||
await axios.post('/api/v4/user/custom-day-start', {
|
||||
dayStart: this.newDayStart,
|
||||
});
|
||||
// @TODO
|
||||
// Notification.text(response.data.data.message);
|
||||
},
|
||||
async changeLanguage (e) {
|
||||
const newLang = e.target.value;
|
||||
this.user.preferences.language = newLang;
|
||||
@@ -847,11 +766,9 @@ export default {
|
||||
window.location.href = buildAppleAuthUrl();
|
||||
} else {
|
||||
const auth = await hello(network).login({ scope: 'email' });
|
||||
|
||||
await this.$store.dispatch('auth:socialAuth', {
|
||||
auth,
|
||||
});
|
||||
|
||||
window.location.href = '/';
|
||||
}
|
||||
},
|
||||
@@ -865,8 +782,11 @@ export default {
|
||||
}
|
||||
},
|
||||
async addLocalAuth () {
|
||||
if (this.localAuth.email === '') {
|
||||
this.localAuth.email = this.user.auth.local.email;
|
||||
}
|
||||
await axios.post('/api/v4/user/auth/local/register', this.localAuth);
|
||||
window.alert(this.$t('addedLocalAuth')); // eslint-disable-line no-alert
|
||||
window.location.href = '/user/settings/site';
|
||||
},
|
||||
restoreEmptyUsername () {
|
||||
if (this.usernameUpdates.username.length < 1) {
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
/* eslint-disable import/no-extraneous-dependencies */
|
||||
import { storiesOf } from '@storybook/vue';
|
||||
|
||||
import Subscription from './subscription.vue';
|
||||
import { mockStore } from '../../../config/storybook/mock.data';
|
||||
|
||||
storiesOf('Subscriptions/Detail Page', module)
|
||||
.add('subscribed', () => ({
|
||||
components: { Subscription },
|
||||
template: `
|
||||
<div style="position: absolute; margin: 20px">
|
||||
<subscription ></subscription>
|
||||
</div>
|
||||
`,
|
||||
data () {
|
||||
return {
|
||||
};
|
||||
},
|
||||
store: mockStore({
|
||||
userData: {
|
||||
purchased: {
|
||||
plan: {
|
||||
customerId: 'customer-id',
|
||||
planId: 'plan-id',
|
||||
subscriptionId: 'sub-id',
|
||||
gemsBought: 22,
|
||||
dateUpdated: new Date(2021, 0, 15),
|
||||
consecutive: {
|
||||
count: 2,
|
||||
gemCapExtra: 4,
|
||||
offset: 2,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
}));
|
||||
@@ -93,7 +93,7 @@
|
||||
<div class="subscribe-card mx-auto">
|
||||
<div
|
||||
v-if="hasSubscription && !hasCanceledSubscription"
|
||||
class="d-flex flex-column align-items-center my-4"
|
||||
class="d-flex flex-column align-items-center"
|
||||
>
|
||||
<div class="round-container bg-green-10 d-flex align-items-center justify-content-center">
|
||||
<div
|
||||
@@ -102,7 +102,7 @@
|
||||
v-html="icons.checkmarkIcon"
|
||||
></div>
|
||||
</div>
|
||||
<h2 class="green-10 mx-auto">
|
||||
<h2 class="green-10 mx-auto mb-75">
|
||||
{{ $t('youAreSubscribed') }}
|
||||
</h2>
|
||||
<div
|
||||
@@ -180,17 +180,17 @@
|
||||
</div>
|
||||
<div
|
||||
v-if="hasSubscription"
|
||||
class="bg-gray-700 p-2 text-center"
|
||||
class="bg-gray-700 py-3 mt-4 mb-3 text-center"
|
||||
>
|
||||
<div class="header-mini mb-3">
|
||||
{{ $t('subscriptionStats') }}
|
||||
</div>
|
||||
<div class="d-flex justify-content-around">
|
||||
<div class="ml-4 mr-3">
|
||||
<div class="d-flex">
|
||||
<div class="stat-column">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-calendar mr-2"
|
||||
class="svg-icon svg-calendar mr-1"
|
||||
v-html="icons.calendarIcon"
|
||||
>
|
||||
</div>
|
||||
@@ -204,49 +204,53 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-spacer"></div>
|
||||
<div>
|
||||
<div class="stat-column">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-gem mr-2"
|
||||
class="svg-icon svg-gem mr-1"
|
||||
v-html="icons.gemIcon"
|
||||
>
|
||||
</div>
|
||||
<div class="number-heavy">
|
||||
{{ user.purchased.plan.consecutive.gemCapExtra }}
|
||||
{{ gemCap }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-label">
|
||||
{{ $t('gemCapExtra') }}
|
||||
{{ $t('gemCap') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-spacer"></div>
|
||||
<div>
|
||||
<div class="stat-column">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-hourglass mt-1 mr-2"
|
||||
class="svg-icon svg-hourglass mt-1 mr-1"
|
||||
v-html="icons.hourglassIcon"
|
||||
>
|
||||
</div>
|
||||
<div class="number-heavy">
|
||||
{{ user.purchased.plan.consecutive.trinkets }}
|
||||
{{ nextHourGlass }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="stats-label">
|
||||
{{ $t('mysticHourglassesTooltip') }}
|
||||
{{ $t('nextHourglass') }}*
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 nextHourglassDescription" v-once>
|
||||
*{{ $t('nextHourglassDescription') }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-column justify-content-center align-items-center mt-4 mb-3">
|
||||
<div class="d-flex flex-column justify-content-center align-items-center mb-3">
|
||||
<div
|
||||
v-once
|
||||
class="svg-icon svg-heart mb-1"
|
||||
class="svg-icon svg-heart mb-2"
|
||||
v-html="icons.heartIcon"
|
||||
>
|
||||
</div>
|
||||
<div class="stats-label">
|
||||
<div class="thanks-for-support">
|
||||
{{ $t('giftSubscriptionText4') }}
|
||||
</div>
|
||||
</div>
|
||||
@@ -350,7 +354,7 @@
|
||||
.cancel-card {
|
||||
width: 28rem;
|
||||
border: 2px solid $gray-500;
|
||||
border-radius: 4px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.disabled {
|
||||
@@ -405,7 +409,10 @@
|
||||
}
|
||||
|
||||
.number-heavy {
|
||||
font-size: 24px;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
line-height: 1.4;
|
||||
color: $gray-50;
|
||||
}
|
||||
|
||||
.Pet-Jackalope-RoyalPurple {
|
||||
@@ -423,7 +430,10 @@
|
||||
|
||||
.stats-label {
|
||||
font-size: 12px;
|
||||
color: $gray-200;
|
||||
color: $gray-100;
|
||||
margin-top: 6px;
|
||||
font-weight: bold;
|
||||
line-height: 1.33;
|
||||
}
|
||||
|
||||
.stats-spacer {
|
||||
@@ -433,8 +443,9 @@
|
||||
}
|
||||
|
||||
.subscribe-card {
|
||||
padding-top: 2rem;
|
||||
width: 28rem;
|
||||
border-radius: 4px;
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 2px 0 rgba(26, 24, 29, 0.16), 0 1px 4px 0 rgba(26, 24, 29, 0.12);
|
||||
background-color: $white;
|
||||
}
|
||||
@@ -452,7 +463,14 @@
|
||||
height: 40px;
|
||||
}
|
||||
|
||||
.svg-calendar, .svg-heart {
|
||||
.svg-calendar {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.svg-heart {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
@@ -479,8 +497,10 @@
|
||||
}
|
||||
|
||||
.svg-gem {
|
||||
width: 32px;
|
||||
height: 28px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.svg-gems {
|
||||
@@ -494,8 +514,10 @@
|
||||
}
|
||||
|
||||
.svg-hourglass {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
|
||||
margin-right: 2px;
|
||||
}
|
||||
|
||||
.svg-gift-box {
|
||||
@@ -521,11 +543,34 @@
|
||||
.w-55 {
|
||||
width: 55%;
|
||||
}
|
||||
|
||||
.nextHourglassDescription {
|
||||
font-size: 12px;
|
||||
font-style: italic;
|
||||
line-height: 1.33;
|
||||
color: $gray-100;
|
||||
margin-left: 100px;
|
||||
margin-right: 100px;
|
||||
}
|
||||
|
||||
.justify-content-evenly {
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
|
||||
.thanks-for-support {
|
||||
font-size: 12px;
|
||||
line-height: 1.33;
|
||||
text-align: center;
|
||||
color: $gray-100;
|
||||
}
|
||||
|
||||
.stat-column {
|
||||
width: 33%;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
import axios from 'axios';
|
||||
import min from 'lodash/min';
|
||||
import moment from 'moment';
|
||||
import { mapState } from '@/libs/store';
|
||||
|
||||
@@ -551,6 +596,7 @@ import logo from '@/assets/svg/habitica-logo-purple.svg';
|
||||
import paypalLogo from '@/assets/svg/paypal-logo.svg';
|
||||
import subscriberGems from '@/assets/svg/subscriber-gems.svg';
|
||||
import subscriberHourglasses from '@/assets/svg/subscriber-hourglasses.svg';
|
||||
import { getPlanContext } from '@/../../common/script/cron';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
@@ -649,23 +695,9 @@ export default {
|
||||
months: parseFloat(this.user.purchased.plan.extraMonths).toFixed(2),
|
||||
};
|
||||
},
|
||||
buyGemsGoldCap () {
|
||||
return {
|
||||
amount: min(this.gemGoldCap),
|
||||
};
|
||||
},
|
||||
gemGoldCap () {
|
||||
const baseCap = 25;
|
||||
const gemCapIncrement = 5;
|
||||
const capIncrementThreshold = 3;
|
||||
const { gemCapExtra } = this.user.purchased.plan.consecutive;
|
||||
const blocks = subscriptionBlocks[this.subscription.key].months / capIncrementThreshold;
|
||||
const flooredBlocks = Math.floor(blocks);
|
||||
|
||||
const userTotalDropCap = baseCap + gemCapExtra + flooredBlocks * gemCapIncrement;
|
||||
const maxDropCap = 50;
|
||||
|
||||
return [userTotalDropCap, maxDropCap];
|
||||
gemCap () {
|
||||
return planGemLimits.convCap
|
||||
+ this.user.purchased.plan.consecutive.gemCapExtra;
|
||||
},
|
||||
numberOfMysticHourglasses () {
|
||||
const numberOfHourglasses = subscriptionBlocks[this.subscription.key].months / 3;
|
||||
@@ -719,6 +751,16 @@ export default {
|
||||
subscriptionEndDate () {
|
||||
return moment(this.user.purchased.plan.dateTerminated).format('MM/DD/YYYY');
|
||||
},
|
||||
nextHourGlassDate () {
|
||||
const currentPlanContext = getPlanContext(this.user, new Date());
|
||||
|
||||
return currentPlanContext.nextHourglassDate;
|
||||
},
|
||||
nextHourGlass () {
|
||||
const nextHourglassMonth = this.nextHourGlassDate.format('MMM');
|
||||
|
||||
return nextHourglassMonth;
|
||||
},
|
||||
},
|
||||
mounted () {
|
||||
this.$store.dispatch('common:setTitle', {
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
<template>
|
||||
<button
|
||||
title="close dialog"
|
||||
@click="$emit('click', $event)"
|
||||
:style="{
|
||||
'--icon-color': iconColor,
|
||||
'--icon-color-hover': iconColorHover,
|
||||
}"
|
||||
:class="{'purple': purple}"
|
||||
@click="$emit('click', $event)"
|
||||
>
|
||||
<div
|
||||
v-once
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<span v-if="user">
|
||||
<br>
|
||||
<a
|
||||
@click.prevent="openBugReportModal()"
|
||||
target="_blank"
|
||||
@click.prevent="openBugReportModal()"
|
||||
>
|
||||
{{ $t('reportBug') }}
|
||||
</a>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<p>
|
||||
HabitRPG, Inc. (“HabitRPG,” “we,” “us,” or “our”) welcomes you. This privacy notice (the “Privacy
|
||||
Notice”) describes how we process the information we collect about or from you through our Website
|
||||
located at <a href='https://habitica.com/static/home'>https://habitica.com/static/home</a> and/or our Apps
|
||||
located at <a href="https://habitica.com/static/home">https://habitica.com/static/home</a> and/or our Apps
|
||||
(our “Digital Platforms”), from our users, subscribers, visitors and other users of our technology and
|
||||
platforms (together with our Digital Platforms, the “Habitica Service” or the “Service”), and when you
|
||||
otherwise interact with us. This Privacy Notice may be updated by us from time to time without notice to
|
||||
@@ -65,11 +65,36 @@
|
||||
policies linked to below:
|
||||
</p>
|
||||
<ul>
|
||||
<li>For Stripe, visit: <a href='https://stripe.com/privacy' target='_blank'>https://stripe.com/privacy</a></li>
|
||||
<li>For Amazon Pay, visit: <a href='https://pay.amazon.com/help/201751600' target='_blank'>https://pay.amazon.com/help/201751600</a></li>
|
||||
<li>For PayPal, visit: <a href='https://www.paypal.com/us/webapps/mpp/ua/privacy-full' target='_blank'>https://www.paypal.com/us/webapps/mpp/ua/privacy-full</a></li>
|
||||
<li>For Apple Pay, visit: <a href='https://www.apple.com/legal/privacy/data/en/apple-pay/' target='_blank'>https://www.apple.com/legal/privacy/data/en/apple-pay/</a></li>
|
||||
<li>For Google Pay, visit: <a href='https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid' target='_blank'>https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid</a></li>
|
||||
<li>
|
||||
For Stripe, visit: <a
|
||||
href="https://stripe.com/privacy"
|
||||
target="_blank"
|
||||
>https://stripe.com/privacy</a>
|
||||
</li>
|
||||
<li>
|
||||
For Amazon Pay, visit: <a
|
||||
href="https://pay.amazon.com/help/201751600"
|
||||
target="_blank"
|
||||
>https://pay.amazon.com/help/201751600</a>
|
||||
</li>
|
||||
<li>
|
||||
For PayPal, visit: <a
|
||||
href="https://www.paypal.com/us/webapps/mpp/ua/privacy-full"
|
||||
target="_blank"
|
||||
>https://www.paypal.com/us/webapps/mpp/ua/privacy-full</a>
|
||||
</li>
|
||||
<li>
|
||||
For Apple Pay, visit: <a
|
||||
href="https://www.apple.com/legal/privacy/data/en/apple-pay/"
|
||||
target="_blank"
|
||||
>https://www.apple.com/legal/privacy/data/en/apple-pay/</a>
|
||||
</li>
|
||||
<li>
|
||||
For Google Pay, visit: <a
|
||||
href="https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid"
|
||||
target="_blank"
|
||||
>https://support.google.com/googlepay/answer/10223752?hl=en&co=GENIE.Platform%3DAndroid</a>
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
We reserve the right to change our payment vendors at any time, or to use additional payment vendors, at
|
||||
@@ -95,22 +120,32 @@
|
||||
see the information regarding analytics providers discussed further below.
|
||||
</p>
|
||||
<ul>
|
||||
<li><strong>Session Cookies</strong>: We use session cookies to make it easier for you to navigate our Service. A
|
||||
session ID cookie expires when you close the Service.</li>
|
||||
<li><strong>Persistent Cookies</strong>: A persistent cookie remains on your device for an extended period of time or
|
||||
<li>
|
||||
<strong>Session Cookies</strong>: We use session cookies to make it easier for you to navigate our Service. A
|
||||
session ID cookie expires when you close the Service.
|
||||
</li>
|
||||
<li>
|
||||
<strong>Persistent Cookies</strong>: A persistent cookie remains on your device for an extended period of time or
|
||||
until you delete it. Persistent cookies enable us to better understand how you interact with the Service and to
|
||||
provide visitors with a better and more personalized experience by retaining information about their identity and
|
||||
preferences, including but not limited to keeping them logged in even if the browser is closed.</li>
|
||||
preferences, including but not limited to keeping them logged in even if the browser is closed.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
If you do not want us to place a cookie on your device, you may be able to turn that feature off on your
|
||||
device. You may refuse to accept cookies from the Service at any time by activating the setting on your
|
||||
browser which allows you to refuse cookies. Further information about the procedure to follow in order to
|
||||
disable cookies can be found on your Internet browser provider’s website via your help screen. You may
|
||||
wish to refer to <a href='http://www.allaboutcookies.org/manage-cookies/index.html' target='_blank'>
|
||||
http://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
|
||||
wish to refer to <a
|
||||
href="http://www.allaboutcookies.org/manage-cookies/index.html"
|
||||
target="_blank"
|
||||
>
|
||||
http://www.allaboutcookies.org/manage-cookies/index.html</a> for information on commonly used browsers.
|
||||
For more information about targeting and advertising cookies and how you can opt out, you can also visit
|
||||
<a href='http://optout.aboutads.info' target='_blank'>http://optout.aboutads.info</a>. Please be aware
|
||||
<a
|
||||
href="http://optout.aboutads.info"
|
||||
target="_blank"
|
||||
>http://optout.aboutads.info</a>. Please be aware
|
||||
that if cookies are disabled, not all features of the Service may operate properly or as intended.
|
||||
</p>
|
||||
<h3>Third-Party Analytics Providers</h3>
|
||||
@@ -129,8 +164,18 @@
|
||||
advised that if you opt out of any service, you may not be able to use the full functionality of the Service.
|
||||
</p>
|
||||
<ul>
|
||||
<li>For Google Analytics, visit: <a href='https://marketingplatform.google.com/about/analytics/' target='_blank'>https://marketingplatform.google.com/about/analytics/</a></li>
|
||||
<li>For Amplitude, visit: <a href='https://amplitude.com/privacy' target='_blank'>https://amplitude.com/privacy</a></li>
|
||||
<li>
|
||||
For Google Analytics, visit: <a
|
||||
href="https://marketingplatform.google.com/about/analytics/"
|
||||
target="_blank"
|
||||
>https://marketingplatform.google.com/about/analytics/</a>
|
||||
</li>
|
||||
<li>
|
||||
For Amplitude, visit: <a
|
||||
href="https://amplitude.com/privacy"
|
||||
target="_blank"
|
||||
>https://amplitude.com/privacy</a>
|
||||
</li>
|
||||
</ul>
|
||||
<h3>Third-Party Advertisers/Remarketers</h3>
|
||||
<p>
|
||||
@@ -150,7 +195,9 @@
|
||||
</p>
|
||||
<p>
|
||||
For more information on our advertising partner Google AdMob, please visit <a
|
||||
href='https://policies.google.com/privacy?hl=en' target='_blank'>https://policies.google.com/privacy?hl=en</a>.
|
||||
href="https://policies.google.com/privacy?hl=en"
|
||||
target="_blank"
|
||||
>https://policies.google.com/privacy?hl=en</a>.
|
||||
</p>
|
||||
<h3>Geolocation Information</h3>
|
||||
<p>
|
||||
@@ -229,7 +276,7 @@
|
||||
</p>
|
||||
<p>
|
||||
You may opt out at any time from the use of your personal information for direct marketing purposes by
|
||||
emailing the instructions to <a href='mailto:admin@habitica.com'>admin@habitica.com</a> or by clicking
|
||||
emailing the instructions to <a href="mailto:admin@habitica.com">admin@habitica.com</a> or by clicking
|
||||
on the “Unsubscribe” link located on the bottom of any HabitRPG marketing email and following the
|
||||
instructions found on the page to which the link takes you. Please allow us a reasonable time to process
|
||||
your request. You cannot opt out of receiving transactional e-mails related to the Service.
|
||||
@@ -274,7 +321,7 @@
|
||||
direct marketing purposes during the preceding calendar year, including the names and addresses of those
|
||||
third parties, and examples of the types of Service or products marketed by those third parties. If you wish
|
||||
to submit a request pursuant to Section 1798.83, please contact HabitRPG via email at
|
||||
<a href='mailto:admin@habitica.com'>admin@habitica.com</a>.
|
||||
<a href="mailto:admin@habitica.com">admin@habitica.com</a>.
|
||||
</p>
|
||||
<h2>NEVADA PRIVACY RIGHTS</h2>
|
||||
<p>
|
||||
@@ -291,7 +338,7 @@
|
||||
<h2>LINKS TO EXTERNAL WEBSITES</h2>
|
||||
<p>
|
||||
The Service may contain links to third-party websites (“<span style="text-decoration: underline;">External
|
||||
Sites</span>”). HabitRPG has no control over the privacy practices or the content of any such External Sites.
|
||||
Sites</span>”). HabitRPG has no control over the privacy practices or the content of any such External Sites.
|
||||
As such, we are not responsible for the content or the privacy policies of such External Sites. You should
|
||||
check the applicable privacy notice or privacy policy and terms of use when visiting any such External Sites.
|
||||
</p>
|
||||
@@ -306,8 +353,8 @@
|
||||
</p>
|
||||
<h2>HOW TO CONTACT US</h2>
|
||||
<p>
|
||||
If you have questions about this Privacy Notice, please e-mail us at <a href='mailto:admin@habitica.com'>
|
||||
admin@habitica.com</a> with “Privacy Notice” in the subject line.
|
||||
If you have questions about this Privacy Notice, please e-mail us at <a href="mailto:admin@habitica.com">
|
||||
admin@habitica.com</a> with “Privacy Notice” in the subject line.
|
||||
</p>
|
||||
<address>
|
||||
<strong>HabitRPG, Inc.</strong>
|
||||
|
||||
@@ -2,11 +2,20 @@
|
||||
<!-- eslint-disable max-len -->
|
||||
<div class="container-fluid">
|
||||
<h1>Terms of Service</h1>
|
||||
<p class="strong pagemeta">Last Updated: December 14, 2021</p>
|
||||
<p class="strong pagemeta">
|
||||
Last Updated: December 14, 2021
|
||||
</p>
|
||||
<p>Thanks for choosing Habitica!</p>
|
||||
<p>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">https://habitica.com/static/privacy</a> (collectively, the "Agreement"), registering for the Service (as defined below), accessing or using any part of the Service, 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.</p>
|
||||
<p>
|
||||
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"
|
||||
>https://habitica.com/static/privacy</a> (collectively, the "Agreement"), registering for the Service (as defined below), accessing or using any part of the Service, 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.
|
||||
</p>
|
||||
<p>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.</p>
|
||||
<p class="strong">THE SECTIONS BELOW TITLED "BINDING ARBITRATION," AND "CLASS ACTION WAIVER" CONTAIN A BINDING ARBITRATION AGREEMENT AND CLASS ACTION WAIVER. THEY AFFECT YOUR LEGAL RIGHTS. PLEASE READ THEM.</p>
|
||||
<p class="strong">
|
||||
THE SECTIONS BELOW TITLED "BINDING ARBITRATION," AND "CLASS ACTION WAIVER" CONTAIN A BINDING ARBITRATION AGREEMENT AND CLASS ACTION WAIVER. THEY AFFECT YOUR LEGAL RIGHTS. PLEASE READ THEM.
|
||||
</p>
|
||||
<h2>Changes to the Terms of Service</h2>
|
||||
<p>These Terms of Service are effective as of the last updated date stated at the top of this page. We may change these Terms of Service from time to time with or without notice to you. By accessing the Service after we make any such changes to this Terms of Service, you are deemed to have accepted such changes. Please be aware that, to the extent permitted by applicable law, our use of the information collected is governed by the Terms of Service in effect at the time we collect the information. Please refer back to this Terms of Service on a regular basis.</p>
|
||||
<p>Our Service allows you to upload, store, send, download, or receive content, including but not limited to information, text, graphics, artwork, or other material ("Content"). You retain ownership of any intellectual property rights that you have in your Content. You hereby grant HabitRPG a worldwide, perpetual, irrevocable, sublicenseable, transferable, assignable, non-exclusive, and royalty-free right and license to use, reproduce, distribute, adapt, modify, translate, create derivative works of, publicly perform, publicly display, digitally perform, make, have made, sell, offer for sale, and import your Content, including all intellectual property rights therein. You represent, warrant, and agree that your Content does not and will not violate any third-party intellectual property, privacy, or other rights, and that you have all right, title and interest in and to your Content required to grant us the license above. We reserve the right at all times, but have no obligation, to delete or refuse to use or distribute any Content on or through the Service, including your Content.</p>
|
||||
@@ -22,9 +31,9 @@
|
||||
<p>HabitRPG reserves the right, in its sole discretion, to add, modify, or remove functionalities or features from the Service, and improve, change and/or update the Service. We may also suspend or terminate the Service at any time, with or without notice to you.</p>
|
||||
<p>You can choose to stop using our Service at any time. We may suspend or cease providing the Service to you at any time, including if we determine in our sole discretion, that:</p>
|
||||
<ul>
|
||||
<li>You have violated any part of this Agreement, the Privacy Policy, or the Community Guidelines;</li>
|
||||
<li>We have stopped offering the Service in your region; or</li>
|
||||
<li>Doing so would be in the best interests of our community, the Service, or the rights of a third party.</li>
|
||||
<li>You have violated any part of this Agreement, the Privacy Policy, or the Community Guidelines;</li>
|
||||
<li>We have stopped offering the Service in your region; or</li>
|
||||
<li>Doing so would be in the best interests of our community, the Service, or the rights of a third party.</li>
|
||||
</ul>
|
||||
<p>If your account is terminated, you will no longer have access to it, including to any of the associated data or Content. You will not be entitled to any refunds and we will have no liability to you. We also reserve the right to terminate any other accounts you may have created, as well as access to any other HabitRPG Service (also without refunds or liability to you).</p>
|
||||
<p>You understand and agree that using the Service comes with the risk that your account may be terminated or suspended at our discretion and at any time. Please keep this risk in mind and comport yourself appropriately.</p>
|
||||
@@ -35,31 +44,36 @@
|
||||
<p>Using our Service does not grant you ownership of any intellectual property rights in our Service or the content you may have access to. You may not use any copyrighted content in our Service unless you obtain permission from the content owner and/or are otherwise permitted by law. The Terms do not grant you the right to use any branding or logos used in our Service. Our Service may display some logos, trademarks, or branding materials that are not the property of HabitRPG. Such content is the sole responsibility of the entity that makes it available.</p>
|
||||
<p>You may not abuse and/or misuse our Service, including but not limited to the following actions:</p>
|
||||
<ul>
|
||||
<li>Using the Service for any unlawful purposes or activities;</li>
|
||||
<li>Uploading any content to the Service in violation of any applicable law, including but not limited to intellectual property laws and publicity laws;</li>
|
||||
<li>Sending unsolicited promotions or advertisements;</li>
|
||||
<li>Accessing or tampering with the Service's server systems;</li>
|
||||
<li>Interfering with or disrupting the access of any user, host, or network;</li>
|
||||
<li>Abusing or submitting excessively frequent requests to the Service via the API</li>
|
||||
<li>Spamming chat, whether for personal or commercial purposes, by disrupting the flow of conversation with repeated postings;</li>
|
||||
<li>Impersonating any person, business, or entity, including an employee of HabitRPG, or member of the Habitica moderation team, or communicating in any way that makes it appear that the communication originates from Habitica staff or HabitRPG;</li>
|
||||
<li>Transmitting or communicating any content which, in the sole and exclusive discretion of HabitRPG, is deemed offensive, including language that is unlawful, harmful, threatening, abusive, harassing, defamatory, vulgar, obscene, sexually explicit, or racially, ethically, or otherwise objectionable,</li>
|
||||
<li>Participating in any action which, in the sole and exclusive judgment of HabitRPG, defrauds any other user of the Game, including by scamming or social engineering; or</li>
|
||||
<li>Inducing or encouraging others to violate the Community Guidelines or the Agreement.</li>
|
||||
<li>Using the Service for any unlawful purposes or activities;</li>
|
||||
<li>Uploading any content to the Service in violation of any applicable law, including but not limited to intellectual property laws and publicity laws;</li>
|
||||
<li>Sending unsolicited promotions or advertisements;</li>
|
||||
<li>Accessing or tampering with the Service's server systems;</li>
|
||||
<li>Interfering with or disrupting the access of any user, host, or network;</li>
|
||||
<li>Abusing or submitting excessively frequent requests to the Service via the API</li>
|
||||
<li>Spamming chat, whether for personal or commercial purposes, by disrupting the flow of conversation with repeated postings;</li>
|
||||
<li>Impersonating any person, business, or entity, including an employee of HabitRPG, or member of the Habitica moderation team, or communicating in any way that makes it appear that the communication originates from Habitica staff or HabitRPG;</li>
|
||||
<li>Transmitting or communicating any content which, in the sole and exclusive discretion of HabitRPG, is deemed offensive, including language that is unlawful, harmful, threatening, abusive, harassing, defamatory, vulgar, obscene, sexually explicit, or racially, ethically, or otherwise objectionable,</li>
|
||||
<li>Participating in any action which, in the sole and exclusive judgment of HabitRPG, defrauds any other user of the Game, including by scamming or social engineering; or</li>
|
||||
<li>Inducing or encouraging others to violate the Community Guidelines or the Agreement.</li>
|
||||
</ul>
|
||||
<p>HabitRPG, in its sole discretion, will determine what constitutes abuse and/or misuse of our Service.</p>
|
||||
<h2>Premium Service and Payments</h2>
|
||||
<p>You may choose our free Service or paid Service ("Premium") depending on your needs. We do not guarantee when, if ever, Premium features will be available in the free Service. You may upgrade from free Service to Premium at any time by any of the following methods:</p>
|
||||
<ul>
|
||||
<li>Web: Selecting the user icon in the top right corner and selecting "Subscription" from the dropdown menu,</li>
|
||||
<li>Web: Clicking the green gem icon in the navigation bar at the top of the screen and following instructions to Subscribe or Buy Gems,</li>
|
||||
<li>Android: Tap the menu icon in the top left corner of the main screen and select "Gems & Subscription". Follow the instructions to make a purchase.</li>
|
||||
<li>iOS: Tap the menu icon in the lower right and select "Gems & Subscriptions". Follow the instructions to make a purchase.</li>
|
||||
<li>Web: Selecting the user icon in the top right corner and selecting "Subscription" from the dropdown menu,</li>
|
||||
<li>Web: Clicking the green gem icon in the navigation bar at the top of the screen and following instructions to Subscribe or Buy Gems,</li>
|
||||
<li>Android: Tap the menu icon in the top left corner of the main screen and select "Gems & Subscription". Follow the instructions to make a purchase.</li>
|
||||
<li>iOS: Tap the menu icon in the lower right and select "Gems & Subscriptions". Follow the instructions to make a purchase.</li>
|
||||
</ul>
|
||||
<p>You will be charged the amount shown on Pricing before you can access Premium Service. All prices shown on Pricing are inclusive of any applicable sales taxes, levies, value-added taxes, or duties imposed by taxing authorities, and you are responsible for payment of all such taxes, levies, or duties. We may revise the Pricing at any time and may, from time to time, modify, amend, or supplement our fees and fee-billing methods. Such changes shall be effective upon posting on the Pricing page or elsewhere in the Service. If there is a dispute regarding payment of fees to us, we reserve the right to terminate or suspend your account at our sole discretion.</p>
|
||||
<p>BY PURCHASING PREMIUM YOU EXPRESSLY UNDERSTAND AND AGREE TO OUR REFUND POLICY:</p>
|
||||
<p>WITHIN THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE AS SHOWN ON YOUR PAYMENT BILL, YOU CAN REQUEST A FULL REFUND BY CONTACTING US AT ADMIN@HABITICA.COM. AFTER THIRTY (30) DAYS OF YOUR PREMIUM PAYMENT DATE, ANY PAYMENT REFUND IS SOLELY SUBJECT TO OUR DISCRETION. THE REFUND SHALL BE YOUR SOLE AND EXCLUSIVE REMEDY.</p>
|
||||
<p>FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a href="http://reportaproblem.apple.com" target="_blank">http://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUND FOR APP STORE PURCHASES MADE BY CUSTOMERS.</p>
|
||||
<p>
|
||||
FOR ANY CUSTOMER WHO PURCHASED PREMIUM IN APPLE INC.'s APP STORE ("APP STORE"), PLEASE CONTACT APPLE INC.'s SUPPORT TEAM: <a
|
||||
href="http://reportaproblem.apple.com"
|
||||
target="_blank"
|
||||
>http://reportaproblem.apple.com</a>. APPLE'S APP STORE DOES NOT ALLOW DEVELOPERS TO ISSUE REFUND FOR APP STORE PURCHASES MADE BY CUSTOMERS.
|
||||
</p>
|
||||
<h2>Warranty Disclaimer</h2>
|
||||
<p>THE SERVICE AND ANY CONTENT MADE AVAILABLE BY HABITRPG VIA THE SERVICE IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT ANY WARRANTIES OF ANY KIND, INCLUDING, WITHOUT LIMITATION, THAT THE SERVICE OR CONTENT WILL OPERATE ERROR-FREE OR THAT THE SERVICE OR CONTENT OR ITS SERVERS ARE FREE OF COMPUTER VIRUSES OR SIMILAR CONTAMINATION OR DESTRUCTIVE FEATURES.</p>
|
||||
<p>WE DISCLAIM ALL WARRANTIES, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF TITLE, MERCHANTABILITY, NON-INFRINGEMENT OF THIRD PARTIES' RIGHTS, AND FITNESS FOR PARTICULAR PURPOSE AND ANY WARRANTIES ARISING FROM A COURSE OF DEALING, COURSE OF PERFORMANCE, OR USAGE OF TRADE.</p>
|
||||
@@ -71,7 +85,12 @@
|
||||
<h2>Compliance with Applicable Laws</h2>
|
||||
<p>The Service is based in the United States. We make no claims concerning whether the Service or posted content may be downloaded, viewed, or be appropriate for use outside of the United States. If you access the Service or such content from outside of the United States, you do so at your own risk. Whether inside or outside of the United States, you are solely responsible for ensuring compliance with the laws of your specific jurisdiction.</p>
|
||||
<h2>Binding Arbitration</h2>
|
||||
<p>In the event of a dispute arising under or relating to this Agreement or the Service (each, a "<u>Dispute</u>"), such dispute will be finally and exclusively resolved by binding arbitration governed by the Federal Arbitration Act ("<u>FAA</u>"). Any election to arbitrate, at any time, shall be final and binding on the other party. NEITHER PARTY SHALL HAVE THE RIGHT TO LITIGATE SUCH CLAIM IN COURT OR TO HAVE A JURY TRIAL, EXCEPT EITHER PARTY MAY BRING ITS CLAIM IN ITS LOCAL SMALL CLAIMS COURT, IF PERMITTED BY THAT SMALL CLAIMS COURT RULES AND IF WITHIN SUCH COURT'S JURISDICTION. ARBITRATION IS DIFFERENT FROM COURT, AND DISCOVERY AND APPEAL RIGHTS MAY ALSO BE LIMITED IN ARBITRATION. 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">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>
|
||||
In the event of a dispute arising under or relating to this Agreement or the Service (each, a "<u>Dispute</u>"), such dispute will be finally and exclusively resolved by binding arbitration governed by the Federal Arbitration Act ("<u>FAA</u>"). Any election to arbitrate, at any time, shall be final and binding on the other party. NEITHER PARTY SHALL HAVE THE RIGHT TO LITIGATE SUCH CLAIM IN COURT OR TO HAVE A JURY TRIAL, EXCEPT EITHER PARTY MAY BRING ITS CLAIM IN ITS LOCAL SMALL CLAIMS COURT, IF PERMITTED BY THAT SMALL CLAIMS COURT RULES AND IF WITHIN SUCH COURT'S JURISDICTION. ARBITRATION IS DIFFERENT FROM COURT, AND DISCOVERY AND APPEAL RIGHTS MAY ALSO BE LIMITED IN ARBITRATION. 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"
|
||||
>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>ANY CLAIMS, ACTIONS OR PROCEEDINGS BY YOU MUST BE COMMENCED WITHIN ONE YEAR AFTER THE EVENT THAT GAVE RISE TO YOUR CLAIM OCCURS. ALL OTHER CLAIMS YOU MAY HAVE ARE PERMANENTLY BARRED.</p>
|
||||
<h2>Class Action Waiver</h2>
|
||||
<p>You agree that any arbitration or proceeding shall be limited to the Dispute between us and you individually. To the full extent permitted by law, (i) no arbitration or proceeding shall be joined with any other; (ii) there is no right or authority for any Dispute to be arbitrated or resolved on a class action-basis or to utilize class action procedures; and (iii) there is no right or authority for any Dispute to be brought in a purported representative capacity on behalf of the general public or any other persons. YOU AGREE THAT YOU MAY BRING CLAIMS AGAINST US ONLY IN YOUR INDIVIDUAL CAPACITY AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING.</p>
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
import includes from 'lodash/includes';
|
||||
|
||||
export default {
|
||||
methods: {
|
||||
foolPet (pet) {
|
||||
const SPECIAL_PETS = [
|
||||
'Wolf-Veteran',
|
||||
'Wolf-Cerberus',
|
||||
'Dragon-Hydra',
|
||||
'Turkey-Base',
|
||||
'BearCub-Polar',
|
||||
'MantisShrimp-Base',
|
||||
'JackOLantern-Base',
|
||||
'Mammoth-Base',
|
||||
'Tiger-Veteran',
|
||||
'Phoenix-Base',
|
||||
'Turkey-Gilded',
|
||||
'MagicalBee-Base',
|
||||
'Lion-Veteran',
|
||||
'Gryphon-RoyalPurple',
|
||||
'JackOLantern-Ghost',
|
||||
'Jackalope-RoyalPurple',
|
||||
'Orca-Base',
|
||||
'Bear-Veteran',
|
||||
'Hippogriff-Hopeful',
|
||||
'Fox-Veteran',
|
||||
'JackOLantern-Glow',
|
||||
'Gryphon-Gryphatrice',
|
||||
'JackOLantern-RoyalPurple',
|
||||
];
|
||||
const BASE_PETS = [
|
||||
'Wolf',
|
||||
'TigerCub',
|
||||
'PandaCub',
|
||||
'LionCub',
|
||||
'Fox',
|
||||
'FlyingPig',
|
||||
'BearCub',
|
||||
'Dragon',
|
||||
'Cactus',
|
||||
];
|
||||
if (!pet) return 'Pet-Cactus-Virtual';
|
||||
if (SPECIAL_PETS.indexOf(pet) !== -1) {
|
||||
return 'Pet-Wolf-Virtual';
|
||||
}
|
||||
const species = pet.slice(0, pet.indexOf('-'));
|
||||
if (includes(BASE_PETS, species)) {
|
||||
return `Pet-${species}-Virtual`;
|
||||
}
|
||||
return 'Pet-Fox-Virtual';
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -117,5 +117,7 @@
|
||||
"achievementKickstarter2019Text": "من مساهمي حملة كيك-ستارتر للدبابيس",
|
||||
"achievementDomesticatedModalText": "لقد جمعت كل الحيوانات الأليفة المستأنسة!",
|
||||
"achievementDomesticatedText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة المستأنسة: النمس ، وخنزير غينيا ، والديك ، والخنزير الطائر ، والجرذ ، والأرنب ، والحصان ، والبقر!",
|
||||
"achievementDomesticated": "ا-يا-ا-يا-يو"
|
||||
"achievementDomesticated": "ا-يا-ا-يا-يو",
|
||||
"achievementBirdsOfAFeatherModalText": "تقوم بجمع كل الحيوانات الأليفة الطائرة!",
|
||||
"achievementZodiacZookeeperText": "لقد فقس جميع الألوان القياسية للحيوانات الأليفة في الأبراج: الجرذ ، البقرة ، الأرنب ، الأفعى ، الحصان ، الأغنام ، القرد ، الديك ، الذئب ، النمر ، الخنزير الطائر ، والتنين!"
|
||||
}
|
||||
|
||||
@@ -408,5 +408,6 @@
|
||||
"backgroundArchaeologicalDigText": "Archaeological Dig",
|
||||
"backgroundArchaeologicalDigNotes": "Unearth secrets of the ancient past at an Archaeological Dig.",
|
||||
"backgroundScribesWorkshopText": "Scribe's Workshop",
|
||||
"backgroundScribesWorkshopNotes": "Write your next great scroll in a Scribe's Workshop."
|
||||
"backgroundScribesWorkshopNotes": "Write your next great scroll in a Scribe's Workshop.",
|
||||
"backgrounds022019": "مجموعة 57: تم إصدارها في فبراير 2019"
|
||||
}
|
||||
|
||||
@@ -118,5 +118,8 @@
|
||||
"welcome3": "تقدم في الحياة واللعبة!",
|
||||
"welcome3notes": "As you improve your life, your avatar will level up and unlock pets, quests, equipment, and more!",
|
||||
"imReady": "ادخل Habitica",
|
||||
"limitedOffer": "Available until <%= date %>"
|
||||
"limitedOffer": "Available until <%= date %>",
|
||||
"nGemsGift": "<%= nGems %> الماس (هدية)",
|
||||
"amountExp": "<%= amount %> خبرة",
|
||||
"nGems": "<%= nGems %> الماس"
|
||||
}
|
||||
|
||||
@@ -68,5 +68,13 @@
|
||||
"petsFound": "إنشاء حيوانات أليفة",
|
||||
"keyToPets": "مفتاح بيوت الحيوانات",
|
||||
"noActiveMount": "لا يوجد تثبيت نشط",
|
||||
"questPets": "بحث الحيوانات"
|
||||
"questPets": "بحث الحيوانات",
|
||||
"releasePetsConfirm": "هل أنت متأكد أنك تريد إطلاق سراح حيوانك الأليف القياسي؟",
|
||||
"keyToMounts": "مفتاح بيت الحيوان",
|
||||
"petsReleased": "أفرج عن الحيوانات الأليفة",
|
||||
"keyToPetsDesc": "حرر جميع الحيوانات المسموح بها حتى تتمكن من جمعها مرة أخرى. (لا تتأثر بالحيوانات الأليفة والحيوانات الأليفة الغريبة.)",
|
||||
"petName": "<%= potion(locale) %> <%= egg(locale) %>",
|
||||
"keyToMountsDesc": "حرر جميع العينات القياسية حتى تتمكن من جمعها مرة أخرى. (لا تتأثر عمليات تثبيت المهام وعمليات التثبيت النادرة.)",
|
||||
"keyToBoth": "مفاتيح رئيسية لبيوت الكلاب",
|
||||
"releasePetsSuccess": "تم إطلاق حيوانك الأليف القياسي!"
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"communityGuidelinesWarning": "Imajte na umu da vaše ime za prikaz, fotografija profila i prikaz moraju biti u skladu s <a href='https://habitica.com/static/community-guidelines' target='_blank'> Smjernicama zajednice </a> ( npr. bez psovki, bez tema za odrasle, bez vrijeđanja itd.). Ako imate bilo kakvih pitanja o tome je li nešto prikladno ili ne, slobodno pišite na <% = hrefBlankCommunityManagerEmail%>!",
|
||||
"communityGuidelinesWarning": "Imajte na umu da vaše ime za prikaz, fotografija profila i prikaz moraju biti u skladu s <a href='https://habitica.com/static/community-guidelines' target='_blank'> Smjernicama zajednice </a> ( npr. bez psovki, bez tema za odrasle, bez vrijeđanja itd.). Ako imate bilo kakvih pitanja o tome je li nešto prikladno ili ne, slobodno pišite na <%= hrefBlankCommunityManagerEmail %>!",
|
||||
"profile": "Profil",
|
||||
"avatar": "Prilagodi avatar",
|
||||
"editAvatar": "Uredi avatar",
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
"tier": "Nivo",
|
||||
"conRewardsURL": "http://habitica.fandom.com/wiki/Contributor_Rewards",
|
||||
"surveysSingle": "Pomogli ste da Habitica raste, bilo popunjavanjem ankete ili pomaganjem tokom testiranja. Hvala vam!",
|
||||
"surveysMultiple": "Pomogli ste Habitici da raste u <% = count%> prilika, bilo popunjavanjem ankete ili pomaganjem tokom testiranja. Hvala vam!",
|
||||
"surveysMultiple": "Pomogli ste Habitici da raste u <%= count %> prilika, bilo popunjavanjem ankete ili pomaganjem tokom testiranja. Hvala vam!",
|
||||
"blurbHallPatrons": "Ovo je dvorana pokrovitelja, u kojoj odajemo počast plemenitim avanturistima koji su podržali Habiticu na Kickstarter-u. Zahvaljujemo im što su nam pomogli da oživimo Habiticu!",
|
||||
"blurbHallContributors": "Ovo je dvorana saradnika, u kojoj se odaje počast saradnicima kroz princip otvorenog koda za Habiticu. Bilo kôdom, umjetnošću, muzikom, pisanjem ili čak samo uslužnošću, zaradili su <a href='http://habitica.wikia.com/wiki/Contributor_Rewards' target='_blank'> dragulje, ekskluzivnu opremu </a> i <a href='http://habitica.wikia.com/wiki/Contributor_Titles' target='_blank'>prestižne titule</a>. I vi možete doprinijeti Habitici! <a href='http://habitica.wikia.com/wiki/Contributing_to_Habitica' target='_blank'>Ovjde saznajte više.</a>"
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
"achievementDilatoryText": "Pomogao je poraziti Stravičnog zmaja odgađanja tokom Ljetnjeg festivala 2014!",
|
||||
"costumeContest": "Kostimirani takmičar",
|
||||
"costumeContestText": "Učestvovao u takmičenju kostima za Noć vještica. Pogledajte neke od sjajnih objava na blog.habitrpg.com!",
|
||||
"costumeContestTextPlural": "Učestvovalo u <% = count%> takmičenjima kostima za Noć vještica. Pogledajte neke od sjajnih objava na blog.habitrpg.com!",
|
||||
"costumeContestTextPlural": "Učestvovalo u <%= count %> takmičenjima kostima za Noć vještica. Pogledajte neke od sjajnih objava na blog.habitrpg.com!",
|
||||
"newPassSent": "Ako imamo vašu e-poštu u evidenciji, poslana su vam uputstva za postavljanje nove šifre.",
|
||||
"error": "Greška",
|
||||
"menu": "Izbornik",
|
||||
|
||||
@@ -6,5 +6,5 @@
|
||||
"webStep2Text": "Sada počnite rješavati svoje ciljeve sa liste! Dok dovršavate zadatke i potvrđujete ih na Habitici, steći ćete [Iskustvo](http://habitica.wikia.com/wiki/Experience_Points), koje vam pomaže da pređete na viši nivo, i [Zlatnike](http: // habitica. wikia.com/wiki/Gold_Points), koji vam omogućavaju da kupite nagrade. Ako padnete u loše navike ili propustite svoje dnevne zadatke, izgubit ćete [Zdravlje](http://habitica.wikia.com/wiki/Health_Points). Na taj način, Habitica iskustvo i zdravlje trake služe kao zabavni pokazatelj vašeg napretka prema zadatim ciljevima. Počet ćete viđati kako se vaš stvarni život poboljšava kako vaš lik napreduje u igri.",
|
||||
"step3": "Korak 3: Prilagodite i istražite Habitiku",
|
||||
"webStep3Text": "Nakon što se upoznate s osnovama, možete još više iskoristiti Habiticu pomoću ovih sjajnih karakteristika:\n * Organizirajte svoje zadatke pomoću [Oznaka](http://habitica.wikia.com/wiki/Tags) (uredite zadatak da biste ih dodali).\n * Prilagodite svoj [Avatar](http://habitica.wikia.com/wiki/Avatar) klikom na ikonu korisnika u gornjem desnom uglu.\n * Kupite svoju [Opremu](http://habitica.wikia.com/wiki/Equipment) u okviru Nagrade ili u [Prodavnici](<% = shopUrl%>) i promijenite je u [Inventar > Oprema] (<% = equipUrl%>).\n * Povežite se s drugim korisnicima putem [Aščinice](http://habitica.wikia.com/wiki/Tavern).\n * Počevši od 3. nivoa, izlegnite [Ljubimce](http://habitica.wikia.com/wiki/Pets) sakupljanjem [Jaja](http://habitica.wikia.com/wiki/Eggs) i [Napitaka za izlijeganje] (http://habitica.wikia.com/wiki/Hatching_Potions). [Hranite](http://habitica.wikia.com/wiki/Food) ih da postanu [Jahalice](http://habitica.wikia.com/wiki/Mounts).\n * Na nivou 10: odaberite određeni [Razred](http://habitica.wikia.com/wiki/Class_System), a zatim koristite [Vještine](http://habitica.wikia.com/wiki/Skills) specifične za razred (nivoi 11 do 14).\n * Napravite partiju sa svojim prijateljima (klikom na [Partija](<% = partyUrl%>) na navigacijskoj traci) kako biste ostali odgovorni i zaradite ponešto iz potrage.\n * Porazite čudovišta i sakupljajte predmete na [Potragama](http://habitica.wikia.com/wiki/Quests) (zadatak će vam biti postavljen na nivou 15).",
|
||||
"overviewQuestions": "Imate pitanja? Pogledajte [ČPP](<% = faqUrl%>)! Ako se vaše pitanje tamo ne spominje, možete zatražiti dodatnu pomoć u [Esnafu za pomoć na Habitica](<% = helpGuildUrl%>).\n\nSretno sa zadacima!"
|
||||
"overviewQuestions": "Imate pitanja? Pogledajte [ČPP](<%= faqUrl %>)! Ako se vaše pitanje tamo ne spominje, možete zatražiti dodatnu pomoć u [Esnafu za pomoć na Habitica](<%= helpGuildUrl %>).\n\nSretno sa zadacima!"
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
"notEnoughPetsMounts": "Niste prikupili dovoljno ljubimaca i jahalica",
|
||||
"notEnoughMounts": "Niste prikupili dovoljno jahalica",
|
||||
"notEnoughPets": "Niste prikupili dovoljno ljubimaca",
|
||||
"clickOnPotionToHatch": "Kliknite napitak za izlijeganje da biste ga iskoristili na <% = eggName%> i izlegnite novog ljubimca!",
|
||||
"clickOnPotionToHatch": "Kliknite napitak za izlijeganje da biste ga iskoristili na <%= eggName %> i izlegnite novog ljubimca!",
|
||||
"hatchDialogText": "Izlijte svoj napitak za izlijeganje <%= potionName %> na jaje <%= eggName %> i ono će se izleći u <%= petName %>.",
|
||||
"clickOnEggToHatch": "Kliknite na jaje da koristite vaš <%= potionName %> napitak za izlijeganje i izlegnite novog ljubimca!",
|
||||
"dragThisPotion": "Povucite <%= potionName %> do jajeta i izlegnite novog ljubimca!",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"rebirthNew": "Preporod: Nova avantura dostupna!",
|
||||
"rebirthUnlock": "Otključali ste preporod! Ova posebna stavka na pijaci omogućava vam da započnete novu igru sa 1. nivoa, zadržavajući zadatke, dostignuća, kućne ljubimce i još mnogo toga, kao da ste ponovo rođeni. Koristite ga da udahnete novi život Habitici ako smatrate da ste sve postigli ili da iskusite nove karakteristike svježim očima početnika!",
|
||||
"rebirthAchievement": "Započeli ste novu avanturu! Ovo vam je <% = number%> preporod, a najviši nivo koji ste postigli je <% = level%>. Da biste nizali ova dostignuća, započnite svoju sljedeću novu avanturu kada dosegnete još viši nivo!",
|
||||
"rebirthAchievement100": "Započeli ste novu avanturu! Ovo je vaš <% = number%> preporod, a najviši nivo koji ste postigli je 100 ili veći. Da biste nizali ova dostignuća, započnite svoju sljedeću novu avanturu kada dostignete najmanje 100!",
|
||||
"rebirthAchievement": "Započeli ste novu avanturu! Ovo vam je <%= number %> preporod, a najviši nivo koji ste postigli je <%= level %>. Da biste nizali ova dostignuća, započnite svoju sljedeću novu avanturu kada dosegnete još viši nivo!",
|
||||
"rebirthAchievement100": "Započeli ste novu avanturu! Ovo je vaš <%= number %> preporod, a najviši nivo koji ste postigli je 100 ili veći. Da biste nizali ova dostignuća, započnite svoju sljedeću novu avanturu kada dostignete najmanje 100!",
|
||||
"rebirthBegan": "Nova avantura je počela",
|
||||
"rebirthText": "Nova avantura je početa <%= rebirths %> put",
|
||||
"rebirthOrb": "Korištena je Kugla preporoda da se krene ispočetka nakon dostizanja <%= level %> nivoa.",
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
"streakSingular": "Ponavljač",
|
||||
"streakSingularText": "Obavljeno je 21-dnevni niz svakodnevnih zadataka",
|
||||
"perfectName": "<%= count %> potpunih dana",
|
||||
"perfectText": "Završili sve svakodnevne zadatke za <% = count%> dana. Ovim postignućem dobijate +nivo/2 poda ojačanja za sve statuse za sljedeći dan. Oni iznad nivoa 100 ne dobijaju nikakve dodatne efekte ojačanja.",
|
||||
"perfectText": "Završili sve svakodnevne zadatke za <%= count %> dana. Ovim postignućem dobijate +nivo/2 poda ojačanja za sve statuse za sljedeći dan. Oni iznad nivoa 100 ne dobijaju nikakve dodatne efekte ojačanja.",
|
||||
"perfectSingular": "Potpun dan",
|
||||
"perfectSingularText": "Završili sve aktivne svakodnevne zadatke u jednom danu. Ovim postignućem dobijate +nivo/2 boda za ojačanje za sve statuse za sljedeći dan. Oni iznad nivoa 100 ne dobijaju nikakve dodatne efekte ojačanja.",
|
||||
"fortifyName": "Napitak okrepljenja",
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
"achievementAridAuthorityModalText": "Du hast alle wüstenfarbenen Reittiere gezähmt!",
|
||||
"achievementAridAuthorityText": "Hat alle wüstenfarbenen Reittiere gezähmt.",
|
||||
"achievementAridAuthority": "Sandige Sachverständige",
|
||||
"achievementDustDevilModalText": "Du hast alle wüstenfarbenen Haustiere eingesammelt!",
|
||||
"achievementDustDevilText": "Hat alle wüstenfarbenen Haustiere eingesammelt.",
|
||||
"achievementDustDevilModalText": "Du hast alle wüstenfarbenen Haustiere gesammelt!",
|
||||
"achievementDustDevilText": "Hat alle wüstenfarbenen Haustiere gesammelt.",
|
||||
"achievementDustDevil": "Staubteufel",
|
||||
"achievementAllYourBaseModalText": "Du hast alle Standard-Reittiere gezähmt!",
|
||||
"achievementAllYourBaseText": "Hat alle Standard-Reittiere gezähmt.",
|
||||
"achievementBackToBasicsModalText": "Du hast alle Standard-Haustiere eingesammelt!",
|
||||
"achievementBackToBasicsText": "Hat alle Standard-Haustiere eingesammelt.",
|
||||
"achievementBackToBasicsModalText": "Du hast alle Standard-Haustiere gesammelt!",
|
||||
"achievementBackToBasicsText": "Hat alle Standard-Haustiere gesammelt.",
|
||||
"achievementBackToBasics": "Zurück zu den Anfängen",
|
||||
"achievementJustAddWaterModalText": "Du hast die Oktopus-, Seepferdchen-, Tintenfisch-, Wal-, Meeresschildkröten-, Nacktkiemerschnecken-, Seeschlagen- und Delfinhaustier-Quests erfüllt!",
|
||||
"achievementJustAddWaterText": "Hat die Oktopus-, Seepferdchen-, Tintenfisch-, Wal-, Meeresschildkröten-, Nacktkiemerschnecken-, Seeschlangen- und Delfinhaustier-Quests erfüllt.",
|
||||
@@ -86,7 +86,7 @@
|
||||
"achievementFreshwaterFriends": "Süßwasser-Freunde",
|
||||
"achievementAllThatGlittersModalText": "Du hast alle goldenen Reittiere gezähmt!",
|
||||
"achievementGoodAsGoldText": "Hat alle goldenen Haustiere gesammelt.",
|
||||
"achievementGoodAsGoldModalText": "Du hast alle goldenen Haustiere eingesammelt!",
|
||||
"achievementGoodAsGoldModalText": "Du hast alle goldenen Haustiere gesammelt!",
|
||||
"achievementAllThatGlittersText": "Hat alle goldenen Reittiere gezähmt.",
|
||||
"achievementAllThatGlitters": "Alles, was glänzt",
|
||||
"achievementGoodAsGold": "So gut wie Gold",
|
||||
@@ -99,24 +99,24 @@
|
||||
"achievementBoneCollector": "Knochensammler",
|
||||
"achievementRedLetterDayModalText": "Du hast alle roten Reittiere gezähmt!",
|
||||
"achievementRedLetterDayText": "Hat alle roten Reittiere gezähmt.",
|
||||
"achievementSeeingRedModalText": "Du hast alle rote Haustiere gesammelt!",
|
||||
"achievementSeeingRedModalText": "Du hast alle roten Haustiere gesammelt!",
|
||||
"achievementSeeingRedText": "Hat alle roten Haustiere gesammelt.",
|
||||
"achievementSeeingRed": "Rot Sehen",
|
||||
"achievementRedLetterDay": "Roter Faden",
|
||||
"achievementLegendaryBestiaryModalText": "Du hast alle mystischen Haustiere gesammelt!",
|
||||
"achievementLegendaryBestiaryText": "Hat alle mystischen Haustiere ausgebrütet: Drachen-Jungtier, Fliegendes Ferkel, Greifen-Jungtier, Seeschlangen-Haustier und Einhorn-Junges!",
|
||||
"achievementLegendaryBestiaryText": "Hat alle mystischen Haustiere ausgebrütet: Drachen-Jungtier, Fliegendes Ferkel, Greifen-Jungtier, Seeschlangen-Haustier und Einhorn-Fohlen!",
|
||||
"achievementLegendaryBestiary": "Legendäres Bestiarium",
|
||||
"achievementSeasonalSpecialistModalText": "Du hast alle saisonalen Quests abgeschlossen!",
|
||||
"achievementSeasonalSpecialistText": "Hat alle Quests der Frühlings- und Winter-Saison abgeschlossen: Eierjagd, Wildernder Weihnachtswichtel, und Finde das Jungtier!",
|
||||
"achievementSeasonalSpecialist": "Saisonal Spezial",
|
||||
"achievementSeasonalSpecialist": "Saisonaler Spezialist",
|
||||
"achievementWildBlueYonderModalText": "Du hast alle blauen Zuckerwatte-Reittiere gezähmt!",
|
||||
"achievementWildBlueYonderText": "Hat alle blauen Zuckerwatte-Reittiere gezähmt.",
|
||||
"achievementWildBlueYonder": "Weite Ferne",
|
||||
"achievementVioletsAreBlueModalText": "Du hast alle blauen Zuckerwattehaustiere gesammelt!",
|
||||
"achievementVioletsAreBlueText": "Hat alle blauen Zuckerwattehaustiere gesammelt.",
|
||||
"achievementWildBlueYonder": "Das wilde weite Blau",
|
||||
"achievementVioletsAreBlueModalText": "Du hast alle blauen Zuckerwatte-Haustiere gesammelt!",
|
||||
"achievementVioletsAreBlueText": "Hat alle blauen Zuckerwatte-Haustiere gesammelt.",
|
||||
"achievementVioletsAreBlue": "Veilchen sind blau",
|
||||
"achievementDomesticated": "E-I-E-I-O",
|
||||
"achievementDomesticatedModalText": "Du hast alle zähmbaren Tiere gesammelt!",
|
||||
"achievementDomesticatedModalText": "Du hast alle gezähmten Tiere gesammelt!",
|
||||
"achievementDomesticatedText": "Hat alle Standardfarben für gezähmte Tiere ausgebrütet: Frettchen, Meerschweinchen, Hahn, Fliegendes Schwein, Ratte, Häschen, Pferd und Kuh!",
|
||||
"achievementShadeOfItAll": "Der Schatten über allen",
|
||||
"achievementShadeOfItAllModalText": "Du hast alle Schatten-Reittiere gezähmt!",
|
||||
@@ -125,6 +125,9 @@
|
||||
"achievementShadyCustomerText": "Hat alle Schatten-Haustiere gesammelt.",
|
||||
"achievementShadyCustomer": "Der Schatten in Dir",
|
||||
"achievementZodiacZookeeper": "Tierkreiszeichen-Pfleger",
|
||||
"achievementZodiacZookeeperText": "Hat alle Tierkreiszeichen-Tiere ausgebrütet: Ratte, Kalb, Kaninchen, Schlange, Fohlen, Schaf, Affe, Hahn, Wolf, Tiger, Fliegendes Ferkel, und Drache!",
|
||||
"achievementZodiacZookeeperModalText": "Du hast alle Tierkreiszeichen-Tiere eingesammelt!"
|
||||
"achievementZodiacZookeeperText": "Hat alle Standardfarben der Tierkreiszeichen-Tiere ausgebrütet: Ratte, Kalb, Kaninchen, Schlange, Fohlen, Schaf, Affe, Hahn, Wolf, Tiger, Fliegendes Ferkel, und Drache!",
|
||||
"achievementZodiacZookeeperModalText": "Du hast alle Tierkreiszeichen-Tiere gesammelt!",
|
||||
"achievementBirdsOfAFeather": "Fliegende Freunde",
|
||||
"achievementBirdsOfAFeatherText": "Hat alle Standardfarben der fliegenden Haustiere ausgebrütet: Fliegendes Ferkel, Eule, Papagei, Pterodactylus, Greif, Falke, Pfau, und Hahn.",
|
||||
"achievementBirdsOfAFeatherModalText": "Du hast alle fliegenden Haustiere gesammelt!"
|
||||
}
|
||||
|
||||
@@ -671,5 +671,19 @@
|
||||
"backgroundPalmTreeWithFairyLightsText": "Palme mit Lichterkette",
|
||||
"backgroundPalmTreeWithFairyLightsNotes": "Posiere bei einer mit Lichterkette geschmückten Palme.",
|
||||
"backgroundSnowyFarmText": "Verschneiter Bauernhof",
|
||||
"backgroundSnowyFarmNotes": "Stelle sicher, dass alle auf Deinem verschneiten Bauernhof wohlauf und warm sind."
|
||||
"backgroundSnowyFarmNotes": "Stelle sicher, dass alle auf Deinem verschneiten Bauernhof wohlauf und warm sind.",
|
||||
"backgroundWinterWaterfallNotes": "Bewundere einen winterlichen Wasserfall.",
|
||||
"backgrounds022022": "Set 93: Veröffentlicht im Februar 2022",
|
||||
"backgroundWinterWaterfallText": "Winterlicher Wasserfall",
|
||||
"backgroundOrangeGroveText": "Orangenhain",
|
||||
"backgroundOrangeGroveNotes": "Streife durch einen duftenden Orangenhain.",
|
||||
"backgroundIridescentCloudsText": "Schillernde Wolken",
|
||||
"backgroundIridescentCloudsNotes": "Schwebe durch schillernde Wolken.",
|
||||
"backgrounds032022": "Set 94: Veröffentlicht im März 2022",
|
||||
"backgroundAnimalsDenText": "Bau eines Waldtieres",
|
||||
"backgroundBrickWallWithIvyText": "Efeubewachsene Ziegelmauer",
|
||||
"backgroundFloweringPrairieText": "Blühende Prärie",
|
||||
"backgroundFloweringPrairieNotes": "Tolle durch eine blühende Prärie.",
|
||||
"backgroundAnimalsDenNotes": "Mach es Dir im Bau eines Waldtieres gemütlich.",
|
||||
"backgroundBrickWallWithIvyNotes": "Bewundere eine efeubewachsene Ziegelmauer."
|
||||
}
|
||||
|
||||
@@ -4,18 +4,18 @@
|
||||
"commGuideHeadingWelcome": "Willkommen in Habitica!",
|
||||
"commGuidePara001": "Sei gegrüßt, Abenteurer! Willkommen in Habitica, dem Land der Produktivität, des gesunden Lebens und des gelegentlich randalierenden Greifs. Wir sind eine fröhliche Gemeinschaft voller hilfreicher Menschen, die sich auf ihrem Weg der persönlichen Entwicklung gegenseitig unterstützen. Alles was dazu gehört, ist eine positive Einstellung, ein respektvoller Umgang miteinander und etwas Verständnis dafür, dass jeder unterschiedliche Fähigkeiten und Grenzen hat - auch Du! Habiticaner gehen geduldig miteinander um und versuchen zu helfen, wo immer sie können.",
|
||||
"commGuidePara002": "Damit sich hier jeder sicher fühlen, glücklich und produktiv sein kann, gibt es ein paar Richtlinien. Wir haben uns große Mühe gegeben, sie möglichst nett und leicht verständlich zu formulieren. Bitte nimm Dir die Zeit, sie durchzulesen, bevor Du anfängst zu chatten.",
|
||||
"commGuidePara003": "Diese Regeln gelten an allen sozialen Orten die wir verwenden, unter anderem (aber nicht nur) bei Trello, GitHub, Weblate und dem Wiki. Manchmal werden unvorhergesehene Situationen auftreten, z.B. ein neuer Krisenherd oder ein bösartiger Totenbeschwörer. Wenn das passiert, werden die Moderatoren reagieren, indem sie diese Richtlinien überarbeiten, um die Gemeinschaft vor neuen Gefahren zu schützen. Hab keine Angst: Du wirst von Bailey informiert werden, wenn sich die Richtlinien ändern!",
|
||||
"commGuidePara003": "Diese Regeln gelten an allen sozialen Orten, die wir verwenden, bezogen (aber nicht unbedingt eingeschränkt) auf Trello, GitHub, Weblate und dem Habitica Wiki auf Fandom. Wenn Gemeinschaften wachsen und sich verändern, passen sich manchmal ihre Regeln von Zeit zu Zeit an. Wenn es wesentliche Änderungen dieser Richtlinien gibt, wirst Du dies durch eine Bailey-Ankündigung und/oder in unseren sozialen Medien hören!",
|
||||
"commGuideHeadingInteractions": "Interaktionen in Habitica",
|
||||
"commGuidePara015": "Habitica hat zwei Arten sozialer Orte: öffentliche und private. Öffentliche Orte sind das Gasthaus, öffentliche Gilden, GitHub, Trello und das Wiki. Private Orte sind private Gilden, der Gruppenchat und private Nachrichten. Alle Anzeigenamen und @Usernamen müssen den Community-Richtlinien für öffentliche Orte entsprechen. Um Deinen Anzeigenamen oder @Usernamen zu ändern, wähle in der mobilen App Menü > Einstellungen > Profil. Und wähle auf der Webseite Benutzer Icon > Profil und klicke auf den \"Bearbeiten\"-Knopf.",
|
||||
"commGuidePara016": "Wenn Du Dich durch die öffentlichen Orte in Habitica bewegst, gibt es ein paar allgemeine Regeln, damit jeder sicher und glücklich ist.",
|
||||
"commGuideList02A": "<strong>Respektiert einander</strong>. Sei höflich, freundlich und hilfsbereit. Vergiss nicht: Habiticaner kommen aus den verschiedensten Hintergründen und haben sehr unterschiedliche Erfahrungen gemacht. Das macht Habitica so eigenartig! Es ist wichtig, dass man beim Aufbauen einer Community seine Unterschiede und Ähnlichkeiten respektieren, aber natürlich auch feiern kann.",
|
||||
"commGuideList02B": "<strong>Halte Dich an die <a href='/static/terms' target='_blank'>allgemeinen Geschäftsbedingungen</a></strong>, sowohl in öffentlichen als auch in privaten Umgebungen.",
|
||||
"commGuideList02C": "<strong>Poste keine Bilder oder Texte, die Gewalt darstellen, andere einschüchtern, oder eindeutig/indirekt sexuell sind, die Diskriminierung, Fanatismus, Rassismus, Sexismus, Hass, Belästigungen oder Hetze gegen jedwede Individuen oder Gruppen beinhalten.</strong> Auch nicht als Scherz oder Meme. Das bezieht sowohl Sprüche als auch Stellungnahmen mit ein. Nicht jeder hat den gleichen Humor, etwas, was Du als Witz wahrnimmst, kann für jemand anderen verletzend sein.",
|
||||
"commGuideList02D": "<strong>Halte die Diskussionen für alle Altersgruppen angemessen</strong>. Wir haben viele junge Habiticaner, die die Seite nutzen! Wir wollen, dass die Habitica-Community so angenehm und inklusiv ist, wie möglich.",
|
||||
"commGuideList02E": "<strong>Vermeide vulgäre Ausdrücke. Dazu gehören auch mildere, religiöse Ausdrücke, die anderswo möglicherweise akzeptiert werden</strong>. Unter uns sind Menschen aus allen religiösen und kulturellen Hintergründen und wir wünschen uns, dass sich alle im öffentlichen Raum wohl fühlen. <strong>Wenn Dir ein Moderator oder Mitarbeiter mitteilt, dass ein bestimmter Ausdruck, der dir selbst vielleicht nicht problematisch vorkommt, in Habitica nicht erlaubt ist, ist diese Entscheidung endgültig</strong>. Zusätzlich werden verbale Angriffe jeder Art strenge Konsequenzen haben, insbesondere auch, da sie unsere Nutzungsbedingungen verletzen.",
|
||||
"commGuideList02F": "<strong>Vermeide längere Diskussionen über spaltende Themen in der Taverne und wo sie außerhalb des Themenbereichs liegen</strong>. Wenn du das Gefühl hast, dass jemand etwas Unhöfliches oder Verletzendes gesagt hat, dann lass dich nicht mit ihm ein. Wenn jemand etwas erwähnt, das von den Richtlinien erlaubt ist, das aber für dich verletzend ist, ist es in Ordnung, das höflich jemandem mitzuteilen. Wenn es gegen die Richtlinien oder die Nutzungsbedingungen verstößt, solltest du es melden und einen Moderator antworten lassen. Im Zweifelsfall melde den Beitrag.",
|
||||
"commGuideList02D": "<strong>Halte die Diskussionen für alle Altersgruppen angemessen</strong>. Das heißt, Erwachsenenthemen in öffentlichen Bereichen zu vermeiden. Viele junge Habiticaner und Menschen mit verschiedenen Hintergründen nutzen diese Seite. Wir wollen unsere Gemeinschaft so angenehm und inklusiv wie möglich gestalten.",
|
||||
"commGuideList02E": "<strong>Vermeide vulgäre Ausdrücke. Dazu gehören auch mildere, religiöse Ausdrücke, die anderswo möglicherweise akzeptiert werden, oder verschleierte Schimpfwörter</strong>. Unter uns sind Menschen aus allen religiösen und kulturellen Hintergründen und wir wollen, dass sich alle im öffentlichen Raum wohl fühlen. <strong>Wenn Dir ein Moderator oder Mitarbeiter mitteilt, dass ein bestimmter Ausdruck in Habitica nicht erlaubt ist, selbst wenn er Dir vielleicht nicht problematisch vorkommt, ist diese Entscheidung endgültig</strong>. Zusätzlich werden verbale Angriffe jeder Art strenge Konsequenzen haben, da sie auch unsere Nutzungsbedingungen verletzen.",
|
||||
"commGuideList02F": "Vermeide längere Diskussionen über spaltende Themen in der Taverne und wenn sie außerhalb des Themenbereichs liegen. Wenn jemand etwas sagt, das zwar von den Richtlinien her erlaubt ist, das Dich aber verletzt, dann ist es in Ordnung, diese Person höflich darauf hinzuweisen. Wenn Dir eine Person sagt, dass ihr Dein Verhalten unangenehm ist, nimm Dir Zeit, darüber zu reflektieren, anstatt im Zorn zu antworten. Aber wenn Du das Gefühl hast, dass ein Gespräch hitzig, übermäßig emotional, oder verletzend wird, dann <strong>lass dich nicht darauf ein. Melde stattdessen die Beiträge, um uns darüber in Kenntnis zu setzen.</strong> Moderatoren werden so schnell wie möglich antworten. Du kannst auch eine E-Mail an <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> senden und gegebenenfalls Screenshots anhängen.",
|
||||
"commGuideList02G": "<strong>Erfülle alle Moderator-Anfragen sofort</strong>. Diese könnten Folgendes beinhalten, ist aber nicht darauf beschränkt: Dich aufzufordern, deine Beiträge in einem bestimmten Bereich zu begrenzen, dein Profil zu bearbeiten, um ungeeignete Inhalte zu entfernen, dich zu bitten, deine Diskussion in einen geeigneteren Bereich zu verschieben, etc. Diskutiere nicht mit Moderatoren. Solltest du mit einer Entscheidung unzufrieden sein, oder anderes Feedback zur Moderation haben, sende eine E-mail an <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> um unseren Community Manager zu kontaktieren.",
|
||||
"commGuideList02J": "<strong>Poste keinen Spam</strong>. Spamming kann Folgendes beinhalten, ist aber nicht beschränkt auf: das Posten desselben Kommentars oder einer Anfrage an mehreren Stellen, das Posten von Links ohne Erklärung oder Kontext, das Posten unsinniger Nachrichten, das Posten mehrerer Werbebotschaften über eine Gilde, Party oder eine Herausforderung oder das Posten vieler Nachrichten in Serie. Wenn Personen, die auf einen Link klicken, Dir einen Nutzen bringen, musst Du dies im Text Deiner Nachricht offenlegen, sonst wird das auch als Spam betrachtet.<br/><br/>Es liegt an den Mods zu entscheiden, ob etwas Spam darstellt.",
|
||||
"commGuideList02J": "<strong>Poste keinen Spam</strong>. Spamming kann Folgendes beinhalten, ist aber nicht beschränkt auf: das Posten desselben Kommentars oder derselben Frage an mehreren Stellen, <strong>das Posten von Links ohne Erklärung oder Kontext</strong>, das Posten unsinniger Nachrichten, das Posten mehrerer Werbebotschaften für eine Gilde, Party, oder Herausforderung, oder das Posten vieler Nachrichten hintereinander. Wenn Du irgendeinen Nutzen daraus ziehst, wenn jemand auf einen Link klickt, musst Du das im Text Deiner Nachricht offenlegen, sonst wird sie auch als Spam betrachtet. Mods können gegebenenfalls nach ihrem Ermessen entscheiden, was Spam ausmacht.",
|
||||
"commGuideList02K": "<strong>Bitte vermeide große Überschriften in öffentlichen Chats, vor allem in der Taverne.</strong> Ähnlich wie bei GROSSBUCHSTABEN liest sich der Text, als ob Du schreien würdest, und beeinträchtigt die gemütliche Atmosphäre.",
|
||||
"commGuideList02L": "<strong>Wir raten Dir dringend davon ab, persönliche Informationen - besonders solche, mit denen Du identifiziert werden könntest - in öffentlichen Chats zu teilen.</strong> Zu den identifizierenden Informationen gehören unter anderem: Deine Adresse, Deine E-Mail-Adresse und Dein API-Token/Passwort. Dies dient nur Deiner Sicherheit! Mitarbeiter oder Moderatoren werden solche Beiträge nach eigenem Ermessen entfernen. Wenn Du nach persönlichen Informationen in einer privaten Gilde, Party oder per PN gefragt wirst, empfehlen wir dringend, dass Du höflich ablehnst und Mitarbeiter und Moderatoren informierst, indem Du entweder 1) den Beitrag über das Fähnchen meldest, oder 2) eine E-Mail an <a href='mailto:admin@habitica.com' target='_blank'>admin@habitica.com</a> schreibst und Screenshots anhängst.",
|
||||
"commGuidePara019": "<strong>An privaten Orten</strong> haben Benutzer die Freiheit, alle möglichen Themen zu besprechen, solange diese nicht den AGB widersprechen. Dies umfasst das Posten von diskriminierenden, gewalttätigen oder einschüchternden Inhalten. Beachte, dass Herausforderungsnamen im öffentlichen Profil des Gewinners angezeigt werden, daher müssen ALLE Herausforderungsnamen den Community-Richtlinien für öffentliche Orte entsprechen, auch wenn sie an privaten Orten genutzt werden.",
|
||||
@@ -28,7 +28,7 @@
|
||||
"commGuidePara024": "<strong>Sprecht nicht über etwas suchterregendes in der Taverne</strong>. Viele Menschen verwenden Habitica, um Ihre schlechten Gewohnheiten loszuwerden. Wenn sie andere Leute über suchterregende/illegale Substanzen reden hören, würde das dies deutlich erschweren! Respektiert eure Tavernenkameraden und berücksichtigt diesen Umstand. Dies gilt auch, aber nicht abschließend, für: Rauchen, Alkohol, Pornografie, Glückspiel und Drogen.",
|
||||
"commGuidePara027": "<strong>Wenn ein Moderator Dich anweist, ein Gespräch an anderer Stelle zu führen und wenn es keine relevante Gilde gibt, kann er Dir vorschlagen, die Hinterzimmer-Gilde zu benutzen</strong>. Die Hinterzimmer-Gilde ist ein freier öffentlicher Raum, um potenziell sensible Themen zu diskutieren. Sie sollte nur verwendet werden, wenn sie von einem Moderator geleitet wird. Sie wird vom Moderatorenteam sorgfältig überwacht. Sie ist kein Ort für allgemeine Diskussionen oder Gespräche, und Du wirst nur dann von einem Mod dorthin geleitet, wenn es angebracht ist.",
|
||||
"commGuideHeadingPublicGuilds": "Öffentliche Gilden",
|
||||
"commGuidePara029": "<strong>Öffentliche Gilden sind der Taverne ziemlich ähnlich, außer dass die Gespräche dort nicht so allgemein sind, sondern sich um ein bestimmtes Thema drehen.</strong> Der öffentliche Gildenchat sollte sich auf dieses Thema konzentrieren. Zum Beispiel könnte es sein, dass Mitglieder der Wordsmith-Gilde genervt sind, wenn sich das Gespräch plötzlich um Gärtnern statt um Schreiben dreht, und eine Drachenliebhaber-Gilde interessiert sich wahrscheinlich nicht dafür, antike Runen zu entziffern. Manche Gilden sind dabei lockerer als andere, aber <strong>versuche generell beim Thema zu bleiben!</strong>",
|
||||
"commGuidePara029": "<strong>Öffentliche Gilden sind der Taverne ziemlich ähnlich, außer dass die Gespräche dort nicht so allgemein sind, sondern sich um ein bestimmtes Thema drehen.</strong> Der öffentliche Gildenchat sollte sich auf dieses Thema konzentrieren. Zum Beispiel könnte es sein, dass Mitglieder der Wordsmith-Gilde genervt sind, wenn sich das Gespräch plötzlich um Gärtnern statt um Schreiben dreht, und eine Drachenliebhaber-Gilde interessiert sich wahrscheinlich nicht dafür, antike Runen zu entziffern. Manche Gilden sind dabei lockerer als andere, aber <strong>versuche beim Thema zu bleiben!</strong>",
|
||||
"commGuidePara031": "Einige öffentlichen Gilden werden sensible Themen wie Depressionen, Religion, Politik usw. enthalten. Dies ist in Ordnung, solange die Gespräche darin nicht gegen die Allgemeinen Geschäftsbedingungen oder die Regeln des öffentlichen Raums verstoßen und solange sie beim Thema bleiben.",
|
||||
"commGuidePara033": "<strong>Öffentliche Gilden dürfen KEINE Inhalte \"ab 18\" enthalten. Wenn geplant ist, regelmäßig über sensible Inhalte zu diskutieren, sollte dies in der Gildenbeschreibung angegeben werden</strong>. Auf diese Weise soll Habitica sicher und angenehm für alle sein.",
|
||||
"commGuidePara035": "<strong>Wenn die betreffende Gilde verschiedene Arten von heiklen Themen hat, ist es respektvoll gegenüber Deinen Habiticanern, eine Warnung vor Deinen Kommentar zu stellen (z.B. \"Warnung: erwähnt Selbstverletzung\")</strong>. Diese können als Triggerwarnungen und/oder Inhaltshinweise bezeichnet werden, und Gilden können zusätzlich zu den hier angegebenen Regeln eigene Regeln haben. Wenn möglich, verwende bitte <a href='https://habitica.fandom.com/wiki/Markdown_Cheat_Sheet' target='_blank'>Markdown</a> um die potenziell heiklen Inhalte unterhalb von Zeilenumbrüchen auszublenden, damit diejenigen, die sie nicht lesen möchten, darüber hinweg scrollen können, ohne den Inhalt zu sehen. Mitarbeiter und Moderatoren von Habitica können dieses Material nach eigenem Ermessen trotzdem entfernen.",
|
||||
@@ -77,7 +77,7 @@
|
||||
"commGuideList09C": "Der Aufstieg in höhere Mitwirkendenstufen kann dauerhaft verwehrt (\"eingefroren\") werden",
|
||||
"commGuideHeadingModerateConsequences": "Beispiele für mittlere Konsequenzen",
|
||||
"commGuideList10A": "Beschränkte öffentliche und/oder private Chat-Berechtigungen",
|
||||
"commGuideList10A1": "Führen Deine Handlungen zur Aufhebung Deiner Chatrechte, wird Dich ein Moderator oder Mitarbeiter per PN und/oder in dem Forum, in dem Du stummgeschaltet wurdest, über die Dauer und Gründe für das Stummschalten und/oder die Handlung, die für die Wiederherstellung Deiner Chatrechte notwendig ist, informieren. Deine Chatrechte werden wieder hergestellt, wenn Du höflich mit den erforderlichen Handlungen übereinstimmst und zustimmst, Dich fortan an die Community-Richtlinien und ToS zu halten.",
|
||||
"commGuideList10A1": "Führen Deine Handlungen zur Aufhebung Deiner Chatrechte, wird Dich ein Moderator oder Mitarbeiter per PN und/oder in dem Forum, in dem Du stummgeschaltet wurdest, über die Dauer und Gründe für das Stummschalten und/oder die Handlung, die für die Wiederherstellung Deiner Chatrechte notwendig ist, informieren. Deine Chatrechte werden wiederhergestellt, wenn Du höflich mit den erforderlichen Handlungen übereinstimmst und zustimmst, Dich fortan an die Community-Richtlinien und Nutzungsbedingungen zu halten.",
|
||||
"commGuideList10C": "Beschränkte Berechtigung, Gilden/Herausforderungen zu gründen",
|
||||
"commGuideList10D": "Der Aufstieg in höhere Mitwirkendenstufen kann temporär verwehrt (\"eingefroren\") werden",
|
||||
"commGuideList10E": "Herabstufung von Mitwirkenden",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"companyDonate": "Spenden",
|
||||
"forgotPassword": "Passwort vergessen?",
|
||||
"emailNewPass": "Einen Link per E-Mail senden, um das Passwort zurückzusetzen",
|
||||
"forgotPasswordSteps": "Trage die E-Mail-Adresse ein, mit der Du Deinen Habitica-Account aktiviert hast.",
|
||||
"forgotPasswordSteps": "Trage deinen Benutzernamen oder die E-Mail-Adresse ein, mit der Du Deinen Habitica-Account aktiviert hast.",
|
||||
"sendLink": "Link senden",
|
||||
"featuredIn": "Vorgestellt in",
|
||||
"footerDevs": "Entwickler",
|
||||
@@ -129,7 +129,7 @@
|
||||
"passwordConfirmationMatch": "Die Passwörter stimmen nicht überein.",
|
||||
"invalidLoginCredentials": "Falscher Benutzername und/oder E-Mail und/oder Passwort.",
|
||||
"passwordResetPage": "Passwort zurücksetzen",
|
||||
"passwordReset": "Wenn wir Deine E-Mail-Adresse kennen, wurden Anweisungen zum Passwort-Zurücksetzen dorthin verschickt.",
|
||||
"passwordReset": "Wenn wir Deine E-Mail-Adresse oder Deinen Benutzernamen kennen, wurden Anweisungen zum Passwort-Zurücksetzen dorthin verschickt.",
|
||||
"passwordResetEmailSubject": "Passwort-Reset für Habitica",
|
||||
"passwordResetEmailText": "Wenn Du das Passwort für <%= username %> zurücksetzen möchtest, folge bitte dem Link <%= passwordResetLink %>, um ein neues zu setzen. Dieser Link wird in 24 Stunden ungültig. Wenn Du keinen Passwort-Reset angefordert hast, kannst Du diese E-Mail ignorieren.",
|
||||
"passwordResetEmailHtml": "Wenn Du das Passwort für <strong><%= username %></strong> auf Habitica zurücksetzen möchtest, folge bitte <a href=\"<%= passwordResetLink %>\">diesem Link </a>, um ein neues zu setzen. Dieser Link wird in 24 Stunden ungültig.<br/><br>Wenn Du keinen Passwort-Reset angefordert hast, kannst Du diese E-Mail ignorieren.",
|
||||
@@ -150,7 +150,7 @@
|
||||
"confirmPassword": "Passwort bestätigen",
|
||||
"usernameLimitations": "Der Benutzername muss zwischen 1 und 20 Buchstaben lang sein und darf nur die Buchstaben von A bis Z, Nummern von 0 bis 9, Bindestriche und Unterstriche beinhalten und darf keine unangemessenen Begriffe enthalten.",
|
||||
"usernamePlaceholder": "z.B., HabitRabbit",
|
||||
"emailPlaceholder": "z.B., rabbit@beispiel.com",
|
||||
"emailPlaceholder": "z.B., gryphon@beispiel.com",
|
||||
"passwordPlaceholder": "z.B., ******************",
|
||||
"confirmPasswordPlaceholder": "Stelle sicher, dass es das gleiche Passwort ist!",
|
||||
"joinHabitica": "Habitica beitreten",
|
||||
@@ -186,5 +186,6 @@
|
||||
"communityInstagram": "Instagram",
|
||||
"minPasswordLength": "Das Passwort muss mindestens 8 Zeichen haben.",
|
||||
"enterHabitica": "Tritt ein in Habitica",
|
||||
"socialAlreadyExists": "Diese Social-Media-Zugangsdaten sind bereits mit einem schon bestehenden Habitica-Konto verknüpft."
|
||||
"socialAlreadyExists": "Diese Social-Media-Zugangsdaten sind bereits mit einem schon bestehenden Habitica-Konto verknüpft.",
|
||||
"emailUsernamePlaceholder": "z.B., habitrabbit oder gryphon@beispiel.com"
|
||||
}
|
||||
|
||||
@@ -1175,7 +1175,7 @@
|
||||
"headArmoireRedHairbowText": "Rote Haarschleife",
|
||||
"headArmoireRedHairbowNotes": "Werde stark, taff und schlau, während Du diese hübsche rote Haarschleife trägst! Erhöht Stärke um <%= str %>, Ausdauer um <%= con %> und Intelligenz um <%= int %>. Verzauberter Schrank: Rotes Haarschleifen-Set (Gegenstand 1 von 2).",
|
||||
"headArmoireVioletFloppyHatText": "Lila Schlapphut",
|
||||
"headArmoireVioletFloppyHatNotes": "Viele Zaubersprüche wurden in diesen einfachen Hut gewirkt, um ihm eine angenehme violette Farbe zu geben. Erhöht Wahrnehmung um <%= per %>, Intelligenz um <%= int %> und Ausdauer um <%= con %>. Verzauberter Schrank: Unabhängiger Gegenstand.",
|
||||
"headArmoireVioletFloppyHatNotes": "Viele Zaubersprüche wurden in diesen einfachen Hut gewirkt, um ihm eine angenehme violette Farbe zu geben. Erhöht Wahrnehmung um <%= per %>, Intelligenz um <%= int %> und Ausdauer um <%= con %>. Verzauberter Schrank: Violettes Loungewear-Set (Gegenstand 1 von 3).",
|
||||
"headArmoireGladiatorHelmText": "Gladiatorenhelm",
|
||||
"headArmoireGladiatorHelmNotes": "Um ein Gladiator zu sein, musst Du nicht nur stark sein… sondern auch gerissen. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Verzauberter Schrank: Gladiatorset (Gegenstand 1 von 3).",
|
||||
"headArmoireRancherHatText": "Farmerhut",
|
||||
@@ -2260,7 +2260,7 @@
|
||||
"weaponSpecialWinter2021RogueNotes": "Tarnung und Waffe in einem, die giftigen Früchte der Stechpalme helfen dir mit den schwierigsten Aufgaben umzugehen. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponSpecialWinter2021RogueText": "Ilex-Beeren Morgenstern",
|
||||
"headSpecialWinter2021HealerNotes": "Ein überraschend großer Teil unserer Körperwärme wird über den Kopf abgegeben! Nicht jedoch, wenn du diese dicke Mütze mit Wind-schützender Sturmbrille trägst. Auf DEINEN Wimpern werden sicher keine Eiszapfen entstehen! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"headSpecialWinter2021HealerText": "Arktischer Entdecker Kopfschutz",
|
||||
"headSpecialWinter2021HealerText": "Arktischer Entdecker Kopfbedeckung",
|
||||
"headSpecialWinter2021MageNotes": "Lass Deine Gedanken frei wandern, während Deine physische Gestalt sicher und warm unter dieser kolossalen Kapuze jedem Winterwind standhält. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2020-2021 Winterausrüstung.",
|
||||
"weaponArmoireBlueMoonSaiText": "Mondschatten Sai",
|
||||
"headSpecialNye2020Notes": "Du hast einen Extravaganten Partyhut erhalten! Trage ihn mit Stolz während du das neue Jahr einläutest! Gewährt keinen Attributbonus.",
|
||||
@@ -2427,7 +2427,7 @@
|
||||
"headSpecialFall2021HealerText": "Die Maske des Beschwörers",
|
||||
"headSpecialFall2021WarriorText": "Kopfloses Halstuch",
|
||||
"shieldSpecialFall2021HealerText": "Beschworene Kreatur",
|
||||
"backMystery202109Text": "Mondflügel der Lepidoptera",
|
||||
"backMystery202109Text": "Mondschmetterlings-Flügel",
|
||||
"weaponSpecialFall2021RogueNotes": "Wo zum Teufel bist Du nur hineingeraten? Wenn Leute sagen, Schurken haben klebrige Finger, meinen sie nicht das hier! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2021 Herbstausrüstung.",
|
||||
"weaponSpecialFall2021WarriorText": "Reiter-Axt",
|
||||
"headMystery202110Text": "Moosbewachsener Wasserspeierhelm",
|
||||
@@ -2451,7 +2451,7 @@
|
||||
"armorSpecialFall2021WarriorText": "Formaler Wollanzug",
|
||||
"armorSpecialFall2021WarriorNotes": "Ein atemberaubender Anzug, perfekt für die Überquerung von Brücken in stockdunkler Nacht. Erhöht Ausdauer um <%= con %>. Limiterte Ausgabe 2021, Herbstausrüstung.",
|
||||
"armorSpecialFall2021MageText": "Robe der abgrundtiefen Finsternis",
|
||||
"armorArmoireBagpipersKiltText": "Sackpfeifers Kilt",
|
||||
"armorArmoireBagpipersKiltText": "Dudelsackpfeifers Kilt",
|
||||
"headMystery202108Text": "Feuriges Shounen Haar",
|
||||
"headMystery202108Notes": "Du siehst top aus, wollt' ich nur sagen. Gewährt keinen Attributbonus. August 2021 Abonnentengegenstand.",
|
||||
"weaponArmoirePotionBaseNotes": "Die Haustiere die durch dieses Elixier schlüpfen sind alles andere als langweilig! Erhöht Stärke, Intelligenz, Konstitution und Wahrnehmung um jeweils <%= attrs %>. Verzauberter Schrank: Elixier Set (Gegenstand 1 von 10)",
|
||||
@@ -2532,7 +2532,7 @@
|
||||
"headSpecialWinter2022MageText": "Granatapfelhelm",
|
||||
"headSpecialWinter2022HealerText": "Kristallklare Krone aus Eis",
|
||||
"weaponSpecialWinter2022RogueText": "Sternschnuppenfeuerwerk",
|
||||
"armorSpecialWinter2022RogueNotes": "Sagen wir es einmal so: Wenn sie Sterne sehen, sehen sie Dich nicht! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"armorSpecialWinter2022RogueNotes": "Wenn sie Sterne sehen, sehen sie Dich nicht! Ja, lass uns das so sagen. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"armorSpecialWinter2022WarriorNotes": "Wer sagt, dass Du es nicht geborgen und gemütlich haben kannst, während Du mit alltäglichen Aufgaben kämpfst? Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"armorSpecialWinter2022MageNotes": "Wenn Du Dich näherst, müssen sich Deine Feinde sich vor Fruchtsaft-Flecken in Acht nehmen! Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2021–2022 Winterausrüstung.",
|
||||
"headSpecialWinter2022RogueText": "Donnerndes Finale",
|
||||
@@ -2558,5 +2558,62 @@
|
||||
"armorArmoireShootingStarCostumeNotes": "Es wird gemunkelt, dass diese Robe, deren Stoff wie das Licht des Mondes fällt, aus dem Nachthimmel selbst gesponnen wurde. Sie wird Dir helfen, alle Hindernisse in Deinem Weg zu überwinden. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Meteoritenstaub-Set (Gegenstand 2 von 3).",
|
||||
"headArmoireShootingStarCrownNotes": "Mit diesem hell strahlenden Kopfschmuck wirst du buchstäblich zum Star Deines eigenen Abenteuers! Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Meteoritenstaub-Set (Gegenstand 1 von 3).",
|
||||
"armorSpecialBirthday2022Text": "Verkehrte Partyroben",
|
||||
"armorSpecialBirthday2022Notes": "Happy Birthday, Habitica! Trage diese verkehrten Partyroben, um diesen wunderbaren Tag zu feiern. Gewährt keinen Attributbonus."
|
||||
"armorSpecialBirthday2022Notes": "Happy Birthday, Habitica! Trage diese verkehrten Partyroben, um diesen wunderbaren Tag zu feiern. Gewährt keinen Attributbonus.",
|
||||
"headMystery202202Notes": "Du brauchst einfach blaue Haare! Gewährt keinen Attributbonus. Februar 2022 Abonnentengegenstand.",
|
||||
"headMystery202202Text": "Türkise Rattenschwänzchen",
|
||||
"weaponArmoirePinkLongbowText": "Pinker Langbogen",
|
||||
"weaponArmoirePinkLongbowNotes": "Sei ein Kuppler im Training, der sowohl Bogenschießen als auch Herzensangelegenheiten mit seinem wunderschönen Bogen meistert. Erhöht Wahrnehmung um <%= per %> und Stärke um <%= str %>. Verzauberter Schrank: Unabhängiger Gegenstand.",
|
||||
"armorArmoireSoftVioletSuitText": "Weicher violetter Anzug",
|
||||
"armorArmoireSoftVioletSuitNotes": "Lila ist eine luxuriöse Farbe. Entspanne dich mit Stil nachdem du alle Tagesaufgaben erfüllt hast. Erhöht Ausdauer und Stärke um je <%= attrs %>. Verzauberter Schrank: Violettes Loungewear-Set (Gegenstand 2 von 3).",
|
||||
"shieldArmoireSoftVioletPillowText": "Weiches violettes Kissen",
|
||||
"eyewearMystery202202Text": "Türkise Augen mit Gesichtsröte",
|
||||
"eyewearMystery202202Notes": "Fröhliches Singen bringt Farbe auf Deine Backen. Gewährt keinen Attributbonus. Februar 2022 Abonnentengegenstand",
|
||||
"shieldArmoireSoftVioletPillowNotes": "Der clevere Krieger packt ein Kissen für jede Expedition ein. Beschütze Dich selbst vor durch Prokrastination ausgelöste Panik … selbst während du ein Nickerchen machst. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Violettes Loungewear-Set (Gegenstand 3 von 3).",
|
||||
"backMystery202203Text": "Furchtlose Libellenflügel",
|
||||
"headAccessoryMystery202203Text": "Furchtloses Libellendiadem",
|
||||
"headAccessoryMystery202203Notes": "Muss es mal besonders schnell gehen? Keine Sorge, die kleinen, ornamentalen Flügel auf diesem Diadem sind kräftiger als sie ausschauen! Gewährt keinen Attributbonus. März 2022 Abonnentengegenstand.",
|
||||
"backMystery202203Notes": "Mit diesen schimmernden Flügeln fliegst Du allen anderen Himmelsgeschöpfen davon. Gewährt keinen Attributbonus. März 2022 Abonnentengegenstand.",
|
||||
"weaponArmoireGardenersWateringCanText": "Gießkanne",
|
||||
"weaponArmoireGardenersWateringCanNotes": "Ohne Wasser kommst Du nicht weit! Aber mit dieser magischen, sich selbst auffüllende Gießkanne hast Du stets einen unendlichen Vorrat zur Hand. Erhöht Intelligenz um <%= int %>. Verzauberter Schrank: Gärtnerei-Set (Gegenstand 4 von 4).",
|
||||
"armorArmoireGardenersOverallsText": "Garten-Gewand",
|
||||
"armorArmoireGardenersOverallsNotes": "Mit diesem beständigen Garten-Gewand brauchst Du keine Angst haben, Dich schmutzig zu machen. Erhöht Ausdauer um <%= con %>. Verzauberter Schrank: Gärtnerei-Set (Gegenstand 1 von 4).",
|
||||
"headArmoireGardenersSunHatText": "Garten-Sonnenhut",
|
||||
"headArmoireGardenersSunHatNotes": "Wenn Du diesen breitkrempigen Hut trägst, kann das grelle Licht der Sonne nicht in Deine Augen scheinen. Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Gärtnerei-Set (Gegenstand 2 von 4).",
|
||||
"shieldArmoireGardenersSpadeText": "Garten-Spaten",
|
||||
"shieldArmoireGardenersSpadeNotes": "Ob Du im Garten herumwühlst, nach einem vergrabenen Schatz suchst, oder einen geheimen Tunnel aushebst, dieser Spaten steht Dir treu zur Seite. Erhöht Stärke um <%= str %>. Verzauberter Schrank: Gärtnerei-Set (Gegenstand 3 von 4).",
|
||||
"weaponSpecialSpring2022RogueText": "Riesiger Ohrstecker",
|
||||
"weaponSpecialSpring2022RogueNotes": "Ein Glanzstück! Es ist so leuchtend und schimmernd und schön und hübsch und es gehört ganz allein Dir! Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022RogueText": "Elster-Kostüm",
|
||||
"armorSpecialSpring2022RogueNotes": "Mit metallisch blaugrau schillernden und hell leuchtenden Stellen auf Deinen Federn wirst Du der feinste fliegende Freund der Frühlingsfeier sein! Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"headSpecialSpring2022RogueText": "Elster-Maske",
|
||||
"headSpecialSpring2022RogueNotes": "Wenn Du diese Maske trägst wirst Du so einfallsreich wie eine Elster erscheinen. Vielleicht kannst Du dann sogar ähnlich gut pfeifen, tirilieren, und imitieren. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"weaponSpecialSpring2022WarriorText": "Umgestülpter Regenschirm",
|
||||
"weaponSpecialSpring2022WarriorNotes": "Uff! Es sieht so aus als wäre der Wind doch stärker als gedacht. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022WarriorText": "Regenmantel",
|
||||
"armorSpecialSpring2022WarriorNotes": "Diese Regenausrüstung ist so beeindruckend, Du kannst im Regen singen und in jede Pfütze springen, und bleibst trotzdem warm und trocken! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"headSpecialSpring2022WarriorText": "Regenmantelkapuze",
|
||||
"headSpecialSpring2022WarriorNotes": "Huch, es sieht nach Regen aus! Steh auf und zieh Dir die Kapuze über, um trocken zu bleiben. Erhöht Stärke um <%= str %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"shieldSpecialSpring2022WarriorText": "Regenwolke",
|
||||
"shieldSpecialSpring2022WarriorNotes": "Kennst Du diese Tage, an denen es sich anfühlt, als würde Dir eine Regenwolke auf Schritt und Tritt folgen? Tja, Du kannst Dich glücklich schätzen, denn schon bald werden die schönsten Blumen zu Deinen Füßen blühen! Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"weaponSpecialSpring2022MageText": "Forsythienstab",
|
||||
"weaponSpecialSpring2022MageNotes": "Diese strahlend gelben Glocken sind bereit, Deine mächtige Frühlingsmagie zu lenken. Erhöht Intelligenz um <%= int %> und Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022MageText": "Forsythienrobe",
|
||||
"headSpecialSpring2022MageText": "Forsythienhelm",
|
||||
"headSpecialSpring2022MageNotes": "Mithilfe dieses Helms aus umgedrehten Blüten bleibst Du bei jedem Frühlingsgewitter trocken. Erhöht Wahrnehmung um <%= per %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022MageNotes": "Diese mit Forsythienblüten geschmückte Robe zeigt allen, dass Du bereit bist, flink und federleicht in den Frühling zu fliegen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"weaponSpecialSpring2022HealerText": "Abendsmaragd-Zauberstab",
|
||||
"weaponSpecialSpring2022HealerNotes": "Benutze diesen Zauberstab, um die Heilkräfte des Abendsmaragds zu entfalten – mögen sie Dir Ruhe, Zufriedenheit und Güte bringen. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorSpecialSpring2022HealerText": "Abendsmaragd-Rüstung",
|
||||
"armorSpecialSpring2022HealerNotes": "Vertreibe Angst und Alpträume mit diesem grünen Edelstein-Gewand. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"headSpecialSpring2022HealerText": "Abendsmaragd-Helm",
|
||||
"headSpecialSpring2022HealerNotes": "Dieser geheimnisvolle Helm bewahrt Deine Privatsphäre während Du diverse Aufgaben anpackst. Erhöht Intelligenz um <%= int %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"shieldSpecialSpring2022HealerText": "Abendsmaragd-Schild",
|
||||
"shieldSpecialSpring2022HealerNotes": "Aus geschmolzenem Stein aus der Erdkruste geformt, kann dieses Schild jedem noch so harten Schlag widerstehen, der ihm in den Weg kommt. Erhöht Ausdauer um <%= con %>. Limitierte Ausgabe 2022 Frühlingsausrüstung.",
|
||||
"armorMystery202204Text": "Virtuelle Abenteurer Kapsel",
|
||||
"armorMystery202204Notes": "Es sieht so aus, als müsstest Du, um Deine Aufgaben zu erledigen, nun diese mysteriösen Knöpfe drücken! Was sie wohl machen? Gewährt keinen Attributbonus. April 2022 Abonnentengegenstand.",
|
||||
"eyewearMystery202204AText": "Virtuelles Gesicht",
|
||||
"headArmoireStrawRainHatNotes": "Du wirst jedes Hindernis auf Deinem Weg erkennen können, wenn Du diesen wasserfesten, kegelförmigen Hut trägst. Erhöht Wahrnehmung um <%= per %>. Verzauberter Schrank: Stroh Regenmantel Set (Gegenstand 2 von 2).",
|
||||
"eyewearMystery202204BText": "Virtuelles Gesicht",
|
||||
"eyewearMystery202204ANotes": "Wie fühlst Du Dich heute? Drücke Deine Stimmung mit diesen lustigen Bildschirmen aus. Gewährt keinen Attributbonus. April 2022 Abonnentengegenstand.",
|
||||
"eyewearMystery202204BNotes": "Wie fühlst Du Dich heute? Drücke Deine Stimmung mit diesen lustigen Bildschirmen aus. Gewährt keinen Attributbonus. April 2022 Abonnentengegenstand."
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
"dateEndOctober": "31. Oktober",
|
||||
"dateEndNovember": "30. November",
|
||||
"dateEndJanuary": "31. Januar",
|
||||
"dateEndFebruary": "29. Februar",
|
||||
"dateEndFebruary": "28. Februar",
|
||||
"winterPromoGiftHeader": "VERSCHENK EIN ABO, BEKOMME EINS UMSONST!",
|
||||
"winterPromoGiftDetails1": "Nur bis zum 6. Januar: wenn Du jemandem ein Abonnement schenkst, erhältst Du das gleiche Abonnement gratis für Dich!",
|
||||
"winterPromoGiftDetails2": "Bitte bedenke, dass das geschenkte Abonnement, falls Du oder Deine beschenkte Person bereits über ein sich wiederholendes Abonnement verfügen, erst dann startet, wenn das alte Abonnement gekündigt wird oder ausläuft. Herzlichen Dank für Deine Unterstützung! <3",
|
||||
@@ -216,5 +216,9 @@
|
||||
"winter2022StockingWarriorSet": "Strumpf (Krieger)",
|
||||
"winter2022IceCrystalHealerSet": "Eiskristall (Heiler)",
|
||||
"winter2022PomegranateMageSet": "Granatapfel (Magier)",
|
||||
"januaryYYYY": "Januar <%= year %>"
|
||||
"januaryYYYY": "Januar <%= year %>",
|
||||
"spring2022MagpieRogueSet": "Elster (Schurke)",
|
||||
"spring2022RainstormWarriorSet": "Gewitterregen (Krieger)",
|
||||
"spring2022ForsythiaMageSet": "Forsythie (Magier)",
|
||||
"spring2022PeridotHealerSet": "Abendsmaragd (Heiler)"
|
||||
}
|
||||
|
||||
@@ -44,8 +44,8 @@
|
||||
"noFoodAvailable": "Du hast kein Futter.",
|
||||
"noSaddlesAvailable": "Du hast keinen Sattel.",
|
||||
"noFood": "Du hast im Moment weder Futter noch magische Sättel.",
|
||||
"dropsExplanation": "Erhalte diese Gegenstände schneller mit Edelsteinen, wenn Du nicht warten möchtest, bis Du sie als Beute für erfüllte Aufgaben erhältst.\n<a href=\"https://habitica.fandom.com/de/wiki/Beute\">Erfahre mehr über das Beutesystem.</a>",
|
||||
"dropsExplanationEggs": "Du kannst Edelsteine für Eier ausgeben, wenn Du nicht warten willst, bis Du ein Standard-Ei als Beute erhältst, oder wenn Du eine Haustier-Quest nicht wiederholen willst, um weitere Quest-Eier zu erhalten.\n<a href=\"https://habitica.fandom.com/de/wiki/Beute\">Erfahre mehr über das Beute-System.</a>",
|
||||
"dropsExplanation": "Erhalte diese Gegenstände schneller mit Edelsteinen, wenn Du nicht warten möchtest, bis Du sie als Beute für erfüllte Aufgaben erhältst. <a href=\"https://habitica.fandom.com/de/wiki/Beute\">Erfahre mehr über das Beutesystem.</a>",
|
||||
"dropsExplanationEggs": "Du kannst Edelsteine für Eier ausgeben, wenn Du nicht warten willst, bis Du ein Standard-Ei als Beute erhältst, oder wenn Du eine Haustier-Quest nicht wiederholen willst, um weitere Quest-Eier zu erhalten. <a href=\"https://habitica.fandom.com/de/wiki/Beute\">Erfahre mehr über das Beute-System.</a>",
|
||||
"premiumPotionNoDropExplanation": "Magische Schlüpftränke können nicht auf Eier, die Du durch Quests erhalten hast, angewendet werden. Magische Schlüpftränke können nur gekauft und nicht durch zufällige Beute erworben werden.",
|
||||
"beastMasterProgress": "\"Meister aller Bestien\" Fortschritt",
|
||||
"beastAchievement": "Du hast den Erfolg \"Meister aller Bestien\" dafür erhalten, dass Du alle Haustiere gesammelt hast!",
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
"questRockText": "Entkomme dem Höhlenungetüm",
|
||||
"questRockNotes": "Beim Durchqueren des Habitica Mäandergebirges schlagen Deine Freunde und Du Euer Lager in einer Höhle auf, welche mit funkelnden Kristallen übersät ist. Als Du jedoch am nächsten Morgen aufwachst, ist der Eingang verschwunden und der Höhlenboden unter Dir beginnt sich zu bewegen.<br><br>\"Der Berg lebt!\" schreit Dein Kamerad @pfeffernusse. \"Das sind keine Kristalle – das sind Zähne!\"<br><br>@Painter de Cluster ergreift Deine Hand. \"Wir müssen einen anderen Weg nach draußen finden. Bleib bei mir und lasse Dich nicht ablenken, sonst sind wir vielleicht für immer hier drinnen gefangen!\"",
|
||||
"questRockBoss": "Kristallkoloss",
|
||||
"questRockCompletion": "Dank Deiner harten Arbeit konntest Du zu guter Letzt einen sicheren Weg durch den lebenden Berg finden. \nNach der langen Dunkelheit genießt Du die wärmenden Sonnenstrahlen, als Dich Dein Freund @intune auf ein Funkeln am Boden nahe der Höhle aufmerksam macht.\nDas Funkeln kommt von einem kleinen Stein, der von einer Goldader durchzogen ist. \nWährend Du ihn aufhebst siehst Du, dass um ihn herum weitere merkwürdig geformte Steine liegen. Sind das ... Eier?",
|
||||
"questRockCompletion": "Dank Deiner harten Arbeit konntest Du zu guter Letzt einen sicheren Weg durch den lebenden Berg finden. Nach der langen Dunkelheit genießt Du die wärmenden Sonnenstrahlen, als Dich Dein Freund @intune auf ein Funkeln am Boden nahe der Höhle aufmerksam macht. Das Funkeln kommt von einem kleinen Stein, der von einer Goldader durchzogen ist. Während Du ihn aufhebst siehst Du, dass um ihn herum weitere merkwürdig geformte Steine liegen. Sind das … Eier?",
|
||||
"questRockDropRockEgg": "Fels (Ei)",
|
||||
"questRockUnlockText": "Schaltet den Kauf von Felseneiern auf dem Marktplatz frei",
|
||||
"questBunnyText": "Das Killerkaninchen",
|
||||
@@ -602,7 +602,7 @@
|
||||
"questSquirrelDropSquirrelEgg": "Eichhörnchen (Ei)",
|
||||
"questSquirrelUnlockText": "Schaltet den Kauf von Eichhörncheneiern auf dem Marktplatz frei",
|
||||
"cuddleBuddiesText": "\"Kuschelkumpel\" Quest-Paket",
|
||||
"cuddleBuddiesNotes": "Beinhaltet 'Das Killerkaninchen', 'Das Ruchlose Frettchen' und 'Die Meerschweinchen Gang'. Verfügbar bis zum 31. Mai.",
|
||||
"cuddleBuddiesNotes": "Beinhaltet 'Das Killerkaninchen', 'Das Ruchlose Frettchen' und 'Die Meerschweinchen Gang'. Verfügbar bis zum 31. März.",
|
||||
"aquaticAmigosText": "\"Feuchte Freunde\" Quest-Paket",
|
||||
"aquaticAmigosNotes": "Beinhaltet 'Der magische Axolotl', 'Der Kraken von Unfertik' und 'Der Ruf des Octothulu'. Verfügbar bis zum 31. August.",
|
||||
"questSeaSerpentText": "Gefahr in der Tiefe: Seeschlangen-Angriff!",
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
"sureChangeCustomDayStartTime": "Bist Du sicher, dass Du Deinen individuellen Tageswechsel umstellen willst? Deine Tagesaufgaben werden das nächste Mal zurückgesetzt, wenn Du Habitica nach <%= time %> verwendest. Stelle sicher, dass Du bis dahin Deine Aufgaben erledigt hast!",
|
||||
"customDayStartHasChanged": "Dein persönlicher Tagesstart wurde geändert.",
|
||||
"nextCron": "Deine Tagesaufgaben werden das nächste Mal überprüft und zurückgesetzt, wenn Du Habitica das erste Mal nach <%= time %> nutzt. Stelle sicher, dass Du Deine Tagesaufgaben vor diesem Zeitpunkt erledigt hast!",
|
||||
"customDayStartInfo1": "Normalerweise werden Deine Tagesaufgaben jeden Tag um Mitternacht Deiner Ortszeit von Habitica überprüft und zurückgesetzt. Du kannst diesen Zeitpunkt hier ändern.",
|
||||
"customDayStartInfo1": "Deine Tagesaufgaben werden jeden Tag um Mitternacht Deiner Ortszeit von Habitica überprüft und zurückgesetzt. Du kannst hier ändern, wenn das zu einem anderen Zeitpunkt geschehen soll.",
|
||||
"misc": "Verschiedenes",
|
||||
"showHeader": "Header anzeigen",
|
||||
"changePass": "Passwort ändern",
|
||||
@@ -55,7 +55,7 @@
|
||||
"newUsername": "Neuer Benutzername",
|
||||
"dangerZone": "Gefahrenzone",
|
||||
"resetText1": "WARNUNG! Es werden große Teile Deines Accounts zurückgesetzt. Wir raten dringend davon ab. Jedoch finden einige Spieler diese Funktion sinnvoll, um nach einem anfänglichen Testen der Seite neu beginnen zu können.",
|
||||
"resetText2": "Du verlierst alle Deine Level, Gold- und Erfahrungspunkte. Alle Deine Aufgaben (außer Wettbewerbsaufgaben) werden permanent gelöscht, inklusive ihrer historischen Daten. Du verlierst Deine gesamte Ausrüstung, kannst sie aber wieder kaufen, inklusive der limitierten Ausgaben oder der mysteriösen Abonnenten-Gegenstände, die Du bereits besitzt (allerdings musst Du für klassenspezifische Ausrüstung der richtigen Klasse angehören, um sie zurückzukaufen). Du behältst Deine aktuelle Klasse und Deine Haus- und Reittiere. Möglicherweise möchtest Du lieber eine Sphäre der Wiedergeburt nutzen, die eine weit sicherere Option darstellt und Deine Aufgaben und Ausrüstung beibehält.",
|
||||
"resetText2": "Du verlierst alle Deine Level, Dein Gold und Deine Erfahrungspunkte. Alle Deine Aufgaben (außer Aufgaben aus Herausforderungen) werden permanent gelöscht, und Du verlierst alle ihre historischen Daten. Du verlierst Deine gesamte Ausrüstung außer Abonnement-Überraschungsgegenstände und gratis Erinnerungsgegenstände. Du wirst die Möglichkeit haben, alle gelöschten Gegenstände zurückzukaufen, inklusive allen Gegenständen limitierter Ausgabe (Du musst für klassenspezifische Ausrüstung der richtigen Klasse angehören, um sie zurückzukaufen). Du behältst Deine aktuelle Klasse, Deine Erfolge, und Deine Haus- und Reittiere. Möglicherweise möchtest Du lieber die Sphäre der Wiedergeburt nutzen, die eine weit sicherere Option darstellt und Deine Aufgaben und Ausrüstung beibehält.",
|
||||
"deleteLocalAccountText": "Bist Du sicher? Dies wird Dein Konto für immer löschen und es kann nicht wiederhergestellt werden! Wenn Du Habitica wieder verwenden möchtest, musst Du ein neues Konto registrieren. Gesparte oder verbrauchte Edelsteine werden nicht ersetzt. Wenn Du absolut sicher bist, dann tippe Dein Passwort in das Textfeld unten ein.",
|
||||
"deleteSocialAccountText": "Bist Du sicher? Dies wird Dein Konto für immer löschen und es kann nicht wiederhergestellt werden! Wenn Du Habitica wieder verwenden möchtest, musst Du ein neues Konto registrieren. Gesparte oder verbrauchte Edelsteine werden nicht ersetzt. Wenn Du absolut sicher bist, dann tippe \"<%= magicWord %>\" in das Textfeld unten ein.",
|
||||
"API": "API",
|
||||
@@ -134,15 +134,15 @@
|
||||
"generateCodes": "Erstelle Codes",
|
||||
"generate": "Erstelle",
|
||||
"getCodes": "Codes erhalten",
|
||||
"webhooks": "Webhooks",
|
||||
"webhooksInfo": "Habitica stellt Webhooks zur Verfügung, damit bei bestimmten Aktionen in Deinem Konto Informationen an ein Skript auf einer anderen Website gesendet werden können. Du kannst diese Skripte hier angeben. Sei vorsichtig mit dieser Funktion, denn die Angabe einer falschen URL kann in Habitica zu Fehlern oder Verzögerungen führen. Weitere Informationen findest Du auf der <a target=\"_blank\" href=\"https://habitica.fandom.com/wiki/Webhooks\">Webhooks-Seite</a> des Wikis.",
|
||||
"webhooks": "WebHooks",
|
||||
"webhooksInfo": "Habitica stellt WebHooks zur Verfügung, damit bei bestimmten Aktionen in Deinem Konto Informationen an ein Skript auf einer anderen Website gesendet werden können. Du kannst diese Skripte hier anführen. Sei vorsichtig mit dieser Funktion, denn die Angabe einer falschen URL kann in Habitica zu Fehlern oder Verzögerungen führen. Weitere Informationen findest Du auf der <a target=\"_blank\" href=\"https://habitica.fandom.com/wiki/Webhooks\">WebHooks-Seite</a> des Wikis.",
|
||||
"enabled": "Aktiviert",
|
||||
"webhookURL": "Webhook-URL",
|
||||
"webhookURL": "WebHook-URL",
|
||||
"invalidUrl": "Ungültige URL",
|
||||
"invalidWebhookId": "der Parameter \"id\" sollte eine gültige UUID darstellen.",
|
||||
"webhookBooleanOption": "\"<%= option %>\" muss ein Boolean Wert sein.",
|
||||
"webhookIdAlreadyTaken": "Ein Webhook mit der ID <%= id %> existiert bereits.",
|
||||
"noWebhookWithId": "Es existiert kein Webhook mit der ID <%= id %>.",
|
||||
"webhookIdAlreadyTaken": "Ein WebHook mit der ID <%= id %> existiert bereits.",
|
||||
"noWebhookWithId": "Es existiert kein WebHook mit der ID <%= id %>.",
|
||||
"regIdRequired": "RegId erforderlich",
|
||||
"pushDeviceAdded": "Push-Gerät erfolgreich hinzugefügt",
|
||||
"pushDeviceNotFound": "Der Benutzer hat kein Push-Gerät mit dieser ID.",
|
||||
@@ -159,7 +159,7 @@
|
||||
"amazonPayments": "Amazon-Zahlungen",
|
||||
"amazonPaymentsRecurring": "Die untenstehende Checkbox muss abgehakt werden, um Dein Abo zu erstellen. Dies ermöglicht, Deinen Amazon-Account für wiederkehrende Zahlungen für <strong>dieses</strong> Abo zu benutzen. Es führt nicht dazu, dass Dein Amazon-Account automatisch auch für zukünftige Einkäufe benutzt wird.",
|
||||
"timezone": "Zeitzone",
|
||||
"timezoneUTC": "Habitica verwendet die Zeitzone, welche an Deinem PC eingestellt ist: <strong><%= utc %></strong>",
|
||||
"timezoneUTC": "Deine Zeitzone wird von Deinem PC festgelegt, und ist: <strong><%= utc %></strong>",
|
||||
"timezoneInfo": "Wenn diese Zeitzone falsch ist, lade die Seite mit Hilfe Deines Browsers erneut, um sicherzustellen, dass Habitica die aktuellen Informationen darstellt. Ist diese immer noch falsch, passe die Zeitzone Deines PCs an und lade die Seite erneut.<br><br> <strong>Wenn Du Habitica auf anderen PCs oder Mobilgeräten verwendest, muss die Zeitzone auf allen übereinstimmen.</strong> Wenn Deine Tagesaufgaben zur falschen Zeit zurückgesetzt werden, wiederhole diese Prüfung auf allen anderen PCs und in einem Browser Deiner Mobilgeräte.",
|
||||
"push": "Push",
|
||||
"about": "Über",
|
||||
@@ -189,5 +189,31 @@
|
||||
"suggestMyUsername": "Schlage meinen Benutzernamen vor",
|
||||
"onlyPrivateSpaces": "Nur in privaten Bereichen",
|
||||
"everywhere": "Überall",
|
||||
"bannedSlurUsedInProfile": "Dein Anzeigename oder Über-Text beinhaltete eine Verunglimpfung, daher wurden Dir Deine Chat-Privilegien entzogen."
|
||||
"bannedSlurUsedInProfile": "Dein Anzeigename oder Über-Text beinhaltete eine Verunglimpfung, daher wurden Dir Deine Chat-Privilegien entzogen.",
|
||||
"transaction_subscription_perks": "Aus der Abonnement-Vergünstigung",
|
||||
"transaction_reroll": "Verstärkungstrank benutzt",
|
||||
"noGemTransactions": "Du hast noch keine Edelstein-Transaktionen.",
|
||||
"transactions": "Transaktionen",
|
||||
"gemTransactions": "Edelstein-Transaktionen",
|
||||
"hourglassTransactions": "Sanduhr-Transaktionen",
|
||||
"noHourglassTransactions": "Du hast noch keine Sanduhr-Transaktionen.",
|
||||
"transaction_buy_money": "Mit Geld erworben",
|
||||
"transaction_buy_gold": "Mit Gold erworben",
|
||||
"transaction_spend": "Ausgegeben für",
|
||||
"transaction_gift_send": "Verschenkt an",
|
||||
"transaction_gift_receive": "Erhalten von",
|
||||
"transaction_create_challenge": "Herausforderung erstellt",
|
||||
"transaction_create_guild": "Gilde erstellt",
|
||||
"transaction_change_class": "Klasse geändert",
|
||||
"transaction_rebirth": "Sphäre der Wiedergeburt verwendet",
|
||||
"transaction_debug": "Debug-Aktion",
|
||||
"transaction_contribution": "Durch Beiträge",
|
||||
"transaction_release_pets": "Haustiere freigelassen",
|
||||
"transaction_release_mounts": "Reittiere freigelassen",
|
||||
"addPasswordAuth": "Passwort hinzufügen",
|
||||
"nextHourglassDescription": "Abonnierende erhalten Mystische Sanduhren\ninnerhalb der ersten drei Tages des Monats.",
|
||||
"gemCap": "Edelsteinobergrenze",
|
||||
"nextHourglass": "Nächste Sanduhr",
|
||||
"adjustment": "Änderung",
|
||||
"dayStartAdjustment": "Änderung des Tageswechsel"
|
||||
}
|
||||
|
||||
@@ -200,5 +200,8 @@
|
||||
"mysterySet202110": "Moosbewachsenes Wasserspeier Set",
|
||||
"mysterySet202111": "Kosmisches Zeitzauberei Set",
|
||||
"mysterySet202112": "Antarktisches Undinen Set",
|
||||
"mysterySet202201": "Mitternächtliches Spaßvogel Set"
|
||||
"mysterySet202201": "Mitternächtliches Spaßvogel Set",
|
||||
"mysterySet202202": "Türkises Rattenschwänzchen Set",
|
||||
"mysterySet202203": "Furchtlose Libelle-Set",
|
||||
"mysterySet202204": "Virtuelles Abenteurer Set"
|
||||
}
|
||||
|
||||
@@ -90,6 +90,7 @@
|
||||
"addedLocalAuth": "Successfully added local authentication",
|
||||
"data": "Δεδομένα",
|
||||
"email": "Email",
|
||||
"emailOrUsername": "Username or Email",
|
||||
"registerWithSocial": "Register with <%= network %>",
|
||||
"registeredWithSocial": "Registered with <%= network %>",
|
||||
"emailNotifications": "Ειδοποιήσεις email",
|
||||
|
||||
@@ -125,9 +125,9 @@
|
||||
"achievementShadeOfItAllText": "Has tamed all Shade Mounts.",
|
||||
"achievementShadeOfItAllModalText": "You tamed all the Shade Mounts!",
|
||||
"achievementZodiacZookeeper": "Zodiac Zookeeper",
|
||||
"achievementZodiacZookeeperText": "Has hatched all the zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!",
|
||||
"achievementZodiacZookeeperText": "Has hatched all standard colors of zodiac pets: Rat, Cow, Bunny, Snake, Horse, Sheep, Monkey, Rooster, Wolf, Tiger, Flying Pig, and Dragon!",
|
||||
"achievementZodiacZookeeperModalText": "You collected all the zodiac pets!",
|
||||
"achievementBirdsOfAFeather": "Birds of a Feather",
|
||||
"achievementBirdsOfAFeatherText": "Has hatched all the flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, Falcon, Peacock, and Rooster.",
|
||||
"achievementBirdsOfAFeatherText": "Has hatched all standard colors of flying pets: Flying Pig, Owl, Parrot, Pterodactyl, Gryphon, Falcon, Peacock, and Rooster.",
|
||||
"achievementBirdsOfAFeatherModalText":"You collected all the flying pets!"
|
||||
}
|
||||
|
||||
@@ -770,6 +770,14 @@
|
||||
"backgroundFloweringPrairieText": "Flowering Prairie",
|
||||
"backgroundFloweringPrairieNotes": "Frolic through a Flowering Prairie.",
|
||||
|
||||
"backgrounds042022": "SET 95: Released April 2022",
|
||||
"backgroundBlossomingTreesText": "Blossoming Trees",
|
||||
"backgroundBlossomingTreesNotes": "Dally beneath Blossoming Trees.",
|
||||
"backgroundFlowerShopText": "Flower Shop",
|
||||
"backgroundFlowerShopNotes": "Enjoy the sweet scent of a Flower Shop.",
|
||||
"backgroundSpringtimeLakeText": "Springtime Lake",
|
||||
"backgroundSpringtimeLakeNotes": "Take in the sights along the shores of a Springtime Lake.",
|
||||
|
||||
"timeTravelBackgrounds": "Steampunk Backgrounds",
|
||||
"backgroundAirshipText": "Airship",
|
||||
"backgroundAirshipNotes": "Become a sky sailor on board your very own Airship.",
|
||||
|
||||
@@ -308,6 +308,7 @@
|
||||
"hatchingPotionMoonglow": "Moonglow",
|
||||
"hatchingPotionSolarSystem": "Solar System",
|
||||
"hatchingPotionOnyx": "Onyx",
|
||||
"hatchingPotionVirtualPet": "Virtual Pet",
|
||||
|
||||
"hatchingPotionNotes": "Pour this on an egg, and it will hatch as a <%= potText(locale) %> pet.",
|
||||
"premiumPotionAddlNotes": "Not usable on quest pet eggs. Available for purchase until <%= date(locale) %>.",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"companyDonate": "Donate",
|
||||
"forgotPassword": "Forgot Password?",
|
||||
"emailNewPass": "Email a Password Reset Link",
|
||||
"forgotPasswordSteps": "Enter the email address you used to register your Habitica account.",
|
||||
"forgotPasswordSteps": "Enter your username or the email address you used to register your Habitica account.",
|
||||
"sendLink": "Send Link",
|
||||
"footerDevs": "Developers",
|
||||
"footerCommunity": "Community",
|
||||
@@ -125,7 +125,7 @@
|
||||
"passwordConfirmationMatch": "Password confirmation doesn't match password.",
|
||||
"minPasswordLength": "Password must be 8 characters or more.",
|
||||
"passwordResetPage": "Reset Password",
|
||||
"passwordReset": "If we have your email on file, instructions for setting a new password have been sent to your email.",
|
||||
"passwordReset": "If we have your email or username on file, instructions for setting a new password have been sent to your email.",
|
||||
"invalidLoginCredentialsLong": "Uh-oh - your email address / username or password is incorrect.\n- Make sure they are typed correctly. Your username and password are case-sensitive.\n- You may have signed up with Facebook or Google-sign-in, not email so double-check by trying them.\n- If you forgot your password, click \"Forgot Password\".",
|
||||
"invalidCredentials": "There is no account that uses those credentials.",
|
||||
"accountSuspended": "This account, User ID \"<%= userId %>\", has been blocked for breaking the Community Guidelines (https://habitica.com/static/community-guidelines) or Terms of Service (https://habitica.com/static/terms). For details or to ask to be unblocked, please email our Community Manager at <%= communityManagerEmail %> or ask your parent or guardian to email them. Please include your @Username in the email.",
|
||||
@@ -133,6 +133,7 @@
|
||||
"unsupportedNetwork": "This network is not currently supported.",
|
||||
"cantDetachSocial": "Account lacks another authentication method; can't detach this authentication method.",
|
||||
"onlySocialAttachLocal": "Local authentication can be added to only a social account.",
|
||||
"socialAlreadyExists": "This social login is already linked to an existing Habitica account.",
|
||||
"invalidReqParams": "Invalid request parameters.",
|
||||
"memberIdRequired": "\"member\" must be a valid UUID.",
|
||||
"heroIdRequired": "\"heroId\" must be a valid UUID.",
|
||||
@@ -143,7 +144,8 @@
|
||||
"confirmPassword": "Confirm Password",
|
||||
"usernameLimitations": "Username must be 1 to 20 characters, containing only letters a to z, numbers 0 to 9, hyphens, or underscores, and cannot include any inappropriate terms.",
|
||||
"usernamePlaceholder": "e.g., HabitRabbit",
|
||||
"emailPlaceholder": "e.g., rabbit@example.com",
|
||||
"emailPlaceholder": "e.g., gryphon@example.com",
|
||||
"emailUsernamePlaceholder": "e.g., habitrabbit or gryphon@example.com",
|
||||
"passwordPlaceholder": "e.g., ******************",
|
||||
"confirmPasswordPlaceholder": "Make sure it's the same password!",
|
||||
"joinHabitica": "Join Habitica",
|
||||
|
||||
@@ -431,7 +431,7 @@
|
||||
"weaponSpecialSpring2022RogueText": "Giant Earring Stud",
|
||||
"weaponSpecialSpring2022RogueNotes": "A shiny! It’s so shiny and gleaming and pretty and nice and all yours! Increases Strength by <%= str %>. Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022WarriorText": "Inside-Out Umbrella",
|
||||
"weaponSpecialSpring2022WarriorNotes": "Yikes! Guess that wind was a little stronger than you thought, huh? Increases Strength by <%= str %>, Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022WarriorNotes": "Yikes! Guess that wind was a little stronger than you thought, huh? Increases Strength by <%= str %>. Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022MageText": "Forsythia Staff",
|
||||
"weaponSpecialSpring2022MageNotes": "These bright yellow bells are ready to channel your powerful springtime magic. Increases Intelligence by <%= int %> and Perception by <%= per %>. Limited Edition 2022 Spring Gear.",
|
||||
"weaponSpecialSpring2022HealerText": "Peridot Wand",
|
||||
@@ -1042,9 +1042,9 @@
|
||||
"armorSpecialSpring2022WarriorText": "Rain Slicker",
|
||||
"armorSpecialSpring2022WarriorNotes": "This slicker and boots are so formidable you could sing in the rain or jump in every puddle but still be warm and dry! Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022MageText": "Forsythia Robe",
|
||||
"armorSpecialSpring2022MageNotes": "Show you’re ready to spring forward into the season with this robe adorned with forsythia flower petals. Intelligence by <%= int %>.Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022MageNotes": "Show you’re ready to spring forward into the season with this robe adorned with forsythia flower petals. Increases Intelligence by <%= int %>. Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022HealerText": "Peridot Armor",
|
||||
"armorSpecialSpring2022HealerNotes": " Drive away fears and nightmares simply by wearing this green gem garment. Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
|
||||
"armorSpecialSpring2022HealerNotes": "Drive away fears and nightmares simply by wearing this green gem garment. Increases Constitution by <%= con %>. Limited Edition 2022 Spring Gear.",
|
||||
|
||||
"armorMystery201402Text": "Messenger Robes",
|
||||
"armorMystery201402Notes": "Shimmering and strong, these robes have many pockets to carry letters. Confers no benefit. February 2014 Subscriber Item.",
|
||||
@@ -1152,6 +1152,8 @@
|
||||
"armorMystery202110Notes": "Velvety moss makes you seem soft on the outside, but you're protected by solid stone. Confers no benefit. October 2021 Subscriber Item.",
|
||||
"armorMystery202112Text": "Antarctic Undine Tail",
|
||||
"armorMystery202112Notes": "Glide through icy seas and never get cold with this glimmering tail. Confers no benefit. December 2021 Subscriber Item.",
|
||||
"armorMystery202204Text":"Virtual Adventurer Capsule",
|
||||
"armorMystery202204Notes":"Looks like doing your tasks now requires pushing these mysterious buttons! What could they do? Confers no benefit. April 2022 Subscriber Item.",
|
||||
"armorMystery301404Text": "Steampunk Suit",
|
||||
"armorMystery301404Notes": "Dapper and dashing, wot! Confers no benefit. February 3015 Subscriber Item.",
|
||||
"armorMystery301703Text": "Steampunk Peacock Gown",
|
||||
@@ -1324,7 +1326,9 @@
|
||||
"armorArmoireSoftVioletSuitText": "Soft Violet Suit",
|
||||
"armorArmoireSoftVioletSuitNotes": "Purple is a luxurious color. Relax in style after you’ve accomplished all your daily tasks. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Violet Loungewear Set (Item 2 of 3).",
|
||||
"armorArmoireGardenersOverallsText": "Gardener's Overalls",
|
||||
"armorArmoireGardenersOverallsNotes": "Don’t be afraid to work down in the dirt when you’re wearing these durable overalls. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set (Item 1 of 4).",
|
||||
"armorArmoireGardenersOverallsNotes": "Don’t be afraid to work down in the dirt when you’re wearing these durable overalls. Increases Constitution by <%= con %>. Enchanted Armoire: Gardener Set (Item 1 of 4).",
|
||||
"armorArmoireStrawRaincoatText": "Straw Raincoat",
|
||||
"armorArmoireStrawRaincoatNotes":"This woven straw cape will keep you dry and your armor from rusting while on your quest. Just don’t venture too near a candle! Increases Constitution by <%= con %>. Enchanted Armoire: Straw Raincoat Set (Item 1 of 2).",
|
||||
|
||||
"headgear": "helm",
|
||||
"headgearCapitalized": "Headgear",
|
||||
@@ -1735,7 +1739,7 @@
|
||||
"headSpecialSpring2022WarriorText": "Rain Slicker Hood",
|
||||
"headSpecialSpring2022WarriorNotes": "Tut tut, it looks like rain! Stand tall and pull up your hood to stay dry. Increases Strength by <%= str %>. Limited Edition 2022 Spring Gear.",
|
||||
"headSpecialSpring2022MageText": "Forsythia Helmet",
|
||||
"headSpecialSpring2022MageNotes": "Stay dry during a rainstorm with this protective helmet of downturned petals.Increases Perception by <%= per %>. Limited Edition 2022 Spring Gear.",
|
||||
"headSpecialSpring2022MageNotes": "Stay dry during a rainstorm with this protective helmet of downturned petals. Increases Perception by <%= per %>. Limited Edition 2022 Spring Gear.",
|
||||
"headSpecialSpring2022HealerText": "Peridot Helmet",
|
||||
"headSpecialSpring2022HealerNotes": "This mysterious helmet preserves your privacy as you tackle your tasks. Increases Intelligence by <%= int %>. Limited Edition 2022 Spring Gear.",
|
||||
|
||||
@@ -2042,7 +2046,9 @@
|
||||
"headArmoireShootingStarCrownText": "Star Crown",
|
||||
"headArmoireShootingStarCrownNotes": "With this brightly shining headpiece, you will literally be the star of your own adventure! Increases Perception by <%= per %>. Enchanted Armoire: Stardust Set (Item 1 of 3).",
|
||||
"headArmoireGardenersSunHatText": "Gardener's Sun Hat",
|
||||
"headArmoireGardenersSunHatNotes": "The bright light of the day star won’t shine in your eyes when you wear this wide-brimmed hat. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set (Item 2 of 4).",
|
||||
"headArmoireGardenersSunHatNotes": "The bright light of the day star won’t shine in your eyes when you wear this wide-brimmed hat. Increases Perception by <%= per %>. Enchanted Armoire: Gardener Set (Item 2 of 4).",
|
||||
"headArmoireStrawRainHatText": "Straw Rain Hat",
|
||||
"headArmoireStrawRainHatNotes": "You’ll be able to spot every obstacle in your path when you wear this water-resistant, conical hat. Increases Perception by <%= per %>. Enchanted Armoire: Straw Raincoat Set (Item 2 of 2).",
|
||||
|
||||
"offhand": "off-hand item",
|
||||
"offHandCapitalized": "Off-Hand Item",
|
||||
@@ -2762,6 +2768,10 @@
|
||||
"eyewearMystery202201Notes": "Ring in the new year with an air of mystery in this stylish feathered mask. Confers no benefit. January 2022 Subscriber Item.",
|
||||
"eyewearMystery202202Text":"Turquoise Eyes with Blush",
|
||||
"eyewearMystery202202Notes":"Cheerful singing brings color to your cheeks. Confers no benefit. February 2022 Subscriber Item",
|
||||
"eyewearMystery202204AText":"Virtual Face",
|
||||
"eyewearMystery202204ANotes":"What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 Subscriber Item.",
|
||||
"eyewearMystery202204BText":"Virtual Face",
|
||||
"eyewearMystery202204BNotes":"What's your mood today? Express yourself with these fun screens. Confers no benefit. April 2022 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.",
|
||||
"eyewearMystery301405Text": "Monocle",
|
||||
|
||||
@@ -193,6 +193,7 @@
|
||||
"septemberYYYY": "September <%= year %>",
|
||||
"decemberYYYY": "December <%= year %>",
|
||||
"marchYYYY": "March <%= year %>",
|
||||
"aprilYYYY": "April <%= year %>",
|
||||
"mayYYYY": "May <%= year %>",
|
||||
"juneYYYY": "June <%= year %>",
|
||||
"novemberYYYY": "November <%= year %>",
|
||||
|
||||
@@ -867,5 +867,15 @@
|
||||
"questOnyxCollectLeoRunes": "Leo Runes",
|
||||
"questOnyxCollectOnyxStones": "Onyx Stones",
|
||||
"questOnyxDropOnyxPotion": "Onyx Hatching Potion",
|
||||
"questOnyxUnlockText": "Unlocks Onyx Hatching Potions for purchase in the Market"
|
||||
"questOnyxUnlockText": "Unlocks Onyx Hatching Potions for purchase in the Market",
|
||||
|
||||
"questVirtualPetText": "Virtual Mayhem with the April Fool: The Beepening",
|
||||
"questVirtualPetNotes": "It’s a quiet and pleasant spring morning in Habitica, a week past a memorable April Fool’s Day. You and @Beffymaroo are at the stables tending to your pets (who are still a bit confused from their time spent virtually!).<br><br>In the distance you hear a rumble and a beeping noise, soft at first but increasing in volume as if it’s getting closer. An egg-shape appears on the horizon and as it nears, beeping ever louder, you see that it is a gigantic virtual pet!<br><br>“Oh no,” @Beffymaroo exclaims, “I think the April Fool left some unfinished business with this big fella here, he seems to want attention!”<br><br>The virtual pet beeps angrily, throwing a virtual tantrum and whomping ever closer.",
|
||||
"questVirtualPetCompletion": "Some careful button pushing seems to have fulfilled the virtual pet’s mysterious needs, and finally it has quieted down and appears content.<br><br>Suddenly in a burst of confetti, the April Fool appears with a basket full of strange potions emitting soft beeps.<br><br>“What timing, April Fool,” @Beffymaroo says with a wry smile. “I suspect this large beeping fellow is an acquaintance of yours.”<br><br>“Uh, yes,” the Fool says, sheepishly. “So sorry about that, and thank you both for taking care of Wotchimon! Take these potions in the way of thanks, they can bring your Virtual pets back anytime you like!”<br><br>You’re not 100% sure you’re on board with all the beeping, but they’re sure cute so it’s worth a shot!",
|
||||
"questVirtualPetBoss": "Wotchimon",
|
||||
"questVirtualPetRageTitle": "The Beepening",
|
||||
"questVirtualPetRageDescription": "This bar fills when you don't complete your Dailies. When it is full, the Wotchiman will heal 30% of its remaining health!",
|
||||
"questVirtualPetRageEffect": "`Wotchimon uses Bothersome Beep!` Wotchimon sounds a bothersome beep, and its happiness bar suddenly disappears! Pending damage reduced.",
|
||||
"questVirtualPetDropVirtualPetPotion": "Virtual Pet Hatching Potion",
|
||||
"questVirtualPetUnlockText": "Unlocks Virtual Pet Hatching Potion for purchase in the Market"
|
||||
}
|
||||
|
||||
@@ -40,10 +40,12 @@
|
||||
"xml": "(XML)",
|
||||
"json": "(JSON)",
|
||||
"customDayStart": "Custom Day Start",
|
||||
"adjustment": "Adjustment",
|
||||
"dayStartAdjustment": "Day Start Adjustment",
|
||||
"sureChangeCustomDayStartTime": "Are you sure you want to change your Custom Day Start time? Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before then!",
|
||||
"customDayStartHasChanged": "Your custom day start has changed.",
|
||||
"nextCron": "Your Dailies will next reset the first time you use Habitica after <%= time %>. Make sure you have completed your Dailies before this time!",
|
||||
"customDayStartInfo1": "Habitica defaults to check and reset your Dailies at midnight in your own time zone each day. You can customize that time here.",
|
||||
"customDayStartInfo1": "Habitica checks and resets your Dailies at midnight in your own time zone each day. You can adjust when that happens past the default time here.",
|
||||
"misc": "Misc",
|
||||
"showHeader": "Show Header",
|
||||
"changePass": "Change Password",
|
||||
@@ -56,7 +58,7 @@
|
||||
"newUsername": "New Username",
|
||||
"dangerZone": "Danger Zone",
|
||||
"resetText1": "WARNING! This resets many parts of your account. This is highly discouraged, but some people find it useful in the beginning after playing with the site for a short time.",
|
||||
"resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment except Subscriber Mystery Items and free commemorative items. You will be able to buy the deleted items back, including all limited edition equipment (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class, achievements and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.",
|
||||
"resetText2": "You will lose all your levels, Gold, and Experience points. All your tasks (except those from challenges) will be deleted permanently and you will lose all of their historical data. You will lose all your equipment except Subscriber Mystery Items and free commemorative items. You will be able to buy the deleted items back, including all limited edition equipment (you will need to be in the correct class to re-buy class-specific gear). You will keep your current class, achievements and your pets and mounts. You might prefer to use an Orb of Rebirth instead, which is a much safer option and which will preserve your tasks and equipment.",
|
||||
"deleteLocalAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type your password into the text box below.",
|
||||
"deleteSocialAccountText": "Are you sure? This will delete your account forever, and it can never be restored! You will need to register a new account to use Habitica again. Banked or spent Gems will not be refunded. If you're absolutely certain, type \"<%= magicWord %>\" into the text box below.",
|
||||
"API": "API",
|
||||
@@ -134,6 +136,7 @@
|
||||
"saveCustomDayStart": "Save Custom Day Start",
|
||||
"registration": "Registration",
|
||||
"addLocalAuth": "Add Email and Password Login",
|
||||
"addPasswordAuth": "Add Password",
|
||||
"generateCodes": "Generate Codes",
|
||||
"generate": "Generate",
|
||||
"getCodes": "Get Codes",
|
||||
@@ -155,14 +158,17 @@
|
||||
"purchasedPlanExtraMonths": "You have <strong><%= months %> months</strong> of extra subscription credit.",
|
||||
"consecutiveSubscription": "Consecutive Subscription",
|
||||
"consecutiveMonths": "Consecutive Months:",
|
||||
"gemCap": "Gem Cap",
|
||||
"gemCapExtra": "Gem Cap Bonus",
|
||||
"mysticHourglasses": "Mystic Hourglasses:",
|
||||
"mysticHourglassesTooltip": "Mystic Hourglasses",
|
||||
"nextHourglass": "Next Hourglass",
|
||||
"nextHourglassDescription": "Subscribers receive Mystic Hourglasses within\nthe first three days of the month.",
|
||||
"paypal": "PayPal",
|
||||
"amazonPayments": "Amazon Payments",
|
||||
"amazonPaymentsRecurring": "Ticking the checkbox below is necessary for your subscription to be created. It allows your Amazon account to be used for ongoing payments for <strong>this</strong> subscription. It will not cause your Amazon account to be automatically used for any future purchases.",
|
||||
"timezone": "Time Zone",
|
||||
"timezoneUTC": "Habitica uses the time zone set on your PC, which is: <strong><%= utc %></strong>",
|
||||
"timezoneUTC": "Your time zone is set by your computer, which is: <strong><%= utc %></strong>",
|
||||
"timezoneInfo": "If that time zone is wrong, first reload this page using your browser's reload or refresh button to ensure that Habitica has the most recent information. If it is still wrong, adjust the time zone on your PC and then reload this page again.<br><br> <strong>If you use Habitica on other PCs or mobile devices, the time zone must be the same on them all.</strong> If your Dailies have been resetting at the wrong time, repeat this check on all other PCs and on a browser on your mobile devices.",
|
||||
"push": "Push",
|
||||
"about": "About",
|
||||
@@ -200,9 +206,9 @@
|
||||
"transaction_create_challenge": "Created challenge",
|
||||
"transaction_create_guild": "Created guild",
|
||||
"transaction_change_class": "Changed class",
|
||||
"transaction_rebirth": "Used orb of rebirth",
|
||||
"transaction_rebirth": "Used Orb of Rebirth",
|
||||
"transaction_release_pets": "Released pets",
|
||||
"transaction_release_mounts": "Released mounts",
|
||||
"transaction_reroll": "Used fortify potion",
|
||||
"transaction_reroll": "Used Fortify Potion",
|
||||
"transaction_subscription_perks": "From subscription perk"
|
||||
}
|
||||
|
||||
@@ -132,6 +132,7 @@
|
||||
"mysterySet202201": "Midnight Merrymaker Set",
|
||||
"mysterySet202202": "Turquoise Twintails Set",
|
||||
"mysterySet202203": "Dauntless Dragonfly Set",
|
||||
"mysterySet202204": "Virtual Adventurer Set",
|
||||
"mysterySet301404": "Steampunk Standard Set",
|
||||
"mysterySet301405": "Steampunk Accessories Set",
|
||||
"mysterySet301703": "Peacock Steampunk Set",
|
||||
|
||||
@@ -291,7 +291,7 @@
|
||||
"foodCandyWhite": "Vanilla Candy",
|
||||
"foodCandyWhiteThe": "the Vanilla Candy",
|
||||
"foodCandyWhiteA": "Vanilla Candy",
|
||||
"foodCandyGolden": "Honey Candy",
|
||||
"foodCandyGolden": "Honey Sweety",
|
||||
"foodCandyGoldenThe": "the Honey Candy",
|
||||
"foodCandyGoldenA": "Honey Candy",
|
||||
"foodCandyZombie": "Rotten Candy",
|
||||
@@ -365,5 +365,10 @@
|
||||
"hatchingPotionAutumnLeaf": "Autumn Leaf",
|
||||
"hatchingPotionStainedGlass": "Stained Glass",
|
||||
"hatchingPotionBlackPearl": "Black Pearl",
|
||||
"hatchingPotionPolkaDot": "Polka Dot"
|
||||
"hatchingPotionPolkaDot": "Polka Dot",
|
||||
"hatchingPotionSunset": "Sunset",
|
||||
"hatchingPotionMossyStone": "Mossy Stone",
|
||||
"hatchingPotionSolarSystem": "Solar System",
|
||||
"hatchingPotionMoonglow": "Moonglow",
|
||||
"hatchingPotionOnyx": "Onyx"
|
||||
}
|
||||
|
||||
@@ -124,7 +124,10 @@
|
||||
"achievementShadeOfItAllModalText": "¡Has domado todas las monturas sombrías!",
|
||||
"achievementShadyCustomerText": "Ha conseguido todas las mascotas sombrías.",
|
||||
"achievementShadyCustomer": "Cliente sombrío",
|
||||
"achievementZodiacZookeeper": "Cuidador del Zodíaco",
|
||||
"achievementZodiacZookeeperText": "¡Has eclosionado todas las mascotas del zodíaco: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!",
|
||||
"achievementZodiacZookeeperModalText": "¡Has conseguido todas las mascotas del zodíaco!"
|
||||
"achievementZodiacZookeeper": "Cuidador del Zodiaco",
|
||||
"achievementZodiacZookeeperText": "¡Ha eclosionado todas las mascotas del zodíaco de color básico: Rata, Vaca, Conejo, Serpiente, Caballo, Oveja, Mono, Gallo, Lobo, Tigre, Cerdo Volador y Dragón!",
|
||||
"achievementZodiacZookeeperModalText": "¡Has conseguido todas las mascotas del zodíaco!",
|
||||
"achievementBirdsOfAFeatherText": "Ha eclosionado todas las mascotas voladoras de color básico: Cerdo Volador, Búho, Loro, Pterodáctilo, Grifo, Halcón, Pavo Real y Gallo.",
|
||||
"achievementBirdsOfAFeatherModalText": "¡Has conseguido todas las mascotas voladoras!",
|
||||
"achievementBirdsOfAFeather": "Aves de Pluma"
|
||||
}
|
||||
|
||||
@@ -667,5 +667,22 @@
|
||||
"backgroundFortuneTellersShopNotes": "Podrás encontrar tentadoras pistas sobre tu futuro en una Tienda de Vidente.",
|
||||
"backgroundInsideAPotionBottleText": "Dentro del Frasco de una Poción",
|
||||
"backgrounds112021": "90.ª serie: publicada en noviembre de 2021",
|
||||
"backgroundSpiralStaircaseNotes": "Sube, baja y da vueltas y vueltas en esta Escalera de Caracol."
|
||||
"backgroundSpiralStaircaseNotes": "Sube, baja y da vueltas y vueltas en esta Escalera de Caracol.",
|
||||
"backgroundWinterWaterfallText": "Catarata invernal",
|
||||
"backgroundWinterWaterfallNotes": "Maravíllate en la catarata invernal.",
|
||||
"backgroundIridescentCloudsText": "Nubes iridiscentes",
|
||||
"backgroundIridescentCloudsNotes": "Flota entre nubes iridiscentes.",
|
||||
"backgroundOrangeGroveText": "Campo de naranjos",
|
||||
"backgroundOrangeGroveNotes": "Pasea por un fragante campo de naranjos.",
|
||||
"backgrounds022022": "93.ª serie: publicada en febrero de 2022",
|
||||
"backgrounds032022": "94.ª serie: publiccada en marzo de 2022",
|
||||
"backgroundBrickWallWithIvyText": "Pared de Ladrillo con Hiedra",
|
||||
"backgroundBrickWallWithIvyNotes": "Admira una Pared de Ladrillo con Hiedra.",
|
||||
"backgrounds042022": "95ª. serie: publicada en abril de 2022",
|
||||
"backgroundBlossomingTreesText": "Árboles Florecidos",
|
||||
"backgroundFlowerShopText": "Tienda de Flores",
|
||||
"backgroundFlowerShopNotes": "Disfruta el suave aroma de una Tienda de Flores.",
|
||||
"backgroundBlossomingTreesNotes": "Entretente bajo Árboles Florecidos.",
|
||||
"backgroundAnimalsDenText": "Cubil de una Criatura del Bosque",
|
||||
"backgroundAnimalsDenNotes": "Ponte Cómodo en el Cubil de una Criatura del Bosque."
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"dontDespair": "¡No necesitas estar triste!",
|
||||
"deathPenaltyDetails": "Has perdido un Nivel, tu Oro y un Articulo, ¡pero puedes recuperarlos todos con trabajo duro! Buena suerte--lo harás genial.",
|
||||
"refillHealthTryAgain": "Rellenar salud y volver a intentarlo",
|
||||
"dyingOftenTips": "¿Pasa esto a menudo? <a href='http://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>¡Aqui tienes ayuda!</a>",
|
||||
"dyingOftenTips": "¿Pasa esto a menudo? <a href='https://habitica.fandom.com/wiki/Death_Mechanics#Strategies_for_Staying_Alive' target='_blank'>¡Aqui tienes ayuda!</a>",
|
||||
"losingHealthWarning": "¡Cuidado, estás perdiendo salud rapidamente!",
|
||||
"losingHealthWarning2": "¡No dejes que tu salud baje a cero! Si lo haces, perderás un nivel, tu oro y un Articulo.",
|
||||
"toRegainHealth": "Para recuperar tu salud:",
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"companyDonate": "Donar",
|
||||
"forgotPassword": "¿Has olvidado la contraseña?",
|
||||
"emailNewPass": "Enviar un link de cambio de contraseña",
|
||||
"forgotPasswordSteps": "Introduce la dirección de correo electrónico que utilizaste para registrarte en Habitica.",
|
||||
"forgotPasswordSteps": "Introduce tu nombre de usuario o la dirección de correo electrónico que utilizaste para registrarte en Habitica.",
|
||||
"sendLink": "Enviar link",
|
||||
"featuredIn": "Hablan de nosotros en",
|
||||
"footerDevs": "Desarrolladores",
|
||||
@@ -129,7 +129,7 @@
|
||||
"passwordConfirmationMatch": "Las contraseñas no coinciden.",
|
||||
"invalidLoginCredentials": "El nombre de usuario y/o correo electrónico y/o conseña no son correctos.",
|
||||
"passwordResetPage": "Restablecer Contraseña",
|
||||
"passwordReset": "Si tenemos constancia de tu correo electrónico, te hemos enviado un mensaje con las instrucciones a seguir para establecer una nueva contraseña.",
|
||||
"passwordReset": "Si tenemos constancia de tu correo electrónico o nombre de usuario, te hemos enviado un mensaje con las instrucciones a seguir para establecer una nueva contraseña.",
|
||||
"passwordResetEmailSubject": "Restablecer contraseña para Habitica",
|
||||
"passwordResetEmailText": "Si has solicitado restablecer la contraseña del usuario <%= username %> en Habitica, entra en <%= passwordResetLink %> para establecer una nueva. El enlace expira tras 24 horas. Si no has solicitado restablecer una contraseña, por favor ignora este mensaje.",
|
||||
"passwordResetEmailHtml": "Si has solicitado restablecer la contraseña del usuario <strong><%= username %></strong> en Habitica, <a href=\"<%= passwordResetLink %>\">haz clic aquí</a> para establecer una nueva. El enlace expira tras 24 horas.<br/><br>Si no has solicitado restablecer una contraseña, por favor ignora este mensaje.",
|
||||
@@ -150,7 +150,7 @@
|
||||
"confirmPassword": "Confirmar contraseña",
|
||||
"usernameLimitations": "El nombre de usuario debe tener entre 1 y 20 caracteres, que tengan solo letras entre la a y la z, números del 0 al 9, guiones o barras bajas, y no pueden incluir términos inapropiados.",
|
||||
"usernamePlaceholder": "p.e., HabitRabbit",
|
||||
"emailPlaceholder": "p.e., rabbit@example.com",
|
||||
"emailPlaceholder": "p.e., gryphon@example.com",
|
||||
"passwordPlaceholder": "p.e., ******************",
|
||||
"confirmPasswordPlaceholder": "¡Asegúrate de que es la misma contraseña!",
|
||||
"joinHabitica": "Únete a Habitica",
|
||||
@@ -185,5 +185,6 @@
|
||||
"learnMore": "Saber más",
|
||||
"communityInstagram": "Instagram",
|
||||
"minPasswordLength": "La contraseña debe contener 8 caracteres o más.",
|
||||
"enterHabitica": "Adéntrate en Habitica"
|
||||
"enterHabitica": "Adéntrate en Habitica",
|
||||
"emailUsernamePlaceholder": "p.e., habitrabbit o gryphon@example.com"
|
||||
}
|
||||
|
||||