WIP(links): replace hrefs in string tokens

This commit is contained in:
Kalista Payne
2026-05-19 07:05:35 -05:00
parent 7e704d65fd
commit 80f4f086c0
52 changed files with 289 additions and 1082 deletions
+10 -1
View File
@@ -11,7 +11,7 @@
{{ $t('tavernDiscontinued') }}
</h1>
<p>{{ $t('tavernDiscontinuedDetail') }}</p>
<p v-html="$t('tavernDiscontinuedLinks')"></p>
<p v-html="$t('tavernDiscontinuedLinks', tavernLinks)"></p>
</div>
<div v-else>
<h1>
@@ -38,6 +38,15 @@
import { mapState } from '@/libs/store';
export default {
data () {
return {
tavernLinks: {
faqLink: '<a href="/static/faq/tavern-and-guilds">',
homeLink: '<a href="/">',
linkClose: '</a>',
},
};
},
computed: {
...mapState(['isUserLoggedIn']),
retiredChatPage () {
@@ -98,7 +98,7 @@
<div
v-once
class="opt-out-description"
v-html="$t('optOutOfClassesText')"
v-html="$t('optOutOfClassesText', optOutLinks)"
></div>
</div>
</div>
@@ -214,6 +214,10 @@ export default {
wizard: wizardIcon,
}),
selectedClass: 'warrior',
optOutLinks: {
linkOpen: '<a href="/static/faq#what-classes" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -55,7 +55,7 @@
</button>
<h4
class="text-center"
v-html="$t('dyingOftenTips')"
v-html="$t('dyingOftenTips', tipLinks)"
></h4>
</div>
</div>
@@ -86,6 +86,10 @@ export default {
data () {
return {
maxHealth,
tipLinks: {
linkOpen: '<a href="/static/faq#prevent-damage" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -52,7 +52,7 @@
&& user.achievements.ultimateGearSets.rogue
&& user.achievements.ultimateGearSets.warrior"
>
<p v-html="$t('moreGearAchievements')"></p>
<p v-html="$t('moreGearAchievements', gearAchievementLinks)"></p>
<br>
</div>
<Sprite image-name="shop_armoire" />
@@ -95,6 +95,12 @@ export default {
achievementAvatar,
Sprite,
},
data: {
gearAchievementLinks: {
linkOpen: '<a href="/user/settings/site" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
},
computed: {
...mapState({ user: 'user.data' }),
},
@@ -77,7 +77,7 @@
v-once
class="custom-control-label purple-600"
for="privacyTOS"
v-html="$t('acceptPrivacyTOS')"
v-html="$t('acceptPrivacyTOS', acceptLinks)"
></label>
</div>
<button
@@ -187,6 +187,11 @@ export default {
privacyAccepted: false,
usernameIssues: [],
needsEmailField: false,
acceptLinks: {
termsLink: '<a href="/static/terms" target="_blank" rel="noreferrer noopener">',
privacyLink: '<a href="/static/privacy" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -64,7 +64,7 @@
<p
v-once
class="w-50 mx-auto"
v-html="$t('visitCustomizationsShop')"
v-html="$t('visitCustomizationsShop', customizeLinks)"
></p>
</div>
<customize-banner
@@ -82,6 +82,7 @@ import { avatarEditorUtilities } from '../../mixins/avatarEditUtilities';
import customizeBanner from './customize-banner';
import customizeOptions from './customize-options';
import subMenu from './sub-menu';
import { customRef } from 'vue';
export default {
components: {
@@ -104,6 +105,10 @@ export default {
headAccessory: ['bearEars', 'cactusEars', 'foxEars', 'lionEars', 'pandaEars', 'pigEars', 'tigerEars', 'wolfEars'],
},
chairKeys: ['none', 'black', 'blue', 'green', 'pink', 'red', 'yellow', 'handleless_black', 'handleless_blue', 'handleless_green', 'handleless_pink', 'handleless_red', 'handleless_yellow'],
customizeLinks: {
linkOpen: '<a href="/shops/customizations">',
linkClose: '</a>',
},
};
},
computed: {
@@ -61,7 +61,7 @@
<p
v-once
class="w-50 mx-auto"
v-html="$t('visitCustomizationsShop')"
v-html="$t('visitCustomizationsShop', customizeLinks)"
></p>
</div>
</div>
@@ -95,6 +95,14 @@ export default {
props: [
'editing',
],
data () {
return {
customizeLinks: {
linkOpen: '<a href="/shops/customizations">',
linkClose: '</a>',
},
}
},
computed: {
hairSubMenuItems () {
const items = [
@@ -77,7 +77,7 @@
</ul>
<div
class="mx-auto"
v-html="$t('newGroupsVisitFAQ')"
v-html="$t('newGroupsVisitFAQ', faqLinks)"
></div>
<div
class="mx-auto"
@@ -193,6 +193,10 @@ export default {
close: closeIcon,
sparkles,
}),
faqLinks: {
linkOpen: '<a href="/static/faq#group-plans" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
methods: {
@@ -6,7 +6,7 @@
<div
v-once
class="col col-sm-12 col-xl-8"
v-html="$t('communityGuidelinesIntro')"
v-html="$t('communityGuidelinesIntro', guidelineLinks)"
></div>
<div class="col-md-auto col-md-12 col-xl-4">
<button
@@ -60,6 +60,14 @@
import { mapState } from '@/libs/store';
export default {
data () {
return {
guidelineLinks: {
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
...mapState({ user: 'user.data' }),
communityGuidelinesAccepted () {
@@ -74,7 +74,7 @@
class="no-quest-to-start"
>
<b>{{ $t('noQuestToStartTitle') }}</b> <br>
<span v-html="$t('noQuestToStart', { questShop: '/shops/quests' })"></span>
<span v-html="$t('noQuestToStart', questLinks)"></span>
</span>
</div>
</div>
@@ -369,6 +369,10 @@ export default {
shareUserIdShown: false,
quests,
sortBy: 'AZ',
questLinks: {
linkOpen: '<a href="/shops/quests">',
linkClose: '</a>',
},
};
},
computed: {
@@ -1,893 +0,0 @@
<template>
<div class="row">
<world-boss-info-modal />
<world-boss-rage-modal />
<div class="col-12 col-sm-8 clearfix standard-page">
<div class="row">
<div class="col-6 title-details">
<h1 v-once>
{{ $t('welcomeToTavern') }}
</h1>
</div>
</div>
<chat
:label="$t('tavernChat')"
:group="group"
:placeholder="$t('tavernCommunityGuidelinesPlaceholder')"
@fetchRecentMessages="fetchRecentMessages()"
/>
</div>
<div class="col-12 col-sm-4 sidebar">
<div class="section">
<div
class="grassy-meadow-backdrop"
:style="{'background-image': imageURLs.background}"
>
<div
class="daniel_front"
:style="{'background-image': imageURLs.npc}"
></div>
</div>
<div class="boss-section">
<div
v-if="group && group.quest && group.quest.active"
class="world-boss"
:style="{
background: questData.colors.dark,
'border-color': questData.colors.extralight,
'outline-color': questData.colors.light}"
>
<div
class="corner-decoration"
:style="{top: '-2px', right: '-2px'}"
></div>
<div
class="corner-decoration"
:style="{top: '-2px', left: '-2px'}"
></div>
<div
class="corner-decoration"
:style="{bottom: '-2px', right: '-2px'}"
></div>
<div
class="corner-decoration"
:style="{bottom: '-2px', left: '-2px'}"
></div>
<div class="text-center float-bar d-flex align-items-center">
<span class="diamond"></span>
<span
class="strong reduce"
:style="{background: questData.colors.dark}"
>{{ $t('worldBossEvent') }}</span>
<span class="diamond"></span>
</div>
<div class="boss-gradient pb-3 pt-3">
<p
class="text-center reduce"
:style="{color: questData.colors.extralight}"
>
{{ $t(`${questData.key}ArtCredit`) }}
</p>
<div
class="quest-boss"
:class="'background_' + questData.key"
>
<div
class="quest-boss"
:class="'quest_' + questData.key"
></div>
<div
class="quest-boss"
:class="'phobia_' + questData.key"
:style="{display: 'none'}"
></div>
</div>
</div>
<div class="p-3">
<div class="row d-flex align-items-center mb-2">
<div class="col-sm-6">
<strong class="float-left">{{ questData.boss.name() }}</strong>
</div>
<div class="col-sm-6">
<span class="d-flex float-right">
<div
class="svg-icon boss-icon"
v-html="icons.swordIcon"
></div>
<span
class="ml-1 reduce"
:style="{color: questData.colors.extralight}"
>{{ $t('pendingDamage', {damage: pendingDamage()}) }}</span>
</span>
</div>
</div>
<div class="grey-progress-bar mb-1">
<div
class="boss-health-bar"
:style="{width: (group.quest.progress.hp / questData.boss.hp) * 100 + '%'}"
></div>
</div>
<span class="d-flex align-items-center">
<div
class="svg-icon boss-icon"
v-html="icons.healthIcon"
></div>
<span
class="reduce ml-1 pt-1"
>{{ $t('bossHealth', {
currentHealth: bossCurrentHealth(),
maxHealth: questData.boss.hp.toLocaleString()}) }}</span>
</span>
<div class="mt-3 mb-2">
<strong class="mr-1">{{ $t('rageAttack') }}</strong>
<span>{{ questData.boss.rage.title() }}</span>
</div>
<div class="grey-progress-bar mb-1">
<div
class="boss-health-bar rage-bar"
:style="{
width: (group.quest.progress.rage / questData.boss.rage.value) * 100 + '%'}"
></div>
</div>
<span class="d-flex align-items-center">
<div
class="svg-icon boss-icon"
v-html="icons.rageIcon"
></div>
<span
class="reduce ml-1 pt-1"
>{{ $t('bossRage', {
currentRage: bossCurrentRage(),
maxRage: questData.boss.rage.value.toLocaleString()}) }}</span>
</span>
<div class="row d-flex align-items-center mb-2 mt-2">
<div class="col-sm-4 d-flex">
<strong class="mr-2">{{ $t('rageStrikes') }}</strong>
<div
v-b-tooltip.hover.top="questData.boss.rage.description()"
class="svg-icon boss-icon information-icon m-auto"
v-html="icons.informationIcon"
></div>
</div>
<div class="col-sm-8 d-flex align-items-center justify-content-center">
<div
class="m-auto"
@click="showWorldBossRage('seasonalShop')"
>
<img
v-if="!group.quest.extra.worldDmg.seasonalShop"
class="rage-strike"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.seasonalShop"
class="rage-strike-active"
src="@/assets/images/world-boss/rage_strike-seasonalShop@2x.png"
>
</div>
<div
class="m-auto"
@click="showWorldBossRage('market')"
>
<img
v-if="!group.quest.extra.worldDmg.market"
class="rage-strike"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.market"
class="rage-strike-active"
src="@/assets/images/world-boss/rage_strike-market@2x.png"
>
</div>
<div
class="m-auto"
@click="showWorldBossRage('quests')"
>
<img
v-if="!group.quest.extra.worldDmg.quests"
class="rage-strike"
src="@/assets/images/world-boss/rage_strike@2x.png"
>
<img
v-if="group.quest.extra.worldDmg.quests"
class="rage-strike-active"
src="@/assets/images/world-boss/rage_strike-quests@2x.png"
>
</div>
</div>
</div>
<div
class="boss-description p-3"
:style="{'border-color': questData.colors.extralight}"
@click="sections.worldBoss = !sections.worldBoss"
>
<strong class="float-left">{{ $t('worldBossDescription') }}</strong>
<div class="float-right">
<div
v-if="!sections.worldBoss"
class="toggle-down"
>
<div
class="svg-icon boss-icon"
v-html="icons.chevronIcon"
></div>
</div>
<div
v-if="sections.worldBoss"
class="toggle-up"
>
<div
class="svg-icon boss-icon reverse"
v-html="icons.chevronIcon"
></div>
</div>
</div>
</div>
<div
v-if="sections.worldBoss"
class="mt-3"
v-html="questData.notes()"
></div>
</div>
</div>
<!-- .text-center.mt-4.world-boss
-info-button(@click="showWorldBossInfo()") {{$t('whatIsWorldBoss') }}
-->
</div>
<div class="sleep px-4 py-3">
<strong v-once>{{ $t('sleepDescription') }}</strong>
<ul>
<li v-once>
{{ $t('sleepBullet1') }}
</li>
<li v-once>
{{ $t('sleepBullet2') }}
</li>
<li v-once>
{{ $t('sleepBullet3') }}
</li>
</ul>
<button
v-if="!user.preferences.sleep"
v-once
class="btn btn-secondary pause-button"
@click="toggleSleep()"
>
{{ $t('pauseDailies') }}
</button>
<button
v-if="user.preferences.sleep"
v-once
class="btn btn-secondary pause-button"
@click="toggleSleep()"
>
{{ $t('unpauseDailies') }}
</button>
</div>
</div>
<div class="px-4">
<sidebar-section :title="$t('staff')">
<div class="row">
<div
v-for="user in staff"
:key="user.uuid"
class="col-6 staff"
:class="{
staff: user.type === 'Staff',
moderator: user.type === 'Moderator'}"
>
<div>
<router-link
class="title"
:to="{'name': 'userProfile', 'params': {'userId': user.uuid}}"
>
{{ user.name }}
</router-link>
<div
v-if="user.type === 'Staff'"
class="svg-icon staff-icon"
v-html="icons.tierStaff"
></div>
</div>
</div>
</div>
</sidebar-section>
<sidebar-section :title="$t('helpfulLinks')">
<ul>
<li>
<a href="mailto:admin@habitica.com">
{{ $t('reportCommunityIssues') }}
</a>
</li>
<li>
<router-link
v-once
to="/static/community-guidelines"
>
{{ $t('communityGuidelines') }}
</router-link>
</li>
<li>
<router-link
to="/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601"
>
{{ $t('lookingForGroup') }}
</router-link>
</li>
<li>
<router-link
v-once
to="/static/faq"
>
{{ $t('faq') }}
</router-link>
</li>
<li>
<a
href
:style="glossary-link"
v-html="$t('glossary')"
></a>
</li>
<li>
<a
v-once
href="https://habitica.fandom.com/wiki/Habitica_Wiki"
target="_blank"
rel="noopener noreferrer"
>{{ $t('wiki') }}</a>
</li>
<li>
<a
v-once
href="https://tools.habitica.com/"
target="_blank"
rel="noopener noreferrer"
>{{ $t('dataDisplayTool') }}</a>
</li>
<li>
<a
href=""
target="_blank"
rel="noopener noreferrer"
@click.prevent="openBugReportModal()"
>
{{ $t('reportBug') }}
</a>
</li>
<li>
<a
v-once
href="https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link"
target="_blank"
rel="noopener noreferrer"
>{{ $t('requestFeature') }}</a>
</li>
<li>
<router-link
to="/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a"
>
{{ $t('askQuestionGuild') }}
</router-link>
</li>
</ul>
</sidebar-section>
<sidebar-section :title="$t('playerTiers')">
<div class="row">
<div class="col-12">
<p v-once>
{{ $t('playerTiersDesc') }}
</p>
<ul class="tier-list">
<li
v-once
class="tier1"
>
{{ $t('tier1') }}
<div
class="svg-icon tier1-icon"
v-html="icons.tier1"
></div>
</li>
<li
v-once
class="tier2"
>
{{ $t('tier2') }}
<div
class="svg-icon tier2-icon"
v-html="icons.tier2"
></div>
</li>
<li
v-once
class="tier3"
>
{{ $t('tier3') }}
<div
class="svg-icon tier3-icon"
v-html="icons.tier3"
></div>
</li>
<li
v-once
class="tier4"
>
{{ $t('tier4') }}
<div
class="svg-icon tier4-icon"
v-html="icons.tier4"
></div>
</li>
<li
v-once
class="tier5"
>
{{ $t('tier5') }}
<div
class="svg-icon tier5-icon"
v-html="icons.tier5"
></div>
</li>
<li
v-once
class="tier6"
>
{{ $t('tier6') }}
<div
class="svg-icon tier6-icon"
v-html="icons.tier6"
></div>
</li>
<li
v-once
class="tier7"
>
{{ $t('tier7') }}
<div
class="svg-icon tier7-icon"
v-html="icons.tier7"
></div>
</li>
<li
v-once
class="moderator"
>
{{ $t('tierModerator') }}
<div
class="svg-icon mod-icon"
v-html="icons.tierMod"
></div>
</li>
<li
v-once
class="staff"
>
{{ $t('tierStaff') }}
<div
class="svg-icon staff-icon"
v-html="icons.tierStaff"
></div>
</li>
<li
v-once
class="npc"
>
{{ $t('tierNPC') }}
<div
class="svg-icon npc-icon"
v-html="icons.tierNPC"
></div>
</li>
</ul>
</div>
</div>
</sidebar-section>
</div>
</div>
</div>
</template>
<style lang='scss' scoped>
@import '@/assets/scss/colors.scss';
h1 {
color: $purple-200;
}
.sidebar {
background-color: $gray-600;
padding: 0em;
}
.pause-button {
background-color: #ffb445 !important;
color: $white;
width: 100%;
}
.grassy-meadow-backdrop {
background-repeat: repeat-x;
width: 100%;
height: 246px;
}
.daniel_front {
height: 246px;
width: 471px;
background-repeat: no-repeat;
margin: 0 auto;
}
.svg-icon {
width: 10px;
display: inline-block;
margin-left: .5em;
}
.tier1-icon, .tier2-icon {
width: 11px;
}
.tier5-icon, .tier6-icon {
width: 8px;
}
.tier7-icon {
width: 12px;
}
.mod-icon {
width: 13px;
}
.npc-icon {
width: 8px;
}
.boss-icon {
width: 16px;
margin-top: .1em;
margin-left: 0;
}
.boss-icon-large {
width: 48px;
}
.staff {
margin-bottom: 1em;
.staff-icon {
width: 11px;
}
.title {
color: #6133b4;
font-weight: bold;
display: inline-block;
}
}
.tier-list {
list-style-type: none;
padding: 0;
width: 98%;
li {
border-radius: 2px;
background-color: #edecee;
border: solid 1px #c3c0c7;
text-align: center;
padding: 1em;
margin-bottom: 1em;
font-weight: bold;
}
.tier1 {
color: #c42870;
}
.tier2 {
color: #b01515;
}
.tier3 {
color: #d70e14;
}
.tier4 {
color: #c24d00;
}
.tier5 {
color: #9e650f;
}
.tier6 {
color: #2b8363;
}
.tier7 {
color: #167e87;
}
.tier8, .moderator {
color: #277eab;
}
.tier9, .staff {
color: #6133b4;
}
.npc {
color: $black;
}
}
.staff .title {
color: #6133b4;
}
.moderator .title {
color: #277eab;
}
.bailey .title {
color: $black;
}
.boss-section {
padding: 1.75em;
}
.world-boss {
color: $white;
border-style: solid;
border-width: 2px;
outline-style: solid;
outline-width: 2px;
margin: 2px;
position: relative;
}
.quest-boss {
margin: 1em auto;
}
.grey-progress-bar {
width: 100%;
height: 15px;
background-color: rgba(255, 255, 255, 0.24);
border-radius: 2px;
}
.boss-health-bar {
width: 80%;
height: 15px;
margin-bottom: .5em;
border-top-left-radius: 2px;
border-bottom-left-radius: 2px;
background-color: #f74e52;
}
.boss-health-bar.rage-bar {
background-color: #ff944c;
}
.boss-gradient {
background-image: linear-gradient(to bottom, #401f2a, #931f4d);
margin-top: -1.4em;
}
.boss-description {
border-top: 1px solid;
margin-left: -16px;
margin-right: -16px;
padding: .25em 0 0 .25em;
}
.float-bar {
position: relative;
top: -16px;
width: 162px;
height: 28px;
border-radius: 2px;
background-color: inherit;
margin: auto;
}
.corner-decoration {
position: absolute;
width: 6px;
height: 6px;
background-color: inherit;
border: inherit;
outline: inherit;
}
.reverse {
transform: rotate(180deg);
}
.diamond {
margin: auto;
display: inline-block;
width: 6px;
height: 6px;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
background-color: #dc4069;
border: solid 2px #931f4d;
}
.reduce {
font-size: 12px;
}
.rage-strike {
max-width: 50px;
height: auto;
}
.rage-strike-active {
max-width: 75px;
height: auto;
cursor: pointer;
}
.world-boss-info-button {
width: 100%;
background-color: $gray-500;
border-radius: 2px;
font-size: 14px;
color: $blue-10;
padding: 1em;
cursor: pointer;
}
</style>
<script>
import find from 'lodash/find';
import { TAVERN_ID } from '@/../../common/script/constants';
import * as quests from '@/../../common/script/content/quests';
import { mapState } from '@/libs/store';
import { goToModForm } from '@/libs/modform';
import worldBossInfoModal from '../world-boss/worldBossInfoModal';
import worldBossRageModal from '../world-boss/worldBossRageModal';
import sidebarSection from '../sidebarSection';
import chat from './chat';
import challengeIcon from '@/assets/svg/challenge.svg?raw';
import chevronIcon from '@/assets/svg/chevron-red.svg?raw';
import gemIcon from '@/assets/svg/gem.svg?raw';
import healthIcon from '@/assets/svg/health.svg?raw';
import informationIconRed from '@/assets/svg/information-red.svg?raw';
import questBackground from '@/assets/svg/quest-background-border.svg?raw';
import rageIcon from '@/assets/svg/rage.svg?raw';
import swordIcon from '@/assets/svg/sword.svg?raw';
import tier1 from '@/assets/svg/tier-1.svg?raw';
import tier2 from '@/assets/svg/tier-2.svg?raw';
import tier3 from '@/assets/svg/tier-3.svg?raw';
import tier4 from '@/assets/svg/tier-4.svg?raw';
import tier5 from '@/assets/svg/tier-5.svg?raw';
import tier6 from '@/assets/svg/tier-6.svg?raw';
import tier7 from '@/assets/svg/tier-7.svg?raw';
import tierMod from '@/assets/svg/tier-mod.svg?raw';
import tierNPC from '@/assets/svg/tier-npc.svg?raw';
import tierStaff from '@/assets/svg/tier-staff.svg?raw';
import staffList from '../../libs/staffList';
import reportBug from '@/mixins/reportBug.js';
export default {
components: {
worldBossInfoModal,
worldBossRageModal,
sidebarSection,
chat,
},
mixins: [reportBug],
data () {
return {
groupId: TAVERN_ID,
icons: Object.freeze({
challengeIcon,
chevronIcon,
gem: gemIcon,
healthIcon,
informationIcon: informationIconRed,
questBackground,
rageIcon,
swordIcon,
tier1,
tier2,
tier3,
tier4,
tier5,
tier6,
tier7,
tierMod,
tierNPC,
tierStaff,
}),
group: {
chat: [],
},
sections: {
worldBoss: true,
},
staff: staffList,
};
},
computed: {
...mapState({
user: 'user.data',
currentEventList: 'worldState.data.currentEventList',
}),
questData () {
if (!this.group.quest) return {};
return quests.quests[this.group.quest.key];
},
imageURLs () {
const currentEvent = find(this.currentEventList, event => Boolean(event.season));
if (!currentEvent) {
return {
background: 'url(/static/npc/normal/tavern_background.png)',
npc: 'url(/static/npc/normal/tavern_npc.png)',
};
}
return {
background: `url(/static/npc/${currentEvent.season}/tavern_background.png)`,
npc: `url(/static/npc/${currentEvent.season}/tavern_npc.png)`,
};
},
},
async mounted () {
this.$store.dispatch('common:setTitle', {
subSection: this.$t('tavern'),
section: this.$t('guilds'),
});
this.group = await this.$store.dispatch('guilds:getGroup', { groupId: TAVERN_ID });
},
methods: {
modForm () {
goToModForm(this.user);
},
toggleSleep () {
this.$store.dispatch('user:sleep');
},
pendingDamage () {
if (!this.user.party.quest.progress.up) return 0;
return this.$options.filters.floor(this.user.party.quest.progress.up, 10);
// keep user's pending damage consistent with how it's displayed on the party page
},
bossCurrentHealth () {
if (!this.group.quest.progress.hp) return 0;
return Math.ceil(parseFloat(this.group.quest.progress.hp)).toLocaleString();
},
bossCurrentRage () {
if (!this.group.quest.progress.hp) return 0;
return Math.floor(parseFloat(this.group.quest.progress.rage)).toLocaleString();
},
showWorldBossInfo () {
this.$root.$emit('bv::show::modal', 'world-boss-info');
},
showWorldBossRage (npc) {
if (this.group.quest.extra.worldDmg[npc]) {
this.$store.state.rageModalOptions.npc = npc;
this.$root.$emit('bv::show::modal', 'world-boss-rage');
}
},
async fetchRecentMessages () {
this.group = await this.$store.dispatch('guilds:getGroup', { groupId: TAVERN_ID });
},
},
};
</script>
@@ -3,7 +3,7 @@
<div class="row standard-page">
<small
class="muted"
v-html="$t('blurbHallContributors')"
v-html="$t('blurbHallContributors', hallLinks)"
></small>
</div>
<div class="row standard-page">
@@ -362,6 +362,12 @@ export default {
expandItems: false,
expandAuth: false,
expandTransactions: false,
hallLinks: {
linkRewards: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards" target="_blank" rel="noreferrer noopener">',
linkTiers: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers" target="_blank" rel="noreferrer noopener">',
linkContributing: '<a href="https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
async mounted () {
@@ -1,64 +0,0 @@
<template>
<base-banner
v-if="showChatWarning"
banner-id="chat-warning"
banner-class="chat-banner"
class="chat-banner"
height="3rem"
:class="{faq: faqPage}"
>
<div
slot="content"
class="w-100 text-center"
v-html="$t('chatSunsetWarning')"
>
</div>
</base-banner>
</template>
<style lang="scss">
@import '@/assets/scss/colors.scss';
.chat-banner {
width: 100%;
min-height: 48px;
padding: 8px;
color: $orange-1;
background-color: $orange-100;
line-height: 1.71;
a {
color: $orange-1;
text-decoration: underline;
&:hover {
color: $orange-1;
}
}
&.faq {
position: fixed;
top: 3.5rem;
}
}
</style>
<script>
import BaseBanner from './base';
export default {
components: {
BaseBanner,
},
computed: {
faqPage () {
return (this.$route.fullPath.indexOf('/faq')) !== -1;
},
showChatWarning () {
return false;
},
},
};
</script>
@@ -6,7 +6,7 @@
>
<p
class="mr-3 mb-0"
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy')"
v-html="$t('privacyOverview') + ' ' + $t('learnMorePrivacy', learnLinks)"
>
</p>
<div
@@ -89,6 +89,10 @@ export default {
data () {
return {
hidden: false,
learnLinks: {
linkOpen: '<a href="/static/privacy" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
mounted () {
@@ -6,11 +6,7 @@
>
<div slot="content">
<div
v-html="$t('invitedToPartyBy', {
userId: notification.data.inviter,
userName: invitingUser.auth ? invitingUser.auth.local.username : null,
party: notification.data.name,
})"
v-html="$t('invitedToPartyBy', invitationInfo)"
>
</div>
<div class="notifications-buttons">
@@ -60,6 +56,10 @@ export default {
},
computed: {
...mapState({ user: 'user.data' }),
invitationInfo: {
usernameLink: `<a href="/profile/${this.notification.data.inviter}" target="_blank" rel="noreferrer noopener">@${this.invitingUser.auth ? this.invitingUser.auth.local.username : null}</a>`,
partyName: `<span class="notification-bold">${this.notification.data.name}</span>`,
},
},
async mounted () {
this.invitingUser = await this.$store.dispatch('members:fetchMember', {
@@ -197,7 +197,7 @@ export default {
},
amazonPayments: {},
assistanceEmailObject: {
hrefTechAssistanceEmail: `<a href="mailto:${TECH_ASSISTANCE_EMAIL}">${TECH_ASSISTANCE_EMAIL}</a>`,
techAssistanceEmail: `<a href="mailto:${TECH_ASSISTANCE_EMAIL}">${TECH_ASSISTANCE_EMAIL}</a>`,
},
sendingInProgress: false,
userReceivingGems: null,
@@ -399,7 +399,7 @@
</div>
<div
v-if="!hasGroupPlan && !canCancelSubscription"
v-html="$t(`cancelSubInfo${user.purchased.plan.paymentMethod}`)"
v-html="$t(`cancelSubInfo${user.purchased.plan.paymentMethod}`, cancelLinks)"
>
</div>
</div>
@@ -1022,6 +1022,17 @@ export default {
return nextHourglassMonth;
},
cancelLinks () {
const links = {
linkClose: '</a>',
};
if (this.user.purchased.plan.paymentMethod === this.paymentMethods.GOOGLE) {
links.linkOpen = '<a href="https://play.google.com/store/account/subscriptions" target="_blank" rel="noopener noreferrer">';
} else if (this.user.purchased.plan.paymentMethod === this.paymentMethods.APPLE) {
links.linkOpen = '<a href="https://support.apple.com/en-us/HT202039" target="_blank" rel="noopener noreferrer">';
}
return links;
},
},
mounted () {
this.$store.dispatch('common:setTitle', {
@@ -18,7 +18,7 @@
</h2>
<p
class="text-center"
v-html="$t('usernameInfo')"
v-html="$t('usernameInfo', usernameLinks)"
></p>
<username-form />
<div class="scene_veteran_pets center-block"></div>
@@ -27,7 +27,7 @@
</div>
<div
class="small text-center tos-footer"
v-html="$t('usernameTOSRequirements')"
v-html="$t('usernameTOSRequirements', requirementsLinks)"
></div>
</b-modal>
</template>
@@ -94,6 +94,15 @@ export default {
icons: Object.freeze({
helloNametag,
}),
usernameLinks: {
linkOpen: '<a href="https://habitica.fandom.com/wiki/Player_Names" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
requirementsLinks: {
termsLink: '<a href="/static/terms" target="_blank" rel="noreferrer noopener">',
guidelinesLink: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
};
@@ -157,7 +157,7 @@
<div
class="contact mx-auto"
>
<p v-html="$t('contactAdmin')"></p>
<p v-html="$t('contactAdmin', { adminEmail })"></p>
</div>
</div>
</div>
@@ -368,6 +368,7 @@ export default {
pixel_border: 'url(/static/npc/normal/pixel_border.png)',
},
staff: staffList,
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
};
},
};
@@ -35,7 +35,7 @@
target="_blank"
rel="noopener noreferrer"
>
<span>{{ $t('petLikeToEat') }}</span>
<span>{{ $t('petLikeToEat', eatLinks) }}</span>
</a>
</div>
</drawer-header-tabs>
@@ -115,6 +115,10 @@ export default {
},
],
selectedDrawerTab: this.defaultSelectedTab,
eatLinks: {
linkOpen: '<a href="/static/faq#pet-foods" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -162,6 +162,10 @@ export default {
searchTextThrottled: null,
unfilteredCategories: [],
viewOptions: {},
customizeLinks: {
linkOpen: '<a href="">',
linkClose: '</a>',
},
};
},
computed: {
@@ -264,21 +268,21 @@ export default {
const { $t } = this;
switch (identifier) {
case 'animalEars':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', customizeLinks);
case 'animalTails':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', customizeLinks);
case 'backgrounds':
return `${$t('allCustomizationsOwned')} ${$t('checkNextMonth')}`;
return `${$t('allCustomizationsOwned', customizeLinks)} ${$t('checkNextMonth')}`;
case 'facialHair':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', customizeLinks);
case 'color':
return `${$t('allCustomizationsOwned')} ${$t('checkNextSeason')}`;
return `${$t('allCustomizationsOwned', customizeLinks)} ${$t('checkNextSeason')}`;
case 'base':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', customizeLinks);
case 'shirt':
return $t('allCustomizationsOwned');
return $t('allCustomizationsOwned', customizeLinks);
case 'skin':
return `${$t('allCustomizationsOwned')} ${$t('checkNextSeason')}`;
return `${$t('allCustomizationsOwned', customizeLinks)} ${$t('checkNextSeason')}`;
default:
return `Unknown identifier ${identifier}`;
}
@@ -136,7 +136,7 @@
:item-margin="24"
:type="category.identifier"
:fold-button="false"
:no-items-label="$t('allEquipmentOwned')"
:no-items-label="$t('allEquipmentOwned', equipmentLinks)"
:click-handler="false"
>
<template
@@ -229,29 +229,25 @@ export default {
data () {
return {
viewOptions: {},
searchText: null,
searchTextThrottled: null,
icons: Object.freeze({
hourglass: svgHourglass,
}),
sortItemsBy: ['AZ', 'sortByNumber'],
selectedSortItemsBy: 'AZ',
selectedItemToBuy: null,
hidePinned: false,
backgroundUpdate: new Date(),
currentEvent: null,
imageURLs: {
background: '',
npc: '',
},
equipmentLinks: {
linkOpen: '<a href="/inventory/equipment">',
linkClose: '</a>',
},
};
},
computed: {
@@ -107,7 +107,7 @@
<div class="body-text">
<p v-html="$t('sunsetFaqPara12')"></p>
<p v-html="$t('sunsetFaqPara13')"></p>
<p v-html="$t('sunsetFaqPara14')"></p>
<p v-html="$t('sunsetFaqPara14', translationLinks)"></p>
<p v-html="$t('sunsetFaqPara15')"></p>
<p v-html="$t('sunsetFaqPara16')"></p>
<p v-html="$t('sunsetFaqPara17')"></p>
@@ -138,9 +138,9 @@
</div>
<div class="body-text">
<ul>
<li v-html="$t('sunsetFaqList8')"></li>
<li v-html="$t('sunsetFaqList9')"></li>
<li v-html="$t('sunsetFaqList10')"></li>
<li v-html="$t('sunsetFaqList8', faqLinks)"></li>
<li v-html="$t('sunsetFaqList9', beginnerLinks)"></li>
<li v-html="$t('sunsetFaqList10', { adminEmail })"></li>
</ul>
</div>
@@ -169,6 +169,23 @@ export default {
components: {
FaqSidebar,
},
data () {
return {
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
translationLinks: {
linkOpen: '<a href="https://translate.habitica.com/projects/habitica/#information">',
linkClose: '</a>',
},
faqLinks: {
linkOpen: '<a href="https://habitica.com/static/faq">',
linkClose: '</a>',
},
beginnerLinks: {
linkOpen: '<a href="https://habitica.wordpress.com/beginning-adventurers-guide/">',
linkClose: '</a>',
},
};
},
mounted () {
this.$store.dispatch('common:setTitle', {
section: this.$t('sunsetFaqTitle'),
@@ -24,11 +24,11 @@
<ul>
<li><strong>{{ $t('commGuideList01A') }}</strong></li>
<li v-html="$t('commGuideList02C')"></li>
<li v-html="$t('commGuideList02N')"></li>
<li v-html="$t('commGuideList02N', { adminEmail })"></li>
<li v-html="$t('commGuideList02H')"></li>
<li v-html="$t('commGuideList02A')"></li>
<li v-html="$t('commGuideList02I')"></li>
<li v-html="$t('commGuideList02G')"></li>
<li v-html="$t('commGuideList02G', { adminEmail })"></li>
<li v-html="$t('commGuideList02D')"></li>
<li v-html="$t('commGuideList02E')"></li>
<li v-html="$t('commGuideList02O')"></li>
@@ -36,7 +36,7 @@
<li v-html="$t('commGuideList02P')"></li>
<li v-html="$t('commGuideList02Q')"></li>
<li v-html="$t('commGuideList02M')"></li>
<li v-html="$t('commGuideList02L')"></li>
<li v-html="$t('commGuideList02L', { adminEmail })"></li>
<li v-html="$t('commGuideList02J')"></li>
<li v-html="$t('commGuideList02K')"></li>
</ul>
@@ -69,7 +69,7 @@
<p v-html="$t('commGuidePara054')"></p>
<p v-html="$t('commGuidePara055')"></p>
<ul>
<li v-html="$t('commGuideList06A')"></li>
<li v-html="$t('commGuideList06A', { adminEmail })"></li>
<li v-html="$t('commGuideList06C')"></li>
<li v-html="$t('commGuideList06E')"></li>
</ul>
@@ -108,7 +108,7 @@
class="mb-3"
>
<p v-html="$t('commGuidePara061')"></p>
<p v-html="$t('commGuidePara063')"></p>
<p v-html="$t('commGuidePara063', { adminEmail })"></p>
<h2 id="meet-the-mods">
{{ $t('commGuideHeadingMeet') }}
</h2>
@@ -162,15 +162,15 @@
<h2 id="final">
{{ $t('commGuideHeadingFinal') }}
</h2>
<p v-html="$t('commGuidePara067')"></p>
<p v-html="$t('commGuidePara067', { adminEmail })"></p>
<p v-html="$t('commGuidePara068')"></p>
<h2 id="links">
{{ $t('commGuideHeadingLinks') }}
</h2>
<ul>
<li><a href="/static/faq">{{ $t('faq') }}</a></li>
<li v-html="$t('commGuideLink03')"></li>
<li v-html="$t('commGuideLink04')"></li>
<li v-html="$t('commGuideLink03', gitHubLinks)"></li>
<li v-html="$t('commGuideLink04', feedbackLinks)"></li>
</ul>
<p v-html="$t('commGuidePara069')"></p>
<ul>
@@ -187,3 +187,23 @@
</ul>
</div>
</template>
<script>
export default {
data () {
return {
adminEmail: '<a href="mailto:admin@habitica.com" target="_blank" rel="noreferrer noopener">admin@habitica.com</a>',
gitHubLinks: {
linkOpen: '<a href="https://github.com/HabitRPG/habitica" target="_blank">',
linkClose: '</a>',
},
feedbackLinks: {
linkOpen: '<a href="https://habitica.fandom.com/wiki/Habitica_Wiki" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
}
</script>
@@ -135,7 +135,7 @@
</h2>
<p
class="purple-600"
v-html="$t('checkGroupPlanFAQ')"
v-html="$t('checkGroupPlanFAQ', faqLinks)"
></p>
</div>
</div>
@@ -329,6 +329,10 @@ export default {
modalOption: '',
modalPage: 'account',
modalTitle: this.$t('register'),
faqLinks: {
linkOpen: '<a href="/static/faq#what-is-group-plan">',
linkClose: '</a>',
},
};
},
computed: {
@@ -13,7 +13,7 @@
<hr>
</div>
<p>
<span v-html="$t('overviewQuestionsRevised')"></span>
<span v-html="$t('overviewQuestionsRevised', overviewLinks)"></span>
<a
target="_blank"
rel="noopener noreferrer"
@@ -58,6 +58,10 @@ export default {
shopUrl: '/shops/market',
},
},
overviewLinks: {
linkOpen: '<a href="/static/faq">',
linkClose: '</a>',
},
};
},
};
@@ -244,13 +244,11 @@
<script>
import AppFooter from '@/components/appFooter';
import ChatBanner from '@/components/header/banners/chatBanner';
import StaticHeader from './header.vue';
export default {
components: {
AppFooter,
ChatBanner,
StaticHeader,
},
computed: {
@@ -377,7 +377,7 @@
<div class="">
<div
class="alert alert-info alert-sm"
v-html="$t('communityGuidelinesWarning', managerEmail)"
v-html="$t('communityGuidelinesWarning', communityGuidelineLinks)"
></div>
<!-- TODO use photo-upload instead: https://groups.google.com/forum/?fromgroups=#!topic/derbyjs/xMmADvxBOak-->
<div class="form-group">
@@ -1060,8 +1060,10 @@ export default {
blurb: '',
},
hero: {},
managerEmail: {
hrefBlankCommunityManagerEmail: `<a href="mailto:${COMMUNITY_MANAGER_EMAIL}">${COMMUNITY_MANAGER_EMAIL}</a>`,
communityGuidelineLinks: {
linkOpen: '<a href="https://habitica.com/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
adminEmail: `<a href="mailto:${COMMUNITY_MANAGER_EMAIL}" target="_blank" rel="noopener noreferrer">${COMMUNITY_MANAGER_EMAIL}</a>`,
},
selectedPage: 'profile',
achievements: {},
@@ -89,7 +89,7 @@
v-if="userLevel100Plus"
v-once
class="level-100-message"
v-html="$t('noMoreAllocate')"
v-html="$t('noMoreAllocate', allocateLinks)"
></div>
</div>
<div class="row allocation-boxes-row">
@@ -395,14 +395,12 @@ export default {
_skip: 'skip',
shield: this.$t('offHandCapitalized'),
},
allocateStatsList: {
str: { title: 'allocateStr', popover: 'strengthText', allocatepop: 'allocateStrPop' },
int: { title: 'allocateInt', popover: 'intText', allocatepop: 'allocateIntPop' },
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
},
stats: {
str: {
title: 'strength',
@@ -422,6 +420,10 @@ export default {
},
},
content: Content,
allocateLinks: {
linkOpen: '<a href="/shops/market">',
linkClose: '</a>',
},
};
},
computed: {
@@ -248,7 +248,7 @@
v-if="userLevel100Plus"
v-once
>
{{ $t('noMoreAllocate') }}
{{ $t('noMoreAllocate', allocateLinks) }}
</p>
<p
v-if="user.stats.points || userLevel100Plus"
@@ -480,6 +480,10 @@ export default {
con: { title: 'allocateCon', popover: 'conText', allocatepop: 'allocateConPop' },
per: { title: 'allocatePer', popover: 'perText', allocatepop: 'allocatePerPop' },
},
allocateLinks: {
linkOpen: '<a href="/shops/market">',
linkClose: '</a>',
},
};
},
computed: {
+5 -1
View File
@@ -10,6 +10,10 @@ export default {
tour: {},
chapters: {},
loaded: false,
partyLinks: {
linkOpen: '<a href="/static/faq#parties">',
linkClose: '</a>',
}
};
},
watch: {
@@ -56,7 +60,7 @@ export default {
party: [[
{
orphan: true,
intro: this.$t('tourPartyPage'),
intro: this.$t('tourPartyPage', partyLinks),
final: true,
proceed: this.$t('tourSplendid'),
hideNavigation: true,
@@ -177,7 +177,7 @@
<div
v-once
class="guidelines flex-fill"
v-html="$t('communityGuidelinesIntro')"
v-html="$t('communityGuidelinesIntro', guidelineLinks)"
></div>
<button
class="btn btn-primary"
@@ -774,6 +774,10 @@ export default defineComponent({
messages: [],
messagesLoading: false,
MAX_MESSAGE_LENGTH: MAX_MESSAGE_LENGTH.toString(),
guidelineLinks: {
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -23,7 +23,7 @@
<div
class="kind-text"
v-html="$t('rememberToBeKind')"
v-html="$t('rememberToBeKind', kindLinks)"
></div>
</div>
</template>
@@ -62,6 +62,14 @@ import Avatar from '@/components/avatar.vue';
export default {
components: { Avatar },
data () {
return {
kindLinks: {
linkOpen: '<a href="/static/community-guidelines" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
props: {
memberObj: null,
},
@@ -34,7 +34,7 @@
class="dialog-disclaimer"
>
<span>{{ $t("americanEnglishGovern") }} </span>
<span v-html="$t('helpWithTranslation')"></span>
<span v-html="$t('helpWithTranslation', translateLinks)"></span>
</div>
<div class="input-area">
<div class="settings-label">
@@ -97,6 +97,10 @@ export default {
data () {
return {
selectedLanguage: '',
translateLinks: {
linkOpen: '<a href="https://translate.habitica.com" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -166,6 +166,10 @@ export default {
icons: Object.freeze({
alert,
}),
gpcLinks: {
linkOpen: '<a href="https://globalprivacycontrol.org/" target="_blank" rel="noreferrer noopener">',
linkClose: '</a>',
},
};
},
computed: {
@@ -178,9 +182,9 @@ export default {
gpcInfo () {
const gpcUrl = 'https://globalprivacycontrol.org/';
if (this.user.preferences.analyticsConsent) {
return this.$t('gpcPlusAnalytics', { url: gpcUrl });
return this.$t('gpcPlusAnalytics', gpcLinks);
}
return this.$t('gpcWarning', { url: gpcUrl });
return this.$t('gpcWarning', gpcLinks);
},
},
methods: {
@@ -8,7 +8,7 @@
<div
v-once
class="webhooks-info mb-3"
v-html="$t('webhooksInfo')"
v-html="$t('webhooksInfo', hookLinks)"
>
</div>
@@ -233,6 +233,10 @@ export default {
}),
webhooks: [], // view copy of state
unsaved: [],
hookLinks: {
linkOpen: '<a target="_blank" rel="noreferrer noopener" href="https://apidoc.habitica.com/#api-Webhook-AddWebhook">',
linkClose: '</a>',
},
};
},
mounted () {
+4 -4
View File
@@ -1,5 +1,5 @@
{
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <a href='https://habitica.com/static/community-guidelines' target='_blank' rel='noreferrer noopener'>Community Guidelines</a> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= hrefBlankCommunityManagerEmail %>!",
"communityGuidelinesWarning": "Please keep in mind that your Display Name, profile photo, and blurb must comply with the <%= linkOpen %>Community Guidelines<%= linkClose %> (e.g. no profanity, no adult topics, no insults, etc). If you have any questions about whether or not something is appropriate, feel free to email <%= adminEmail %>!",
"profile": "Profile",
"avatar": "Customize Avatar",
"editAvatar": "Customize Avatar",
@@ -65,7 +65,7 @@
"costumeDisabled": "You have disabled your costume.",
"gearAchievement": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class! You have attained the following complete sets:",
"gearAchievementNotification": "You have earned the \"Ultimate Gear\" Achievement for upgrading to the maximum gear set for a class!",
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <a href='/user/settings/site' target='_blank' rel='noreferrer noopener'>the Settings &gt; Site page</a> and buy your new class's gear!",
"moreGearAchievements": "To attain more Ultimate Gear badges, change classes on <%= linkOpen %>the Settings &gt; Site page<%= linkClose %> and buy your new class's gear!",
"armoireUnlocked": "For more equipment, check out the <strong>Enchanted Armoire!</strong> Click on the Enchanted Armoire Reward for a random chance at special Equipment! It may also give you random XP or food items.",
"ultimGearName": "Ultimate Gear - <%= ultClass %>",
"ultimGearText": "Has upgraded to the maximum weapon and armor set for the <%= ultClass %> class.",
@@ -87,7 +87,7 @@
"allocatePerPop": "Add a Point to Perception",
"allocateInt": "Points allocated to Intelligence:",
"allocateIntPop": "Add a Point to Intelligence",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <a href='/shops/market'>Orb of Rebirth</a>.",
"noMoreAllocate": "Now that you've hit level 100, you won't gain any more Stat Points. You can continue leveling up, or start a new adventure at level 1 by using the <%= linkOpen %>Orb of Rebirth<%= linkClose %>.",
"stats": "Stats",
"strength": "Strength",
"strText": "Strength increases the chance of random \"critical hits\" and the Gold, Experience, and drop chance boost from them. It also helps deal damage to boss monsters.",
@@ -139,7 +139,7 @@
"optOutOfClasses": "Opt Out",
"chooseClass": "Choose your Class",
"chooseClassLearnMarkdown": "[Learn more about Habitica's class system](/static/faq#what-classes)",
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <a href='/static/faq#what-classes' target='_blank' rel='noreferrer noopener'>our FAQ</a> and visit Settings to enable the Class System when you're ready.",
"optOutOfClassesText": "Not ready to choose? There's no rush! If you opt out, you can read about each Class in <%= linkOpen %>our FAQ<%= linkClose %> and visit Settings to enable the Class System when you're ready.",
"selectClass": "Select <%= heroClass %>",
"select": "Select",
"stealth": "Stealth",
@@ -12,11 +12,11 @@
"commGuideList01A": "Our Guidelines and Terms of Service apply in Challenges, Parties, player profiles, and private messages.",
"commGuideList02C": "<strong>Do not post images or text that are violent, threatening, or sexually explicit/suggestive, or that promote discrimination, bigotry, racism, sexism, hatred, harassment or harm against any individual or group</strong>. Not even as a joke or meme. This includes slurs as well as statements. Not everyone has the same sense of humor, and so something that you consider a joke may be hurtful to another.",
"commGuideList02N": "<strong>Report anything you see that breaks these Guidelines or our Terms of Service</strong>. You can report a message directly or notify staff via <a href='mailto:admin@habitica.com' target='_blank' rel='noreferrer noopener'>admin@habitica.com</a> for violations in profiles or Challenges. We will handle them as quickly as possible. You may contact us in your native language if that is easier for you: we may have to use Google Translate, but we want you to feel comfortable about contacting us if you have a problem.",
"commGuideList02N": "<strong>Report anything you see that breaks these Guidelines or our Terms of Service</strong>. You can report a message directly or notify staff via <%= adminEmail %> for violations in profiles or Challenges. We will handle them as quickly as possible. You may contact us in your native language if that is easier for you: we may have to use Google Translate, but we want you to feel comfortable about contacting us if you have a problem.",
"commGuideList02H": "<strong>All Display Names and @usernames must comply with the Terms of Service</strong>. To change your Display Name and/or @username: on mobile go to Menu > Settings > Account. On web, go to Settings from the user icon in the top navigation.",
"commGuideList02A": "<strong>Respect each other</strong>. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences.",
"commGuideList02I": "<strong>Challenge names should be appropriate for all spaces, as they will appear in the winner's public profile</strong>. Keep this in mind when creating Challenges as we may be forced to edit the record on their profile if there is a report.",
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <a href='mailto:admin@habitica.com' target='_blank' rel='noreferrer noopener'>admin@habitica.com</a> to contact our community manager.",
"commGuideList02G": "<strong>Comply immediately with any Staff request.</strong> This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, etc. Do not argue with Staff. If you have concerns or comments about Staff actions, email <%= adminEmail %> to contact our community manager.",
"commGuideList02D": "<strong>Be mindful that Habiticans are of all ages and backgrounds</strong>. Challenges and player profiles should not mention adult topics, use profanity, or promote contention or conflict.",
"commGuideList02E": "<strong>If a staff member tells you that a term is disallowed on Habitica, even if it is a term that you did not realize was problematic, that decision is final.</strong> Additionally, slurs will be dealt with very severely, as they are also a violation of the Terms of Service.",
"commGuideList02O": "<strong>Parties may create their own chat rules for members comfort and preferences</strong>. However, the admins cannot enforce chat rules in these private spaces unless there is a breach of the Terms of Service, including harassment. If someone in your Party is causing issues, we encourage the Party leader to remove them.",
@@ -24,7 +24,7 @@
"commGuideList02P": "<strong>We discourage the sending of unsolicited private messages</strong>. If you receive an unwanted message that makes you uncomfortable or that breaks these Guidelines or the Terms of Service, please block the sender and report it to bring it to Staff attention.",
"commGuideList02Q": "<strong>Do not try to get around a block</strong>. If someone has blocked you from sending them private messages, do not contact them elsewhere to ask them to unblock you.",
"commGuideList02M": "<strong>Do not ask or beg for Gems, subscriptions, or membership in Group Plans</strong>. If you see or receive unwanted messages asking for paid items, please report them. Repeated Gem or subscription begging, especially after a warning, may result in an account ban.",
"commGuideList02L": "<strong>We highly discourage the exchange of personal information--particularly information that can be used to identify you</strong>. Identifying information can include but is not limited to: your address, your email, and your password or API token. If you are asked for personal information in a Party chat or private message, we highly recommend that you do not respond, and alert the Staff by either reporting the message or contacting <a href='mailto:admin@habitica.com' target='_blank' rel='noreferrer noopener'>admin@habitica.com</a> with screenshots of the messages if more context is needed.",
"commGuideList02L": "<strong>We highly discourage the exchange of personal information--particularly information that can be used to identify you</strong>. Identifying information can include but is not limited to: your address, your email, and your password or API token. If you are asked for personal information in a Party chat or private message, we highly recommend that you do not respond, and alert the Staff by either reporting the message or contacting <%= adminEmail %> with screenshots of the messages if more context is needed.",
"commGuideList02J": "<strong>Do not spam</strong>. Spamming may include, but is not limited to: sending multiple unsolicited private messages, sending nonsensical messages, sending multiple promotional messages about a Party or Challenge, or creating multiple similar or low quality Challenges in a row. Staff has discretion to determine what messages are considered spamming.",
"commGuideList02K": "<strong>Do not send links without explanation or context</strong>. If players clicking on a link will result in any benefit to you, you need to disclose that. This applies in messages as well as Challenges.",
@@ -48,7 +48,7 @@
"commGuideHeadingModerateInfractions": "Moderate Infractions",
"commGuidePara054": "These infractions will have moderate consequences. When in conjunction with multiple infractions, the consequences may grow more severe.",
"commGuidePara055": "The following are some examples of Moderate Infractions. This is not a comprehensive list.",
"commGuideList06A": "Ignoring, disrespecting or arguing with Staff. If you are concerned about one of the rules or the behavior of the staff, please contact us at <a href='mailto:admin@habitica.com' target='_blank' rel='noreferrer noopener'>admin@habitica.com</a>.",
"commGuideList06A": "Ignoring, disrespecting or arguing with Staff. If you are concerned about one of the rules or the behavior of the staff, please contact us at <%= adminEmail %>.",
"commGuideList06C": "Intentionally flagging innocent Challenges, profiles, or messages.",
"commGuideList06E": "Repeatedly Committing Minor Infractions",
@@ -79,8 +79,7 @@
"commGuideHeadingRestoration": "Restoration",
"commGuidePara061": "Habitica is devoted to self-improvement, and we believe in second chances. <strong>If you commit an infraction and receive a consequence, view it as a chance to evaluate your actions and strive to be a better member of the community</strong>.",
"commGuidePara062": "<strong>If you wish to ask questions about your infraction or consequences, apologize, or make a plea for reinstatement, please contact us at <a href='mailto:admin@habitica.com' target='_blank' rel='noreferrer noopener'>admin@habitica.com</a> with your User ID or @username</strong>. It is <strong>your</strong> responsibility to reach out.",
"commGuidePara063": "If you do not understand your consequences or the nature of your infraction, or if you have other questions related to the matter, you can contact the staff to discuss it at <a href='mailto:admin@habitica.com' target='_blank' rel='noreferrer noopener'>admin@habitica.com</a>. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.",
"commGuidePara063": "If you do not understand your consequences or the nature of your infraction, or if you have other questions related to the matter, you can contact the staff to discuss it at <%= adminEmail %>. Cooperate with any restrictions which have been imposed, and endeavor to meet the requirements to have any penalties lifted.",
"commGuideHeadingMeet": "Meet the Staff",
"commGuidePara007": "The Habitica Staff keep the app and sites running and can act as chat moderators. They have purple tags marked with crowns. Their title is \"Heroic\".",
@@ -94,13 +93,12 @@
"commGuidePara014": "Staff and Moderators Emeritus:",
"commGuideHeadingFinal": "The Final Section",
"commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some EXP for reading it all. If you have any questions or concerns about these Community Guidelines, please reach out to us via <a href='mailto:admin@habitica.com' target='_blank' rel='noreferrer noopener'>admin@habitica.com</a> and we will be happy to help clarify things.",
"commGuidePara067": "So there you have it, brave Habitican -- the Community Guidelines! Wipe that sweat off of your brow and give yourself some EXP for reading it all. If you have any questions or concerns about these Community Guidelines, please reach out to us via <%= adminEmail %> and we will be happy to help clarify things.",
"commGuidePara068": "Now go forth, brave adventurer, and slay some Dailies!",
"commGuideHeadingLinks": "Useful Links",
"commGuideLink02": "<a href='https://habitica.fandom.com/wiki/Habitica_Wiki' target='_blank' rel='noreferrer noopener'>The Wiki</a>: the biggest collection of information about Habitica. Note that this space is unofficial, being hosted by Fandom and maintained by players.",
"commGuideLink03": "<a href='https://github.com/HabitRPG/habitica' target='_blank'>GitHub</a>: for helping with code!",
"commGuideLink04": "<a href='https://docs.google.com/forms/d/e/1FAIpQLScPhrwq_7P1C6PTrI3lbvTsvqGyTNnGzp1ugi1Ml0PFee_p5g/viewform?usp=sf_link' target='_blank' rel='noreferrer noopener'>The Feedback Form</a>: for site and app feature requests.",
"commGuideLink03": "<%= linkOpen %>GitHub<%= linkClose %>: for helping with code!",
"commGuideLink04": "<%= linkOpen %>The Feedback Form<%= linkClose %>: for site and app feature requests.",
"commGuidePara069": "The following talented artists contributed to these illustrations:"
}
+1 -1
View File
@@ -45,5 +45,5 @@
"surveysSingle": "Helped Habitica grow, either by filling out a survey or helping with a major testing effort. Thank you!",
"surveysMultiple": "Helped Habitica grow on <%= count %> occasions, either by filling out a survey or helping with a major testing effort. Thank you!",
"blurbHallPatrons": "This is the Hall of Patrons, where we honor the noble adventurers who backed Habitica's original Kickstarter. We thank them for helping us bring Habitica to life!",
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tier-rewards' target='_blank' rel='noreferrer noopener'>Gems, exclusive Equipment</a>, and <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica#contributor-tiers' target='_blank' rel='noreferrer noopener'>prestigious titles</a>. You can contribute to Habitica, too! <a href='https://github.com/HabitRPG/habitica/wiki/Contributing-to-Habitica' target='_blank' rel='noreferrer noopener'>Find out more here.</a>"
"blurbHallContributors": "This is the Hall of Contributors, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned <%= linkRewards %>Gems, exclusive Equipment<%= linkClose %>, and <%= linkTiers %>prestigious titles<%= linkClose %>. You can contribute to Habitica, too! <%= linkContributing %>Find out more here<%= linkClose %>."
}
@@ -5,8 +5,8 @@
"800ed0": "Purple",
"915533": "Skin Tone 1",
"98461a": "Skin Tone 6",
"allCustomizationsOwned": "You own all of these items. You can try them on by <a href=''>customizing your avatar</a>.",
"allEquipmentOwned": "You own all of these items. You can find them in your <a href='/inventory/equipment'>Equipment</a>. Be sure to check back later for next month's options!",
"allCustomizationsOwned": "You own all of these items. You can try them on by <%= linkOpen %>customizing your avatar<%= linkClose %>.",
"allEquipmentOwned": "You own all of these items. You can find them in your <%= linkOpen %>Equipment<%= linkClose %>. Be sure to check back later for next month's options!",
"aurora": "Aurora",
"bear": "Bear",
"black": "Black",
@@ -154,7 +154,7 @@
"tropicalwater": "Tropical Water",
"TRUred": "Crimson",
"updo": "Updo",
"visitCustomizationsShop": "Head over to the <a href='/shops/customizations'>Customizations Shop</a> to browse the many ways you can customize your avatar!",
"visitCustomizationsShop": "Head over to the <%= linkOpen %>Customizations Shop<%= linkClose %> to browse the many ways you can customize your avatar!",
"wavyLong": "Wavy Long",
"wavyShort": "Wavy Short",
"white": "White",
+1 -1
View File
@@ -3,7 +3,7 @@
"dontDespair": "Don't despair!",
"deathPenaltyDetails": "You lost a Level, your Gold, and a piece of Equipment, but you can get them all back with hard work! Good luck--you'll do great.",
"refillHealthTryAgain": "Refill Health & Try Again",
"dyingOftenTips": "Is this happening often? <a href='/static/faq#prevent-damage' target='_blank' rel='noreferrer noopener'>Here are some tips!</a>",
"dyingOftenTips": "Is this happening often? <%= linkOpen %>Here are some tips!<%= linkClose %>",
"losingHealthWarning": "Careful - You're Losing Health!",
"losingHealthWarning2": "Don't let your Health drop to zero! If you do, you'll lose a level, your Gold, and a piece of equipment.",
"toRegainHealth": "To regain Health:",
+5 -5
View File
@@ -185,7 +185,7 @@
"sunsetFaqHeader8": "How does this affect Habitica contributors?",
"sunsetFaqPara12": "As an open-source project, we welcome and encourage many types of contributions. To show our appreciation we will be sending the Heroic gear set to everyone that has a contributor tier as of <strong>August 1, 2023</strong>. When Tavern and Guild services end, there will be some changes to contributions as well. You can read more about the plan for each type below.",
"sunsetFaqPara13": "<strong>Blacksmiths</strong><br />We still welcome open-source help through our GitHub and will continue awarding tiers for qualifying contributions. Blacksmith collaboration and discussion has largely taken place over GitHub and that will continue.",
"sunsetFaqPara14": "<strong>Linguists</strong><br />We continue to welcome help with translating the apps and website and will still be awarding contributor tiers for qualifying contributions. However, the method with which we accept translations will be changing. Wed like to focus our resources on supporting a set selection of languages across all platforms. To do this, we will be reducing the amount of languages available for translation. Previously unfinished languages will be archived in Github. We hope this change will make the cross platform Habitica experience more consistent. You can read our most up to date translation procedure guidelines on our <a href='https://translate.habitica.com/projects/habitica/#information'>translation website</a>.",
"sunsetFaqPara14": "<strong>Linguists</strong><br />We continue to welcome help with translating the apps and website and will still be awarding contributor tiers for qualifying contributions. However, the method with which we accept translations will be changing. Wed like to focus our resources on supporting a set selection of languages across all platforms. To do this, we will be reducing the amount of languages available for translation. Previously unfinished languages will be archived in Github. We hope this change will make the cross platform Habitica experience more consistent. You can read our most up to date translation procedure guidelines on our <%= linkOpen %>translation website<%= linkClose %>.",
"sunsetFaqPara15": "<strong>Challengers</strong><br />The team encourages you to continue creating high quality Challenges. We would like to explore new ways of promoting Challenge discoverability in and outside of the app.",
"sunsetFaqPara16": "<strong>Socialites</strong><br />This type of contribution will be ending with the Tavern and Guild discontinuation. We are extremely grateful for the work that our friendly and helpful players have done answering questions in our chat spaces.",
"sunsetFaqPara17": "<strong>Comrades</strong><br />Scripts and add-ons are helpful to a shrinking section of our user base as the mobile apps increasingly become the only way that most users access Habitica. Contributors wishing to create 3rd party tools to customize their Habitica experience can continue doing so, but we will no longer be awarding Comrade tiers as we focus on contributions that enhance Habitica in a way that is accessible to our player base as a whole.",
@@ -199,9 +199,9 @@
"sunsetFaqList7": "Currently many Challenges have tasks that require posts in Habiticas public chat spaces. Creators of those Challenges can adapt their tasks or move the chat requirement to posting on an outside service.",
"sunsetFaqHeader10": "Where will players go when they have questions about how to use Habitica?",
"sunsetFaqList8": "Our existing <a href='https://habitica.com/static/faq'>FAQ</a> is a great resource and can be found from the Help menu, or Support on mobile. We are in the process of creating a more comprehensive and improved FAQ to help guide players moving forward.",
"sunsetFaqList9": "This <a href='https://habitica.wordpress.com/beginning-adventurers-guide/'>blog post</a> also provides a handy guide for new players.",
"sunsetFaqList10": "Players are also encouraged to email <a href='mailto:admin@habitica.com'>admin@habitica.com</a> with any questions for which they cannot find answers in the above links.",
"sunsetFaqList8": "Our existing <%= linkOpen %>FAQ<%= linkClose %> is a great resource and can be found from the Help menu, or Support on mobile. We are in the process of creating a more comprehensive and improved FAQ to help guide players moving forward.",
"sunsetFaqList9": "This <%= linkOpen %>blog post<%= linkClose %> also provides a handy guide for new players.",
"sunsetFaqList10": "Players are also encouraged to email <%= adminEmail %> with any questions for which they cannot find answers in the above links.",
"sunsetFaqHeader11": "How does this affect Habiticas Community Guidelines and Terms of Service?",
"sunsetFaqPara20": "Habiticas Community Guidelines will be updated at the time Tavern and Guild service is discontinued. They will reflect that community rules for conduct are now in relation to player profiles, Challenges, and messages in private spaces. Our Terms of Service have always applied to both public and private spaces and do not require an immediate update in regard to this change.",
@@ -210,7 +210,7 @@
"sunsetFaqPara21": "Gems in the Guild Bank will be refunded to the leader of the Guild on August 8th when Guild Services end.",
"anotherQuestion": "Have another question?",
"contactAdmin": "Contact <a href='mailto:admin@habitica.com'>admin@habitica.com</a>",
"contactAdmin": "Contact <%= adminEmail %>",
"contentReleaseChanges": "Content Release Changes",
"contentFaqTitle": "Habitica Content Release Change FAQ",
+3 -3
View File
@@ -123,8 +123,8 @@
"emailTaken": "Email address is already used in an account.",
"newEmailRequired": "Missing new email address.",
"usernameTime": "It's time to set your username!",
"usernameInfo": "Login names are now unique usernames that will be visible beside your display name and used for invitations, chat @mentions, and messaging.<br><br>If you'd like to learn more about this change, <a href='https://habitica.fandom.com/wiki/Player_Names' target='_blank' rel='noreferrer noopener'>visit our wiki</a>.",
"usernameTOSRequirements": "Usernames must conform to our <a href='/static/terms' target='_blank' rel='noreferrer noopener'>Terms of Service</a> and <a href='/static/community-guidelines' target='_blank' rel='noreferrer noopener'>Community Guidelines</a>. If you didnt previously set a login name, your username was auto-generated.",
"usernameInfo": "Login names are now unique usernames that will be visible beside your display name and used for invitations, chat @mentions, and messaging.<br><br>If you'd like to learn more about this change, <%= linkOpen %>visit our wiki<%= linkClose %>.",
"usernameTOSRequirements": "Usernames must conform to our <%= termsLink %>Terms of Service<%= linkClose %> and <%= guidelinesLink %>Community Guidelines<%= linkClose %>. If you didnt previously set a login name, your username was auto-generated.",
"usernameTaken": "Username already taken.",
"passwordConfirmationMatch": "Password confirmation doesn't match password.",
"minPasswordLength": "Password must be 8 characters or more.",
@@ -187,7 +187,7 @@
"learnMore": "Learn More",
"translateHabitica": "Translate Habitica",
"whatToCallYou": "What should we call you?",
"acceptPrivacyTOS": "You confirm that you are at least 18 years old, and that you have read and agree to our <a href='/static/terms' target='_blank' rel='noreferrer noopener'>Terms of Service</a> and <a href='/static/privacy' target='_blank' rel='noreferrer noopener'>Privacy Policy</a>",
"acceptPrivacyTOS": "You confirm that you are at least 18 years old, and that you have read and agree to our <%= termsLink %>Terms of Service<%= linkClose %> and <%= privacyLink %>Privacy Policy<%= linkClose %>",
"emailAddress": "Email address",
"emailRequiredForSupport": "We require an email address for user support. Please enter an email address to continue creating your account."
}
+1 -1
View File
@@ -242,7 +242,7 @@
"whyReportingPlayerPlaceholder": "Reason for report",
"playerReportModalBody": "You should only report a player who violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Submitting a false report is a violation of Habiticas Community Guidelines.",
"targetUserNotExist": "Target User: '<%= userName %>' does not exist.",
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <a href='/static/community-guidelines' target='_blank' rel='noreferrer noopener'>Community Guidelines</a>.",
"rememberToBeKind": "Please remember to be kind, respectful, and follow the <%= linkOpen %>Community Guidelines<%= linkClose %>.",
"confirmPurchase": "Confirm Purchase",
"avoidSPI": "Avoid SPI",
"avoidSPIDetails": "For your privacy, avoid including <%= firstLink %>sensitive personal information<%= linkClose %> (SPI) when using Habitica. Your account data, including tasks, is stored on our servers so you can access it from any device.<br><br>To learn more, review our <%= secondLink %>Privacy Policy<%= linkClose %>."
+5 -8
View File
@@ -12,7 +12,6 @@
"contributing": "Contributing",
"faq": "FAQ",
"tutorial": "Tutorial",
"glossary": "<a target='_blank' rel='noreferrer noopener' href='https://habitica.fandom.com/wiki/Glossary'>Glossary</a>",
"wiki": "Wiki",
"resources": "Resources",
"communityGuidelines": "Community Guidelines",
@@ -28,7 +27,7 @@
"invite": "Invite",
"leave": "Leave",
"invitedToParty": "You were invited to join the Party <span class=\"notification-bold\"><%= party %></span>",
"invitedToPartyBy": "<a href=\"/profile/<%= userId %>\" target=\"_blank\" rel=\"noreferrer noopener\">@<%= userName %></a> has invited you to join the Party <span class=\"notification-bold\"><%= party %></span>",
"invitedToPartyBy": "<%= usernameLink %> has invited you to join the Party <%= partyName %>",
"invitedToPrivateGuild": "You were invited to join the private Group <span class=\"notification-bold\"><%= guild %></span>",
"invitedToPublicGuild": "You were invited to join the Group <span class=\"notification-bold-blue\"><%= guild %></span>",
"invitationAcceptedHeader": "Your Invitation has been Accepted",
@@ -138,7 +137,7 @@
"sendGiftLabel": "Would you like to send a gift message?",
"sendGiftMessagePlaceholder": "Add a gift message",
"sendGiftSubscription": "<%= months %> Month(s): $<%= price %> USD",
"gemGiftsAreOptional": "Please note that Habitica will never require you to gift gems to other players. Begging people for gems is a <strong>violation of the Community Guidelines</strong>, and all such instances should be reported to <%= hrefTechAssistanceEmail %>.",
"gemGiftsAreOptional": "Please note that Habitica will never require you to gift gems to other players. Begging people for gems is a <strong>violation of the Community Guidelines</strong>, and all such instances should be reported to <%= techAssistanceEmail %>.",
"giftMessageTooLong": "The maximum length for gift messages is <%= maxGiftMessageLength %>.",
"battleWithFriends": "Play Habitica with Others",
"questWithOthers": "Take on Quests with Others",
@@ -304,7 +303,6 @@
"playInPartyTitle": "Play Habitica in a Party!",
"playInPartyDescription": "Take on amazing Quests with friends or on your own. Battle monsters, create Challenges, and help yourself stay accountable through Parties.",
"wantToJoinPartyTitle": "Looking for a Party?",
"wantToJoinPartyDescription": "Give your username to a friend who already has a Party, or head to the <a href='/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601'>Party Wanted Guild</a> to meet potential comrades!",
"lookForParty": "Look for a Party",
"currentlyLookingForParty": "Youre looking for a Party!",
"partyFinderDescription": "Want to join a Party with others but dont know any other players? Let Party leaders know youre looking for an invite!",
@@ -411,7 +409,7 @@
"newGroupsBullet10a": "<strong>Leave a task unassigned</strong> if any member can complete it",
"newGroupsBullet10b": "<strong>Assign a task to one member</strong> so only they can complete it",
"newGroupsBullet10c": "<strong>Assign a task to multiple members</strong> if they all need to complete it",
"newGroupsVisitFAQ": "Visit the <a href='/static/faq#group-plans' target='_blank' rel='noreferrer noopener'>FAQ</a> from the Help dropdown for more guidance.",
"newGroupsVisitFAQ": "Visit the <%= linkOpen %>FAQ<%= linkClose %> from the Help dropdown for more guidance.",
"newGroupsEnjoy": "We hope you enjoy the new Group Plans experience!",
"checkinsLabel": "Check-ins:",
"classLabel": "Class:",
@@ -423,10 +421,9 @@
"noOneLooking": "Theres no one looking for a Party right now.<br>You can check back later!",
"tavernDiscontinued": "The Tavern and Guilds have been discontinued",
"tavernDiscontinuedDetail": "Due to a number of factors, including changes in how our player base interacts with Habitica, the resources necessary to maintain these spaces became disproportionate to the number of people participating in them and unsustainable over the long term.",
"tavernDiscontinuedLinks": "Read more about the <a href='/static/faq/tavern-and-guilds'>Tavern and Guild Service Discontinuation</a> or head back to the <a href='/'>homepage</a>.",
"chatSunsetWarning": "⚠️ <strong>Habitica Guilds and Tavern chat will be discontinued on 8/8/2023.</strong> <a href='/static/faq/tavern-and-guilds'>Click here</a> to read more about this change.",
"tavernDiscontinuedLinks": "Read more about the <%= faqLink %>Tavern and Guild Service Discontinuation<%= linkClose %> or head back to the <%= homeLink %>homepage<%= linkClose %>.",
"interestedLearningMore": "Interested in Learning More?",
"checkGroupPlanFAQ": "Check out the <a href='/static/faq#what-is-group-plan'>Group Plans FAQ</a> to learn how to get the most out of your shared task experience.",
"checkGroupPlanFAQ": "Check out the <%= linkOpen %>Group Plans FAQ<%= linkClose %> to learn how to get the most out of your shared task experience.",
"groupPlanBillingFYI": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You can cancel from the Group Billing tab of your Group Plan. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle.",
"groupPlanBillingFYIShort": "Group Plan subscriptions automatically renew unless you cancel at least 24 hours before the end of your current period. You will be charged within 24 hours before your subscription renews, based on the number of members in your Group Plan at that time. If you add members between payment periods, you'll see an additional prorated charge for their benefits at your next billing cycle.",
"chooseAnOption": "Choose an Option",
+2 -2
View File
@@ -21,7 +21,7 @@
"pauseDailies": "Pause Damage",
"unpauseDailies": "Unpause Damage",
"staffAndModerators": "Staff and Moderators",
"communityGuidelinesIntro": "Habitica tries to create a welcoming environment for users of all ages and backgrounds, especially in spaces like Groups and Parties. If you have any questions, please consult our <a href='/static/community-guidelines' target='_blank' rel='noreferrer noopener'>Community Guidelines</a>.",
"communityGuidelinesIntro": "Habitica tries to create a welcoming environment for users of all ages and backgrounds, especially in spaces like Groups and Parties. If you have any questions, please consult our <%= linkOpen %>Community Guidelines<%= linkClose %>.",
"acceptCommunityGuidelines": "I agree to follow the Community Guidelines",
"worldBossEvent": "World Boss Event",
"worldBossDescription": "World Boss Description",
@@ -109,7 +109,7 @@
"toDo": "To Do",
"tourStatsPage": "This is your Stats page! Earn achievements by completing the listed tasks.",
"tourTavernPage": "Welcome to the Tavern, an all-ages chat room! You can keep your Dailies from hurting you in case of illness or travel by clicking \"Pause Damage\". Come say hi!",
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <a href='/static/faq#parties'>FAQ</a> from the Help dropdown to learn more about how Parties work.",
"tourPartyPage": "Welcome to your new Party! You can invite other players to your Party by username, email, or from a list of players looking for a Party to earn the exclusive Basi-List Quest Scroll.<br/><br/>Select <%= linkOpen %>FAQ<%= linkClose %> from the Help dropdown to learn more about how Parties work.",
"tourChallengesPage": "Challenges are themed task lists created by users! Joining a Challenge will add its tasks to your account. Compete against other users to win Gem prizes!",
"tourMarketPage": "Every time you complete a task, you'll have a random chance at receiving an Egg, a Hatching Potion, or a piece of Pet Food. You can also buy these items here.",
"tourHallPage": "Welcome to the Hall of Heroes, where open-source contributors to Habitica are honored. Whether through code, art, music, writing, or even just helpfulness, they have earned Gems, exclusive Equipment, and prestigious titles. You can contribute to Habitica, too!",
+1 -1
View File
@@ -10,5 +10,5 @@
"step3": "Step 3: Customize and Explore Habitica",
"webStep3Text": "Once you're familiar with the basics, you can get even more out of Habitica with these nifty features:\n * Organize your Tasks with [tags](https://habitica.fandom.com/wiki/Tags) (edit a Task to add them).\n * Customize your [Avatar](https://habitica.fandom.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](https://habitica.fandom.com/wiki/Equipment) under Rewards or from the [Shops](<%= shopUrl %>), and change it under [Inventory > Equipment](<%= equipUrl %>).\n * Connect with other users via the [Looking for Party tool](https://habitica.com/looking-for-party).\n * Hatch [Pets](https://habitica.fandom.com/wiki/Pets) by collecting [Eggs](https://habitica.fandom.com/wiki/Eggs) and [Hatching Potions](https://habitica.fandom.com/wiki/Hatching_Potions). [Feed](https://habitica.fandom.com/wiki/Food) them to create [Mounts](https://habitica.fandom.com/wiki/Mounts).\n * At level 10: Choose a particular [Class](https://habitica.fandom.com/wiki/Class_System) and then use Class-specific [skills](https://habitica.fandom.com/wiki/Skills) (levels 11 to 14).\n * Form a Party with your friends (by clicking [Party](<%= partyUrl %>) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [Quests](https://habitica.fandom.com/wiki/Quests) (you will be given a quest at level 15).",
"overviewQuestionsRevised": "Have questions? Check out the <a href='/static/faq'>FAQ</a>! If your question isn't mentioned there, you can ask for further help using this form: "
"overviewQuestionsRevised": "Have questions? Check out the <%= linkOpen %>FAQ<%= linkClose %>! If your question isn't mentioned there, you can ask for further help using this form: "
}
+1 -3
View File
@@ -47,8 +47,6 @@
"food": "Pet Food and Saddles",
"noFoodAvailable": "You don't have any Pet Food.",
"noSaddlesAvailable": "You don't have any Saddles.",
"dropsExplanation": "Get these items faster with Gems if you don't want to wait for them to drop when completing a task. <a href=\"https://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
"dropsExplanationEggs": "Spend Gems to get eggs more quickly, if you don't want to wait for standard eggs to drop, or to repeat Quests to earn Quest eggs. <a href=\"https://habitica.fandom.com/wiki/Drops\">Learn more about the drop system.</a>",
"premiumPotionNoDropExplanation": "Magic Hatching Potions cannot be used on eggs received from Quests. The only way to get Magic Hatching Potions is by buying them below, not from random drops.",
"beastMasterProgress": "Beast Master Progress",
"beastAchievement": "You have earned the \"Beast Master\" Achievement for collecting all the pets!",
@@ -91,7 +89,7 @@
"welcomeStable": "Welcome to your Pets and Mounts!",
"welcomeStableText": "Welcome to the stable! Im Matt, the beastmaster. Every time you complete a task, you'll have a random chance at receiving an Egg or a Hatching Potion to hatch Pets. When you hatch a Pet, it will appear here! Click a Pet's image to add it to your Avatar. Feed them with the Pet Food you find and they'll grow into hardy Mounts.",
"petLikeToEat": "What does my Pet like to eat?",
"petLikeToEatText": "Pets will grow no matter what you feed them, but they'll grow faster if you feed them the one Pet Food that they like best. Experiment to find out the pattern, or see the answers here: <br/> <a href=\"/static/faq#pet-foods\" target=\"_blank\" rel=\"noreferrer noopener\">https://habitica.com/static/faq#pet-foods</a>",
"petLikeToEatText": "Pets will grow no matter what you feed them, but they'll grow faster if you feed them the one Pet Food that they like best. Experiment to find out the pattern, or <%= linkOpen %>see the answers here<%= linkClose %>.",
"filterByStandard": "Standard",
"filterByMagicPotion": "Magic Potion",
"filterByQuest": "Quest",
+1 -1
View File
@@ -70,7 +70,7 @@
"loginReward": "<%= count %> Check-ins",
"questBundles": "Discounted Quest Bundles",
"noQuestToStartTitle": "Cant find a Quest to start?",
"noQuestToStart": "Try checking out the <a href=\"<%= questShop %>\">Quest Shop</a> for new releases!",
"noQuestToStart": "Try checking out the <%= linkOpen %>Quest Shop<%= linkClose %> for new releases!",
"pendingDamage": "<%= damage %> pending damage",
"pendingDamageLabel": "pending damage",
"bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health",
+6 -8
View File
@@ -10,7 +10,7 @@
"language": "Language",
"siteLanguage": "Site Language",
"americanEnglishGovern": "In the event of a discrepancy in the translations, the American English version governs.",
"helpWithTranslation": "Are you interested in helping with the translation of Habitica? Great! Then visit <a href=\"https://translate.habitica.com\">Habitica's Weblate site</a>!",
"helpWithTranslation": "Are you interested in helping with the translation of Habitica? Great! Then visit <%= linkOpen %>Habitica's Weblate site<%= linkClose %>!",
"stickyHeader": "Sticky header",
"newTaskEdit": "Open new tasks in edit mode",
"reverseChatOrder": "Show chat messages in reverse order",
@@ -93,8 +93,6 @@
"APIToken": "API Token (this is a password - see warning above!)",
"showAPIToken": "Show API Token",
"hideAPIToken": "Hide API Token",
"thirdPartyApps": "Third Party Apps",
"thirdPartyTools": "Find third party apps, extensions, and all kinds of other tools you can use with your account on the <a href='https://habitica.fandom.com/wiki/Extensions,_Add-Ons,_and_Customizations' target='_blank' rel='noreferrer noopener'>Habitica wiki</a>.",
"resetDo": "Do it, reset my account!",
"resetComplete": "Reset complete!",
"fixValues": "Fix Values",
@@ -140,7 +138,7 @@
"kickedGroup": "Removed from group",
"remindersToLogin": "Reminders to check in to Habitica",
"unsubscribedSuccessfully": "Unsubscribed successfully!",
"unsubscribedTextUsers": "You have successfully unsubscribed from all Habitica emails. You can enable only the emails you want to receive from <a href=\"/user/settings/notifications\">Settings > &gt; Notifications</a> (requires login).",
"unsubscribedTextUsers": "You have successfully unsubscribed from all Habitica emails. You can enable only the emails you want to receive from <%= linkOpen %>Settings > Notifications<%= linkClose %> (requires login).",
"unsubscribedTextOthers": "You won't receive any other email from Habitica.",
"unsubscribeAllEmails": "Unsubscribe from Emails",
"unsubscribeAllEmailsText": "Habitica will be unable to notify you via email about important changes to the site or your account.",
@@ -163,7 +161,7 @@
"generate": "Generate",
"getCodes": "Get Codes",
"webhooks": "Webhooks",
"webhooksInfo": "Webhooks provide a way for developers to receive notifications when a particular action is performed, such as scoring or updating a Task, or sending a message in a Group. By creating a webhook, you will be able to listen to changes in Habitica and build apps that respond to these changes.<br><br>For additional information and examples on webhooks, please visit our <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https://apidoc.habitica.com/#api-Webhook-AddWebhook\">API Docs</a>.",
"webhooksInfo": "Webhooks provide a way for developers to receive notifications when a particular action is performed, such as scoring or updating a Task, or sending a message in a Group. By creating a webhook, you will be able to listen to changes in Habitica and build apps that respond to these changes.<br><br>For additional information and examples on webhooks, please visit our <%= linkOpen %>API Docs<%= linkClose %>.",
"enabled": "Enabled",
"webhookURL": "Webhook URL",
"addWebhook": "Add Webhook",
@@ -264,7 +262,7 @@
"managePrivacyPreferences": "Manage Your Privacy Preferences",
"yourPrivacyPreferences": "Your Privacy Preferences",
"privacySettingsOverview": "Habitica uses cookies to analyze performance, handle support requests, and provide you with the best possible gamified experience. To do that, we need to request the following permissions. You can change these at any time from your account settings.",
"learnMorePrivacy": "To learn more, review our <a href='/static/privacy' target='_blank' rel='noreferrer noopener'>Privacy Policy</a>.",
"learnMorePrivacy": "To learn more, review our <%= linkOpen %>Privacy Policy<%= linkClose %>.",
"strictlyNecessary": "Strictly Necessary",
"alwaysActive": "Always Active",
"requiredToRun": "These are required by our website and apps to run at their best.",
@@ -272,6 +270,6 @@
"usedForSupport": "These are used to improve the user experience, performance, and services of our website and apps. This data is used by our support team when handling requests and bug reports.",
"savePreferences": "Save Preferences",
"habiticaPrivacyPolicy": "Habitica's Privacy Policy",
"gpcWarning": "<a href='<%= url %>' target='_blank' rel='noreferrer noopener'>GPC</a> is on. Turning on tracking below will override this and send data to our analytics partners.",
"gpcPlusAnalytics": "<a href='<%= url %>' target='_blank' rel='noreferrer noopener'>GPC</a> is on. You have opted in to tracking and sending data to our analytics partners."
"gpcWarning": "<%= linkOpen %>GPC<%= linkClose %> is on. Turning on tracking below will override this and send data to our analytics partners.",
"gpcPlusAnalytics": "<%= linkOpen %>GPC<%= linkClose %> is on. You have opted in to tracking and sending data to our analytics partners."
}
+2 -3
View File
@@ -20,8 +20,8 @@
"groupPlans": "Group Plans",
"nowSubscribed": "You are now subscribed to Habitica!",
"cancelSub": "Cancel Subscription",
"cancelSubInfoGoogle": "To cancel your subscription or to view your subscription's termination date, please use the <a href='https://play.google.com/store/account/subscriptions'>Google Play Store</a>. Any leftover months of subscription credit will be added to your end date after cancellation.",
"cancelSubInfoApple": "Please follow <a href=\"https://support.apple.com/en-us/HT202039\">Apple's official instructions</a> to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
"cancelSubInfoGoogle": "To cancel your subscription or to view your subscription's termination date, please use the <%= linkOpen %>Google Play Store<%= linkClose %>. Any leftover months of subscription credit will be added to your end date after cancellation.",
"cancelSubInfoApple": "Please follow <%= linkOpen %>Apple's official instructions<%= linkClose %> to cancel your subscription or to see your subscription's termination date if you have already cancelled it. This screen is not able to show you whether your subscription has been cancelled.",
"cancelSubInfoGroupPlan": "Because you have a free subscription from a Group Plan, you cannot cancel it. It will end when you are no longer a member of the Group Plan. If you are the Group leader and want to cancel the Group Plan, you can do that from the Group Plans “Group Billing” tab.",
"cancelingSubscription": "Canceling the subscription",
"contactUs": "Contact Us",
@@ -254,7 +254,6 @@
"readyToResubscribe": "Are you ready to resubscribe?",
"resubscribeToPickUp": "Resubscribe to pick up where you left off!",
"cancelYourSubscription": "Need to cancel your subscription?",
"cancelSubAlternatives": "If you're having technical problems or Habitica doesn't seem to be working out for you, please consider <a href='mailto:admin@habitica.com'>contacting us</a>. We want to help you get the most from Habitica.",
"sendAGift": "Send Gift",
"haveNonRecurringSub": "You have a non-recurring gift subscription.",
"switchToRecurring": "Switch to a recurring subscription?",
@@ -26,7 +26,10 @@ async function emailUnsubscribe (req, res) {
if (userUpdated.modifiedCount !== 1) throw new NotFound(res.t('userNotFound'));
res.send(`<h1>${res.t('unsubscribedSuccessfully')}</h1> ${res.t('unsubscribedTextUsers')}`);
res.send(`<h1>${res.t('unsubscribedSuccessfully')}</h1> ${res.t('unsubscribedTextUsers', {
linkOpen: '<a href="/user/settings/notifications">',
linkClose: '</a>',
})}`);
} else {
const unsubscribedEmail = await EmailUnsubscription
.findOne({ email: data.email.toLowerCase() }).exec();