From f93822b0b359a08f70fbbf5550edeba65e317313 Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 14:34:58 +0200 Subject: [PATCH 01/76] Several hard coded strings fixed. --- website/client/components/challenges/sidebar.vue | 6 +++--- website/client/components/inventory/stable/index.vue | 2 +- website/common/locales/en/challenge.json | 2 ++ website/common/locales/en/npc.json | 1 + 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/website/client/components/challenges/sidebar.vue b/website/client/components/challenges/sidebar.vue index ce22bf0d62..ecd46e493a 100644 --- a/website/client/components/challenges/sidebar.vue +++ b/website/client/components/challenges/sidebar.vue @@ -5,7 +5,7 @@ form h2(v-once) {{ $t('filter') }} .form-group - h3 Category + h3 {{ $t('category') }} .form-check( v-for="group in categoryOptions", :key="group.key", @@ -14,7 +14,7 @@ input.custom-control-input(type="checkbox", :value='group.key' v-model="categoryFilters", :id="group.key") label.custom-control-label(v-once, :for="group.key") {{ $t(group.label) }} .form-group(v-if='$route.name !== "findChallenges"') - h3 Membership + h3 {{ $t('membership') }} .form-check( v-for="group in roleOptions", :key="group.key", @@ -23,7 +23,7 @@ input.custom-control-input(type="checkbox", :value='group.key' v-model="roleFilters", :id="group.key") label.custom-control-label(v-once, :for="group.key") {{ $t(group.label) }} .form-group - h3 Ownership + h3 {{ $t('ownership') }} .form-check( v-for="group in ownershipOptions", :key="group.key", diff --git a/website/client/components/inventory/stable/index.vue b/website/client/components/inventory/stable/index.vue index b118f8f679..7298f60bc7 100644 --- a/website/client/components/inventory/stable/index.vue +++ b/website/client/components/inventory/stable/index.vue @@ -47,7 +47,7 @@ label.custom-control-label(v-once, :for="mountGroup.key") {{ mountGroup.label }} div.form-group.clearfix - h3.float-left Hide Missing + h3.float-left {{ $t('hideMissing') }} toggle-switch.float-right( :checked="hideMissing", @change="updateHideMissing" diff --git a/website/common/locales/en/challenge.json b/website/common/locales/en/challenge.json index a5ca557e4a..65af6c1211 100644 --- a/website/common/locales/en/challenge.json +++ b/website/common/locales/en/challenge.json @@ -25,7 +25,9 @@ "filter": "Filter", "groups": "Groups", "noNone": "None", + "category": "Category", "membership": "Membership", + "ownership": "Ownership", "participating": "Participating", "notParticipating": "Not Participating", "either": "Either", diff --git a/website/common/locales/en/npc.json b/website/common/locales/en/npc.json index 0fdb31496d..0644e86a64 100644 --- a/website/common/locales/en/npc.json +++ b/website/common/locales/en/npc.json @@ -53,6 +53,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", From 4e4181a394a79bc535a91b6f70fac5dbf4e41428 Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 16:10:22 +0200 Subject: [PATCH 02/76] Improved challenge layout. --- .../components/challenges/challengeDetail.vue | 74 ++++----- .../components/challenges/groupChallenges.vue | 154 ++++++++++-------- website/client/components/groups/group.vue | 93 ++--------- .../components/groups/questSidebarSection.vue | 140 ++++++++-------- website/client/components/sidebarSection.vue | 94 +++++++++++ 5 files changed, 294 insertions(+), 261 deletions(-) create mode 100644 website/client/components/sidebarSection.vue diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index 19ddd1f183..eb2013d166 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -6,7 +6,7 @@ challenge-member-progress-modal(:memberId='progressMemberId', :challengeId='challenge._id') .col-12.col-md-8.standard-page .row - .col-12.col-md-8 + .col-12.col-md-6 h1(v-markdown='challenge.name') div strong(v-once) {{$t('createdBy')}}: @@ -19,7 +19,7 @@ // span {{challenge.endDate}} .tags span.tag(v-for='tag in challenge.tags') {{tag}} - .col-12.col-md-4 + .col-12.col-md-6.text-right .box(@click="showMemberModal()") .svg-icon.member-icon(v-html="icons.memberIcon") | {{challenge.memberCount}} @@ -29,10 +29,10 @@ | {{challenge.prize}} .details(v-once) {{$t('prize')}} .row.challenge-actions - .col-12.col-md-7.offset-md-5 - span.view-progress - strong {{ $t('viewProgressOf') }} + .col-12.col-md-6 + strong.view-progress {{ $t('viewProgressOf') }} member-search-dropdown(:text="$t('selectParticipant')", :members='members', :challengeId='challengeId', @member-selected='openMemberProgressModal') + .col-12.col-md-6.text-right span(v-if='isLeader || isAdmin') b-dropdown.create-dropdown(:text="$t('addTaskToChallenge')", :variant="'success'") b-dropdown-item(v-for="type in columns", :key="type", @click="createTask(type)") @@ -56,24 +56,25 @@ v-on:editTask="editTask", v-if='tasksByType[column].length > 0') .col-12.col-md-4.sidebar.standard-page - .acitons - div(v-if='canJoin') - button.btn.btn-success(v-once, @click='joinChallenge()') {{$t('joinChallenge')}} - div(v-if='isMember') - button.btn.btn-danger(v-once, @click='leaveChallenge()') {{$t('leaveChallenge')}} - div(v-if='isLeader || isAdmin') - button.btn.btn-secondary(v-once, @click='edit()') {{$t('editChallenge')}} - div(v-if='isLeader || isAdmin') - button.btn.btn-danger(v-once, @click='closeChallenge()') {{$t('endChallenge')}} - div(v-if='isLeader || isAdmin') - button.btn.btn-secondary(v-once, @click='exportChallengeCsv()') {{$t('exportChallengeCsv')}} - div(v-if='isLeader || isAdmin') - button.btn.btn-secondary(v-once, @click='cloneChallenge()') {{$t('clone')}} - .description-section - h2 {{$t('challengeSummary')}} + .button-container(v-if='canJoin') + button.btn.btn-success(v-once, @click='joinChallenge()') {{$t('joinChallenge')}} + .button-container(v-if='isLeader || isAdmin') + button.btn.btn-primary(v-once, @click='edit()') {{$t('editChallenge')}} + .button-container(v-if='isLeader || isAdmin') + button.btn.btn-primary(v-once, @click='cloneChallenge()') {{$t('clone')}} + .button-container(v-if='isLeader || isAdmin') + button.btn.btn-primary(v-once, @click='exportChallengeCsv()') {{$t('exportChallengeCsv')}} + .button-container(v-if='isLeader || isAdmin') + button.btn.btn-danger(v-once, @click='closeChallenge()') {{$t('endChallenge')}} + sidebar-section(:title="$t('challengeSummary')") p(v-markdown='challenge.summary') - h2 {{$t('challengeDescription')}} + sidebar-section( + :title="$t('challengeDescription')" + :last="true" + ) p(v-markdown='challenge.description') + .text-center(v-if='isMember') + button.btn.btn-danger(v-once, @click='leaveChallenge()') {{$t('leaveChallenge')}} - - diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index ff5372f734..be3c4ea675 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -61,48 +61,17 @@ // @TODO: V2 button.btn.btn-primary(v-once, v-if='!isLeader') {{$t('messageGuildLeader')}} // Suggest making the button visible to the leader too - useful for them to test how the feature works or to send a note to themself. -- Alys .button-container // @TODO: V2 button.btn.btn-primary(v-once, v-if='isMember && !isParty') {{$t('donateGems')}} // Suggest removing the isMember restriction - it's okay if non-members donate to a public guild. Also probably allow it for parties if parties can buy imagery. -- Alys - .section-header(v-if='isParty') - quest-sidebar-section(@toggle='toggleQuestSection', :show='sections.quest', :group='group') - .section-header(v-if='!isParty') - .row - .col-10 - h3(v-once) {{ $t('guildSummary') }} - .col-2 - .toggle-up(@click="sections.summary = !sections.summary", v-if="sections.summary") - .svg-icon(v-html="icons.upIcon") - .toggle-down(@click="sections.summary = !sections.summary", v-if="!sections.summary") - .svg-icon(v-html="icons.downIcon") - .section(v-if="sections.summary") - p(v-markdown='group.summary') - .section-header - .row - .col-10 - h3 {{ $t('groupDescription') }} - .col-2 - .toggle-up(@click="sections.description = !sections.description", v-if="sections.description") - .svg-icon(v-html="icons.upIcon") - .toggle-down(@click="sections.description = !sections.description", v-if="!sections.description") - .svg-icon(v-html="icons.downIcon") - .section(v-if="sections.description") - p(v-markdown='group.description') - .section-header.challenge - .row - .col-10.information-header - h3(v-once) - | {{ $t('challenges') }} - #groupPrivateDescOrChallengeInfo.icon.tooltip-wrapper(:title="isParty ? $t('challengeDetails') : $t('privateDescription')") - .svg-icon(v-html='icons.information') - b-tooltip( - :title="isParty ? $t('challengeDetails') : $t('privateDescription')", - target="groupPrivateDescOrChallengeInfo", - ) - .col-2 - .toggle-up(@click="sections.challenges = !sections.challenges", v-if="sections.challenges") - .svg-icon(v-html="icons.upIcon") - .toggle-down(@click="sections.challenges = !sections.challenges", v-if="!sections.challenges") - .svg-icon(v-html="icons.downIcon") - .section(v-if="sections.challenges") - group-challenges(:groupId='searchId') + quest-sidebar-section(:group='group', v-if='isParty') + sidebar-section(:title="$t('guildSummary')", v-if='!isParty') + p(v-markdown='group.summary') + sidebar-section(:title="$t('groupDescription')") + p(v-markdown='group.description') + sidebar-section( + :title="$t('challenges')", + :tooltip="isParty ? $t('challengeDetails') : $t('privateDescription')" + :last="true" + ) + group-challenges(:groupId='searchId') div.text-center button.btn.btn-danger(v-if='isMember', @click='clickLeave()') {{ isParty ? $t('leaveParty') : $t('leaveGroup') }} @@ -270,29 +239,6 @@ margin-right: .3em; } - .information-header { - h3, .tooltip-wrapper { - display: inline-block; - } - - .tooltip-wrapper { - width: 15px; - margin-left: 1.2em; - } - } - - .section-header { - border-top: 1px solid #e1e0e3; - margin-top: 1em; - padding-top: 1em; - } - - .section-header.challenge { - border-bottom: 1px solid #e1e0e3; - margin-bottom: 1em; - padding-bottom: 1em; - } - .hr { width: 100%; height: 20px; @@ -334,6 +280,7 @@ import groupGemsModal from 'client/components/groups/groupGemsModal'; import questSidebarSection from 'client/components/groups/questSidebarSection'; import markdownDirective from 'client/directives/markdown'; import communityGuidelines from './communityGuidelines'; +import sidebarSection from '../sidebarSection'; import deleteIcon from 'assets/svg/delete.svg'; import copyIcon from 'assets/svg/copy.svg'; @@ -342,10 +289,7 @@ import likedIcon from 'assets/svg/liked.svg'; import reportIcon from 'assets/svg/report.svg'; import gemIcon from 'assets/svg/gem.svg'; import questIcon from 'assets/svg/quest.svg'; -import informationIcon from 'assets/svg/information.svg'; import questBackground from 'assets/svg/quest-background-border.svg'; -import upIcon from 'assets/svg/up.svg'; -import downIcon from 'assets/svg/down.svg'; import goldGuildBadgeIcon from 'assets/svg/gold-guild-badge-small.svg'; import silverGuildBadgeIcon from 'assets/svg/silver-guild-badge-small.svg'; import bronzeGuildBadgeIcon from 'assets/svg/bronze-guild-badge-small.svg'; @@ -365,6 +309,7 @@ export default { groupGemsModal, questSidebarSection, communityGuidelines, + sidebarSection, }, directives: { markdown: markdownDirective, @@ -381,22 +326,13 @@ export default { gem: gemIcon, liked: likedIcon, questIcon, - information: informationIcon, questBackground, - upIcon, - downIcon, goldGuildBadgeIcon, silverGuildBadgeIcon, bronzeGuildBadgeIcon, }), members: [], selectedQuest: {}, - sections: { - quest: true, - summary: true, - description: true, - challenges: true, - }, newMessage: '', coords: { TOP: 0, @@ -698,9 +634,6 @@ export default { showGroupGems () { this.$root.$emit('bv::show::modal', 'group-gems-modal'); }, - toggleQuestSection () { - this.sections.quest = !this.sections.quest; - }, }, }; diff --git a/website/client/components/groups/questSidebarSection.vue b/website/client/components/groups/questSidebarSection.vue index f7dde2dbd8..f683841e22 100644 --- a/website/client/components/groups/questSidebarSection.vue +++ b/website/client/components/groups/questSidebarSection.vue @@ -1,74 +1,65 @@ + + \ No newline at end of file From 85136675e9f55d63730b55826c438dd941636d4b Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 16:13:16 +0200 Subject: [PATCH 03/76] Fixed group sidebar. --- website/client/components/groups/sidebar.vue | 6 +++--- website/common/locales/en/groups.json | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/website/client/components/groups/sidebar.vue b/website/client/components/groups/sidebar.vue index cd1a35ebf9..afa35608a1 100644 --- a/website/client/components/groups/sidebar.vue +++ b/website/client/components/groups/sidebar.vue @@ -6,7 +6,7 @@ form h2(v-once) {{ $t('filter') }} .form-group - h3 Category + h3 {{ $t('category') }} .form-check( v-for="group in categoryOptions", :key="group.key", @@ -15,7 +15,7 @@ input.custom-control-input(type="checkbox", :value='group.key' v-model="categoryFilters", :id="group.key") label.custom-control-label(v-once, :for="group.key") {{ $t(group.label) }} .form-group - h3 Role + h3 {{ $t('role') }} .form-check( v-for="group in roleOptions", :key="group.key", @@ -24,7 +24,7 @@ input.custom-control-input(type="checkbox", :value='group.key' v-model="roleFilters", :id="group.key") label.custom-control-label(v-once, :for="group.key") {{ $t(group.label) }} .form-group - h3 Guild Size + h3 {{ $t('guildSize') }} .form-check( v-for="group in guildSizeOptions", :key="group.key", diff --git a/website/common/locales/en/groups.json b/website/common/locales/en/groups.json index 706934318d..99c01fcd0b 100644 --- a/website/common/locales/en/groups.json +++ b/website/common/locales/en/groups.json @@ -371,9 +371,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", From 88b14592c5a4623c6c3c0d171d59fc9c88bb85e3 Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 17:23:02 +0200 Subject: [PATCH 04/76] Make Challenge Owner's Name Clickable (#9283) --- .../components/challenges/challengeDetail.vue | 7 ++++--- .../components/challenges/groupChallenges.vue | 12 +++++------ website/client/components/groups/group.vue | 17 ++++----------- website/client/components/sidebarSection.vue | 2 +- website/client/components/userLink.vue | 21 +++++++++++++++++++ 5 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 website/client/components/userLink.vue diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index eb2013d166..6152740022 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -9,8 +9,8 @@ .col-12.col-md-6 h1(v-markdown='challenge.name') div - strong(v-once) {{$t('createdBy')}}: - span(v-if='challenge.leader && challenge.leader.profile') {{challenge.leader.profile.name}} + strong.float-left(v-once) {{ $t('createdBy') }}: + user-link.mx-1.float-left(:user="challenge.leader") // @TODO: make challenge.author a variable inside the createdBy string (helps with RTL languages) // @TODO: Implement in V2 strong.margin-left(v-once) .svg-icon.calendar-icon(v-html="icons.calendarIcon") @@ -180,7 +180,7 @@ import challengeMemberProgressModal from './challengeMemberProgressModal'; import challengeMemberSearchMixin from 'client/mixins/challengeMemberSearch'; import leaveChallengeModal from './leaveChallengeModal'; import sidebarSection from '../sidebarSection'; - +import userLink from '../userLink'; import taskDefaults from 'common/script/libs/taskDefaults'; import gemIcon from 'assets/svg/gem.svg'; @@ -202,6 +202,7 @@ export default { sidebarSection, TaskColumn: Column, TaskModal, + userLink, }, data () { return { diff --git a/website/client/components/challenges/groupChallenges.vue b/website/client/components/challenges/groupChallenges.vue index fdac5452cf..79af7de8be 100644 --- a/website/client/components/challenges/groupChallenges.vue +++ b/website/client/components/challenges/groupChallenges.vue @@ -122,7 +122,7 @@ div computed: { ...mapState({user: 'user.data'}), }, - data() { + data () { return { challenges: [], icons: Object.freeze({ @@ -136,24 +136,24 @@ div directives: { markdown: markdownDirective, }, - mounted() { + mounted () { this.loadChallenges(); }, watch: { - async groupId() { + async groupId () { this.loadChallenges(); }, }, methods: { - async loadChallenges() { + async loadChallenges () { this.groupIdForChallenges = this.groupId; if (this.groupId === 'party' && this.user.party._id) this.groupIdForChallenges = this.user.party._id; this.challenges = await this.$store.dispatch('challenges:getGroupChallenges', {groupId: this.groupIdForChallenges}); }, - createChallenge() { + createChallenge () { this.$root.$emit('bv::show::modal', 'challenge-modal'); }, - challengeCreated(challenge) { + challengeCreated (challenge) { if (challenge.group._id !== this.groupIdForChallenges) return; this.challenges.push(challenge); }, diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index be3c4ea675..4d128948e2 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -9,8 +9,8 @@ .row .col-12.col-md-6.title-details h1 {{group.name}} - strong.float-left(v-once) {{$t('groupLeader')}} - span.leader.float-left(v-if='group.leader.profile', @click='showMemberProfile(group.leader)') : {{group.leader.profile.name}} + strong.float-left(v-once) {{$t('groupLeader')}}: + user-link.mx-1.float-left(:user="group.leader") .col-12.col-md-6 .row.icon-row .col-4.offset-4(v-bind:class="{ 'offset-8': isParty }") @@ -93,10 +93,6 @@ color: $purple-200; } - .leader:hover { - cursor: pointer; - } - .button-container { margin-bottom: 1em; @@ -281,6 +277,7 @@ import questSidebarSection from 'client/components/groups/questSidebarSection'; import markdownDirective from 'client/directives/markdown'; import communityGuidelines from './communityGuidelines'; import sidebarSection from '../sidebarSection'; +import userLink from '../userLink'; import deleteIcon from 'assets/svg/delete.svg'; import copyIcon from 'assets/svg/copy.svg'; @@ -310,6 +307,7 @@ export default { questSidebarSection, communityGuidelines, sidebarSection, + userLink }, directives: { markdown: markdownDirective, @@ -624,13 +622,6 @@ export default { } // $rootScope.$state.go('options.inventory.quests'); }, - async showMemberProfile (leader) { - let heroDetails = await this.$store.dispatch('members:fetchMember', { memberId: leader._id }); - this.$root.$emit('habitica:show-profile', { - user: heroDetails.data.data, - startingPage: 'profile', - }); - }, showGroupGems () { this.$root.$emit('bv::show::modal', 'group-gems-modal'); }, diff --git a/website/client/components/sidebarSection.vue b/website/client/components/sidebarSection.vue index f4cba87ced..18bdcc9b5a 100644 --- a/website/client/components/sidebarSection.vue +++ b/website/client/components/sidebarSection.vue @@ -81,7 +81,7 @@ icons: { upIcon, downIcon, - information: informationIcon + information: informationIcon, }, }; }, diff --git a/website/client/components/userLink.vue b/website/client/components/userLink.vue new file mode 100644 index 0000000000..c0e51fff43 --- /dev/null +++ b/website/client/components/userLink.vue @@ -0,0 +1,21 @@ + + + \ No newline at end of file From eaa00598d0c70b80d00c4474390fe48115e1efee Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 19:47:04 +0200 Subject: [PATCH 05/76] Improvements to Challenge Layout (#9619) --- .../components/challenges/challengeDetail.vue | 13 +- .../components/challenges/challengeItem.vue | 389 +++++++++++------- .../components/challenges/groupChallenges.vue | 76 +--- website/client/components/groupLink.vue | 22 + website/client/components/groups/group.vue | 6 +- website/common/locales/en/challenge.json | 3 +- 6 files changed, 286 insertions(+), 223 deletions(-) create mode 100644 website/client/components/groupLink.vue diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index 6152740022..ae7e88a1a8 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -9,8 +9,12 @@ .col-12.col-md-6 h1(v-markdown='challenge.name') div - strong.float-left(v-once) {{ $t('createdBy') }}: - user-link.mx-1.float-left(:user="challenge.leader") + span.mr-1.ml-0 + strong(v-once) {{ $t('createdBy') }}: + user-link.mx-1(:user="challenge.leader") + span.mr-1.ml-0(v-if="challenge.group") + strong(v-once) {{ $t(challenge.group.type) }}: + group-link.mx-1(:group="challenge.group") // @TODO: make challenge.author a variable inside the createdBy string (helps with RTL languages) // @TODO: Implement in V2 strong.margin-left(v-once) .svg-icon.calendar-icon(v-html="icons.calendarIcon") @@ -152,7 +156,8 @@ } .challenge-actions { - margin-bottom: 1em; + margin-top: 1em; + margin-bottom: 2em; .view-progress { margin-right: .5em; @@ -181,6 +186,7 @@ import challengeMemberSearchMixin from 'client/mixins/challengeMemberSearch'; import leaveChallengeModal from './leaveChallengeModal'; import sidebarSection from '../sidebarSection'; import userLink from '../userLink'; +import groupLink from '../groupLink'; import taskDefaults from 'common/script/libs/taskDefaults'; import gemIcon from 'assets/svg/gem.svg'; @@ -203,6 +209,7 @@ export default { TaskColumn: Column, TaskModal, userLink, + groupLink, }, data () { return { diff --git a/website/client/components/challenges/challengeItem.vue b/website/client/components/challenges/challengeItem.vue index 2b0c12c4c8..bd1407cd4b 100644 --- a/website/client/components/challenges/challengeItem.vue +++ b/website/client/components/challenges/challengeItem.vue @@ -1,187 +1,288 @@ + + diff --git a/website/client/components/challenges/groupChallenges.vue b/website/client/components/challenges/groupChallenges.vue index 79af7de8be..1415b921a9 100644 --- a/website/client/components/challenges/groupChallenges.vue +++ b/website/client/components/challenges/groupChallenges.vue @@ -8,21 +8,7 @@ div p(v-once) {{ $t('challengeDetails') }} button.btn.btn-secondary(@click='createChallenge()') {{ $t('createChallenge') }} template(v-else) - router-link.title(:to="{ name: 'challenge', params: { challengeId: challenge._id } }", v-for='challenge in challenges',:key='challenge._id') - .col-12.challenge-item - .row - .col-9 - router-link.title(:to="{ name: 'challenge', params: { challengeId: challenge._id } }") - strong(v-markdown='challenge.name') - p(v-markdown='challenge.summary || challenge.name') - div - .svg-icon.member-icon(v-html="icons.memberIcon") - .member-count {{challenge.memberCount}} - .col-3 - div - span.svg-icon.gem(v-html="icons.gemIcon") - span.prize {{challenge.prize}} - div.prize-title Prize + challenge-item(v-for='challenge in challenges',:challenge='challenge',:key='challenge._id',:fullLayout='false') .col-12.text-center button.btn.btn-secondary(@click='createChallenge()') {{ $t('createChallenge') }} @@ -51,73 +37,19 @@ div } - - \ No newline at end of file diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 4d128948e2..63b5a1d82f 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -9,8 +9,10 @@ .row .col-12.col-md-6.title-details h1 {{group.name}} - strong.float-left(v-once) {{$t('groupLeader')}}: - user-link.mx-1.float-left(:user="group.leader") + div + span.mr-1.ml-0 + strong(v-once) {{$t('groupLeader')}}: + user-link.mx-1(:user="group.leader") .col-12.col-md-6 .row.icon-row .col-4.offset-4(v-bind:class="{ 'offset-8': isParty }") diff --git a/website/common/locales/en/challenge.json b/website/common/locales/en/challenge.json index a5ca557e4a..ee425c1efc 100644 --- a/website/common/locales/en/challenge.json +++ b/website/common/locales/en/challenge.json @@ -13,7 +13,8 @@ "challengeWinner": "Was the winner in the following challenges", "challenges": "Challenges", "challengesLink": "Challenges", - + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "No challenges yet, visit", "toCreate": "to create one.", From 45df73e4be260497cf18206d8b5384ea5ae36d01 Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 19:53:31 +0200 Subject: [PATCH 06/76] Fixed challenges on 'Tavern' --- website/client/components/challenges/challengeDetail.vue | 2 +- website/client/components/challenges/challengeItem.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index ae7e88a1a8..1d0b737d71 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -12,7 +12,7 @@ span.mr-1.ml-0 strong(v-once) {{ $t('createdBy') }}: user-link.mx-1(:user="challenge.leader") - span.mr-1.ml-0(v-if="challenge.group") + span.mr-1.ml-0(v-if="challenge.group && challenge.group.name !== 'Tavern'") strong(v-once) {{ $t(challenge.group.type) }}: group-link.mx-1(:group="challenge.group") // @TODO: make challenge.author a variable inside the createdBy string (helps with RTL languages) diff --git a/website/client/components/challenges/challengeItem.vue b/website/client/components/challenges/challengeItem.vue index bd1407cd4b..c92c2fa2d9 100644 --- a/website/client/components/challenges/challengeItem.vue +++ b/website/client/components/challenges/challengeItem.vue @@ -14,7 +14,7 @@ .owner-item strong {{ $t('createdBy') }}: user-link.mx-1(:user="challenge.leader") - .owner-item(v-if="challenge.group") + .owner-item(v-if="challenge.group && challenge.group.name !== 'Tavern'") strong {{ $t(challenge.group.type) }}: group-link.mx-1(:group="challenge.group") .meta From 05c43d1f9d7119c62b589da2c8e51d17d817b7a8 Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 20:13:46 +0200 Subject: [PATCH 07/76] Use sidebar section component in tavern. --- website/client/components/groups/group.vue | 2 +- website/client/components/groups/tavern.vue | 93 +++++++-------------- 2 files changed, 30 insertions(+), 65 deletions(-) diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 63b5a1d82f..6bcf92922e 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -309,7 +309,7 @@ export default { questSidebarSection, communityGuidelines, sidebarSection, - userLink + userLink, }, directives: { markdown: markdownDirective, diff --git a/website/client/components/groups/tavern.vue b/website/client/components/groups/tavern.vue index 3ea95eed72..9fb0924dbf 100644 --- a/website/client/components/groups/tavern.vue +++ b/website/client/components/groups/tavern.vue @@ -102,18 +102,9 @@ li(v-once) {{ $t('sleepBullet4') }} button.btn.btn-secondary.pause-button(v-if='!user.preferences.sleep', @click='toggleSleep()', v-once) {{ $t('pauseDailies') }} button.btn.btn-secondary.pause-button(v-if='user.preferences.sleep', @click='toggleSleep()', v-once) {{ $t('unpauseDailies') }} - - .below-header-sections - .section-header + .px-3 + sidebar-section(:title="$t('staffAndModerators')") .row - .col-10 - h3(v-once) {{ $t('staffAndModerators') }} - .col-2 - .toggle-up(@click="sections.staff = !sections.staff", v-if="sections.staff") - .svg-icon(v-html="icons.upIcon") - .toggle-down(@click="sections.staff = !sections.staff", v-if="!sections.staff") - .svg-icon(v-html="icons.downIcon") - .section.row(v-if="sections.staff") .col-4.staff(v-for='user in staff', :class='{staff: user.type === "Staff", moderator: user.type === "Moderator", bailey: user.name === "It\'s Bailey"}') div a.title(@click="viewStaffProfile(user.uuid)") {{user.name}} @@ -122,50 +113,33 @@ .svg-icon.npc-icon(v-html="icons.tierNPC", v-if='user.name === "It\'s Bailey"') .type {{user.type}} - .section-header - .row - .col-10 - h3(v-once) {{ $t('helpfulLinks') }} - .col-2 - .toggle-up(@click="sections.helpfulLinks = !sections.helpfulLinks", v-if="sections.helpfulLinks") - .svg-icon(v-html="icons.upIcon") - .toggle-down(@click="sections.helpfulLinks = !sections.helpfulLinks", v-if="!sections.helpfulLinks") - .svg-icon(v-html="icons.downIcon") - .section.row(v-if="sections.helpfulLinks") - ul - li - a(href='', @click.prevent='modForm()') {{ $t('contactForm') }} - li - router-link(to='/static/community-guidelines', v-once) {{ $t('communityGuidelinesLink') }} - li - router-link(to="/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601") {{ $t('lookingForGroup') }} - li - router-link(to='/static/faq', v-once) {{ $t('faq') }} - li - a(href='', v-html="$t('glossary')") - li - a(href='http://habitica.wikia.com/wiki/Habitica_Wiki', v-once) {{ $t('wiki') }} - li - a(href='https://oldgods.net/habitrpg/habitrpg_user_data_display.html', v-once) {{ $t('dataDisplayTool') }} - li - router-link(to="/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac") {{ $t('reportProblem') }} - li - a(href='https://trello.com/c/odmhIqyW/440-read-first-table-of-contents', v-once) {{ $t('requestFeature') }} - li - a(href='', v-html="$t('communityForum')") - li - router-link(to="/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a") {{ $t('askQuestionGuild') }} + sidebar-section(:title="$t('helpfulLinks')") + ul + li + a(href='', @click.prevent='modForm()') {{ $t('contactForm') }} + li + router-link(to='/static/community-guidelines', v-once) {{ $t('communityGuidelinesLink') }} + li + router-link(to="/groups/guild/f2db2a7f-13c5-454d-b3ee-ea1f5089e601") {{ $t('lookingForGroup') }} + li + router-link(to='/static/faq', v-once) {{ $t('faq') }} + li + a(href='', v-html="$t('glossary')") + li + a(href='http://habitica.wikia.com/wiki/Habitica_Wiki', v-once) {{ $t('wiki') }} + li + a(href='https://oldgods.net/habitrpg/habitrpg_user_data_display.html', v-once) {{ $t('dataDisplayTool') }} + li + router-link(to="/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac") {{ $t('reportProblem') }} + li + a(href='https://trello.com/c/odmhIqyW/440-read-first-table-of-contents', v-once) {{ $t('requestFeature') }} + li + a(href='', v-html="$t('communityForum')") + li + router-link(to="/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a") {{ $t('askQuestionGuild') }} - .section-header + sidebar-section(:title="$t('playerTiers')",:last='true') .row - .col-10 - h3(v-once) {{ $t('playerTiers') }} - .col-2 - .toggle-up(@click="sections.playerTiers = !sections.playerTiers", v-if="sections.playerTiers") - .svg-icon(v-html="icons.upIcon") - .toggle-down(@click="sections.playerTiers = !sections.playerTiers", v-if="!sections.playerTiers") - .svg-icon(v-html="icons.downIcon") - .section.row(v-if="sections.playerTiers") .col-12 p(v-once) {{ $t('playerTiersDesc') }} ul.tier-list @@ -267,10 +241,6 @@ width: 100%; } - .section-header { - margin-top: 2em; - } - .grassy-meadow-backdrop { background-image: url('~assets/images/npc/#{$npc_tavern_flavor}/tavern_background.png'); background-repeat: repeat-x; @@ -525,17 +495,16 @@ import autocomplete from '../chat/autoComplete'; import communityGuidelines from './communityGuidelines'; import worldBossInfoModal from '../world-boss/worldBossInfoModal'; import worldBossRageModal from '../world-boss/worldBossRageModal'; +import sidebarSection from '../sidebarSection'; import challengeIcon from 'assets/svg/challenge.svg'; import chevronIcon from 'assets/svg/chevron-red.svg'; -import downIcon from 'assets/svg/down.svg'; import gemIcon from 'assets/svg/gem.svg'; import healthIcon from 'assets/svg/health.svg'; import informationIconRed from 'assets/svg/information-red.svg'; import questBackground from 'assets/svg/quest-background-border.svg'; import rageIcon from 'assets/svg/rage.svg'; import swordIcon from 'assets/svg/sword.svg'; -import upIcon from 'assets/svg/up.svg'; import tier1 from 'assets/svg/tier-1.svg'; import tier2 from 'assets/svg/tier-2.svg'; @@ -557,6 +526,7 @@ export default { communityGuidelines, worldBossInfoModal, worldBossRageModal, + sidebarSection, }, data () { return { @@ -564,7 +534,6 @@ export default { icons: Object.freeze({ challengeIcon, chevronIcon, - downIcon, gem: gemIcon, healthIcon, informationIcon: informationIconRed, @@ -581,15 +550,11 @@ export default { tierMod, tierNPC, tierStaff, - upIcon, }), group: { chat: [], }, sections: { - staff: true, - helpfulLinks: true, - playerTiers: true, worldBoss: true, }, staff: [ From 129fccf646abf0dd7354eecd4dd5cc29b564f501 Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Tue, 1 May 2018 21:36:23 +0200 Subject: [PATCH 08/76] Guild category tags and challenge category tags have now the same styling. --- website/client/assets/scss/categories.scss | 10 +++++ .../components/challenges/challengeItem.vue | 40 +++++-------------- .../components/groups/publicGuildItem.vue | 13 +++++- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/website/client/assets/scss/categories.scss b/website/client/assets/scss/categories.scss index 7317e9ee5e..cd0b4c4c4e 100644 --- a/website/client/assets/scss/categories.scss +++ b/website/client/assets/scss/categories.scss @@ -23,6 +23,16 @@ color: $gray-300; } +.category-label-purple { + color: white; + background: $purple-300; +} + +.category-label-blue { + color: white; + background: $blue-50; +} + .category-select { border-radius: 2px; background-color: $white; diff --git a/website/client/components/challenges/challengeItem.vue b/website/client/components/challenges/challengeItem.vue index c92c2fa2d9..4932b86d9d 100644 --- a/website/client/components/challenges/challengeItem.vue +++ b/website/client/components/challenges/challengeItem.vue @@ -26,9 +26,9 @@ .svg-icon(v-html="icons.calendarIcon") strong.mx-1 {{ $t('endDate')}}: span {{challenge.endDate}} - .tags - span.tag.tag-blue(v-if='isLeader(challenge)') {{ $t('owned') }} - span.tag(v-for='category in challenge.categories', :class="{'tag-purple':isOfficial(category)}") {{ $t(category.name) }} + .categories + span.category-label.category-label-blue(v-if='isLeader(challenge)') {{ $t('owned') }} + span.category-label(v-for='category in challenge.categories', :class="{'category-label-purple':isOfficial(category)}") {{ $t(category.name) }} .challenge-description {{challenge.summary}} .well-wrapper(v-if="fullLayout") .well @@ -104,7 +104,7 @@ display: inline-block; float: right; padding: 1em 1.5em; - margin-left: 1.5em; + margin-left: 1em; background: #eefaf6; border-bottom-left-radius: .3em; @@ -129,7 +129,7 @@ .meta, .owner { display: flex; align-items: center; - overflow: visible; + flex-wrap: wrap; } .meta-item, .owner-item { @@ -165,33 +165,15 @@ width: 26px; } - .tags { + .categories { + clear: right; display: flex; - padding: 0 1em 1em; + padding: 0 1.5em 1em; + flex-wrap: wrap; } - .tag { - box-shadow: none !important; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - border-radius: 1em; - color: $gray-200; - background: $gray-500; - padding: .2em .8em; - margin-left: .3em; - font-weight: 600; - font-size: .9em - } - - .tag-purple { - color: white; - background: $purple-300; - } - - .tag-blue { - color: white; - background: $blue-50; + .category-label { + margin-top: .5em; } .challenge-description { diff --git a/website/client/components/groups/publicGuildItem.vue b/website/client/components/groups/publicGuildItem.vue index f01ccded7d..db28020e6e 100644 --- a/website/client/components/groups/publicGuildItem.vue +++ b/website/client/components/groups/publicGuildItem.vue @@ -25,7 +25,11 @@ router-link.card-link(:to="{ name: 'guild', params: { groupId: guild._id } }") div.guild-bank(v-if='displayGemBank', v-once) {{$t('guildBank')}} .row .col-md-12 - .category-label(v-for="category in guild.categorySlugs") + .category-label.category-label-blue(v-if='isLeader(guild)') {{ $t('owned') }} + .category-label( + v-for="category in guild.categorySlugs" + :class="{'category-label-purple': isOfficial(category)}" + ) | {{$t(category)}} span.recommend-text(v-if='showSuggested(guild._id)') Suggested because you’re new to Habitica. @@ -176,6 +180,13 @@ export default { // @TODO: ask about challenges when we add challenges await this.$store.dispatch('guilds:leave', {groupId: this.guild._id, type: 'myGuilds'}); }, + isLeader (guild) { + if (!guild.leader) return false; + return this.user._id === guild.leader; + }, + isOfficial (category) { + return category === 'habitica_official'; + }, }, }; From 6af50c9f2fb4531ddae7b8db692b7d6d58f85611 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 6 May 2018 15:12:00 -0500 Subject: [PATCH 09/76] Payment refactor (#10325) * Rarranged payment index functions * Moved gem function * Increased buy gems test coverage * Reduced length of functions. Reduced cognitive complexity --- gulp/gulp-tests.js | 2 +- .../v3/unit/libs/payments/payments.test.js | 9 + website/server/libs/payments/gems.js | 97 +++ website/server/libs/payments/groupPayments.js | 242 +++++++ website/server/libs/payments/payments.js | 612 +----------------- website/server/libs/payments/subscriptions.js | 322 +++++++++ 6 files changed, 688 insertions(+), 596 deletions(-) create mode 100644 website/server/libs/payments/gems.js create mode 100644 website/server/libs/payments/groupPayments.js create mode 100644 website/server/libs/payments/subscriptions.js diff --git a/gulp/gulp-tests.js b/gulp/gulp-tests.js index 4a38458d83..d805765b86 100644 --- a/gulp/gulp-tests.js +++ b/gulp/gulp-tests.js @@ -167,7 +167,7 @@ gulp.task('test:content:safe', gulp.series('test:prepare:build', (cb) => { gulp.task('test:api-v3:unit', (done) => { let runner = exec( - testBin('node_modules/.bin/istanbul cover --dir coverage/api-v3-unit --report lcovonly node_modules/mocha/bin/_mocha -- test/api/v3/unit --recursive --require ./test/helpers/start-server'), + testBin('node_modules/.bin/istanbul cover --dir coverage/api-v3-unit node_modules/mocha/bin/_mocha -- test/api/v3/unit --recursive --require ./test/helpers/start-server'), (err) => { if (err) { process.exit(1); diff --git a/test/api/v3/unit/libs/payments/payments.test.js b/test/api/v3/unit/libs/payments/payments.test.js index 85e6d91676..d67c51afe2 100644 --- a/test/api/v3/unit/libs/payments/payments.test.js +++ b/test/api/v3/unit/libs/payments/payments.test.js @@ -632,6 +632,15 @@ describe('payments/index', () => { expect(user.sendMessage).to.be.calledWith(recipient, { receiverMsg: msg, senderMsg: msg }); }); + it('sends a message from purchaser to recipient wtih custom message', async () => { + data.gift.message = 'giftmessage'; + + await api.buyGems(data); + + const msg = `\`Hello recipient, sender has sent you 4 gems!\` ${data.gift.message}`; + expect(user.sendMessage).to.be.calledWith(recipient, { receiverMsg: msg, senderMsg: msg }); + }); + it('sends a push notification if user did not gift to self', async () => { await api.buyGems(data); expect(notifications.sendNotification).to.be.calledOnce; diff --git a/website/server/libs/payments/gems.js b/website/server/libs/payments/gems.js new file mode 100644 index 0000000000..7e0bfa6c51 --- /dev/null +++ b/website/server/libs/payments/gems.js @@ -0,0 +1,97 @@ +import analytics from '../analyticsService'; +import { + getUserInfo, + sendTxn as txnEmail, +} from '../email'; +import { sendNotification as sendPushNotification } from '../pushNotifications'; +import shared from '../../../common'; + +function getGiftMessage (data, byUsername, gemAmount, language) { + const senderMsg = shared.i18n.t('giftedGemsFull', { + username: data.gift.member.profile.name, + sender: byUsername, + gemAmount, + }, language); + + const quotedMessage = `\`${senderMsg}\``; + + if (data.gift.message) return `${quotedMessage} ${data.gift.message}`; + + return quotedMessage; +} + +async function buyGemGift (data) { + const byUsername = getUserInfo(data.user, ['name']).name; + const gemAmount = data.gift.gems.amount || 20; + + const languages = [data.user.preferences.language, data.gift.member.preferences.language]; + + const senderMsg = getGiftMessage(data, byUsername, gemAmount, languages[0]); + const receiverMsg = getGiftMessage(data, byUsername, gemAmount, languages[1]); + data.user.sendMessage(data.gift.member, { receiverMsg, senderMsg }); + + if (data.gift.member.preferences.emailNotifications.giftedGems !== false) { + txnEmail(data.gift.member, 'gifted-gems', [ + {name: 'GIFTER', content: byUsername}, + {name: 'X_GEMS_GIFTED', content: gemAmount}, + ]); + } + + // Only send push notifications if sending to a user other than yourself + if (data.gift.member._id !== data.user._id && data.gift.member.preferences.pushNotifications.giftedGems !== false) { + sendPushNotification( + data.gift.member, + { + title: shared.i18n.t('giftedGems', languages[1]), + message: shared.i18n.t('giftedGemsInfo', {amount: gemAmount, name: byUsername}, languages[1]), + identifier: 'giftedGems', + } + ); + } + + await data.gift.member.save(); +} + +function getAmountForGems (data) { + const amount = data.amount || 5; + + if (data.gift) return data.gift.gems.amount / 4; + + return amount; +} + +function updateUserBalance (data, amount) { + if (data.gift) { + data.gift.member.balance += amount; + return; + } + + data.user.balance += amount; +} + +async function buyGems (data) { + const amt = getAmountForGems(data); + + updateUserBalance(data, amt); + data.user.purchased.txnCount++; + + if (!data.gift) txnEmail(data.user, 'donation'); + + analytics.trackPurchase({ + uuid: data.user._id, + itemPurchased: 'Gems', + sku: `${data.paymentMethod.toLowerCase()}-checkout`, + purchaseType: 'checkout', + paymentMethod: data.paymentMethod, + quantity: 1, + gift: Boolean(data.gift), + purchaseValue: amt, + headers: data.headers, + }); + + if (data.gift) await buyGemGift(data); + + await data.user.save(); +} + +module.exports = { buyGems }; diff --git a/website/server/libs/payments/groupPayments.js b/website/server/libs/payments/groupPayments.js new file mode 100644 index 0000000000..539200fe55 --- /dev/null +++ b/website/server/libs/payments/groupPayments.js @@ -0,0 +1,242 @@ +import nconf from 'nconf'; +import _ from 'lodash'; +import moment from 'moment'; + +import { model as User } from '../../models/user'; +import { + model as Group, + basicFields as basicGroupFields, +} from '../../models/group'; +import { + getUserInfo, + sendTxn as txnEmail, +} from '../email'; + +const TECH_ASSISTANCE_EMAIL = nconf.get('EMAILS:TECH_ASSISTANCE_EMAIL'); +const JOINED_GROUP_PLAN = 'joined group plan'; + +function _dateDiff (earlyDate, lateDate) { + if (!earlyDate || !lateDate || moment(lateDate).isBefore(earlyDate)) return 0; + + return moment(lateDate).diff(earlyDate, 'months', true); +} + +/** + * Add a subscription to members of a group + * + * @param group The Group Model that is subscribed to a group plan + * + * @return undefined + */ +async function addSubscriptionToGroupUsers (group) { + let members; + if (group.type === 'guild') { + members = await User.find({guilds: group._id}).select('_id purchased items auth profile.name notifications').exec(); + } else { + members = await User.find({'party._id': group._id}).select('_id purchased items auth profile.name notifications').exec(); + } + + let promises = members.map((member) => { + return this.addSubToGroupUser(member, group); + }); + + await Promise.all(promises); +} + +/** + * Add a subscription to a new member of a group + * + * @param member The new member of the group + * + * @return undefined + */ +async function addSubToGroupUser (member, group) { + // These EMAIL_TEMPLATE constants are used to pass strings into templates that are + // stored externally and so their values must not be changed. + const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE = 'Google_subscription'; + const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_IOS = 'iOS_subscription'; + const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GROUP_PLAN = 'group_plan_free_subscription'; + const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_LIFETIME_FREE = 'lifetime_free_subscription'; + const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL = 'normal_subscription'; + const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_UNKNOWN = 'unknown_type_of_subscription'; + const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE = 'no_subscription'; + + // When changing customerIdsToIgnore or paymentMethodsToIgnore, the code blocks below for + // the `group-member-join` email template will probably need to be changed. + let customerIdsToIgnore = [this.constants.GROUP_PLAN_CUSTOMER_ID, this.constants.UNLIMITED_CUSTOMER_ID]; + let paymentMethodsToIgnore = [this.constants.GOOGLE_PAYMENT_METHOD, this.constants.IOS_PAYMENT_METHOD]; + let previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE; + let leader = await User.findById(group.leader).exec(); + + let data = { + user: {}, + sub: { + key: 'group_plan_auto', + }, + customerId: 'group-plan', + paymentMethod: 'Group Plan', + headers: {}, + }; + + let plan = { + planId: 'group_plan_auto', + customerId: 'group-plan', + dateUpdated: new Date(), + gemsBought: 0, + paymentMethod: 'groupPlan', + extraMonths: 0, + dateTerminated: null, + lastBillingDate: null, + dateCreated: new Date(), + mysteryItems: [], + consecutive: { + trinkets: 0, + offset: 0, + gemCapExtra: 0, + }, + }; + + let memberPlan = member.purchased.plan; + if (member.isSubscribed()) { + let customerHasCancelledGroupPlan = memberPlan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID && !member.hasNotCancelled(); + let ignorePaymentPlan = paymentMethodsToIgnore.indexOf(memberPlan.paymentMethod) !== -1; + let ignoreCustomerId = customerIdsToIgnore.indexOf(memberPlan.customerId) !== -1; + + if (ignorePaymentPlan) { + txnEmail({email: TECH_ASSISTANCE_EMAIL}, 'admin-user-subscription-details', [ + {name: 'PROFILE_NAME', content: member.profile.name}, + {name: 'UUID', content: member._id}, + {name: 'EMAIL', content: getUserInfo(member, ['email']).email}, + {name: 'PAYMENT_METHOD', content: memberPlan.paymentMethod}, + {name: 'PURCHASED_PLAN', content: JSON.stringify(memberPlan)}, + {name: 'ACTION_NEEDED', content: 'User has joined group plan and has been told to cancel their subscription then email us. Ensure they do that then give them free sub.'}, + // TODO User won't get email instructions if they've opted out of all emails. See if we can make this email an exception and if not, report here whether they've opted out. + ]); + } + + if ((ignorePaymentPlan || ignoreCustomerId) && !customerHasCancelledGroupPlan) { + // member has been added to group plan but their subscription will not be changed + // automatically so they need a special message in the email + if (memberPlan.paymentMethod === this.constants.GOOGLE_PAYMENT_METHOD) { + previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE; + } else if (memberPlan.paymentMethod === this.constants.IOS_PAYMENT_METHOD) { + previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_IOS; + } else if (memberPlan.customerId === this.constants.UNLIMITED_CUSTOMER_ID) { + previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_LIFETIME_FREE; + } else if (memberPlan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID) { + previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GROUP_PLAN; + } else { + // this triggers a generic message in the email template in case we forget + // to update this code for new special cases + previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_UNKNOWN; + } + txnEmail(member, 'group-member-join', [ + {name: 'LEADER', content: leader.profile.name}, + {name: 'GROUP_NAME', content: group.name}, + {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: previousSubscriptionType}, + ]); + return; + } + + if (member.hasNotCancelled()) { + await member.cancelSubscription({cancellationReason: JOINED_GROUP_PLAN}); + previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL; + } + + let today = new Date(); + plan = member.purchased.plan.toObject(); + let extraMonths = Number(plan.extraMonths); + if (plan.dateTerminated) extraMonths += _dateDiff(today, plan.dateTerminated); + + _(plan).merge({ // override with these values + planId: 'group_plan_auto', + customerId: 'group-plan', + dateUpdated: today, + paymentMethod: 'groupPlan', + extraMonths, + dateTerminated: null, + lastBillingDate: null, + owner: member._id, + }).defaults({ // allow non-override if a plan was previously used + gemsBought: 0, + dateCreated: today, + mysteryItems: [], + }).value(); + } + + // save unused hourglass and mystery items + plan.consecutive.trinkets = memberPlan.consecutive.trinkets; + plan.mysteryItems = memberPlan.mysteryItems; + + member.purchased.plan = plan; + member.items.mounts['Jackalope-RoyalPurple'] = true; + + data.user = member; + await this.createSubscription(data); + + txnEmail(data.user, 'group-member-join', [ + {name: 'LEADER', content: leader.profile.name}, + {name: 'GROUP_NAME', content: group.name}, + {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: previousSubscriptionType}, + ]); +} + +/** + * Cancels subscriptions of members of a group + * + * @param group The Group Model that is cancelling a group plan + * + * @return undefined + */ +async function cancelGroupUsersSubscription (group) { + let members; + if (group.type === 'guild') { + members = await User.find({guilds: group._id}).select('_id guilds purchased').exec(); + } else { + members = await User.find({'party._id': group._id}).select('_id guilds purchased').exec(); + } + + let promises = members.map((member) => { + return this.cancelGroupSubscriptionForUser(member, group); + }); + + await Promise.all(promises); +} + +async function cancelGroupSubscriptionForUser (user, group, userWasRemoved = false) { + if (user.purchased.plan.customerId !== this.constants.GROUP_PLAN_CUSTOMER_ID) return; + + let userGroups = user.guilds.toObject(); + userGroups.push('party'); + + let index = userGroups.indexOf(group._id); + userGroups.splice(index, 1); + + let groupPlansQuery = { + type: {$in: ['guild', 'party']}, + // privacy: 'private', + _id: {$in: userGroups}, + 'purchased.plan.dateTerminated': null, + }; + + let groupFields = `${basicGroupFields} purchased`; + let userGroupPlans = await Group.find(groupPlansQuery).select(groupFields).exec(); + + if (userGroupPlans.length === 0) { + let leader = await User.findById(group.leader).exec(); + const email = userWasRemoved ? 'group-member-removed' : 'group-member-cancel'; + + txnEmail(user, email, [ + {name: 'LEADER', content: leader.profile.name}, + {name: 'GROUP_NAME', content: group.name}, + ]); + await this.cancelSubscription({user}); + } +} + +module.exports = { + addSubscriptionToGroupUsers, + addSubToGroupUser, + cancelGroupUsersSubscription, + cancelGroupSubscriptionForUser, +}; diff --git a/website/server/libs/payments/payments.js b/website/server/libs/payments/payments.js index ecc790c468..da3e189d70 100644 --- a/website/server/libs/payments/payments.js +++ b/website/server/libs/payments/payments.js @@ -1,26 +1,16 @@ -import _ from 'lodash'; -import nconf from 'nconf'; -import analytics from '../analyticsService'; import { - getUserInfo, - sendTxn as txnEmail, -} from '../email'; -import moment from 'moment'; -import { sendNotification as sendPushNotification } from '../pushNotifications'; -import shared from '../../../common'; + addSubscriptionToGroupUsers, + addSubToGroupUser, + cancelGroupUsersSubscription, + cancelGroupSubscriptionForUser, +} from './groupPayments'; import { - model as Group, - basicFields as basicGroupFields, -} from '../../models/group'; -import { model as User } from '../../models/user'; + createSubscription, + cancelSubscription, +} from './subscriptions'; import { - NotAuthorized, - NotFound, -} from '../errors'; -import slack from '../slack'; - -const TECH_ASSISTANCE_EMAIL = nconf.get('EMAILS:TECH_ASSISTANCE_EMAIL'); -const JOINED_GROUP_PLAN = 'joined group plan'; + buyGems, +} from './gems'; let api = {}; @@ -32,586 +22,18 @@ api.constants = { IOS_PAYMENT_METHOD: 'Apple', }; -function revealMysteryItems (user) { - const pushedItems = []; +api.addSubscriptionToGroupUsers = addSubscriptionToGroupUsers; - _.each(shared.content.gear.flat, function findMysteryItems (item) { - if ( - item.klass === 'mystery' && - moment().isAfter(shared.content.mystery[item.mystery].start) && - moment().isBefore(shared.content.mystery[item.mystery].end) && - !user.items.gear.owned[item.key] && - user.purchased.plan.mysteryItems.indexOf(item.key) === -1 - ) { - user.purchased.plan.mysteryItems.push(item.key); - pushedItems.push(item.key); - } - }); +api.addSubToGroupUser = addSubToGroupUser; - user.addNotification('NEW_MYSTERY_ITEMS', { items: pushedItems }); -} +api.cancelGroupUsersSubscription = cancelGroupUsersSubscription; -function _dateDiff (earlyDate, lateDate) { - if (!earlyDate || !lateDate || moment(lateDate).isBefore(earlyDate)) return 0; +api.cancelGroupSubscriptionForUser = cancelGroupSubscriptionForUser; - return moment(lateDate).diff(earlyDate, 'months', true); -} +api.createSubscription = createSubscription; -/** - * Add a subscription to members of a group - * - * @param group The Group Model that is subscribed to a group plan - * - * @return undefined - */ -api.addSubscriptionToGroupUsers = async function addSubscriptionToGroupUsers (group) { - let members; - if (group.type === 'guild') { - members = await User.find({guilds: group._id}).select('_id purchased items auth profile.name notifications').exec(); - } else { - members = await User.find({'party._id': group._id}).select('_id purchased items auth profile.name notifications').exec(); - } +api.cancelSubscription = cancelSubscription; - let promises = members.map((member) => { - return this.addSubToGroupUser(member, group); - }); - - await Promise.all(promises); -}; - -/** - * Add a subscription to a new member of a group - * - * @param member The new member of the group - * - * @return undefined - */ -api.addSubToGroupUser = async function addSubToGroupUser (member, group) { - // These EMAIL_TEMPLATE constants are used to pass strings into templates that are - // stored externally and so their values must not be changed. - const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE = 'Google_subscription'; - const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_IOS = 'iOS_subscription'; - const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GROUP_PLAN = 'group_plan_free_subscription'; - const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_LIFETIME_FREE = 'lifetime_free_subscription'; - const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL = 'normal_subscription'; - const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_UNKNOWN = 'unknown_type_of_subscription'; - const EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE = 'no_subscription'; - - // When changing customerIdsToIgnore or paymentMethodsToIgnore, the code blocks below for - // the `group-member-join` email template will probably need to be changed. - let customerIdsToIgnore = [this.constants.GROUP_PLAN_CUSTOMER_ID, this.constants.UNLIMITED_CUSTOMER_ID]; - let paymentMethodsToIgnore = [this.constants.GOOGLE_PAYMENT_METHOD, this.constants.IOS_PAYMENT_METHOD]; - let previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NONE; - let leader = await User.findById(group.leader).exec(); - - let data = { - user: {}, - sub: { - key: 'group_plan_auto', - }, - customerId: 'group-plan', - paymentMethod: 'Group Plan', - headers: {}, - }; - - let plan = { - planId: 'group_plan_auto', - customerId: 'group-plan', - dateUpdated: new Date(), - gemsBought: 0, - paymentMethod: 'groupPlan', - extraMonths: 0, - dateTerminated: null, - lastBillingDate: null, - dateCreated: new Date(), - mysteryItems: [], - consecutive: { - trinkets: 0, - offset: 0, - gemCapExtra: 0, - }, - }; - - let memberPlan = member.purchased.plan; - if (member.isSubscribed()) { - let customerHasCancelledGroupPlan = memberPlan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID && !member.hasNotCancelled(); - let ignorePaymentPlan = paymentMethodsToIgnore.indexOf(memberPlan.paymentMethod) !== -1; - let ignoreCustomerId = customerIdsToIgnore.indexOf(memberPlan.customerId) !== -1; - - if (ignorePaymentPlan) { - txnEmail({email: TECH_ASSISTANCE_EMAIL}, 'admin-user-subscription-details', [ - {name: 'PROFILE_NAME', content: member.profile.name}, - {name: 'UUID', content: member._id}, - {name: 'EMAIL', content: getUserInfo(member, ['email']).email}, - {name: 'PAYMENT_METHOD', content: memberPlan.paymentMethod}, - {name: 'PURCHASED_PLAN', content: JSON.stringify(memberPlan)}, - {name: 'ACTION_NEEDED', content: 'User has joined group plan and has been told to cancel their subscription then email us. Ensure they do that then give them free sub.'}, - // TODO User won't get email instructions if they've opted out of all emails. See if we can make this email an exception and if not, report here whether they've opted out. - ]); - } - - if ((ignorePaymentPlan || ignoreCustomerId) && !customerHasCancelledGroupPlan) { - // member has been added to group plan but their subscription will not be changed - // automatically so they need a special message in the email - if (memberPlan.paymentMethod === this.constants.GOOGLE_PAYMENT_METHOD) { - previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GOOGLE; - } else if (memberPlan.paymentMethod === this.constants.IOS_PAYMENT_METHOD) { - previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_IOS; - } else if (memberPlan.customerId === this.constants.UNLIMITED_CUSTOMER_ID) { - previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_LIFETIME_FREE; - } else if (memberPlan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID) { - previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_GROUP_PLAN; - } else { - // this triggers a generic message in the email template in case we forget - // to update this code for new special cases - previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_UNKNOWN; - } - txnEmail(member, 'group-member-join', [ - {name: 'LEADER', content: leader.profile.name}, - {name: 'GROUP_NAME', content: group.name}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: previousSubscriptionType}, - ]); - return; - } - - if (member.hasNotCancelled()) { - await member.cancelSubscription({cancellationReason: JOINED_GROUP_PLAN}); - previousSubscriptionType = EMAIL_TEMPLATE_SUBSCRIPTION_TYPE_NORMAL; - } - - let today = new Date(); - plan = member.purchased.plan.toObject(); - let extraMonths = Number(plan.extraMonths); - if (plan.dateTerminated) extraMonths += _dateDiff(today, plan.dateTerminated); - - _(plan).merge({ // override with these values - planId: 'group_plan_auto', - customerId: 'group-plan', - dateUpdated: today, - paymentMethod: 'groupPlan', - extraMonths, - dateTerminated: null, - lastBillingDate: null, - owner: member._id, - }).defaults({ // allow non-override if a plan was previously used - gemsBought: 0, - dateCreated: today, - mysteryItems: [], - }).value(); - } - - // save unused hourglass and mystery items - plan.consecutive.trinkets = memberPlan.consecutive.trinkets; - plan.mysteryItems = memberPlan.mysteryItems; - - member.purchased.plan = plan; - member.items.mounts['Jackalope-RoyalPurple'] = true; - - data.user = member; - await this.createSubscription(data); - - txnEmail(data.user, 'group-member-join', [ - {name: 'LEADER', content: leader.profile.name}, - {name: 'GROUP_NAME', content: group.name}, - {name: 'PREVIOUS_SUBSCRIPTION_TYPE', content: previousSubscriptionType}, - ]); -}; - - -/** - * Cancels subscriptions of members of a group - * - * @param group The Group Model that is cancelling a group plan - * - * @return undefined - */ -api.cancelGroupUsersSubscription = async function cancelGroupUsersSubscription (group) { - let members; - if (group.type === 'guild') { - members = await User.find({guilds: group._id}).select('_id guilds purchased').exec(); - } else { - members = await User.find({'party._id': group._id}).select('_id guilds purchased').exec(); - } - - let promises = members.map((member) => { - return this.cancelGroupSubscriptionForUser(member, group); - }); - - await Promise.all(promises); -}; - -api.cancelGroupSubscriptionForUser = async function cancelGroupSubscriptionForUser (user, group, userWasRemoved = false) { - if (user.purchased.plan.customerId !== this.constants.GROUP_PLAN_CUSTOMER_ID) return; - - let userGroups = user.guilds.toObject(); - userGroups.push('party'); - - let index = userGroups.indexOf(group._id); - userGroups.splice(index, 1); - - let groupPlansQuery = { - type: {$in: ['guild', 'party']}, - // privacy: 'private', - _id: {$in: userGroups}, - 'purchased.plan.dateTerminated': null, - }; - - let groupFields = `${basicGroupFields} purchased`; - let userGroupPlans = await Group.find(groupPlansQuery).select(groupFields).exec(); - - if (userGroupPlans.length === 0) { - let leader = await User.findById(group.leader).exec(); - const email = userWasRemoved ? 'group-member-removed' : 'group-member-cancel'; - - txnEmail(user, email, [ - {name: 'LEADER', content: leader.profile.name}, - {name: 'GROUP_NAME', content: group.name}, - ]); - await this.cancelSubscription({user}); - } -}; - -api.createSubscription = async function createSubscription (data) { - let recipient = data.gift ? data.gift.member : data.user; - let block = shared.content.subscriptionBlocks[data.gift ? data.gift.subscription.key : data.sub.key]; - let months = Number(block.months); - let today = new Date(); - let plan; - let group; - let groupId; - let itemPurchased = 'Subscription'; - let purchaseType = 'subscribe'; - let emailType = 'subscription-begins'; - - // If we are buying a group subscription - if (data.groupId) { - let groupFields = basicGroupFields.concat(' purchased'); - group = await Group.getGroup({user: data.user, groupId: data.groupId, populateLeader: false, groupFields}); - - if (!group) { - throw new NotFound(shared.i18n.t('groupNotFound')); - } - - if (!group.leader === data.user._id) { - throw new NotAuthorized(shared.i18n.t('onlyGroupLeaderCanManageSubscription')); - } - - recipient = group; - itemPurchased = 'Group-Subscription'; - purchaseType = 'group-subscribe'; - emailType = 'group-subscription-begins'; - groupId = group._id; - recipient.purchased.plan.quantity = data.sub.quantity; - - await this.addSubscriptionToGroupUsers(group); - } - - plan = recipient.purchased.plan; - - if (data.gift) { - if (plan.customerId && !plan.dateTerminated) { // User has active plan - plan.extraMonths += months; - } else { - if (!recipient.isSubscribed() || !plan.dateUpdated) plan.dateUpdated = today; - if (moment(plan.dateTerminated).isAfter()) { - plan.dateTerminated = moment(plan.dateTerminated).add({months}).toDate(); - } else { - plan.dateTerminated = moment().add({months}).toDate(); - plan.dateCreated = today; - } - } - - if (!plan.customerId) plan.customerId = 'Gift'; // don't override existing customer, but all sub need a customerId - } else { - if (!plan.dateTerminated) plan.dateTerminated = today; - - Object.assign(plan, { // override plan with new values - planId: block.key, - customerId: data.customerId, - dateUpdated: today, - paymentMethod: data.paymentMethod, - extraMonths: Number(plan.extraMonths) + _dateDiff(today, plan.dateTerminated), - dateTerminated: null, - // Specify a lastBillingDate just for Amazon Payments - // Resetted every time the subscription restarts - lastBillingDate: data.paymentMethod === 'Amazon Payments' ? today : undefined, - nextPaymentProcessing: data.nextPaymentProcessing, - nextBillingDate: data.nextBillingDate, - additionalData: data.additionalData, - owner: data.user._id, - }); - - // allow non-override if a plan was previously used - if (!plan.gemsBought) plan.gemsBought = 0; - if (!plan.dateCreated) plan.dateCreated = today; - if (!plan.mysteryItems) plan.mysteryItems = []; - - if (data.subscriptionId) { - plan.subscriptionId = data.subscriptionId; - } - } - - // Block sub perks - let perks = Math.floor(months / 3); - if (perks) { - plan.consecutive.offset += months; - plan.consecutive.gemCapExtra += perks * 5; - if (plan.consecutive.gemCapExtra > 25) plan.consecutive.gemCapExtra = 25; - plan.consecutive.trinkets += perks; - } - - if (recipient !== group) { - recipient.items.pets['Jackalope-RoyalPurple'] = 5; - revealMysteryItems(recipient); - } - - // @TODO: Create a factory pattern for use cases - if (!data.gift && data.customerId !== this.constants.GROUP_PLAN_CUSTOMER_ID) { - txnEmail(data.user, emailType); - } - - analytics.trackPurchase({ - uuid: data.user._id, - groupId, - itemPurchased, - sku: `${data.paymentMethod.toLowerCase()}-subscription`, - purchaseType, - paymentMethod: data.paymentMethod, - quantity: 1, - gift: Boolean(data.gift), - purchaseValue: block.price, - headers: data.headers, - }); - - if (!group) data.user.purchased.txnCount++; - - if (data.gift) { - let byUserName = getUserInfo(data.user, ['name']).name; - - // generate the message in both languages, so both users can understand it - let languages = [data.user.preferences.language, data.gift.member.preferences.language]; - let senderMsg = shared.i18n.t('giftedSubscriptionFull', { - username: data.gift.member.profile.name, - sender: byUserName, - monthCount: shared.content.subscriptionBlocks[data.gift.subscription.key].months, - }, languages[0]); - senderMsg = `\`${senderMsg}\``; - - let receiverMsg = shared.i18n.t('giftedSubscriptionFull', { - username: data.gift.member.profile.name, - sender: byUserName, - monthCount: shared.content.subscriptionBlocks[data.gift.subscription.key].months, - }, languages[1]); - receiverMsg = `\`${receiverMsg}\``; - - if (data.gift.message) { - receiverMsg += ` ${data.gift.message}`; - senderMsg += ` ${data.gift.message}`; - } - - data.user.sendMessage(data.gift.member, { receiverMsg, senderMsg }); - - if (data.gift.member.preferences.emailNotifications.giftedSubscription !== false) { - txnEmail(data.gift.member, 'gifted-subscription', [ - {name: 'GIFTER', content: byUserName}, - {name: 'X_MONTHS_SUBSCRIPTION', content: months}, - ]); - } - - if (data.gift.member._id !== data.user._id) { // Only send push notifications if sending to a user other than yourself - if (data.gift.member.preferences.pushNotifications.giftedSubscription !== false) { - sendPushNotification(data.gift.member, - { - title: shared.i18n.t('giftedSubscription', languages[1]), - message: shared.i18n.t('giftedSubscriptionInfo', {months, name: byUserName}, languages[1]), - identifier: 'giftedSubscription', - payload: {replyTo: data.user._id}, - } - ); - } - } - } - - if (group) { - await group.save(); - } else { - await data.user.save(); - } - - if (data.gift) await data.gift.member.save(); - - slack.sendSubscriptionNotification({ - buyer: { - id: data.user._id, - name: data.user.profile.name, - email: getUserInfo(data.user, ['email']).email, - }, - recipient: data.gift ? { - id: data.gift.member._id, - name: data.gift.member.profile.name, - email: getUserInfo(data.gift.member, ['email']).email, - } : {}, - paymentMethod: data.paymentMethod, - months: group ? 1 : months, - groupId, - }); -}; - -// Cancels a subscription or group plan, setting termination to happen later -api.cancelSubscription = async function cancelSubscription (data) { - let plan; - let group; - let cancelType = 'unsubscribe'; - let groupId; - let emailType; - let emailMergeData = []; - let sendEmail = true; - - if (data.groupId) { - // cancelling a group plan - let groupFields = basicGroupFields.concat(' purchased'); - group = await Group.getGroup({user: data.user, groupId: data.groupId, populateLeader: false, groupFields}); - - if (!group) { - throw new NotFound(shared.i18n.t('groupNotFound')); - } - - let allowedManagers = [group.leader, group.purchased.plan.owner]; - - if (allowedManagers.indexOf(data.user._id) === -1) { - throw new NotAuthorized(shared.i18n.t('onlyGroupLeaderCanManageSubscription')); - } - plan = group.purchased.plan; - emailType = 'group-cancel-subscription'; - emailMergeData.push({name: 'GROUP_NAME', content: group.name}); - - await this.cancelGroupUsersSubscription(group); - } else { - // cancelling a user subscription - plan = data.user.purchased.plan; - emailType = 'cancel-subscription'; - // When cancelling because the user joined a group plan, no cancel-subscription email is sent - // because the group-member-join email says the subscription is cancelled. - if (data.cancellationReason && data.cancellationReason === JOINED_GROUP_PLAN) sendEmail = false; - } - - let now = moment(); - let defaultRemainingDays = 30; - - if (plan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID) { - defaultRemainingDays = 2; - sendEmail = false; // because group-member-cancel email has already been sent - } - - let remaining = data.nextBill ? moment(data.nextBill).diff(new Date(), 'days', true) : defaultRemainingDays; - if (plan.extraMonths < 0) plan.extraMonths = 0; - let extraDays = Math.ceil(30.5 * plan.extraMonths); - let nowStr = `${now.format('MM')}/${now.format('DD')}/${now.format('YYYY')}`; - let nowStrFormat = 'MM/DD/YYYY'; - - plan.dateTerminated = - moment(nowStr, nowStrFormat) - .add({days: remaining}) - .add({days: extraDays}) - .toDate(); - - plan.extraMonths = 0; // clear extra time. If they subscribe again, it'll be recalculated from p.dateTerminated - - if (group) { - await group.save(); - } else { - await data.user.save(); - } - - if (sendEmail) txnEmail(data.user, emailType, emailMergeData); - - if (group) { - cancelType = 'group-unsubscribe'; - groupId = group._id; - } - - analytics.track(cancelType, { - uuid: data.user._id, - groupId, - gaCategory: 'commerce', - gaLabel: data.paymentMethod, - paymentMethod: data.paymentMethod, - headers: data.headers, - }); -}; - -api.buyGems = async function buyGems (data) { - let amt = data.amount || 5; - amt = data.gift ? data.gift.gems.amount / 4 : amt; - - (data.gift ? data.gift.member : data.user).balance += amt; - data.user.purchased.txnCount++; - - if (!data.gift) txnEmail(data.user, 'donation'); - - analytics.trackPurchase({ - uuid: data.user._id, - itemPurchased: 'Gems', - sku: `${data.paymentMethod.toLowerCase()}-checkout`, - purchaseType: 'checkout', - paymentMethod: data.paymentMethod, - quantity: 1, - gift: Boolean(data.gift), - purchaseValue: amt, - headers: data.headers, - }); - - if (data.gift) { - let byUsername = getUserInfo(data.user, ['name']).name; - let gemAmount = data.gift.gems.amount || 20; - - // generate the message in both languages, so both users can understand it - let languages = [data.user.preferences.language, data.gift.member.preferences.language]; - let senderMsg = shared.i18n.t('giftedGemsFull', { - username: data.gift.member.profile.name, - sender: byUsername, - gemAmount, - }, languages[0]); - senderMsg = `\`${senderMsg}\``; - - let receiverMsg = shared.i18n.t('giftedGemsFull', { - username: data.gift.member.profile.name, - sender: byUsername, - gemAmount, - }, languages[1]); - receiverMsg = `\`${receiverMsg}\``; - - if (data.gift.message) { - receiverMsg += ` ${data.gift.message}`; - senderMsg += ` ${data.gift.message}`; - } - - data.user.sendMessage(data.gift.member, { receiverMsg, senderMsg }); - - if (data.gift.member.preferences.emailNotifications.giftedGems !== false) { - txnEmail(data.gift.member, 'gifted-gems', [ - {name: 'GIFTER', content: byUsername}, - {name: 'X_GEMS_GIFTED', content: gemAmount}, - ]); - } - - if (data.gift.member._id !== data.user._id) { // Only send push notifications if sending to a user other than yourself - if (data.gift.member.preferences.pushNotifications.giftedGems !== false) { - sendPushNotification( - data.gift.member, - { - title: shared.i18n.t('giftedGems', languages[1]), - message: shared.i18n.t('giftedGemsInfo', {amount: gemAmount, name: byUsername}, languages[1]), - identifier: 'giftedGems', - } - ); - } - } - - await data.gift.member.save(); - } - - await data.user.save(); -}; +api.buyGems = buyGems; module.exports = api; diff --git a/website/server/libs/payments/subscriptions.js b/website/server/libs/payments/subscriptions.js new file mode 100644 index 0000000000..43f7b18577 --- /dev/null +++ b/website/server/libs/payments/subscriptions.js @@ -0,0 +1,322 @@ +import _ from 'lodash'; +import moment from 'moment'; + +import analytics from '../analyticsService'; +import slack from '../slack'; +import { + getUserInfo, + sendTxn as txnEmail, +} from '../email'; +import { + model as Group, + basicFields as basicGroupFields, +} from '../../models/group'; +import { + NotAuthorized, + NotFound, +} from '../errors'; +import shared from '../../../common'; +import { sendNotification as sendPushNotification } from '../pushNotifications'; + +// @TODO: Abstract to shared/constant +const JOINED_GROUP_PLAN = 'joined group plan'; + +function revealMysteryItems (user) { + const pushedItems = []; + + _.each(shared.content.gear.flat, function findMysteryItems (item) { + if ( + item.klass === 'mystery' && + moment().isAfter(shared.content.mystery[item.mystery].start) && + moment().isBefore(shared.content.mystery[item.mystery].end) && + !user.items.gear.owned[item.key] && + user.purchased.plan.mysteryItems.indexOf(item.key) === -1 + ) { + user.purchased.plan.mysteryItems.push(item.key); + pushedItems.push(item.key); + } + }); + + user.addNotification('NEW_MYSTERY_ITEMS', { items: pushedItems }); +} + +// @TODO: Abstract to payment helper +function _dateDiff (earlyDate, lateDate) { + if (!earlyDate || !lateDate || moment(lateDate).isBefore(earlyDate)) return 0; + + return moment(lateDate).diff(earlyDate, 'months', true); +} + +async function createSubscription (data) { + let recipient = data.gift ? data.gift.member : data.user; + let block = shared.content.subscriptionBlocks[data.gift ? data.gift.subscription.key : data.sub.key]; + let months = Number(block.months); + let today = new Date(); + let plan; + let group; + let groupId; + let itemPurchased = 'Subscription'; + let purchaseType = 'subscribe'; + let emailType = 'subscription-begins'; + + // If we are buying a group subscription + if (data.groupId) { + let groupFields = basicGroupFields.concat(' purchased'); + group = await Group.getGroup({user: data.user, groupId: data.groupId, populateLeader: false, groupFields}); + + if (!group) { + throw new NotFound(shared.i18n.t('groupNotFound')); + } + + if (!group.leader === data.user._id) { + throw new NotAuthorized(shared.i18n.t('onlyGroupLeaderCanManageSubscription')); + } + + recipient = group; + itemPurchased = 'Group-Subscription'; + purchaseType = 'group-subscribe'; + emailType = 'group-subscription-begins'; + groupId = group._id; + recipient.purchased.plan.quantity = data.sub.quantity; + + await this.addSubscriptionToGroupUsers(group); + } + + plan = recipient.purchased.plan; + + if (data.gift) { + if (plan.customerId && !plan.dateTerminated) { // User has active plan + plan.extraMonths += months; + } else { + if (!recipient.isSubscribed() || !plan.dateUpdated) plan.dateUpdated = today; + if (moment(plan.dateTerminated).isAfter()) { + plan.dateTerminated = moment(plan.dateTerminated).add({months}).toDate(); + } else { + plan.dateTerminated = moment().add({months}).toDate(); + plan.dateCreated = today; + } + } + + if (!plan.customerId) plan.customerId = 'Gift'; // don't override existing customer, but all sub need a customerId + } else { + if (!plan.dateTerminated) plan.dateTerminated = today; + + Object.assign(plan, { // override plan with new values + planId: block.key, + customerId: data.customerId, + dateUpdated: today, + paymentMethod: data.paymentMethod, + extraMonths: Number(plan.extraMonths) + _dateDiff(today, plan.dateTerminated), + dateTerminated: null, + // Specify a lastBillingDate just for Amazon Payments + // Resetted every time the subscription restarts + lastBillingDate: data.paymentMethod === 'Amazon Payments' ? today : undefined, + nextPaymentProcessing: data.nextPaymentProcessing, + nextBillingDate: data.nextBillingDate, + additionalData: data.additionalData, + owner: data.user._id, + }); + + // allow non-override if a plan was previously used + if (!plan.gemsBought) plan.gemsBought = 0; + if (!plan.dateCreated) plan.dateCreated = today; + if (!plan.mysteryItems) plan.mysteryItems = []; + + if (data.subscriptionId) { + plan.subscriptionId = data.subscriptionId; + } + } + + // Block sub perks + let perks = Math.floor(months / 3); + if (perks) { + plan.consecutive.offset += months; + plan.consecutive.gemCapExtra += perks * 5; + if (plan.consecutive.gemCapExtra > 25) plan.consecutive.gemCapExtra = 25; + plan.consecutive.trinkets += perks; + } + + if (recipient !== group) { + recipient.items.pets['Jackalope-RoyalPurple'] = 5; + revealMysteryItems(recipient); + } + + // @TODO: Create a factory pattern for use cases + if (!data.gift && data.customerId !== this.constants.GROUP_PLAN_CUSTOMER_ID) { + txnEmail(data.user, emailType); + } + + analytics.trackPurchase({ + uuid: data.user._id, + groupId, + itemPurchased, + sku: `${data.paymentMethod.toLowerCase()}-subscription`, + purchaseType, + paymentMethod: data.paymentMethod, + quantity: 1, + gift: Boolean(data.gift), + purchaseValue: block.price, + headers: data.headers, + }); + + if (!group) data.user.purchased.txnCount++; + + if (data.gift) { + let byUserName = getUserInfo(data.user, ['name']).name; + + // generate the message in both languages, so both users can understand it + let languages = [data.user.preferences.language, data.gift.member.preferences.language]; + let senderMsg = shared.i18n.t('giftedSubscriptionFull', { + username: data.gift.member.profile.name, + sender: byUserName, + monthCount: shared.content.subscriptionBlocks[data.gift.subscription.key].months, + }, languages[0]); + senderMsg = `\`${senderMsg}\``; + + let receiverMsg = shared.i18n.t('giftedSubscriptionFull', { + username: data.gift.member.profile.name, + sender: byUserName, + monthCount: shared.content.subscriptionBlocks[data.gift.subscription.key].months, + }, languages[1]); + receiverMsg = `\`${receiverMsg}\``; + + if (data.gift.message) { + receiverMsg += ` ${data.gift.message}`; + senderMsg += ` ${data.gift.message}`; + } + + data.user.sendMessage(data.gift.member, { receiverMsg, senderMsg }); + + if (data.gift.member.preferences.emailNotifications.giftedSubscription !== false) { + txnEmail(data.gift.member, 'gifted-subscription', [ + {name: 'GIFTER', content: byUserName}, + {name: 'X_MONTHS_SUBSCRIPTION', content: months}, + ]); + } + + if (data.gift.member._id !== data.user._id) { // Only send push notifications if sending to a user other than yourself + if (data.gift.member.preferences.pushNotifications.giftedSubscription !== false) { + sendPushNotification(data.gift.member, + { + title: shared.i18n.t('giftedSubscription', languages[1]), + message: shared.i18n.t('giftedSubscriptionInfo', {months, name: byUserName}, languages[1]), + identifier: 'giftedSubscription', + payload: {replyTo: data.user._id}, + } + ); + } + } + } + + if (group) { + await group.save(); + } else { + await data.user.save(); + } + + if (data.gift) await data.gift.member.save(); + + slack.sendSubscriptionNotification({ + buyer: { + id: data.user._id, + name: data.user.profile.name, + email: getUserInfo(data.user, ['email']).email, + }, + recipient: data.gift ? { + id: data.gift.member._id, + name: data.gift.member.profile.name, + email: getUserInfo(data.gift.member, ['email']).email, + } : {}, + paymentMethod: data.paymentMethod, + months: group ? 1 : months, + groupId, + }); +} + +// Cancels a subscription or group plan, setting termination to happen later +async function cancelSubscription (data) { + let plan; + let group; + let cancelType = 'unsubscribe'; + let groupId; + let emailType; + let emailMergeData = []; + let sendEmail = true; + + if (data.groupId) { + // cancelling a group plan + let groupFields = basicGroupFields.concat(' purchased'); + group = await Group.getGroup({user: data.user, groupId: data.groupId, populateLeader: false, groupFields}); + + if (!group) { + throw new NotFound(shared.i18n.t('groupNotFound')); + } + + let allowedManagers = [group.leader, group.purchased.plan.owner]; + + if (allowedManagers.indexOf(data.user._id) === -1) { + throw new NotAuthorized(shared.i18n.t('onlyGroupLeaderCanManageSubscription')); + } + plan = group.purchased.plan; + emailType = 'group-cancel-subscription'; + emailMergeData.push({name: 'GROUP_NAME', content: group.name}); + + await this.cancelGroupUsersSubscription(group); + } else { + // cancelling a user subscription + plan = data.user.purchased.plan; + emailType = 'cancel-subscription'; + // When cancelling because the user joined a group plan, no cancel-subscription email is sent + // because the group-member-join email says the subscription is cancelled. + if (data.cancellationReason && data.cancellationReason === JOINED_GROUP_PLAN) sendEmail = false; + } + + let now = moment(); + let defaultRemainingDays = 30; + + if (plan.customerId === this.constants.GROUP_PLAN_CUSTOMER_ID) { + defaultRemainingDays = 2; + sendEmail = false; // because group-member-cancel email has already been sent + } + + let remaining = data.nextBill ? moment(data.nextBill).diff(new Date(), 'days', true) : defaultRemainingDays; + if (plan.extraMonths < 0) plan.extraMonths = 0; + let extraDays = Math.ceil(30.5 * plan.extraMonths); + let nowStr = `${now.format('MM')}/${now.format('DD')}/${now.format('YYYY')}`; + let nowStrFormat = 'MM/DD/YYYY'; + + plan.dateTerminated = + moment(nowStr, nowStrFormat) + .add({days: remaining}) + .add({days: extraDays}) + .toDate(); + + plan.extraMonths = 0; // clear extra time. If they subscribe again, it'll be recalculated from p.dateTerminated + + if (group) { + await group.save(); + } else { + await data.user.save(); + } + + if (sendEmail) txnEmail(data.user, emailType, emailMergeData); + + if (group) { + cancelType = 'group-unsubscribe'; + groupId = group._id; + } + + analytics.track(cancelType, { + uuid: data.user._id, + groupId, + gaCategory: 'commerce', + gaLabel: data.paymentMethod, + paymentMethod: data.paymentMethod, + headers: data.headers, + }); +} + +module.exports = { + createSubscription, + cancelSubscription, +}; From ac451bdb9bc0a669bf2284ae695287ea388c696d Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Sun, 6 May 2018 17:53:49 -0500 Subject: [PATCH 10/76] Removed spell queue (#10337) --- website/client/libs/spellQueue.js | 40 ---------------------------- website/client/store/actions/user.js | 6 ----- 2 files changed, 46 deletions(-) delete mode 100644 website/client/libs/spellQueue.js diff --git a/website/client/libs/spellQueue.js b/website/client/libs/spellQueue.js deleted file mode 100644 index 3fa82c0f97..0000000000 --- a/website/client/libs/spellQueue.js +++ /dev/null @@ -1,40 +0,0 @@ -let store = {}; - -let currentCount = 1; -let currentSpell = { - key: '', -}; -let timer = null; - -// @TODO: We are using this lib in actions, so we have to inject store -function setStore (storeInc) { - store = storeInc; -} - -function castSpell () { - clearTimeout(timer); - - currentSpell.quantity = currentCount; - store.dispatch('user:castSpell', currentSpell); - - currentCount = 0; -} - -function queue (spell, storeInc) { - setStore(storeInc); - - currentCount += 1; - - if (currentSpell.key && spell.key !== currentSpell.key) { - castSpell(); - } - - currentSpell = spell; - - clearTimeout(timer); - timer = setTimeout(() => { - castSpell(); - }, 1500); -} - -export default { queue }; diff --git a/website/client/store/actions/user.js b/website/client/store/actions/user.js index 7c44d90e7e..4edea0983a 100644 --- a/website/client/store/actions/user.js +++ b/website/client/store/actions/user.js @@ -1,5 +1,4 @@ import { loadAsyncResource } from 'client/libs/asyncResource'; -import spellQueue from 'client/libs/spellQueue'; import setProps from 'lodash/set'; import axios from 'axios'; @@ -118,11 +117,6 @@ export async function movePinnedItem (store, params) { } export function castSpell (store, params) { - if (params.pinType !== 'card' && !params.quantity) { - spellQueue.queue({key: params.key, targetId: params.targetId}, store); - return; - } - let spellUrl = `/api/v3/user/class/cast/${params.key}`; const data = {}; From 17001743e1e36c5e53ae0f7716efc3e525254cab Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Mon, 7 May 2018 13:24:48 +0200 Subject: [PATCH 11/76] Changed last prop to :last-of-type --- .../components/challenges/challengeDetail.vue | 12 +++++----- website/client/components/groups/group.vue | 22 +++++++++---------- website/client/components/groups/tavern.vue | 2 +- website/client/components/sidebarSection.vue | 7 ++---- 4 files changed, 19 insertions(+), 24 deletions(-) diff --git a/website/client/components/challenges/challengeDetail.vue b/website/client/components/challenges/challengeDetail.vue index 1d0b737d71..70b9ff2c60 100644 --- a/website/client/components/challenges/challengeDetail.vue +++ b/website/client/components/challenges/challengeDetail.vue @@ -70,13 +70,11 @@ button.btn.btn-primary(v-once, @click='exportChallengeCsv()') {{$t('exportChallengeCsv')}} .button-container(v-if='isLeader || isAdmin') button.btn.btn-danger(v-once, @click='closeChallenge()') {{$t('endChallenge')}} - sidebar-section(:title="$t('challengeSummary')") - p(v-markdown='challenge.summary') - sidebar-section( - :title="$t('challengeDescription')" - :last="true" - ) - p(v-markdown='challenge.description') + div + sidebar-section(:title="$t('challengeSummary')") + p(v-markdown='challenge.summary') + sidebar-section(:title="$t('challengeDescription')") + p(v-markdown='challenge.description') .text-center(v-if='isMember') button.btn.btn-danger(v-once, @click='leaveChallenge()') {{$t('leaveChallenge')}} diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 6bcf92922e..474752907b 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -63,17 +63,17 @@ // @TODO: V2 button.btn.btn-primary(v-once, v-if='!isLeader') {{$t('messageGuildLeader')}} // Suggest making the button visible to the leader too - useful for them to test how the feature works or to send a note to themself. -- Alys .button-container // @TODO: V2 button.btn.btn-primary(v-once, v-if='isMember && !isParty') {{$t('donateGems')}} // Suggest removing the isMember restriction - it's okay if non-members donate to a public guild. Also probably allow it for parties if parties can buy imagery. -- Alys - quest-sidebar-section(:group='group', v-if='isParty') - sidebar-section(:title="$t('guildSummary')", v-if='!isParty') - p(v-markdown='group.summary') - sidebar-section(:title="$t('groupDescription')") - p(v-markdown='group.description') - sidebar-section( - :title="$t('challenges')", - :tooltip="isParty ? $t('challengeDetails') : $t('privateDescription')" - :last="true" - ) - group-challenges(:groupId='searchId') + div + quest-sidebar-section(:group='group', v-if='isParty') + sidebar-section(:title="$t('guildSummary')", v-if='!isParty') + p(v-markdown='group.summary') + sidebar-section(:title="$t('groupDescription')") + p(v-markdown='group.description') + sidebar-section( + :title="$t('challenges')", + :tooltip="isParty ? $t('challengeDetails') : $t('privateDescription')" + ) + group-challenges(:groupId='searchId') div.text-center button.btn.btn-danger(v-if='isMember', @click='clickLeave()') {{ isParty ? $t('leaveParty') : $t('leaveGroup') }} diff --git a/website/client/components/groups/tavern.vue b/website/client/components/groups/tavern.vue index 9fb0924dbf..de390cac93 100644 --- a/website/client/components/groups/tavern.vue +++ b/website/client/components/groups/tavern.vue @@ -138,7 +138,7 @@ li router-link(to="/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a") {{ $t('askQuestionGuild') }} - sidebar-section(:title="$t('playerTiers')",:last='true') + sidebar-section(:title="$t('playerTiers')") .row .col-12 p(v-once) {{ $t('playerTiersDesc') }} diff --git a/website/client/components/sidebarSection.vue b/website/client/components/sidebarSection.vue index 18bdcc9b5a..24f150ef00 100644 --- a/website/client/components/sidebarSection.vue +++ b/website/client/components/sidebarSection.vue @@ -1,5 +1,5 @@ \ No newline at end of file diff --git a/website/client/components/challenges/challengeItem.vue b/website/client/components/challenges/challengeItem.vue index 81cc9b0bb3..4684c7cfb8 100644 --- a/website/client/components/challenges/challengeItem.vue +++ b/website/client/components/challenges/challengeItem.vue @@ -26,9 +26,7 @@ .svg-icon(v-html="icons.calendarIcon") strong.mx-1 {{ $t('endDate')}}: span {{challenge.endDate}} - .categories - span.category-label.category-label-blue(v-if='isLeader(challenge)') {{ $t('owned') }} - span.category-label(v-for='category in challenge.categories', :class="{'category-label-purple':isOfficial(category)}") {{ $t(category.name) }} + category-tags(:categories="challenge.categories", :owner-id="challenge.leader._id", v-once) .challenge-description {{challenge.summary}} .well-wrapper(v-if="fullLayout") .well @@ -213,9 +211,9 @@ From 1896a8fab0f81afb00b3eedcdf2376cd75890883 Mon Sep 17 00:00:00 2001 From: Marvin Rabe Date: Mon, 7 May 2018 14:18:05 +0200 Subject: [PATCH 16/76] Challenge task numbers get created from computed array. --- .../components/challenges/challengeItem.vue | 78 ++++++++++--------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/website/client/components/challenges/challengeItem.vue b/website/client/components/challenges/challengeItem.vue index 4684c7cfb8..405f2a9d87 100644 --- a/website/client/components/challenges/challengeItem.vue +++ b/website/client/components/challenges/challengeItem.vue @@ -26,31 +26,15 @@ .svg-icon(v-html="icons.calendarIcon") strong.mx-1 {{ $t('endDate')}}: span {{challenge.endDate}} - category-tags(:categories="challenge.categories", :owner-id="challenge.leader._id", v-once) + category-tags.challenge-categories(:categories="challenge.categories", :owner-id="challenge.leader._id", v-once) .challenge-description {{challenge.summary}} .well-wrapper(v-if="fullLayout") .well - div(:class="{'muted': challenge.tasksOrder.habits.length === 0}") + div(v-for="task in tasksData", :class="{'muted': task.value === 0}", v-once) .number - .svg-icon.habit-icon(v-html="icons.habitIcon") - span.value {{challenge.tasksOrder.habits.length}} - .label {{$t('habit')}} - div(:class="{'muted': challenge.tasksOrder.dailys.length === 0}") - .number - .svg-icon.daily-icon(v-html="icons.dailyIcon") - span.value {{challenge.tasksOrder.dailys.length}} - .label {{$t('daily')}} - div(:class="{'muted': challenge.tasksOrder.todos.length === 0}") - .number - .svg-icon.todo-icon(v-html="icons.todoIcon") - span.value {{challenge.tasksOrder.todos.length}} - div {{$t('todo')}} - div(:class="{'muted': challenge.tasksOrder.rewards.length === 0}") - .number - .svg-icon.reward-icon(v-html="icons.rewardIcon") - span.value {{challenge.tasksOrder.rewards.length}} - .label {{$t('reward')}} - + .svg-icon(v-html="task.icon", :class="task.label + '-icon'") + span.value {{ task.value }} + .label {{$t(task.label)}} From 355f0fedfb4215cdbb0e1aa89485a4dfb71851ae Mon Sep 17 00:00:00 2001 From: Brian Fenton Date: Sun, 13 May 2018 09:12:26 -0500 Subject: [PATCH 47/76] disabling checking off a subtask if not assigned to a user (#10357) --- website/client/components/tasks/task.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/client/components/tasks/task.vue b/website/client/components/tasks/task.vue index b64d7b7c75..1a2f055dcf 100644 --- a/website/client/components/tasks/task.vue +++ b/website/client/components/tasks/task.vue @@ -64,7 +64,7 @@ type="checkbox", :checked="item.completed", @change="toggleChecklistItem(item)", - :disabled="castingSpell", + :disabled="castingSpell || !isUser", :id="`checklist-${item.id}`" ) label.custom-control-label(v-markdown="item.text", :for="`checklist-${item.id}`") From 8cd695c39703c16dbeb1350b9564b31dff2fa80e Mon Sep 17 00:00:00 2001 From: aszlig Date: Sun, 13 May 2018 16:14:17 +0200 Subject: [PATCH 48/76] locales/groups: Don't wrap task text in code block (#10349) So far if a task contained Markdown, a system message like this would have been posted to the group chat: foo has claimed "Some [link](http://example.org/)" Also, if the Markdown contained backticked code fragments, the whole text would be displayed in red except the code part. The reason for this is because the system message is already in Markdown and a backticked task text would result in the following Markdown: `foo has claimed "Foo `bar`"` Here there are two code blocks, one with `foo has claimed "Foo ` and another which only has `"`. This is fixed by simply changing the userIsClamingTask translation string to not wrap the task text inside a code block, as per @Alys suggestion. Signed-off-by: aszlig --- website/common/locales/en/groups.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/common/locales/en/groups.json b/website/common/locales/en/groups.json index 4eded55be6..785eefb406 100644 --- a/website/common/locales/en/groups.json +++ b/website/common/locales/en/groups.json @@ -321,7 +321,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", From fa60c9a23220fb37c022325a03d1a54b943f30f0 Mon Sep 17 00:00:00 2001 From: Keith Holliday Date: Mon, 14 May 2018 22:18:23 -0500 Subject: [PATCH 49/76] Reset stats after allocation (#10363) --- website/client/components/userMenu/profileStats.vue | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/website/client/components/userMenu/profileStats.vue b/website/client/components/userMenu/profileStats.vue index 16af67fd0c..01f9fc8383 100644 --- a/website/client/components/userMenu/profileStats.vue +++ b/website/client/components/userMenu/profileStats.vue @@ -307,6 +307,13 @@ stats: statUpdates, }); + this.statUpdates = { + str: 0, + int: 0, + con: 0, + per: 0, + }; + this.loading = false; }, allocateNow () { From 6db412f7e683d7390c644a210a11d10a67cc7478 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 15 May 2018 16:55:35 +0200 Subject: [PATCH 50/76] fix tags checkbox in bootstrap 4.1.1 --- website/client/components/tasks/tagsPopup.vue | 4 ---- 1 file changed, 4 deletions(-) diff --git a/website/client/components/tasks/tagsPopup.vue b/website/client/components/tasks/tagsPopup.vue index 1f6c44c64b..b1df9647f3 100644 --- a/website/client/components/tasks/tagsPopup.vue +++ b/website/client/components/tasks/tagsPopup.vue @@ -55,10 +55,6 @@ .custom-control-label { color: $gray-50 !important; font-weight: normal; - overflow: hidden; - text-overflow: ellipsis; - white-space: pre; - width: 8em; } } From 196e5f5b955d8029bbdf15cc3215e29d568f9f41 Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 15 May 2018 17:00:17 +0200 Subject: [PATCH 51/76] upgrade deps --- package-lock.json | 456 +++++++++++++++++++++++++++------------------- package.json | 22 +-- 2 files changed, 284 insertions(+), 194 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec48f0853a..a6e04108bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -191,9 +191,9 @@ } }, "@vue/test-utils": { - "version": "1.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.15.tgz", - "integrity": "sha512-Oev99e+LorKARoFFt/+T5RegOLyO+fHLXBr0XvpaDOukxzJEWaerYtuFpoZ4DFIF9qPdCJZN0luBm4mRtj0nnQ==", + "version": "1.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.16.tgz", + "integrity": "sha512-TF9ae3zhs8qBN98Bix2Bh3IrwkhscEV3HRthPgtzJPNG0YHUyNTlZNXH36vbP0nuSAs9Om8XjVd8/MDj8ehpEA==", "dev": true, "requires": { "lodash": "4.17.10" @@ -333,7 +333,7 @@ "resolved": "https://registry.npmjs.org/amazon-payments/-/amazon-payments-0.2.7.tgz", "integrity": "sha512-TDaE0N9IeFJGIKHSIMyDBP8iq9jMcdT/BcpVEAunwL22he1/nI4/tnaOZs4TYFNMnWj2r5pVgDJzwQXTW9wFzw==", "requires": { - "request": "2.85.0", + "request": "2.86.0", "xml2js": "0.4.4" }, "dependencies": { @@ -429,9 +429,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.86.0.tgz", + "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", "requires": { "aws-sign2": "0.7.0", "aws4": "1.6.0", @@ -451,7 +451,6 @@ "performance-now": "2.1.0", "qs": "6.5.2", "safe-buffer": "5.1.1", - "stringstream": "0.0.5", "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" @@ -917,7 +916,7 @@ "requires": { "bn.js": "4.11.8", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -1014,12 +1013,12 @@ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=" }, "autoprefixer": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.4.1.tgz", - "integrity": "sha512-YqUclCBDXUT9Y7aQ8Xv+ja8yhTZYJoMsOD7WS++gZIJLCpCu+gPcKGDlhk6S3WxhLkTcNVdaMZAWys2nzZCH7g==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.5.0.tgz", + "integrity": "sha512-buY1XxFoBrXvLsoFb0jP+niSu1tCj2RwMwHj96+RfQ8DJTgb0vUhh0dg6wjJT3JzsFYBrkSj8/sGtarNdlxTFw==", "requires": { - "browserslist": "3.2.6", - "caniuse-lite": "1.0.30000832", + "browserslist": "3.2.7", + "caniuse-lite": "1.0.30000840", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "6.0.22", @@ -1047,9 +1046,9 @@ } }, "aws-sdk": { - "version": "2.238.1", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.238.1.tgz", - "integrity": "sha1-o1/ewSLtkV2kkIQOiCgzbaW+Tn8=", + "version": "2.239.1", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.239.1.tgz", + "integrity": "sha1-KZo+YR5cR7OSML0fUeLSXR+9s0U=", "requires": { "buffer": "4.9.1", "events": "1.1.1", @@ -1059,8 +1058,7 @@ "sax": "1.2.1", "url": "0.10.3", "uuid": "3.1.0", - "xml2js": "0.4.17", - "xmlbuilder": "4.2.1" + "xml2js": "0.4.17" }, "dependencies": { "sax": { @@ -1772,9 +1770,9 @@ "dev": true }, "base64-js": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", - "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" }, "base64-stream": { "version": "0.1.3", @@ -2411,26 +2409,61 @@ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", "requires": { "bytes": "3.0.0", "content-type": "1.0.4", "debug": "2.6.9", "depd": "1.1.2", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", + "qs": "6.5.2", + "raw-body": "2.3.3", "type-is": "1.6.16" }, "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" } } }, @@ -2448,16 +2481,16 @@ } }, "bootstrap": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.0.tgz", - "integrity": "sha512-kCo82nE8qYVfOa/Z3hL98CPgPIEkh6iPdiJrUJMQ9n9r0+6PEET7cmhLlV0XVYmEj5QtKIOaSGMLxy5jSFhKog==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.1.1.tgz", + "integrity": "sha512-SpiDSOcbg4J/PjVSt4ny5eY6j74VbVSjROY4Fb/WIUXBV9cnb5luyR4KnPvNoXuGnBK1T+nJIWqRsvU3yP8Mcg==" }, "bootstrap-vue": { "version": "2.0.0-rc.9", "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.9.tgz", "integrity": "sha512-0q2sB8qNrjWg+nQ2t/p90+VtQM5hgFCl5jPPquC+ay+EGtPt7wzQEbnC6A97nh81jAZBxoaR0y9mqwA02iTkig==", "requires": { - "bootstrap": "4.1.0", + "bootstrap": "4.1.1", "lodash.get": "4.4.2", "lodash.startcase": "4.4.0", "opencollective": "1.0.3", @@ -2570,32 +2603,32 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" }, "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", "inherits": "2.0.3", "safe-buffer": "5.1.1" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", + "browserify-aes": "1.2.0", + "browserify-des": "1.0.1", "evp_bytestokey": "1.0.3" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { "cipher-base": "1.0.4", "des.js": "1.0.0", @@ -2618,11 +2651,11 @@ "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", "elliptic": "6.4.0", "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -2634,18 +2667,18 @@ } }, "browserslist": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.6.tgz", - "integrity": "sha512-XCsMSg9V4S1VRdcp265dJ+8kBRjfuFXcavbisY7G6T9QI0H1Z24PP53vvs0WDYWqm38Mco1ILDtafcS8ZR4xiw==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.7.tgz", + "integrity": "sha512-oYVLxFVqpX9uMhOIQBLtZL+CX4uY8ZpWcjNTaxyWl5rO8yA9SSNikFnAfvk8J3P/7z3BZwNmEqFKaJoYltj3MQ==", "requires": { - "caniuse-lite": "1.0.30000832", - "electron-to-chromium": "1.3.44" + "caniuse-lite": "1.0.30000840", + "electron-to-chromium": "1.3.45" }, "dependencies": { "electron-to-chromium": { - "version": "1.3.44", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.44.tgz", - "integrity": "sha1-72sVCmDVIwgjiMra2ICF7NL9RoQ=" + "version": "1.3.45", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz", + "integrity": "sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g=" } } }, @@ -2659,7 +2692,7 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.2.3", + "base64-js": "1.3.0", "ieee754": "1.1.8", "isarray": "1.0.0" } @@ -2920,9 +2953,9 @@ "integrity": "sha1-DiGPoTPQ0HHIhqoEG0NSWMx0aJE=" }, "caniuse-lite": { - "version": "1.0.30000832", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000832.tgz", - "integrity": "sha512-WMC2GiGTPxGywFL70h+CnP7GAYo6LM6JSI1sF13vAZfXCzOeunHzl20DpfbDGMdvtT2wpqvabY96MHEp/la+BQ==" + "version": "1.0.30000840", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000840.tgz", + "integrity": "sha512-Lw6AaouV6lh7TgIdQtLiUFKKO2mtDnZFkzCq5/V6tqs4ZI0OGVSDCEt1uegZ3OOBEBUYuVw3Hhr9DQSbgVofFA==" }, "capture-stack-trace": { "version": "1.0.0", @@ -3213,16 +3246,16 @@ } }, "chromedriver": { - "version": "2.38.2", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.38.2.tgz", - "integrity": "sha512-gh77kozqCPTtr74RZpnSgBCoClpNznsg2NEKwi8t54UyzrcpMRkG9nH1qhwI+ojLQpsdpsSjGiASSdMsFZT/mw==", + "version": "2.38.3", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.38.3.tgz", + "integrity": "sha512-tczy6RHl0LOVA4p+xezcu3NRjr9A1iLyyfjP9yPIUynvV28YSKH/Ll1iw0jMCjN9jwtaB2HB4aPjv0Uuw2VARw==", "dev": true, "requires": { "del": "3.0.0", "extract-zip": "1.6.6", "kew": "0.7.0", "mkdirp": "0.5.1", - "request": "2.85.0" + "request": "2.86.0" }, "dependencies": { "assert-plus": { @@ -3323,15 +3356,15 @@ } }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "request": { - "version": "2.85.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", - "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "version": "2.86.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.86.0.tgz", + "integrity": "sha512-BQZih67o9r+Ys94tcIW4S7Uu8pthjrQVxhsZ/weOwHbDfACxvIyvnAbzFQxjy1jMtvFSzv5zf4my6cZsJBbVzw==", "dev": true, "requires": { "aws-sign2": "0.7.0", @@ -3350,9 +3383,8 @@ "mime-types": "2.1.18", "oauth-sign": "0.8.2", "performance-now": "2.1.0", - "qs": "6.5.1", + "qs": "6.5.2", "safe-buffer": "5.1.1", - "stringstream": "0.0.5", "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" @@ -4163,9 +4195,9 @@ } }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "requires": { "bn.js": "4.11.8", "elliptic": "6.4.0" @@ -4180,27 +4212,28 @@ } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "1.0.4", "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.10" + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "inherits": "2.0.3", - "ripemd160": "2.0.1", + "ripemd160": "2.0.2", "safe-buffer": "5.1.1", - "sha.js": "2.4.10" + "sha.js": "2.4.11" } }, "cross-env": { @@ -4258,15 +4291,15 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "1.0.0", + "browserify-cipher": "1.0.1", "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", "randombytes": "2.0.6", "randomfill": "1.0.4" } @@ -5306,7 +5339,7 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -5339,9 +5372,9 @@ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "4.11.8", "miller-rabin": "4.0.1", @@ -5765,7 +5798,7 @@ "dependencies": { "onetime": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" } } @@ -5885,7 +5918,7 @@ "hash.js": "1.1.3", "hmac-drbg": "1.0.1", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -6503,7 +6536,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "requires": { "duplexer": "0.1.1", @@ -6834,6 +6867,23 @@ "vary": "1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, "qs": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", @@ -9559,11 +9609,12 @@ } }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "hash-sum": { @@ -9577,7 +9628,7 @@ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "hasha": { @@ -9627,7 +9678,7 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -11096,7 +11147,7 @@ "dev": true, "requires": { "bluebird": "3.5.1", - "body-parser": "1.18.2", + "body-parser": "1.18.3", "chokidar": "1.7.0", "colors": "1.2.1", "combine-lists": "1.0.1", @@ -12917,17 +12968,6 @@ "requires": { "hash-base": "3.0.4", "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } } }, "mdn-data": { @@ -13083,9 +13123,9 @@ "integrity": "sha1-3z02Uqc/3ta5sLJBRub9BSNTRY4=" }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", @@ -13372,9 +13412,9 @@ } }, "mongoose": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.0.tgz", - "integrity": "sha512-GFx4Z2YpfxRQ9BExd2ML5MDKYdzOjdXB5a6fhove98EP6iB8tgZDY/fKSociEMJSIA37auPXmKfGfrc2uAMkMQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.1.tgz", + "integrity": "sha512-pmVX//61yX8hV/Db790Cym8CGYd29OYQROYx6ve6ab4LbUW0+GehiBVDlnE9Tvogaz8nndHlVUb+iXwOBw/MNw==", "requires": { "async": "2.1.4", "bson": "1.0.6", @@ -13964,9 +14004,9 @@ "querystring-es3": "0.2.1", "readable-stream": "2.3.5", "stream-browserify": "2.0.1", - "stream-http": "2.8.1", + "stream-http": "2.8.2", "string_decoder": "1.0.3", - "timers-browserify": "2.0.6", + "timers-browserify": "2.0.10", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", @@ -15018,15 +15058,15 @@ } }, "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "4.10.1", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "pbkdf2": "3.0.16" } }, "parse-cookie-phantomjs": { @@ -15286,15 +15326,15 @@ } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", "safe-buffer": "5.1.1", - "sha.js": "2.4.10" + "sha.js": "2.4.11" } }, "pend": { @@ -17417,14 +17457,14 @@ } }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", "randombytes": "2.0.6" } }, @@ -18510,11 +18550,11 @@ } }, "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "requires": { - "hash-base": "2.0.2", + "hash-base": "3.0.4", "inherits": "2.0.3" } }, @@ -18544,6 +18584,11 @@ "ret": "0.1.15" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "samsam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", @@ -18796,9 +18841,9 @@ "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" }, "sha.js": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", - "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "requires": { "inherits": "2.0.3", "safe-buffer": "5.1.1" @@ -19666,15 +19711,39 @@ "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" }, "stream-http": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.1.tgz", - "integrity": "sha512-cQ0jo17BLca2r0GfRdZKYAGLU6JRoIWxqSOakUMuKOT6MOK7AAlE856L33QuDmAy/eeOrhLee3dZKX0Uadu93A==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", "requires": { "builtin-status-codes": "3.0.0", "inherits": "2.0.3", - "readable-stream": "2.3.5", + "readable-stream": "2.3.6", "to-arraybuffer": "1.0.1", "xtend": "4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "5.1.1" + } + } } }, "stream-shift": { @@ -19835,9 +19904,9 @@ "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=" }, "stripe": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/stripe/-/stripe-5.9.0.tgz", - "integrity": "sha512-kQl34Bkc3K27HyhSZDYX3Jkek5O+Mrggd+1SbWgSpLm94To763siufqDrYxtqFTdMEFxD9y1P3wz01yXBsJ9QA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-5.10.0.tgz", + "integrity": "sha512-AUDmXfNAAY/oOfW87HPO4bDzNWJp8iQd0blVWwwEgPxO1DmEC//foI0C9rhr2ZNsuF6kLypPfNtGB9Uf+RCQzQ==", "requires": { "lodash.isplainobject": "4.0.6", "qs": "6.5.2", @@ -20237,9 +20306,9 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "requires": { "setimmediate": "1.0.5" } @@ -20761,6 +20830,21 @@ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" }, + "uri-js": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.1.tgz", + "integrity": "sha512-jpKCA3HjsBfSDOEgxRDAxQCNyHfCPSbq57PqCkd3gAyBuPb3IWxw54EHncqESznIdqSetHfw3D7ylThu2Kcc9A==", + "requires": { + "punycode": "2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + } + } + }, "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", @@ -21283,9 +21367,9 @@ } }, "watchpack": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", - "integrity": "sha512-RSlipNQB1u48cq0wH/BNfCu1tD/cJ8ydFIkNYhp9o+3d+8unClkIovpW5qpFPgmL9OE48wfAnlZydXByWP82AA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "requires": { "chokidar": "2.0.2", "graceful-fs": "4.1.11", @@ -21301,13 +21385,13 @@ } }, "webpack": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", - "integrity": "sha512-3kOFejWqj5ISpJk4Qj/V7w98h9Vl52wak3CLiw/cDOfbVTq7FeoZ0SdoHHY9PYlHr50ZS42OfvzE2vB4nncKQg==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.12.0.tgz", + "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "requires": { "acorn": "5.5.3", "acorn-dynamic-import": "2.0.2", - "ajv": "6.3.0", + "ajv": "6.5.0", "ajv-keywords": "3.1.0", "async": "2.6.0", "enhanced-resolve": "3.4.1", @@ -21324,19 +21408,20 @@ "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.5.0", + "watchpack": "1.6.0", "webpack-sources": "1.1.0", "yargs": "8.0.2" }, "dependencies": { "ajv": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.3.0.tgz", - "integrity": "sha1-FlCkERTvAFdMrBC4Ay2PTBSBLac=", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.0.tgz", + "integrity": "sha512-VDUX1oSajablmiyFyED9L1DFndg0P9h7p1F+NO8FkIzei6EPrR6Zu1n18rd5P8PqaSRd/FrWv3G1TVBqpM83gA==", "requires": { - "fast-deep-equal": "1.1.0", + "fast-deep-equal": "2.0.1", "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "json-schema-traverse": "0.3.1", + "uri-js": "4.2.1" } }, "ansi-regex": { @@ -21357,6 +21442,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", @@ -21491,9 +21581,9 @@ } }, "webpack-bundle-analyzer": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.11.2.tgz", - "integrity": "sha512-jDO+sACU4kM7WhvjtIu4Z90UogsGUyVDc1K8THH3HzihwVqgipAS2qXyAPrJ0vTo6593V3RR4/IhHi8UQrE+yA==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-2.12.0.tgz", + "integrity": "sha512-fuP11YxvAd8DYuwC4otr7hDwx7cRutew49dz0+PTlVPl544aqFqjGLCdxKz9c03eWnBMpMFTK5SG4SDrUmZ+JA==", "dev": true, "requires": { "acorn": "5.5.3", @@ -21552,9 +21642,9 @@ } }, "webpack-hot-middleware": { - "version": "2.22.1", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.22.1.tgz", - "integrity": "sha512-wbjnvcc3HOPKRE/L0KmTv2MrByfLFOJlVFNKo5Svxy+1plR/bMIMYQDgB4pUOzJXhiBLU7Clp6P1SSzS89iKxA==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.22.2.tgz", + "integrity": "sha512-uccPS6b/UlXJoNCS+3fuc40z2KZgO0qQhnu+Ne1iZiHTy9s5fMCJAV+Vc8VTVkN203UphsxQmkumxYeHLiQ5jg==", "dev": true, "requires": { "ansi-html": "0.0.7", diff --git a/package.json b/package.json index 58d8803c9a..9951ea2570 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "amazon-payments": "^0.2.7", "amplitude": "^3.5.0", "apidoc": "^0.17.5", - "autoprefixer": "^8.4.1", - "aws-sdk": "^2.230.1", + "autoprefixer": "^8.5.0", + "aws-sdk": "^2.239.1", "axios": "^0.18.0", "axios-progress-bar": "^1.2.0", "babel-core": "^6.26.3", @@ -26,8 +26,8 @@ "babel-register": "^6.6.0", "babel-runtime": "^6.11.6", "bcrypt": "^2.0.0", - "body-parser": "^1.15.0", - "bootstrap": "^4.1.0", + "body-parser": "^1.18.3", + "bootstrap": "^4.1.1", "bootstrap-vue": "^2.0.0-rc.9", "compression": "^1.7.2", "cookie-session": "^1.2.0", @@ -52,7 +52,7 @@ "hellojs": "^1.15.1", "html-webpack-plugin": "^3.2.0", "image-size": "^0.6.2", - "in-app-purchase": "^1.9.3", + "in-app-purchase": "^1.9.4", "intro.js": "^2.9.3", "jquery": ">=3.0.0", "js2xmlparser": "^3.0.0", @@ -61,7 +61,7 @@ "method-override": "^2.3.5", "moment": "^2.22.1", "moment-recur": "^1.0.7", - "mongoose": "^5.0.17", + "mongoose": "^5.1.1", "morgan": "^1.7.0", "nconf": "^0.10.0", "node-gcm": "^0.14.4", @@ -103,7 +103,7 @@ "vue-template-compiler": "^2.5.16", "vuedraggable": "^2.15.0", "vuejs-datepicker": "git://github.com/habitrpg/vuejs-datepicker.git#5d237615463a84a23dd6f3f77c6ab577d68593ec", - "webpack": "^3.11.0", + "webpack": "^3.12.0", "webpack-merge": "^4.0.0", "winston": "^2.4.2", "winston-loggly-bulk": "^2.0.2", @@ -139,13 +139,13 @@ "apidoc": "gulp apidoc" }, "devDependencies": { - "@vue/test-utils": "^1.0.0-beta.15", + "@vue/test-utils": "^1.0.0-beta.16", "babel-plugin-istanbul": "^4.1.6", "babel-plugin-syntax-object-rest-spread": "^6.13.0", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "chalk": "^2.4.1", - "chromedriver": "^2.38.2", + "chromedriver": "^2.38.3", "connect-history-api-fallback": "^1.1.0", "coveralls": "^3.0.1", "cross-spawn": "^6.0.5", @@ -181,9 +181,9 @@ "sinon": "^4.5.0", "sinon-chai": "^3.0.0", "sinon-stub-promise": "^4.0.0", - "webpack-bundle-analyzer": "^2.11.2", + "webpack-bundle-analyzer": "^2.12.0", "webpack-dev-middleware": "^2.0.5", - "webpack-hot-middleware": "^2.22.1" + "webpack-hot-middleware": "^2.22.2" }, "optionalDependencies": { "memwatch-next": "^0.3.0", From 37b890f282296ca998232763ecc830863051595d Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 15 May 2018 17:21:15 +0200 Subject: [PATCH 52/76] fix(market): fixes #10316 --- website/client/components/shops/market/sellModal.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/website/client/components/shops/market/sellModal.vue b/website/client/components/shops/market/sellModal.vue index b22bd3fb74..a3c2f654da 100644 --- a/website/client/components/shops/market/sellModal.vue +++ b/website/client/components/shops/market/sellModal.vue @@ -26,7 +26,7 @@ b.how-many-to-sell {{ $t('howManyToSell') }} div - b-input.itemsToSell(type="number", v-model="selectedAmountToSell", :max="itemCount", min="1", @keyup.native="preventNegative($event)") + b-input.itemsToSell(type="number", v-model="selectedAmountToSell", :max="itemCount", min="1", @keyup.native="preventNegative($event)", step="1") span.svg-icon.inline.icon-32(aria-hidden="true", v-html="icons.gold") span.value {{ item.value }} @@ -144,11 +144,16 @@ preventNegative ($event) { let value = $event.target.value; - if (isNaN($event.target.valueAsNumber) || Number(value) < 0) { + if (Number(value) < 0) { this.selectedAmountToSell = 0; } }, sellItems () { + if (!Number.isInteger(Number(this.selectedAmountToSell))) { + this.selectedAmountToSell = 0; + return; + } + this.$store.dispatch('shops:sellItems', { type: this.itemType, key: this.item.key, From ba799c67f9f31e94bd3cc97975d1b5768b45817c Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 15 May 2018 17:42:27 +0200 Subject: [PATCH 53/76] fix(tests): remove tests that timeout --- .../challenges/GET-challenges_challengeId_members.test.js | 3 ++- .../v3/integration/groups/GET-groups_groupId_members.test.js | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js index a7d750fdb9..974c65ee95 100644 --- a/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js +++ b/test/api/v3/integration/challenges/GET-challenges_challengeId_members.test.js @@ -123,7 +123,8 @@ describe('GET /challenges/:challengeId/members', () => { }); }); - it('supports using req.query.lastId to get more members', async () => { + // @TODO times out too many times (when it takes more than 8s) + xit('supports using req.query.lastId to get more members', async () => { let group = await generateGroup(user, {type: 'party', name: generateUUID()}); let challenge = await generateChallenge(user, group); diff --git a/test/api/v3/integration/groups/GET-groups_groupId_members.test.js b/test/api/v3/integration/groups/GET-groups_groupId_members.test.js index 36fa584466..8e95634d6c 100644 --- a/test/api/v3/integration/groups/GET-groups_groupId_members.test.js +++ b/test/api/v3/integration/groups/GET-groups_groupId_members.test.js @@ -142,6 +142,7 @@ describe('GET /groups/:groupId/members', () => { }); }); + // @TODO times out too many times (when it takes more than 8s) it('supports using req.query.lastId to get more members', async () => { let leader = await generateUser({balance: 4}); let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); From 10567d81e2efa5256242d396116c1973dfb170fc Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Tue, 15 May 2018 18:03:00 +0200 Subject: [PATCH 54/76] fix(tests): remove tests that timeout --- .../v3/integration/groups/GET-groups_groupId_members.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api/v3/integration/groups/GET-groups_groupId_members.test.js b/test/api/v3/integration/groups/GET-groups_groupId_members.test.js index 8e95634d6c..67ae5705b2 100644 --- a/test/api/v3/integration/groups/GET-groups_groupId_members.test.js +++ b/test/api/v3/integration/groups/GET-groups_groupId_members.test.js @@ -143,7 +143,7 @@ describe('GET /groups/:groupId/members', () => { }); // @TODO times out too many times (when it takes more than 8s) - it('supports using req.query.lastId to get more members', async () => { + xit('supports using req.query.lastId to get more members', async () => { let leader = await generateUser({balance: 4}); let group = await generateGroup(leader, {type: 'guild', privacy: 'public', name: generateUUID()}); From ae9db7aee359b3677526f1d2dc8b68338e6a1380 Mon Sep 17 00:00:00 2001 From: SabreCat Date: Tue, 15 May 2018 21:00:49 +0000 Subject: [PATCH 55/76] feat(content): enable Fairy Potions --- .../sprites/spritesmith-largeSprites-0.css | 20 ++++++++++++------ .../sprites/spritesmith-largeSprites-0.png | Bin 84828 -> 100946 bytes .../common/script/content/hatching-potions.js | 2 +- .../script/content/shop-featuredItems.js | 4 ++-- .../spritesmith_large/promo_fairy_potions.png | Bin 0 -> 14841 bytes website/server/controllers/api-v3/news.js | 15 ++++++------- 6 files changed, 22 insertions(+), 19 deletions(-) create mode 100644 website/raw_sprites/spritesmith_large/promo_fairy_potions.png diff --git a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css b/website/client/assets/css/sprites/spritesmith-largeSprites-0.css index c100c3510a..be1d5d9cf0 100644 --- a/website/client/assets/css/sprites/spritesmith-largeSprites-0.css +++ b/website/client/assets/css/sprites/spritesmith-largeSprites-0.css @@ -1,42 +1,48 @@ .promo_armoire_backgrounds_201805 { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: 0px -337px; + background-position: -878px 0px; width: 141px; height: 441px; } .promo_bundle_cuddleBuddies { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -142px -337px; + background-position: 0px -534px; width: 141px; height: 441px; } -.promo_ios { +.promo_fairy_potions { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); background-position: 0px 0px; + width: 564px; + height: 196px; +} +.promo_ios { + background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); + background-position: 0px -197px; width: 325px; height: 336px; } .promo_mystery_201804 { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -326px -223px; + background-position: -878px -442px; width: 114px; height: 90px; } .promo_take_this { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -441px -223px; + background-position: -716px -223px; width: 114px; height: 87px; } .scene_casting_spells { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -326px 0px; + background-position: -565px 0px; width: 312px; height: 222px; } .scene_meditation { background-image: url('~assets/images/sprites/spritesmith-largeSprites-0.png'); - background-position: -284px -337px; + background-position: -565px -223px; width: 150px; height: 150px; } diff --git a/website/client/assets/images/sprites/spritesmith-largeSprites-0.png b/website/client/assets/images/sprites/spritesmith-largeSprites-0.png index c304e6c664308a3ec54854ad06fa614fe1a6a8fb..53784c88af1f1308ace05d07e7821f9281b9d811 100644 GIT binary patch literal 100946 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 $*s(s*S!+axY%K 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 W$S%Rm0-5ubzkR;@Gw!EffA>F&Tve6; literal 84828 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 TW0LkKO*$P7h${res.t('newStuff')} -

5/10/2018 - ${LAST_ANNOUNCEMENT_TITLE}

+

5/15/2018 - ${LAST_ANNOUNCEMENT_TITLE}


-
-
-

In honor of Mental Health Awareness Month, we've got new posts on the blog all about ways to explore better mental health and wellness through Habitica! First, there's a Guild Spotlight that highlights the Guilds that can help you as you explore the path to better mental health. We've also posted a Use Case Spotlight featuring a number of great suggestions for using Habitica's task system to manage mental health and wellness! These suggestions were submitted by Habiticans in the Use Case Spotlights Guild.

-
-
-
-

Plus, we're collecting user submissions for the next Use Case Spotlight! How do you use Habitica to manage parenting and/or family life? We’ll be featuring player-submitted examples in Use Case Spotlights on the Habitica Blog next month, so post your suggestions in the Use Case Spotlight Guild now. We look forward to learning more about how you use Habitica to improve your life and get things done!

+

They're back! Between now and May 31, you can buy Fairy Hatching Potions from the Market and use them to hatch any standard pet egg. (Magic Hatching Potions do not work on Quest Pet eggs.) Fairy Potion Pets aren't picky, so they'll happily eat any kind of food that you feed them!

+

After they're gone, it will be at least a year before the Fairy Hatching Potions are available again, so be sure to get them now!

+
by Edge, Willow the Witty, and SabreCat
+
`, }); From d114b858fd5c6574bc4000dde750a52a9df2d943 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Tue, 15 May 2018 21:06:11 +0000 Subject: [PATCH 56/76] chore(i18n): update locales --- Dockerfile-Production | 2 +- website/common/locales/bg/groups.json | 28 +-- .../locales/de/communityguidelines.json | 6 +- website/common/locales/de/front.json | 4 +- website/common/locales/de/gear.json | 16 +- website/common/locales/de/groups.json | 36 ++-- website/common/locales/de/npc.json | 2 +- website/common/locales/de/questscontent.json | 4 +- website/common/locales/de/subscriber.json | 2 +- website/common/locales/es/groups.json | 24 +-- website/common/locales/es_419/content.json | 6 +- website/common/locales/es_419/messages.json | 4 +- website/common/locales/es_419/npc.json | 4 +- website/common/locales/es_419/overview.json | 2 +- website/common/locales/es_419/quests.json | 2 +- website/common/locales/es_419/settings.json | 2 +- website/common/locales/fr/backgrounds.json | 6 +- .../locales/fr/communityguidelines.json | 4 +- website/common/locales/fr/gear.json | 8 +- website/common/locales/fr/groups.json | 26 +-- website/common/locales/fr/npc.json | 2 +- website/common/locales/fr/questscontent.json | 10 +- website/common/locales/fr/subscriber.json | 2 +- website/common/locales/pl/groups.json | 28 +-- website/common/locales/pt/challenge.json | 8 +- website/common/locales/pt/defaulttasks.json | 2 +- website/common/locales/pt/front.json | 16 +- website/common/locales/pt/generic.json | 2 +- website/common/locales/pt/groups.json | 2 +- website/common/locales/pt/npc.json | 10 +- website/common/locales/pt/settings.json | 4 +- website/common/locales/pt/tasks.json | 4 +- website/common/locales/pt_BR/backgrounds.json | 14 +- .../locales/pt_BR/communityguidelines.json | 26 +-- website/common/locales/pt_BR/front.json | 2 +- website/common/locales/pt_BR/gear.json | 2 +- website/common/locales/pt_BR/groups.json | 26 +-- website/common/locales/pt_BR/npc.json | 2 +- website/common/locales/pt_BR/settings.json | 2 +- website/common/locales/pt_BR/subscriber.json | 4 +- website/common/locales/ru/backgrounds.json | 8 +- website/common/locales/ru/front.json | 2 +- website/common/locales/ru/groups.json | 24 +-- website/common/locales/tr/npc.json | 2 +- website/common/locales/tr/pets.json | 4 +- website/common/locales/tr/tasks.json | 2 +- website/common/locales/uk/faq.json | 6 +- website/common/locales/zh/backgrounds.json | 14 +- .../locales/zh/communityguidelines.json | 42 ++-- website/common/locales/zh/content.json | 6 +- website/common/locales/zh/front.json | 14 +- website/common/locales/zh/generic.json | 26 +-- website/common/locales/zh/groups.json | 182 +++++++++--------- website/common/locales/zh/limited.json | 8 +- .../common/locales/zh/loadingscreentips.json | 2 +- website/common/locales/zh/messages.json | 2 +- website/common/locales/zh/npc.json | 18 +- website/common/locales/zh/pets.json | 38 ++-- website/common/locales/zh/quests.json | 14 +- website/common/locales/zh/questscontent.json | 34 ++-- website/common/locales/zh/settings.json | 2 +- website/common/locales/zh/subscriber.json | 4 +- website/common/locales/zh/tasks.json | 2 +- 63 files changed, 406 insertions(+), 406 deletions(-) diff --git a/Dockerfile-Production b/Dockerfile-Production index b5a1661a48..98320a8fb1 100644 --- a/Dockerfile-Production +++ b/Dockerfile-Production @@ -17,7 +17,7 @@ RUN npm install -g gulp-cli mocha # Clone Habitica repo and install dependencies RUN mkdir -p /usr/src/habitrpg WORKDIR /usr/src/habitrpg -RUN git clone --branch v4.42.0 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg +RUN git clone --branch v4.42.3 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg RUN npm install RUN gulp build:prod --force diff --git a/website/common/locales/bg/groups.json b/website/common/locales/bg/groups.json index b3a925debb..23e85e30c4 100644 --- a/website/common/locales/bg/groups.json +++ b/website/common/locales/bg/groups.json @@ -106,16 +106,16 @@ "optionalMessage": "Незадължително съобщение", "yesRemove": "Да, нека бъдат премахнати", "foreverAlone": "Не можете да харесате собственото си съобщение. Не бъдете такъв човек.", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", - "ascendingAbbrev": "Asc", - "descendingAbbrev": "Desc", - "applySortToHeader": "Apply Sort Options to Party Header", + "sortBackground": "Подреждане по фоново изображение", + "sortClass": "Подреждане по клас", + "sortDateJoined": "Подреждане по дата на присъединяване", + "sortLogin": "Подреждане по дата на вписване", + "sortLevel": "Подреждане по ниво", + "sortName": "Подреждане по име", + "sortTier": "Подреждане по ниво на сътрудник", + "ascendingAbbrev": "Възходящ ред", + "descendingAbbrev": "Низходящ ред", + "applySortToHeader": "Прилагане на настройките за подреждане към заглавната част на групата", "confirmGuild": "Създавате ли гилдията за 4 диаманта?", "leaveGroupCha": "Напускане на предизвикателствата на гилдията и…", "confirm": "Потвърждаване", @@ -131,10 +131,10 @@ "clearAll": "Изтриване на всички съобщения", "confirmDeleteAllMessages": "Наистина ли искате да изтриете всички съобщения от входящата поща? Другите потребители ще виждат изпратените от Вас съобщения.", "optOutPopover": "Личните съобщения не Ви допадат? Щракнете тук, за да се откажете напълно от тях.", - "PMPlaceholderTitle": "Nothing Here Yet", - "PMPlaceholderDescription": "Select a conversation on the left", - "PMPlaceholderTitleRevoked": "Your chat privileges have been revoked", - "PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email admin@habitica.com to discuss it with the staff.", + "PMPlaceholderTitle": "Тук все още няма нищо", + "PMPlaceholderDescription": "Изберете разговор отляво", + "PMPlaceholderTitleRevoked": "Привилегиите Ви в чата Ви бяха отнети", + "PMPlaceholderDescriptionRevoked": "Не можете да изпращате лични съобщения, тъй като привилегиите Ви в чата Ви бяха отнети. Ако имате въпроси или притеснения относно това, моля, пишете на admin@habitica.com, за да ги обсъдите с екипа.", "block": "Блокиране", "unblock": "Отблокиране", "pm-reply": "Изпращане на отговор", diff --git a/website/common/locales/de/communityguidelines.json b/website/common/locales/de/communityguidelines.json index 2610b7f5b0..29dfbe29c7 100644 --- a/website/common/locales/de/communityguidelines.json +++ b/website/common/locales/de/communityguidelines.json @@ -10,8 +10,8 @@ "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 müssen den Community-Richtlinien für öffentliche Orte entsprechen. Um Deinen Anzeigenamen zu ändern, 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. Diese sollten für einen Abenteurer wie Dich einfach sein!", - "commGuideList02A": "Respect each other. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences. This is part of what makes Habitica so cool! Building a community means respecting and celebrating our differences as well as our similarities. Here are some easy ways to respect each other:", - "commGuideList02B": "Obey all of the Terms and Conditions.", + "commGuideList02A": "Respektiert einander. Sei höflich, freundlich und hilfsbereit. Vergiss nicht: Habiticaner kommen aus den verschiedensten Hintergründen und haben sehr andere Erfahrungen gemacht. Das macht Habitica so eigenartig! Es ist wichtig, das man beim Aufbauen einer Community seine Unterschiede und Ähnlichkeiten respektieren aber natürlich auch feiern kann. Dies sind einfache Möglichkeiten einander zu respektieren:", + "commGuideList02B": "Befolge alle allgemeinen Geschäftsbedingungen.", "commGuideList02C": "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. Not even as a joke. This includes slurs as well as statements. Not everyone has the same sense of humor, and so something that you consider a joke may be hurtful to another. Attack your Dailies, not each other.", "commGuideList02D": "Keep discussions appropriate for all ages. We have many young Habiticans who use the site! Let's not tarnish any innocents or hinder any Habiticans in their goals.", "commGuideList02E": "Avoid profanity. This includes milder, religious-based oaths that may be acceptable elsewhere. We have people from all religious and cultural backgrounds, and we want to make sure that all of them feel comfortable in public spaces. If a moderator or 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. Additionally, slurs will be dealt with very severely, as they are also a violation of the Terms of Service.", @@ -119,7 +119,7 @@ "commGuideHeadingLinks": "Nützliche Links", "commGuideLink01": "Habitica Help: Ask a Question: a Guild for users to ask questions!", "commGuideLink02": "The Wiki: the biggest collection of information about Habitica.", - "commGuideLink03": "GitHub: for bug reports or helping with code!", + "commGuideLink03": "GitHub: für Fehlermeldungen oder für das Mithelfen beim Programmieren.", "commGuideLink04": "The Main Trello: for site feature requests.", "commGuideLink05": "The Mobile Trello: for mobile feature requests.", "commGuideLink06": "The Art Trello: for submitting pixel art.", diff --git a/website/common/locales/de/front.json b/website/common/locales/de/front.json index 5ae6b4c9bc..ce21b850ec 100644 --- a/website/common/locales/de/front.json +++ b/website/common/locales/de/front.json @@ -156,7 +156,7 @@ "pkAnswer7": "Habitica uses pixel art for several reasons. In addition to the fun nostalgia factor, pixel art is very approachable to our volunteer artists who want to chip in. It's much easier to keep our pixel art consistent even when lots of different artists contribute, and it lets us quickly generate a ton of new content!", "pkQuestion8": "Wie hat Habitica das reale Leben von Leuten beeinflusst?", "pkAnswer8": "You can find lots of testimonials for how Habitica has helped people here: https://habitversary.tumblr.com", - "pkMoreQuestions": "Do you have a question that’s not on this list? Send an email to admin@habitica.com!", + "pkMoreQuestions": "Hast du eine Frage, welche nicht in der Liste zu finden ist? Bitte sende uns eine Email an admin@habitica.com! ", "pkVideo": "Video", "pkPromo": "Aktionen", "pkLogo": "Logos", @@ -283,7 +283,7 @@ "invalidLoginCredentialsLong": "Uh-oh - your email address / login name or password is incorrect.\n- Make sure they are typed correctly. Your login name 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": "Es gibt kein Konto, das diese Anmeldedaten verwendet.", "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 copy your User ID into the email and include your Profile Name.", - "accountSuspendedTitle": "Account has been suspended", + "accountSuspendedTitle": "Dieser Account wurde suspendiert. ", "unsupportedNetwork": "Dieses Netzwerk wird aktuell nicht unterstützt.", "cantDetachSocial": "Der Account hat nur noch diese Authentifizierung, sie kann nicht getrennt werden.", "onlySocialAttachLocal": "Lokale Authentifizierung kann nur zu einem Social-Media-Konto hinzugefügt werden.", diff --git a/website/common/locales/de/gear.json b/website/common/locales/de/gear.json index 79e49ec704..b5d30fd904 100644 --- a/website/common/locales/de/gear.json +++ b/website/common/locales/de/gear.json @@ -1021,7 +1021,7 @@ "headMystery201802Text": "Liebeskäfer-Helm", "headMystery201802Notes": "Die Fühler auf diesem Helm funktionieren wie niedliche Wünschelruten, die Gefühle der Liebe und Unterstützung in der Nähe aufspüren. Gewährt keinen Attributbonus. Abonnentengegenstand, Februar 2018.", "headMystery201803Text": "Wagemutiges Libellendiadem", - "headMystery201803Notes": "Although its appearance is quite decorative, you can engage the wings on this circlet for extra lift! Confers no benefit. March 2018 Subscriber Item.", + "headMystery201803Notes": "Trotz ihres dekorativen Aussehens können Dir die Flügel auf diesen Diadem extra Auftrieb geben! Gewährt keinen Attributbonus. Abonnentengegenstand, März 2018. ", "headMystery301404Text": "Schicker Zylinder", "headMystery301404Notes": "Ein schicker Zylinder für die feinsten Ehrenleute! Gewährt keinen Attributbonus. Abonnentengegenstand, Januar 3015.", "headMystery301405Text": "Einfacher Zylinder", @@ -1357,11 +1357,11 @@ "backMystery201709Text": "Zauberbücherstapel", "backMystery201709Notes": "Magie zu erlernen erfordert eine Menge zu Lesen, aber Du bist Dir sicher, dass Dir nicht langweilig wird! Gewährt keinen Attributbonus. Abonnentengegenstand, September 2017.", "backMystery201801Text": "Frostkobold-Flügel", - "backMystery201801Notes": "They may look as delicate as snowflakes, but these enchanted wings can carry you anywhere you wish! Confers no benefit. January 2018 Subscriber Item.", + "backMystery201801Notes": "Diese verzauberten Flügel sehen vielleicht so delikat wie Schneeflocken aus, aber sie werden Dich tragen wohin du willst! Gewährt keinen Attributbonus. Abonnentengegenstand, Januar 2018.", "backMystery201803Text": "Wagemutige Libellenflügel", - "backMystery201803Notes": "These bright and shiny wings will carry you through soft spring breezes and across lily ponds with ease. Confers no benefit. March 2018 Subscriber Item.", - "backMystery201804Text": "Squirrel Tail", - "backMystery201804Notes": "Sure, it helps you balance while you jump on branches, but the most important thing is MAXIMUM FLUFF. Confers no benefit. April 2018 Subscriber Item.", + "backMystery201803Notes": "Diese glänzenden, hellen Fügel werden Dich mühelos durch leichte Frühlingsbrisen und über Lilienteiche tragen. Gewährt keinen Attributbonus. Abonnentengegenstand, März 2018.", + "backMystery201804Text": "Eichörnchenschwanz", + "backMystery201804Notes": "Klar hilft dieser Schwanz Dir beim Springen von Ast zu Ast, aber viel wichtiger ist seine MAXIMALE FLAUSCHIGKEIT. Gewährt keinen Attributbonus. Abonnentengegenstand, April 2018.", "backSpecialWonderconRedText": "Mächtiger Umhang", "backSpecialWonderconRedNotes": "Strotzt vor Stärke und Schönheit. Gewährt keinen Attributbonus. Special Edition Convention-Gegenstand.", "backSpecialWonderconBlackText": "Tückischer Umhang", @@ -1405,7 +1405,7 @@ "bodyMystery201706Text": "Zerlumpter Korsarenumhang", "bodyMystery201706Notes": "Dieser Umhang hat geheime Taschen um all das Gold zu verstecken, dass Du von Deinen Aufgaben erbeutet hast. Gewährt keinen Attributbonus. Abonnentengegenstand, Juni 2017.", "bodyMystery201711Text": "Teppichreiterschal", - "bodyMystery201711Notes": "This soft knitted scarf looks quite majestic blowing in the wind. Confers no benefit. November 2017 Subscriber Item.", + "bodyMystery201711Notes": "Dieser weiche Schal sieht sehr majestätisch aus wenn er sich leicht im Wind bewegt. Gewährt keinen Attributbonus. Abonnentengegenstand, November 2017.", "bodyArmoireCozyScarfText": "Gemütlicher Schal", "bodyArmoireCozyScarfNotes": "This fine scarf will keep you warm as you go about your wintry business. Increases Constitution and Perception by <%= attrs %> each. Enchanted Armoire: Lamplighter's Set (Item 4 of 4).", "headAccessory": "Kopfschmuck", @@ -1474,8 +1474,8 @@ "headAccessoryMystery201510Notes": "Diese schreckenerregenden Hörner sind ein wenig schleimig. Gewährt keinen Attributbonus. Abonnentengegenstand, Oktober 2015.", "headAccessoryMystery201801Text": "Frostkobold-Geweih", "headAccessoryMystery201801Notes": "Dieses eigige Geweih schimmert mit dem Glanze eines Winterpolarlichts. Gewährt keinen Attributbonus. Abonnentengegenstand, Januar 2018.", - "headAccessoryMystery201804Text": "Squirrel Ears", - "headAccessoryMystery201804Notes": "These fuzzy sound-catchers will ensure you never miss the rustle of a leaf or the sound of an acorn falling! Confers no benefit. April 2018 Subscriber Item.", + "headAccessoryMystery201804Text": "Eichörnchenohren", + "headAccessoryMystery201804Notes": "Mit diesem flauschigen Geräuschfänger wirst Du nie das Rascheln eines Blatts oder das Geräusch einer fallenden Eichel verpassen! Gewährt keinen Attributbonus. Abonnentengegenstand, April 2018.", "headAccessoryMystery301405Text": "Kopf-Brille", "headAccessoryMystery301405Notes": "\"Brillen sind für die Augen,\" haben sie gesagt. \"Niemand will Brillen, die man nur auf dem Kopf tragen kann,\" haben sie gesagt. Ha! Da hast Du es ihnen aber ordentlich gezeigt! Gewährt keinen Attributbonus. Abonnentengegenstand, August 3015.", "headAccessoryArmoireComicalArrowText": "Komischer Pfeil", diff --git a/website/common/locales/de/groups.json b/website/common/locales/de/groups.json index e32a6764c6..44d145a6c8 100644 --- a/website/common/locales/de/groups.json +++ b/website/common/locales/de/groups.json @@ -34,7 +34,7 @@ "communityGuidelines": "Community-Richtlinien", "communityGuidelinesRead1": "Bitte lies unsere", "communityGuidelinesRead2": "vor dem Chatten.", - "bannedWordUsed": "Oops! Looks like this post contains a swearword, religious oath, or reference to an addictive substance or adult topic (<%= swearWordsUsed %>). Habitica has users from all backgrounds, so we keep our chat very clean. Feel free to edit your message so you can post it!", + "bannedWordUsed": "Hoppla! Es sieht so aus, als würde dieser Beitrag ein Schimpfwort oder einen religiösen Fluch enthält, oder sich auf Suchtstoffe oder nicht-jugendfreie Themen bezieht (<%= swearWordsUsed %>). Habitica hat Spieler unterschiedlichster Herkunft, weswegen wir unseren Chat besonders sauber halten wollen. Du kannst Deine Nachricht gerne überarbeiten, um sie doch noch posten zu können! ", "bannedSlurUsed": "Dein Beitrag enthielt unangebrachten Inhalt und deine Chat Privilegien wurden Dir entzogen.", "party": "Gruppe", "createAParty": "Gruppe erstellen", @@ -106,15 +106,15 @@ "optionalMessage": "Optionale Nachricht", "yesRemove": "Ja, entferne sie", "foreverAlone": "\"Gefällt mir\" funktioniert nicht bei eigenen Nachrichten. Sei nicht so einer.", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", - "ascendingAbbrev": "Asc", - "descendingAbbrev": "Desc", + "sortBackground": "Nach Hintergrund sortieren", + "sortClass": "Sortiere nach Klasse", + "sortDateJoined": "Nach Beitrittsdatum sortieren", + "sortLogin": "Sortiere nach Login Datum ", + "sortLevel": "Nach Level sortieren", + "sortName": "Sortiere nach Name", + "sortTier": "Nach Rang sortieren", + "ascendingAbbrev": "Aufsteigend", + "descendingAbbrev": "Absteigend", "applySortToHeader": "Apply Sort Options to Party Header", "confirmGuild": "Gilde für 4 Edelsteine gründen?", "leaveGroupCha": "Gildenwettbewerbe verlassen und ...", @@ -226,7 +226,7 @@ "inviteMustNotBeEmpty": "Einladung muss Daten enthalten", "partyMustbePrivate": "Gruppen müssen privat sein", "userAlreadyInGroup": "Nutzer-ID: <%= userId %>, Nutzer \"<%= username %>\" ist bereits in dieser Gruppe.", - "youAreAlreadyInGroup": "You are already a member of this group.", + "youAreAlreadyInGroup": "Du bist bereits Mitglied dieser Gruppe. ", "cannotInviteSelfToGroup": "Du kannst Dich nicht selbst in eine Gruppe einladen.", "userAlreadyInvitedToGroup": "Nutzer-ID: <%= userId %>, Nutzer \"<%= username %>\" wurde bereits zu dieser Gruppe eingeladen.", "userAlreadyPendingInvitation": "Nutzer-ID: <%= userId %>, Nutzer \"<%= username %>\" hat bereits eine ausstehende Einladung.", @@ -436,16 +436,16 @@ "groupPlanTitle": "Need more for your crew?", "groupPlanDesc": "Managing a small team or organizing household chores? Our group plans grant you exclusive access to a private task board and chat area dedicated to you and your group members!", "billedMonthly": "*billed as a monthly subscription", - "teamBasedTasksList": "Team-Based Task List", + "teamBasedTasksList": "Teambasierte Aufgabenliste", "teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!", "groupManagementControls": "Group Management Controls", "groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.", "inGameBenefits": "In-Game Benefits", "inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.", "inspireYourParty": "Inspire your party, gamify life together.", - "letsMakeAccount": "First, let’s make you an account", - "nameYourGroup": "Next, Name Your Group", - "exampleGroupName": "Example: Avengers Academy", + "letsMakeAccount": "Lass uns dir als erstes einen Account erstellen", + "nameYourGroup": "Wähle als nächstes einen Namen für deine Gruppe", + "exampleGroupName": "Beispiel: Avangers Academy", "exampleGroupDesc": "For those selected to join the training academy for The Avengers Superhero Initiative", "thisGroupInviteOnly": "This group is invitation only.", "gettingStarted": "Getting Started", @@ -454,12 +454,12 @@ "whatsIncludedGroupDesc": "All members of the Group receive full subscription benefits, including the monthly subscriber items, the ability to buy Gems with Gold, and the Royal Purple Jackalope mount, which is exclusive to users with a Group Plan membership.", "howDoesBillingWork": "How does billing work?", "howDoesBillingWorkDesc": "Group Leaders are billed based on group member count on a monthly basis. This charge includes the $9 (USD) price for the Group Leader subscription, plus $3 USD for each additional group member. For example: A group of four users will cost $18 USD/month, as the group consists of 1 Group Leader + 3 group members.", - "howToAssignTask": "How do you assign a Task?", + "howToAssignTask": "Wie weise ich eine Aufgabe zu? ", "howToAssignTaskDesc": "Assign any Task to one or more Group members (including the Group Leader or Managers themselves) by entering their usernames in the \"Assign To\" field within the Create Task modal. You can also decide to assign a Task after creating it, by editing the Task and adding the user in the \"Assign To\" field!", "howToRequireApproval": "How do you mark a Task as requiring approval?", "howToRequireApprovalDesc": "Toggle the \"Requires Approval\" setting to mark a specific task as requiring Group Leader or Manager confirmation. The user who checked off the task won't get their rewards for completing it until it has been approved.", "howToRequireApprovalDesc2": "Group Leaders and Managers can approve completed Tasks directly from the Task Board or from the Notifications panel.", - "whatIsGroupManager": "What is a Group Manager?", + "whatIsGroupManager": "Was ist ein Gruppen Manager? ", "whatIsGroupManagerDesc": "A Group Manager is a user role that do not have access to the group's billing details, but can create, assign, and approve shared Tasks for the Group's members. Promote Group Managers from the Group’s member list.", - "goToTaskBoard": "Go to Task Board" + "goToTaskBoard": "Gehe zum Aufgabenbrett" } \ No newline at end of file diff --git a/website/common/locales/de/npc.json b/website/common/locales/de/npc.json index 29d2098ba9..34794bb296 100644 --- a/website/common/locales/de/npc.json +++ b/website/common/locales/de/npc.json @@ -80,7 +80,7 @@ "positiveAmountRequired": "Positiver Betrag benötigt", "notAccteptedType": "Typ muss eins der Folgenden sein: [Eier, Schlüpftränke, Premium-Schlüpftränke, Futter, Quests, Ausrüstung]", "contentKeyNotFound": "Schlüssel für Inhalt <%= type %> nicht gefunden", - "plusGem": "+<%= count %> Gem", + "plusGem": "+<%= count %> Edelstein", "typeNotSellable": "Typ ist nicht verkäuflich. Dieser muss einer der Folgenden sein: <%= acceptedTypes %>", "userItemsKeyNotFound": "Schlüssel für user.items <%= type %> nicht gefunden", "userItemsNotEnough": "Du hast nicht genug <%= type %>", diff --git a/website/common/locales/de/questscontent.json b/website/common/locales/de/questscontent.json index ba27fcaa99..768788a665 100644 --- a/website/common/locales/de/questscontent.json +++ b/website/common/locales/de/questscontent.json @@ -599,8 +599,8 @@ "questSquirrelNotes": "You wake up and find you’ve overslept! Why didn’t your alarm go off? … How did an acorn get stuck in the ringer?

When you try to make breakfast, the toaster is stuffed with acorns. When you go to retrieve your mount, @Shtut is there, trying unsuccessfully to unlock their stable. They look into the keyhole. “Is that an acorn in there?”

@randomdaisy cries out, “Oh no! I knew my pet squirrels had gotten out, but I didn’t know they’d made such trouble! Can you help me round them up before they make any more of a mess?”

Following the trail of mischievously placed oak nuts, you track and catch the wayward sciurines, with @Cantras helping secure each one safely at home. But just when you think your task is almost complete, an acorn bounces off your helm! You look up to see a mighty beast of a squirrel, crouched in defense of a prodigious pile of seeds.

“Oh dear,” says @randomdaisy, softly. “She’s always been something of a resource guarder. We’ll have to proceed very carefully!” You circle up with your party, ready for trouble!", "questSquirrelCompletion": "With a gentle approach, offers of trade, and a few soothing spells, you’re able to coax the squirrel away from its hoard and back to the stables, which @Shtut has just finished de-acorning. They’ve set aside a few of the acorns on a worktable. “These ones are squirrel eggs! Maybe you can raise some that don’t play with their food quite so much.”", "questSquirrelBoss": "Sneaky Squirrel", - "questSquirrelDropSquirrelEgg": "Squirrel (Egg)", - "questSquirrelUnlockText": "Unlocks purchasable Squirrel eggs in the Market", + "questSquirrelDropSquirrelEgg": "Eichörnchen (Ei)", + "questSquirrelUnlockText": "Ermöglicht den Kauf von Eichörncheneiern auf dem Marktplatz ", "cuddleBuddiesText": "Cuddle Buddies Quest Bundle", "cuddleBuddiesNotes": "Contains 'The Killer Bunny', 'The Nefarious Ferret', and 'The Guinea Pig Gang'. Available until May 31." } \ No newline at end of file diff --git a/website/common/locales/de/subscriber.json b/website/common/locales/de/subscriber.json index 64bb0a092f..24e91327e9 100644 --- a/website/common/locales/de/subscriber.json +++ b/website/common/locales/de/subscriber.json @@ -142,7 +142,7 @@ "mysterySet201801": "Frostkobold-Set", "mysterySet201802": "Liebeskäfer-Set", "mysterySet201803": "Wagemutige-Libelle-Set", - "mysterySet201804": "Spiffy Squirrel Set", + "mysterySet201804": "Schickes Eichörnchen Set", "mysterySet301404": "Steampunk-Standard-Set", "mysterySet301405": "Steampunk-Zubehör-Set", "mysterySet301703": "Pfauen-Steampunk-Set", diff --git a/website/common/locales/es/groups.json b/website/common/locales/es/groups.json index b98ab633fa..686274fc7f 100644 --- a/website/common/locales/es/groups.json +++ b/website/common/locales/es/groups.json @@ -106,16 +106,16 @@ "optionalMessage": "Mensaje opcional", "yesRemove": "Sí, elimínalos", "foreverAlone": "No pueden gustarte tus propios mensajes. No seas esa persona.", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", + "sortBackground": "Ordenar por fondo", + "sortClass": "Ordenar por clase", + "sortDateJoined": "Ordenar por fecha de ingreso", + "sortLogin": "Ordenar por fecha de acceso", + "sortLevel": "Ordenar por nivel", + "sortName": "Ordenar por nombre", + "sortTier": "Ordenar por escalafón", "ascendingAbbrev": "Asc", "descendingAbbrev": "Desc", - "applySortToHeader": "Apply Sort Options to Party Header", + "applySortToHeader": "Aplicar opciones de clasificación al cabecero del equipo", "confirmGuild": "¿Crear Gremio por 4 gemas?", "leaveGroupCha": "Abandonar los desafíos del Gremio y...", "confirm": "Confirmar", @@ -131,10 +131,10 @@ "clearAll": "Eliminar todos los mensajes", "confirmDeleteAllMessages": "¿Estás seguro que quieres eliminar todos los mensajes de tu bandeja de entrada? Otros usuarios seguirán viendo los mensajes que les mandaste.", "optOutPopover": "¿No te gustan los mensajes privados? Haz click para excluirlos por completo", - "PMPlaceholderTitle": "Nothing Here Yet", - "PMPlaceholderDescription": "Select a conversation on the left", - "PMPlaceholderTitleRevoked": "Your chat privileges have been revoked", - "PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email admin@habitica.com to discuss it with the staff.", + "PMPlaceholderTitle": "No hay nada aquí de momento", + "PMPlaceholderDescription": "Elige una conversación de la izquierda", + "PMPlaceholderTitleRevoked": "Tus privilegios para chatear han sido revocados.", + "PMPlaceholderDescriptionRevoked": "No puedes enviar mensajes privados porque tus privilegios para chatear han sido revocados. Si tienes preguntas o inquietudes acerca de esto, envía un correo electrónico a admin@habitica.com para tratarlo con el personal.", "block": "Bloquear", "unblock": "Desbloquear", "pm-reply": "Enviar una respuesta", diff --git a/website/common/locales/es_419/content.json b/website/common/locales/es_419/content.json index 70b684c574..dc3beec896 100644 --- a/website/common/locales/es_419/content.json +++ b/website/common/locales/es_419/content.json @@ -167,9 +167,9 @@ "questEggBadgerText": "Tejón", "questEggBadgerMountText": "Tejón", "questEggBadgerAdjective": "bullicioso", - "questEggSquirrelText": "Squirrel", - "questEggSquirrelMountText": "Squirrel", - "questEggSquirrelAdjective": "bushy-tailed", + "questEggSquirrelText": "Ardilla", + "questEggSquirrelMountText": "Ardilla", + "questEggSquirrelAdjective": "de cola tupida", "eggNotes": "Encuentra una poción de eclosión para verter sobre este huevo y se convertirá en <%= eggAdjective(locale) %> <%= eggText(locale) %>.", "hatchingPotionBase": "Básico", "hatchingPotionWhite": "Blanco", diff --git a/website/common/locales/es_419/messages.json b/website/common/locales/es_419/messages.json index d0e1100b9b..1fc5eeafe2 100644 --- a/website/common/locales/es_419/messages.json +++ b/website/common/locales/es_419/messages.json @@ -55,11 +55,11 @@ "messageGroupChatAdminClearFlagCount": "¡Sólo un administrador puede borrar el número de denuncias!", "messageCannotFlagSystemMessages": "No puedes marcar un mensaje del sistema. Si necesitas informar una infracción de las Normas de la comunidad relacionadas con este mensaje, envíe un mensaje de correo electrónico con una captura de pantalla y una explicación a Lemoness <%= communityManagerEmail %>.", "messageGroupChatSpam": "Ups, ¡parece que estás publicando demasiados mensajes! Espera un minuto y vuelve a intentarlo. El chat de la Taberna solo puede con 200 mensajes a la vez, por lo que Habitica recomienda publicar mensajes más largos y meditados, así como respuestas unificadas. No podemos esperar a oir lo que tienes que decir. :)", - "messageCannotLeaveWhileQuesting": "You cannot accept this party invitation while you are in a quest. If you'd like to join this party, you must first abort your quest, which you can do from your party screen. You will be given back the quest scroll.", + "messageCannotLeaveWhileQuesting": "No puedes aceptar esta invitación de grupo mientras estas en una misión. Si te quieres unir a este grupo, tienes que abortar tu misión primero, puedes hacerlo desde la pantalla del grupo. Se te devolverá tu pergamino de misión.", "messageUserOperationProtected": "la ruta `<%= operation %>` no ha sido guardada, ya que es una ruta protegida.", "messageUserOperationNotFound": "<%= operation %> operación no encontrada", "messageNotificationNotFound": "Notificación no encontrada.", - "messageNotAbleToBuyInBulk": "This item cannot be purchased in quantities above 1.", + "messageNotAbleToBuyInBulk": "Este artículo no se puede comprar en cantidades arriba de 1.", "notificationsRequired": "Se requiere el ID de notificación.", "unallocatedStatsPoints": "Tienes <%= points %> Puntos de Atributo sin asignar ", "beginningOfConversation": "Este es el comienzo de tu conversación con <%= userName %>. ¡Recuerda ser amable, respetuoso y seguir las Normas de la Comunidad!" diff --git a/website/common/locales/es_419/npc.json b/website/common/locales/es_419/npc.json index 70743552d3..5de4597f36 100644 --- a/website/common/locales/es_419/npc.json +++ b/website/common/locales/es_419/npc.json @@ -80,7 +80,7 @@ "positiveAmountRequired": "Se requiere una cantidad positiva", "notAccteptedType": "Tipo debe ir en [eggs, hatchingPotions, premiumHatchingPotions, food, quests, gear]", "contentKeyNotFound": "No se encontró una llave para el contenido <%= type %>", - "plusGem": "+<%= count %> Gem", + "plusGem": "+<%= count %> Gemas", "typeNotSellable": "El tipo no se puede vender. Debe ser uno de los siguientes: <%= acceptedTypes %>", "userItemsKeyNotFound": "no se encontró una llave para los objetos del usuario <%= type %>", "userItemsNotEnough": "No tienes suficientes <%= type %>", @@ -88,7 +88,7 @@ "unlocked": "Se han desbloqueado objetos. ", "alreadyUnlocked": "El conjunto ya se ha desbloqueado por completo. ", "alreadyUnlockedPart": "El conjunto se ha desbloqueado parcialmente. ", - "invalidQuantity": "Quantity to purchase must be a number.", + "invalidQuantity": "La cantidad a comprar debe ser un numero.", "USD": "(USD)", "newStuff": "Cosas nuevas, por Bailey", "newBaileyUpdate": "¡Nueva Actualización de Bailey!", diff --git a/website/common/locales/es_419/overview.json b/website/common/locales/es_419/overview.json index 0eae0c4a34..8373997a9a 100644 --- a/website/common/locales/es_419/overview.json +++ b/website/common/locales/es_419/overview.json @@ -10,5 +10,5 @@ "step3": "Paso 3: Personaliza y Explora Habitica", "webStep3Text": "\nUna vez que esté familiarizado con los conceptos básicos, puede obtener aún más de Habitica con estas características ingeniosas:\n * Organiza tus tareas [tags](http://habitica.wikia.com/wiki/Tags) (edit a task to add them).\n * Personaliza tu avatar [avatar](http://habitica.wikia.com/wiki/Avatar) by clicking the user icon in the upper-right corner.\n * Buy your [Equipment](http://habitica.wikia.com/wiki/Equipment) under Rewards or from the [Shops](/shops/market), and change it under [Inventory > Equipment](/inventory/equipment).\n * Connect with other users via the [Tavern](http://habitica.wikia.com/wiki/Tavern).\n * Starting at Level 3, hatch [Pets](http://habitica.wikia.com/wiki/Pets) by collecting [eggs](http://habitica.wikia.com/wiki/Eggs) and [hatching potions](http://habitica.wikia.com/wiki/Hatching_Potions). [Feed](http://habitica.wikia.com/wiki/Food) them to create [Mounts](http://habitica.wikia.com/wiki/Mounts).\n * At level 10: Choose a particular [class](http://habitica.wikia.com/wiki/Class_System) and then use class-specific [skills](http://habitica.wikia.com/wiki/Skills) (levels 11 to 14).\n * Form a party with your friends (by clicking [Party](/party) in the navigation bar) to stay accountable and earn a Quest scroll.\n * Defeat monsters and collect objects on [quests](http://habitica.wikia.com/wiki/Quests) (you will be given a quest at level 15).\n Escriba aquí su ", - "overviewQuestions": "Have questions? Check out the [FAQ](/static/faq/)! If your question isn't mentioned there, you can ask for further help in the [Habitica Help guild](/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a).\n\nGood luck with your tasks!" + "overviewQuestions": "¿Tienes preguntas? ¡Revisa las [Preguntas Frecuentes](/static/faq/)! Si tu pregunta no esta ahi, puedes pedir ayuda en el [Gremio de ayuda de Habitica](/groups/guild/5481ccf3-5d2d-48a9-a871-70a7380cee5a).\n\n¡Buena suerte con tus tareas!" } diff --git a/website/common/locales/es_419/quests.json b/website/common/locales/es_419/quests.json index b7b3ad4757..11fe1c8bee 100644 --- a/website/common/locales/es_419/quests.json +++ b/website/common/locales/es_419/quests.json @@ -121,7 +121,7 @@ "buyQuestBundle": "Comprar paquete de misiones", "noQuestToStart": "¿No puedes encontrar una misión para iniciar? ¡Intenta revisar la Tienda de Misiones en el Mercado para ver nuevas misiones!", "pendingDamage": "<%= damage %> daño pendiente", - "pendingDamageLabel": "pending damage", + "pendingDamageLabel": "Daño pendiente", "bossHealth": "<%= currentHealth %>/<%= maxHealth %> Salud", "rageAttack": "Ataque de ira", "bossRage": "<%= currentRage %>/<%= maxRage %> Ira", diff --git a/website/common/locales/es_419/settings.json b/website/common/locales/es_419/settings.json index b6536c428e..6ff2276b70 100644 --- a/website/common/locales/es_419/settings.json +++ b/website/common/locales/es_419/settings.json @@ -32,7 +32,7 @@ "resetAccPop": "Empezar de nuevo, eliminando todo los niveles, el oro, el equipamiento, el historial, y las tareas.", "deleteAccount": "Eliminar cuenta", "deleteAccPop": "Cancelar y quitar esta cuenta de Habitica.", - "feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.", + "feedback": "Si deseas enviarnos sus comentarios, ingrésalos a continuación. Nos encantaría saber qué te gustó o no de Habitica. ¿No hablas inglés? ¡No hay problema! Usa el idioma que prefieras.", "qrCode": "Código QR", "dataExport": "Exportar datos", "saveData": "Aquí hay algunas opciones para guardar tu información.", diff --git a/website/common/locales/fr/backgrounds.json b/website/common/locales/fr/backgrounds.json index 47b47d885e..33073e92b3 100644 --- a/website/common/locales/fr/backgrounds.json +++ b/website/common/locales/fr/backgrounds.json @@ -347,10 +347,10 @@ "backgroundFlyingOverAncientForestText": "Forêt ancienne", "backgroundFlyingOverAncientForestNotes": "Volez au dessus de la canopée d'une forêt ancienne.", "backgrounds052018": "Ensemble 48 : sorti en mai 2018", - "backgroundTerracedRiceFieldText": "Champs de riz en terrasses", - "backgroundTerracedRiceFieldNotes": "Appréciez un champ de riz en terrasses pendant la saison de croissance.", + "backgroundTerracedRiceFieldText": "Champ de riz en terrasses", + "backgroundTerracedRiceFieldNotes": "Appréciez la saison des pousses dans un champ de riz en terrasses.", "backgroundFantasticalShoeStoreText": "Magasin de chaussures fantastiques", - "backgroundFantasticalShoeStoreNotes": "Cherchez de nouvelles chaussures amusantes dans ce magasin de chaussures fantastiques.", + "backgroundFantasticalShoeStoreNotes": "Cherchez de nouvelles chausses amusantes dans ce magasin de chaussures fantastiques.", "backgroundChampionsColosseumText": "Colisée des champions", "backgroundChampionsColosseumNotes": "Prélassez-vous devant la gloire du Colisée des champions." } \ No newline at end of file diff --git a/website/common/locales/fr/communityguidelines.json b/website/common/locales/fr/communityguidelines.json index 2cb848926f..ccbac8dddc 100644 --- a/website/common/locales/fr/communityguidelines.json +++ b/website/common/locales/fr/communityguidelines.json @@ -58,7 +58,7 @@ "commGuidePara055": "Les exemples suivants représentent des infractions modérées. Cette liste n’est pas exhaustive.", "commGuideList06A": "Ignorer, manquer de respect ou contester un modérateur. Ceci inclut : se plaindre en public d'un modérateur ou d'un autre utilisateur, ou publiquement glorifier ou défendre des utilisateurs bannis, ou débattre si l'action d'un modérateur était ou non appropriée. Si une règle ou un modérateur vous pose un souci, veuillez contacter l'équipe par courriel (admin@habitica.com).", "commGuideList06B": "Modération abusive. Pour clarifier : un rappel sympathique des règles ne pose pas de problème. La modération abusive consiste à ordonner, demander et/ou sous-entendre fortement que quelqu’un doit vous écouter afin de corriger une erreur. Vous pouvez prévenir une personne qu’elle enfreint les règles, mais ne réclamez pas d’action particulière. Par exemple, dire « Juste pour que tu saches, il est déconseillé de jurer dans la taverne donc tu devrais retirer cela » est plus adéquat que dire « Je vais devoir te demander de retirer tes propos ».", - "commGuideList06C": "Intentionnellement reporter des messages innocents.", + "commGuideList06C": "Signalement intentionnel de messages innocents.", "commGuideList06D": "Violations répétées du code de conduite dans l'espace public ", "commGuideList06E": "Commissions répétées d'infractions mineures", "commGuideHeadingMinorInfractions": "Infractions mineures", @@ -94,7 +94,7 @@ "commGuideList11E": "Modifications (la modération ou le staff peut modifier du contenu problématique)", "commGuideHeadingRestoration": "Restauration", "commGuidePara061": "Habitica est un lieu dédié au développement personnel, et nous croyons aux secondes chances. Si vous commettez une infraction qui a eu une conséquence, voyez-le comme une chance d’évaluer vos actions et de travailler à devenir un meilleur membre de la communauté.", - "commGuidePara062": "L'annonce, le message et/ou le courriel que vous recevez expliquant les conséquences de vos actions est une bonne source d’informations. Acceptez les restrictions qui vous sont imposées, et engagez-vous à faire ce qu’il faut pour voir vos sanctions levées.", + "commGuidePara062": "L'annonce, le message et/ou le courriel que vous recevez expliquant les conséquences de vos actions constitue une bonne source d’informations. Acceptez les restrictions qui vous sont imposées, et engagez-vous à faire ce qu’il faut pour voir vos sanctions levées.", "commGuidePara063": "Si vous ne comprenez pas les conséquences ou la nature de votre infraction, demandez de l’aide au staff ou à l'équipe de modération afin d'éviter de nouvelles infractions. Si vous trouvez qu'une décision spécifique était injuste, vous pouvez contacter l'équipe pour en discuter à admin@habitica.com.", "commGuideHeadingMeet": "Rencontrez l'équipe derrière Habitica et ses modérateurs !", "commGuidePara006": "Habitica compte plusieurs chevaliers-errants qui unissent leurs forces avec celles des membres de l'équipe d'administration afin de préserver le calme et le contentement de la communauté et de la protéger des trolls. Tous et toutes ont leur domaine spécifique, mais certains peuvent être parfois appelés à servir dans d'autres sphères sociales.", diff --git a/website/common/locales/fr/gear.json b/website/common/locales/fr/gear.json index fc966487b1..61c7412b30 100644 --- a/website/common/locales/fr/gear.json +++ b/website/common/locales/fr/gear.json @@ -335,7 +335,7 @@ "weaponArmoireFlutteryArmyText": "Armée papillonnante", "weaponArmoireFlutteryArmyNotes": "Ce groupe de lépidoptères bagarreurs est prêt à battre des ailes avec acharnement pour refroidir les plus rouges de vos tâches. Augmente la Constitution, l'Intelligence et la Force de <%= attrs %> chacune. Armoire enchantée : ensemble papillonnant (objet 3 sur 3).", "weaponArmoireCobblersHammerText": "Marteau de cordonnier", - "weaponArmoireCobblersHammerNotes": "Ce marteau a été spécialement fabriqué pour traiter le cuir. Néanmoins, il peut faire un travail impressionnant sur une quotidienne rouge en un rien de temps. Augmente la constitution et la force de <%= attrs %> chacun. Armoire enchantée : Ensemble du cordonnier (Objet 2 de 3).", + "weaponArmoireCobblersHammerNotes": "Ce marteau a été spécialement fabriqué pour traiter le cuir. Néanmoins, il peut accomplir un travail impressionnant sur une quotidienne rouge en un rien de temps. Augmente la constitution et la force de <%= attrs %> chacune. Armoire enchantée : ensemble du cordonnier (objet 2 sur 3).", "armor": "armure", "armorCapitalized": "Armure", "armorBase0Text": "Habit simple", @@ -719,7 +719,7 @@ "armorArmoireFlutteryFrockText": "Robe papillonnante", "armorArmoireFlutteryFrockNotes": "Une robe légère et vaporeuse avec un large jupon que les papillons risquent de prendre pour une fleur géante. Augmente la Constitution, la Perception et la Force de <%= attrs %> chacune. Armoire enchantée : ensemble papillonnant (objet 1 sur 3).", "armorArmoireCobblersCoverallsText": "Combinaison de cordonnier", - "armorArmoireCobblersCoverallsNotes": "Cette combinaison solide a plein de poches pour les outils, les morceaux de cuir et les autres objets utiles ! Augmente la perception et la force de <%= attrs %> chacun. Armoire enchantée : Ensemble du cordonnier (Objet 1 de 3).", + "armorArmoireCobblersCoverallsNotes": "Cette combinaison solide a plein de poches pour les outils, les morceaux de cuir et les autres objets utiles ! Augmente la perception et la force de <%= attrs %> chacune. Armoire enchantée : ensemble du cordonnier (objet 1 sur 3).", "headgear": "heaume", "headgearCapitalized": "Couvre-chef", "headBase0Text": "Pas de couvre-chef", @@ -1327,7 +1327,7 @@ "shieldArmoireFlutteryFanText": "Éventail fleuri", "shieldArmoireFlutteryFanNotes": "Par une chaude journée, il n'y a rien de mieux qu'un éventail chic pour vous refroidir et avoir l'air cool . Augmente la Constitution, l'Intelligence et la Perception de <%= attrs %> chacune. Armoire enchantée : objet indépendant.", "shieldArmoireFancyShoeText": "Chaussure de luxe", - "shieldArmoireFancyShoeNotes": "Une chaussure très spéciale sur laquelle vous travaillez. Elle est bonne pour la royauté ! Augmente l'intelligence et la perception de <%= attrs %> chacun. Armoire enchantée (Objet 3 de 3).", + "shieldArmoireFancyShoeNotes": "Une chaussure très spéciale sur laquelle vous travaillez. Elle est bonne pour la royauté ! Augmente l'intelligence et la perception de <%= attrs %> chacune. Armoire enchantée : ensemble du cordonnier (objet 3 sur 3).", "back": "Accessoire dorsal", "backCapitalized": "Accessoire dorsal", "backBase0Text": "Pas d’accessoire dorsal", @@ -1361,7 +1361,7 @@ "backMystery201803Text": "Ailes de la libellule audacieuse", "backMystery201803Notes": "Ces ailes brillantes et reluisantes vous porteront avec aise à travers la douce brise de printemps, et par dessus les nénuphars. Ne confère aucun bonus. Équipement d'abonné·e de mars 2018.", "backMystery201804Text": "Queue d’écureuil", - "backMystery201804Notes": "Évidemment, ça vous aide à garder l'équilibre quand vous sautez de branche en branche, mais le plus important c'est la DOUCEUR MAXIMALE. Ne confère aucun bonus. Objet d'abonnement d'Avril 2018.", + "backMystery201804Notes": "Évidemment, elle vous aide à garder l'équilibre quand vous sautez de branche en branche, mais le plus important c'est cette DOUCEUR MAXIMALE. Ne confère aucun bonus. Équipement d’abonné•e d'avril 2018.", "backSpecialWonderconRedText": "Cape de puissance", "backSpecialWonderconRedNotes": "Bruisse avec force et élégance. N'apporte aucun bonus. Équipement de Convention en Édition Spéciale.", "backSpecialWonderconBlackText": "Cape de dissimulation", diff --git a/website/common/locales/fr/groups.json b/website/common/locales/fr/groups.json index 9634b4f5d4..1c19b95fd3 100644 --- a/website/common/locales/fr/groups.json +++ b/website/common/locales/fr/groups.json @@ -106,15 +106,15 @@ "optionalMessage": "Message optionnel", "yesRemove": "Oui, enlevez-les", "foreverAlone": "Vous ne pouvez pas aimer votre propre message. Ne soyez pas ce genre de personne.", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", - "ascendingAbbrev": "Asc", - "descendingAbbrev": "Desc", + "sortBackground": "Classer par arrière-plan", + "sortClass": "Trier par classe", + "sortDateJoined": "Trier par date d'arrivée", + "sortLogin": "Trier par date de connexion", + "sortLevel": "Trier par niveau", + "sortName": "Trier par nom", + "sortTier": "Trier par palier", + "ascendingAbbrev": "Asc.", + "descendingAbbrev": "Desc.", "applySortToHeader": "Apply Sort Options to Party Header", "confirmGuild": "Créer une guilde pour 4 gemmes ?", "leaveGroupCha": "Quitter les défis de guilde et…", @@ -132,9 +132,9 @@ "confirmDeleteAllMessages": "Confirmez-vous effacer tous les messages de votre boîte ? Les autres utilisateurs continueront de voir les messages que vous avez expédiés.", "optOutPopover": "Vous n'aimez pas les messages privés ? Cliquez ici pour désactiver l'option", "PMPlaceholderTitle": "Nothing Here Yet", - "PMPlaceholderDescription": "Select a conversation on the left", - "PMPlaceholderTitleRevoked": "Your chat privileges have been revoked", - "PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email admin@habitica.com to discuss it with the staff.", + "PMPlaceholderDescription": "Sélectionnez une conversation à gauche", + "PMPlaceholderTitleRevoked": "Vos privilèges de discussion ont été révoqués.", + "PMPlaceholderDescriptionRevoked": "Vous ne pouvez pas envoyer de messages privés car vos privilèges de discussion ont été révoqués. Si vous avez des questions ou des inquiétudes concernant cette mesure, veuillez envoyer un courriel à admin@habitica.com pour en discuter avec les employés Habitica.", "block": "Bloquer", "unblock": "Ne plus bloquer", "pm-reply": "Répondre", @@ -444,7 +444,7 @@ "inGameBenefitsDesc": "Les membres du groupe reçoivent une monture léporilope exclusive, ainsi que tous les bénéfices d'un abonnement complet, incluant l'équipement mensuel spécial et la capacité d'acheter des gemmes pour de l'or.", "inspireYourParty": "Inspirez votre équipe, ludifiez votre vie tous ensemble.", "letsMakeAccount": "D’abord, créons-vous un compte", - "nameYourGroup": "Ensuite, nommez votre Groupe", + "nameYourGroup": "Ensuite, nommez votre groupe", "exampleGroupName": "Par exemple : Avengers Academy", "exampleGroupDesc": "Dédié aux personnes sélectionnées qui rejoignent l'université d'entraînement \"Initiative Superhéroïque des Avengers\".", "thisGroupInviteOnly": "Ce groupe n’est accessible qu’avec une invitation.", diff --git a/website/common/locales/fr/npc.json b/website/common/locales/fr/npc.json index 325b02fd5a..a9ed7e0f1c 100644 --- a/website/common/locales/fr/npc.json +++ b/website/common/locales/fr/npc.json @@ -80,7 +80,7 @@ "positiveAmountRequired": "Un montant positif est requis", "notAccteptedType": "Le Type doit faire partie de [eggs, hatchingPotions, premiumHatchingPotions, food, quests, gear]", "contentKeyNotFound": "Clé non trouvée pour le contenu <%= type %>", - "plusGem": "+<%= count %> Gemmes", + "plusGem": "+<%= count %> gemmes", "typeNotSellable": "Type n'est pas vendable. Il doit faire partie des types suivants <%= acceptedTypes %>", "userItemsKeyNotFound": "Clé non trouvée pour user.items <%= type %>", "userItemsNotEnough": "Vous n'avez pas assez de <%= type %>.", diff --git a/website/common/locales/fr/questscontent.json b/website/common/locales/fr/questscontent.json index 80bcef498a..af3083ed40 100644 --- a/website/common/locales/fr/questscontent.json +++ b/website/common/locales/fr/questscontent.json @@ -97,12 +97,12 @@ "questGoldenknight1Text": "La chevaleresse d'or, 1re partie : une sévère remontrance", "questGoldenknight1Notes": "La chevaleresse d'or tombe sur le dos des pauvres citoyens d'Habitica. Vous n'avez pas fait toutes vos quotidiennes ? Vous avez cédé à une mauvaise habitude ? Elle s'en servira comme raison pour vous rabâcher que vous devez suivre son exemple. Elle est l'exemple brillant d'une Habiticienne parfaite, et vous n'êtes qu'un raté. Hé bien, ce n'est pas gentil du tout, ça ! Tout le monde fait des erreurs ! Et on ne devrait pas subir de telles critiques pour si peu. Il est peut-être temps de récolter quelques témoignages d'habitants blessés et d'avoir une petite discussion avec la chevaleresse d'or !", "questGoldenknight1CollectTestimony": "Témoignages", - "questGoldenknight1Completion": "Regardez tout ces témoignages ! De toute évidence, cela suffira à convaincre la chevaleresse d'or. Tout ce qu'il vous reste à faire, c'est la trouver.", + "questGoldenknight1Completion": "Regardez tous ces témoignages ! De toute évidence, cela suffira à convaincre la chevaleresse d'or. Tout ce qu'il vous reste à faire, c'est la trouver.", "questGoldenknight1DropGoldenknight2Quest": "La chevaleresse d'or, 2e partie : le chevalier au féminin (Parchemin)", "questGoldenknight2Text": "La chevaleresse d'or, 2e partie : le chevalier au féminin", "questGoldenknight2Notes": "Avec en poche des centaines de témoignages d'Habiticiennes et d'Habiticiens malmenés, vous affrontez enfin la chevaleresse d'or. Vous entamez la récitation des plaintes à son sujet, une par une : \"...et @Pfeffernusse dit que tes vantardises incessantes...\" La chevaleresse lève la main pour vous faire taire, puis ricane. \"Je t'en prie, ces gens sont simplement jaloux de mon succès. Au lieu de se plaindre, ils devraient juste travailler aussi dur que moi ! Je devrais peut-être te montrer la force qu'on peut atteindre avec une discipline comme la mienne !\" Elle lève alors son fléau et se prépare à vous attaquer !", "questGoldenknight2Boss": "Chevaleresse d'or", - "questGoldenknight2Completion": "La chevaleresse d'or baisse son fléau avec consternation. \"Je m'excuse pour mon accès de colère,\" dit-elle. \"La vérité, c'est qu'il m'est pénible de penser que j'ai blessé les autres par inadvertance, et je m'énerve par réflexe défensif... mais peut être n'est-il pas trop tard pour s'excuser ?\"", + "questGoldenknight2Completion": "La chevaleresse d'or baisse son fléau avec consternation. \"Je m'excuse pour mon accès de colère,\" dit-elle. \"La vérité, c'est qu'il m'est pénible de penser que j'ai blessé les autres par inadvertance, et je m'énerve par réflexe défensif... mais peut être n'est-il pas trop tard pour demander pardon ?\"", "questGoldenknight2DropGoldenknight3Quest": "La chevaleresse d'or, 3e partie : le chevalier de fer (Parchemin)", "questGoldenknight3Text": "La chevaleresse d'or, 3e partie : le chevalier de fer", "questGoldenknight3Notes": "@Jon Arinbjorn vous appelle pour attirer votre attention. À la suite de votre bataille, un nouveau personnage est apparu. Un chevalier dans une armure de fer veiné de noir s'approche lentement de vous, l'épée à la main. La chevaleresse d'or lui crie \"Père, non !\" mais le chevalier ne montre aucun signe de ralentissement. Elle se tourne vers vous et dit : \"Je suis désolée. J'étais inconsciente, avec bien trop la grosse tête pour voir à quel point j'étais devenue cruelle. Mais mon père est bien plus terrible que je ne pourrais l'être. Si on ne l'arrête pas, il nous détruira tous. Tiens, prend mon fléau et arrête le chevalier de fer !\"", @@ -295,7 +295,7 @@ "questUnicornDropUnicornEgg": "Licorne (Œuf)", "questUnicornUnlockText": "Déverrouille l'achat d’œufs de licorne au marché", "questSabretoothText": "Le tigre à dents de sabre", - "questSabretoothNotes": "Un monstre rugissant terrorise Habitica ! La créature erre entre bois et forêts et tout-à-coup attaque, avant de s'évanouir dans la nature. Elle chasse les pandas sans défense et effraie tant les cochons volants qu'ils quittent leurs enclos et se perchent dans les arbres. @InspectorCaracal et @icefelis expliquent qu'ils ont malencontreusement libéré un tigre à dents de sabre zombie alors qu'ils faisaient des fouilles dans les antiques glaces vierges des steppes stoïcalmes. \"Il était tout-à-fait aimable au début. Je ne comprends pas ce qui s'est passé. Je vous en prie, vous devez nous aider à l'attraper ! Seul un champion de Habitica peut espérer maîtriser ce monstre préhistorique.\"", + "questSabretoothNotes": "Un monstre rugissant terrorise Habitica ! La créature erre entre bois et forêts et tout-à-coup attaque, avant de s'évanouir dans la nature. Elle chasse les pandas sans défense et effraie tant les cochons volants qu'ils quittent leurs enclos et se perchent dans les arbres. @InspectorCaracal et @icefelis expliquent qu'ils ont malencontreusement libéré un tigre à dents de sabre zombie alors qu'ils faisaient des fouilles dans les antiques glaces vierges des steppes stoïcalmes. \"Il était tout-à-fait aimable au début. Je ne comprends pas ce qui s'est passé. Je vous en prie, vous devez nous aider à l'attraper ! Seul un champion d'Habitica peut espérer maîtriser ce monstre préhistorique.\"", "questSabretoothCompletion": "Après un long et fatiguant combat en corps-à-corps, vous immobilisez le tigre à dents de sabre zombie au sol. Collé à lui, le maintenant solidement, vous remarquez une vilaine carie dans l'une de ses immenses canines. Comprenant enfin la raison de la rage du tigre, vous faites soigner la carie par @Fandekasp et dites gentiment au groupe que dorénavant, il vaudrait mieux éviter de donner des bonbons à leur ami tigre. Le tigre à dents de sabre grandit de manière spectaculaire, et ses dompteurs, pleins de gratitude, vous envoient une grande récompense : une couvée d’œufs au motif strié. ", "questSabretoothBoss": "Tigre à dents de sabre zombie", "questSabretoothDropSabretoothEgg": "Tigre à dents de sabre (Œuf)", @@ -601,6 +601,6 @@ "questSquirrelBoss": "Écureuil sournois", "questSquirrelDropSquirrelEgg": "Écureuil (Œuf)", "questSquirrelUnlockText": "Déverrouille l'achat d'œufs d’écureuils au marché", - "cuddleBuddiesText": "Lot de quêtes des amis câlins", - "cuddleBuddiesNotes": "Contient 'Le lapin tueur', 'L'abominable furet', et 'Le gang des cochons d'Inde'. Disponible jusqu'au 31 Mai." + "cuddleBuddiesText": "Lot de quêtes des acolytes à câlins", + "cuddleBuddiesNotes": "Contient \"Le lapin tueur\", \"L'abominable furet\", et \"Le gang des cochons d'Inde\". Disponible jusqu'au 31 mai." } \ No newline at end of file diff --git a/website/common/locales/fr/subscriber.json b/website/common/locales/fr/subscriber.json index 7c65b88ac4..b6ea1dd1e2 100644 --- a/website/common/locales/fr/subscriber.json +++ b/website/common/locales/fr/subscriber.json @@ -142,7 +142,7 @@ "mysterySet201801": "Ensemble de la fée de givre", "mysterySet201802": "Ensemble de l'insecte de l'amour", "mysterySet201803": "Ensemble de la libellule audacieuse", - "mysterySet201804": "Ensemble d’écureuil élégant", + "mysterySet201804": "Ensemble de l’élégant écureuil", "mysterySet301404": "Ensemble steampunk de base", "mysterySet301405": "Ensemble d'accessoires steampunks", "mysterySet301703": "Ensemble du paon steampunk", diff --git a/website/common/locales/pl/groups.json b/website/common/locales/pl/groups.json index ca5e8c06da..bb2d2ac7ef 100644 --- a/website/common/locales/pl/groups.json +++ b/website/common/locales/pl/groups.json @@ -106,16 +106,16 @@ "optionalMessage": "Wiadomość opcjonalna", "yesRemove": "Tak, usuń je", "foreverAlone": "Nie możesz polubić własnej wiadomości. Nie bądź taki.", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", - "ascendingAbbrev": "Asc", - "descendingAbbrev": "Desc", - "applySortToHeader": "Apply Sort Options to Party Header", + "sortBackground": "Sortuj według Tła", + "sortClass": "Sortuj według Klasy", + "sortDateJoined": "Sortuj według Daty Dołączenia", + "sortLogin": "Sortuj według Daty Logowania", + "sortLevel": "Sortuj według Poziomu", + "sortName": "Sortuj według Nazwy", + "sortTier": "Sortuj według Rangi", + "ascendingAbbrev": "Rosnąco", + "descendingAbbrev": "Malejąco", + "applySortToHeader": "Użyj Opcji Sortowania do Nagłówka Drużyny", "confirmGuild": "Stworzyć Gildię za 4 Klejnoty?", "leaveGroupCha": "Opuść wyzwania Gildii i...", "confirm": "Potwierdź", @@ -131,10 +131,10 @@ "clearAll": "Usuń wszystkie wiadomości", "confirmDeleteAllMessages": "Czy na pewno chcesz usunąć wszystkie wiadomości w skrzynce odbiorczej? Inni użytkownicy nadal będą widzieli wiadomości, które im przesłałeś.", "optOutPopover": "Nie lubisz prywatnych wiadomości? Kliknij, aby całkiem z nich zrezygnować.", - "PMPlaceholderTitle": "Nothing Here Yet", - "PMPlaceholderDescription": "Select a conversation on the left", - "PMPlaceholderTitleRevoked": "Your chat privileges have been revoked", - "PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email admin@habitica.com to discuss it with the staff.", + "PMPlaceholderTitle": "Nic tu jeszcze nie ma", + "PMPlaceholderDescription": "Wybierz rozmowę po lewej", + "PMPlaceholderTitleRevoked": "Twoje uprawnienia do czatu zostały wycofane", + "PMPlaceholderDescriptionRevoked": "Nie możesz wysyłać prywatnych wiadomości ponieważ Twoje uprawnienia do rozmów zostały wycofane. Jeśli masz z tego powodu pytania albo wątpliwości to proszę wyślij e-maila na adres admin@habitica.com by przedyskutować to z zespołem.", "block": "Blokuj", "unblock": "Odblokuj", "pm-reply": "Wyślij odpowiedź", diff --git a/website/common/locales/pt/challenge.json b/website/common/locales/pt/challenge.json index 5dc99221ec..e3e7bb1160 100644 --- a/website/common/locales/pt/challenge.json +++ b/website/common/locales/pt/challenge.json @@ -16,7 +16,7 @@ "noChallenges": "Nenhum desafio ainda, visite", "toCreate": "para criar um.", "selectWinner": "Selecione um vencedor e termine o desafio:", - "deleteOrSelect": "Apagar ou selecionar vencedor", + "deleteOrSelect": "Eliminar ou seleccionar vencedor", "endChallenge": "Terminar Desafio", "challengeDiscription": "Estas são as tarefas do desafio que serão adicionadas ao seu painel de tarefas quando você começá-lo. As amostras de tarefas de Desafio abaixo mudarão de cor e ganharão gráficos para lhe mostrar o progresso geral do grupo.", "hows": "Como Todos Estão Indo?", @@ -48,7 +48,7 @@ "exportChallengeCSV": "Exportar para CSV", "selectGroup": "Favor selecionar grupo", "challengeCreated": "Desafio criado", - "sureDelCha": "Tem certeza que deseja deletar esse desafio?", + "sureDelCha": "Tens a certeza de que queres eliminar este desafio?", "sureDelChaTavern": "Tem a certeza que pretende eliminar este desafio? As suas gemas não serão reembolsadas.", "removeTasks": "Remover Tarefas", "keepTasks": "Manter Tarefas", @@ -103,8 +103,8 @@ "challengeDescription": "Descrição do Desafio", "selectChallengeWinnersDescription": "Seleccione um vencedor entre os participantes do Desafio", "awardWinners": "Vencedor do Prémio", - "doYouWantedToDeleteChallenge": "Quer apagar este desafio?", - "deleteChallenge": "Apagar Desafio", + "doYouWantedToDeleteChallenge": "Queres eliminar este desafio?", + "deleteChallenge": "Eliminar Desafio", "challengeNamePlaceholder": "Qual é o nome do seu Desafio?", "challengeSummary": "Sumário", "challengeSummaryPlaceholder": "Escreva uma descrição curta para publicitar o seu Desafio a outros Habiticanos. Qual é o propósito principal do seu Desafio e porque devem as pessoas juntar-se a ele? Tente incluir palavras chave úteis na descrição para que Habiticanos possam encontra-lo facilmente durante pesquisas!", diff --git a/website/common/locales/pt/defaulttasks.json b/website/common/locales/pt/defaulttasks.json index 52e11ea324..98bd9c415c 100644 --- a/website/common/locales/pt/defaulttasks.json +++ b/website/common/locales/pt/defaulttasks.json @@ -8,7 +8,7 @@ "defaultHabit4Text": "Adicionar uma tarefa ao Habitica", "defaultHabit4Notes": "Ou um Hábito, uma Tarefa Diária ou um Afazer", "defaultHabit5Text": "Carregue aqui para editar isto de forma a criar um mau hábito que queira parar", - "defaultHabit5Notes": "Ou apagar a partir do ecrã de edição", + "defaultHabit5Notes": "Ou eliminar a partir do ecrã de edição", "defaultDaily1Text": "Use Habitica para manter registo das suas tarefas", "defaultTodo1Text": "Junte-se ao Habitica (complete-me!)", "defaultTodoNotes": "Você pode tanto como completar esse afazer, como editá-lo ou removê-lo.", diff --git a/website/common/locales/pt/front.json b/website/common/locales/pt/front.json index 8161e779a7..c49cf8d29b 100644 --- a/website/common/locales/pt/front.json +++ b/website/common/locales/pt/front.json @@ -306,23 +306,23 @@ "motivateYourself": "Motiva-te para atingir os teus objetivos.", "timeToGetThingsDone": "It's time to have fun when you get things done! Join over <%= userCountInMillions %> million Habiticans and improve your life one task at a time.", "singUpForFree": "Inscreve-te Gratuitamente", - "or": "OR", + "or": "OU", "gamifyYourLife": "Gamifique a Sua Vida", "aboutHabitica": "Habitica is a free habit-building and productivity app that treats your real life like a game. With in-game rewards and punishments to motivate you and a strong social network to inspire you, Habitica can help you achieve your goals to become healthy, hard-working, and happy.", - "trackYourGoals": "Track Your Habits and Goals", + "trackYourGoals": "Acompanha os teus Hábitos e Metas", "trackYourGoalsDesc": "Stay accountable by tracking and managing your Habits, Daily goals, and To-Do list with Habitica’s easy-to-use mobile apps and web interface.", - "earnRewards": "Earn Rewards for Your Goals", + "earnRewards": "Ganha Recompensas pelas Tuas Metas", "earnRewardsDesc": "Check off tasks to level up your Avatar and unlock in-game features such as battle armor, mysterious pets, magic skills, and even quests!", - "battleMonsters": "Battle Monsters with Friends", + "battleMonsters": "Luta contra Monstros com os teus Amigos", "battleMonstersDesc": "Fight monsters with other Habiticans! Use the Gold that you earn to buy in-game or custom rewards, like watching an episode of your favorite TV show.", - "playersUseToImprove": "Players Use Habitica to Improve", - "healthAndFitness": "Health and Fitness", + "playersUseToImprove": "Os Jogadores usam o Habitica para Melhorarem", + "healthAndFitness": "Saúde e Forma", "healthAndFitnessDesc": "Never motivated to floss? Can't seem to get to the gym? Habitica finally makes it fun to get healthy.", - "schoolAndWork": "School and Work", + "schoolAndWork": "Escola e Trabalho", "schoolAndWorkDesc": "Whether you're preparing a report for your teacher or your boss, it's easy to keep track of your progress as you tackle your toughest tasks.", "muchmuchMore": "E muito, muito mais!", "muchmuchMoreDesc": "Our fully customizable task list means that you can shape Habitica to fit your personal goals. Work on creative projects, emphasize self-care, or pursue a different dream -- it's all up to you.", - "levelUpAnywhere": "Level Up Anywhere", + "levelUpAnywhere": "Passa de Nível em Qualquer Lugar", "levelUpAnywhereDesc": "Our mobile apps make it simple to keep track of your tasks on-the-go. Accomplish your goals with a single tap, no matter where you are.", "joinMany": "Join over 2,000,000 people having fun while accomplishing their goals!", "joinToday": "Junta-te ao Habitica Hoje", diff --git a/website/common/locales/pt/generic.json b/website/common/locales/pt/generic.json index f50eb62c1f..b2a3cc78d0 100644 --- a/website/common/locales/pt/generic.json +++ b/website/common/locales/pt/generic.json @@ -82,7 +82,7 @@ "buyMoreGems": "Comprar Mais Gemas", "notEnoughGems": "Gemas insuficientes", "alreadyHave": "Eeepa! Você já tem esse item. Não precisa comprar de novo!", - "delete": "Deletar", + "delete": "Eliminar", "gemsPopoverTitle": "Gemas", "gems": "Gemas", "gemButton": "Você tem <%= number %> Gemas.", diff --git a/website/common/locales/pt/groups.json b/website/common/locales/pt/groups.json index f69bc427b4..212703f97f 100644 --- a/website/common/locales/pt/groups.json +++ b/website/common/locales/pt/groups.json @@ -128,7 +128,7 @@ "pmHeading": "Mensagem privada para <%= name %>", "pmsMarkedRead": "Suas mensagens privadas foram marcadas como lidas.", "possessiveParty": "Equipa de <%= name %>", - "clearAll": "Deletar Todas as Mensagens", + "clearAll": "Eliminar Todas as Mensagens", "confirmDeleteAllMessages": "Tem certeza que desja deletar todas as mensagens na sua caixa de entrada? Outros usuários ainda irão ver as mensagens que você enviou para eles.", "optOutPopover": "Não gosta de mensagens privadas? Clique para desativar completamente", "PMPlaceholderTitle": "Nothing Here Yet", diff --git a/website/common/locales/pt/npc.json b/website/common/locales/pt/npc.json index cffafcf727..239d3eb226 100644 --- a/website/common/locales/pt/npc.json +++ b/website/common/locales/pt/npc.json @@ -21,11 +21,11 @@ "sleepBullet2": "Tarefas não perderão combos ou perderão cor", "sleepBullet3": "Chefões não lhe causaram dano por causa de Tarefas Diárias incompletas", "sleepBullet4": "Your boss damage or collection Quest items will stay pending until check-out", - "pauseDailies": "Pause Damage", - "unpauseDailies": "Unpause Damage", - "staffAndModerators": "Staff and Moderators", + "pauseDailies": "Pausar Dano", + "unpauseDailies": "Resumir Dano", + "staffAndModerators": "Equipa e Moderadores", "communityGuidelinesIntro": "Habitica tries to create a welcoming environment for users of all ages and backgrounds, especially in public spaces like the Tavern. If you have any questions, please consult our Community Guidelines.", - "acceptCommunityGuidelines": "I agree to follow the Community Guidelines", + "acceptCommunityGuidelines": "Concordo em seguir as Diretrizes da Comunidade", "daniel": "Daniel", "danielText": "Bem vindo à Taverna! Fique um pouco e conheça os locais. Se precisares descansar (férias? problemas de saúde?), eu me encarregarei de deixá-lo à vontade na Pousada. Enquanto descansa, suas Tarefas Diárias não lhe causarão dano na virada do dia, mas você ainda pode marcá-las como realizadas.", "danielText2": "Tenha cuidado: Se estiver participando de uma missão contra um Chefão, ele ainda lhe causará danos pelas Tarefas Diárias perdidas dos seus companheiros de equipe! Além disso, o seu dano no chefão (ou itens coletados) não serão aplicados até que você saia da Pousada.", @@ -35,7 +35,7 @@ "worldBossDescription": "Descrição do Líder Global", "alexander": "Alexander, o Mercador", "welcomeMarket": "Bem-vindo ao Mercado! Compre ovos e poções difíceis de encontrar! Venda os seus extras! Encomende serviços úteis! Venha ver o que nós temos para oferecer.", - "welcomeMarketMobile": "Welcome to the Market! Buy hard-to-find eggs and potions! Come see what we have to offer.", + "welcomeMarketMobile": "Bem-vindo ao Mercado! Aqui pode comprar ovos e poções difíceis de encontrar! Venha ver o que temos para oferecer.", "displayItemForGold": "Você quer vender um <%= itemType %>?", "displayEggForGold": "Você quer vender um Ovo <%= itemType %>?", "displayPotionForGold": "Você quer vender uma Poção <%= itemType %>?", diff --git a/website/common/locales/pt/settings.json b/website/common/locales/pt/settings.json index 521c876780..1e25bebfbf 100644 --- a/website/common/locales/pt/settings.json +++ b/website/common/locales/pt/settings.json @@ -30,7 +30,7 @@ "classTourPop": "Mostra o tour de como usar o sistema de classes.", "resetAccount": "Reiniciar Conta", "resetAccPop": "Comece de novo, removendo todos níveis, ouro, equipamentos, histórico, e tarefas.", - "deleteAccount": "Deletar Conta", + "deleteAccount": "Eliminar Conta", "deleteAccPop": "Cancela e remove sua conta do Habitica.", "feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.", "qrCode": "Código QR", @@ -89,7 +89,7 @@ "disabledWinterEvent": "Desativado durante o Evento do Mundo das Maravilhas de Inverno Pt.4 (já que as recompensas são adquiríveis com ouro).", "fix21Streaks": "Combos de 21 Dias", "discardChanges": "Descartar Alterações", - "deleteDo": "Faça, delete minha conta!", + "deleteDo": "Força, eliminem a minha conta!", "enterNumber": "Favor digitar um número entre 0 e 24", "fillAll": "Favor preencher todos campos", "invalidPasswordResetCode": "O código de reinicio de senha fornecido é inválido ou expirou.", diff --git a/website/common/locales/pt/tasks.json b/website/common/locales/pt/tasks.json index 06c8686137..f681ba2a44 100644 --- a/website/common/locales/pt/tasks.json +++ b/website/common/locales/pt/tasks.json @@ -120,8 +120,8 @@ "fortifyText": "A poção fortificante retornará todas as suas tarefas, exceto as tarefas de desafios, para um estado neutro (amarelo), como se você tivesse acabado de adicioná-las, e aumentará sua Saúde para a barra cheia. Isso é ótimo se suas tarefas vermelhas estão deixando o jogo muito difícil, ou se suas tarefas azuis estão deixando o jogo fácil demais. Se começar do zero te parecer mais motivador, gaste suas gemas e ganhe uma moratória!", "confirmFortify": "Tem certeza?", "fortifyComplete": "Fortificação completa!", - "deleteTask": "Apagar Tarefa", - "sureDelete": "De certeza que queres apagar esta tarefa?", + "deleteTask": "Eliminar Tarefa", + "sureDelete": "De certeza que queres eliminar esta tarefa?", "streakCoins": "Bônus de Combo!", "taskToTop": "Para o topo", "taskToBottom": "Para o fim", diff --git a/website/common/locales/pt_BR/backgrounds.json b/website/common/locales/pt_BR/backgrounds.json index 06bf821354..712cabfd5f 100644 --- a/website/common/locales/pt_BR/backgrounds.json +++ b/website/common/locales/pt_BR/backgrounds.json @@ -346,11 +346,11 @@ "backgroundFlyingOverWildflowerFieldNotes": "Eleve-se sobre um Campo de Flores Silvestres.", "backgroundFlyingOverAncientForestText": "Floresta Anciã", "backgroundFlyingOverAncientForestNotes": "Voe sobre a copa das árvores de uma Florestal Anciã.", - "backgrounds052018": "SET 48: Released May 2018", - "backgroundTerracedRiceFieldText": "Terraced Rice Field", - "backgroundTerracedRiceFieldNotes": "Enjoy a Terraced Rice Field in the growing season.", - "backgroundFantasticalShoeStoreText": "Fantastical Shoe Store", - "backgroundFantasticalShoeStoreNotes": "Look for fun new footwear in the Fantastical Shoe Store.", - "backgroundChampionsColosseumText": "Champions' Colosseum", - "backgroundChampionsColosseumNotes": "Bask in the glory of the Champions' Colosseum." + "backgrounds052018": "Conjunto 48: Lançado em Maio de 2018", + "backgroundTerracedRiceFieldText": "Terraço Arrozal", + "backgroundTerracedRiceFieldNotes": "Aproveite o Terração Arrozal na estação de cultivo.", + "backgroundFantasticalShoeStoreText": "Fantástica Loja de Sapatos", + "backgroundFantasticalShoeStoreNotes": "Se divirta procurando um novo pisante na Fantástica Loja de Sapatos.", + "backgroundChampionsColosseumText": "O Coliseu dos Campeões ", + "backgroundChampionsColosseumNotes": "Encandeça-se na glória do Coliseu dos Campeões." } \ No newline at end of file diff --git a/website/common/locales/pt_BR/communityguidelines.json b/website/common/locales/pt_BR/communityguidelines.json index 74d31bf639..177c3e2f2e 100644 --- a/website/common/locales/pt_BR/communityguidelines.json +++ b/website/common/locales/pt_BR/communityguidelines.json @@ -36,8 +36,8 @@ "commGuidePara031": "Algumas das Guildas públicas tratam de assuntos delicados como depressão, religião, politica, etc. Esteja tranquilo ao falar sobre esses assuntos nestas guildas, desde que as conversas lá não violem nenhum dos Termos e Condições ou Regras de Espaços Públicos além de manter o tópico.", "commGuidePara033": "Guildas Públicas são proibidas de conter conteúdo adulto ( 18+). Caso os membros desejem falar regularmente sobre assuntos sensíveis, isto deverá está escrito na descrição da Guilda. Esta regra é para manter o Habitica seguro e confortável para todos.", "commGuidePara035": "Se a Guilda em questão falar de problemas sensíveis, é respeitoso para seus companheiros Habiticianos colocar um aviso no início da mensagem ( exemplo \"Aviso: Referências a automutilação\", \"Aviso: Referências a suicídio\" ) . Estas podem ser caracterizadas como aviso de gatilho ou notas de conteúdo e as Guildas podem ter suas próprias regras em adição a estas aqui. Se possível, por favor use a quebra de texto do markdown para esconder o texto potencialmente sensível. Assim aqueles que quiserem evitar podem rolar a tela sem ver o conteúdo. Ainda, a Equipe do Habitica ou os Moderadores podem remover o material caso eles achem necessário.", - "commGuidePara036": "Additionally, the sensitive material should be topical -- bringing up self-harm in a Guild focused on fighting depression may make sense, but is probably less appropriate in a music Guild. If you see someone who is repeatedly violating this guideline, especially after several requests, please flag the posts and notify the moderators via the Moderator Contact Form.", - "commGuidePara037": "No Guilds, Public or Private, should be created for the purpose of attacking any group or individual. Creating such a Guild is grounds for an instant ban. Fight bad habits, not your fellow adventurers!", + "commGuidePara036": "Adicionalmente, o conteúdo sensível deve fazer parte do tópico, isto é, falar sobre suicídio em uma Guilda que luta contra a depressão faz sentido, mas é pode ser inapropriado se o tema da Guilda for sobre música. Se ver alguém violando esta diretriz repetidamente, principalmente após avisos, por favor reporte as postagens e notifique os Moderadores atraves do Formulário de contato ao Moderador.", + "commGuidePara037": "Nenhuma Guilda, seja ela Pública ou Privada, deve ser criada com o propósito de atacar qualquer grupo ou indivíduo. O descumprimento desta regra com a criação deste tipo de Guilda é tratado com banimento imediato.Combate maus hábitos, não seus colegas! ", "commGuidePara038": "Todos os Desafios da Taverna e das Guildas Públicas também são regulados por essas regras e deverão cumprir-las. ", "commGuideHeadingInfractionsEtc": "Infrações, Consequências e Restauração", "commGuideHeadingInfractions": "Infrações", @@ -45,7 +45,7 @@ "commGuidePara051": "Há uma variedade de infrações e elas são tratadas de acordo com sua severidade. Estas listas não são conclusivas e Moderadores possuem o poder de arbítrio inclusive em tópicos aqui não cobertos. Moderadores levarão contexto em consideração ao avaliar infrações.", "commGuideHeadingSevereInfractions": "Infrações Severas", "commGuidePara052": "Infrações Severas causam grande dano à segurança da comunidade de Habitica e seus usuários e, portanto, tem consequências severas.", - "commGuidePara053": "Estes são alguns exemplos de Infrações Severas. Esta não é uma lista completa.", + "commGuidePara053": "Estes são alguns exemplos de Infrações Severas. ATENÇÃO: Esta lista não pretende ser abrangente e ações aqui não descritas podem resultar em infrações a critério da Equipe e Moderação.", "commGuideList05A": "Violação dos Termos e Condições de Uso", "commGuideList05B": "Discurso/Imagens de Ódio, Assédio/Perseguição, Cyber-Bullying, Discussões Inflamadas, e \"Trolling\"", "commGuideList05C": "Violação da Condicional", @@ -55,9 +55,9 @@ "commGuideList05G": "Enganar intencionalmente a Equipe ou Moderadores em ordem de evitar consequências ou colocar outro usuário em problemas. ", "commGuideHeadingModerateInfractions": "Infrações Moderadas", "commGuidePara054": "Infrações moderadas não tornam nossa comunidade perigosa, mas a tornam desagradável. Essas infrações terão consequências moderadas. Quando em conjunto com múltiplas infrações, as consequências podem ter sua severidade aumentada.", - "commGuidePara055": "Estes são alguns exemplos de Infrações Moderadas. Esta não é uma lista completa.", - "commGuideList06A": "Ignoring, disrespecting or arguing with a Mod. This includes publicly complaining about moderators or other users, publicly glorifying or defending banned users, or debating whether or not a moderator action was appropriate. If you are concerned about one of the rules or the behaviour of the Mods, please contact the staff via email (admin@habitica.com).", - "commGuideList06B": "Backseat Modding. To quickly clarify a relevant point: A friendly mention of the rules is fine. Backseat modding consists of telling, demanding, and/or strongly implying that someone must take an action that you describe to correct a mistake. You can alert someone to the fact that they have committed a transgression, but please do not demand an action -- for example, saying, \"Just so you know, profanity is discouraged in the Tavern, so you may want to delete that,\" would be better than saying, \"I'm going to have to ask you to delete that post.\"", + "commGuidePara055": "Eis alguns exemplos de Infrações Moderadas. ATENÇÃO: Esta lista não pretende ser abrangente e ações aqui não descritas podem resultar em infrações a critério da Equipe e Moderação.", + "commGuideList06A": "Ignorar, desrespeitar ou discutir com um Moderador. Isso inclui reclamar publicamente de moderadores ou outros usuários, glorificar ou defender usuários banidos ou debater se a ação da Moderação foi apropiada. Se você está preocupado com uma das regras ou o comportamento dos Moderadores, favor entrar em contato com a Equipe pelo e-mail (admin@habitica.com).", + "commGuideList06B": "Bancar de Justiceiro. Esta é importante clarificar : Uma menção amigável das regras é aceitável. Bancar o Justiceiro consiste em dizer, demandar ou seriamente implicar que alguém deve tomar uma providência que você considera como correção de um erro. Você pode alertar alguém para o fato dele ter cometido uma transgressão, mas por favor não exija uma providência - por exemplo, dizer \"Só para você saber, profanidades são desencorajadas na Taverna, então você pode querer deletar isso\" seria melhor que dizer, \"Eu vou ter que pedir para que delete esta mensagem\"", "commGuideList06C": "Reportar postagens inocentes intencionalmente.", "commGuideList06D": "Violar Repetidamente as Diretrizes de Espaço Público", "commGuideList06E": "Cometer Pequenas Infrações Repetidamente.", @@ -65,8 +65,8 @@ "commGuidePara056": "Infrações Leves, apesar de desencorajadas, tem também consequências pequenas. Se elas continuarem a ocorrer, podem levar à consequências mais severas com o passar do tempo.", "commGuidePara057": "Estes são alguns exemplos de Infrações Leves. Esta não é uma lista completa.", "commGuideList07A": "Primeira violação das Diretrizes de Espaço Publico", - "commGuideList07B": "Any statements or actions that trigger a \"Please Don't\". When a Mod has to say \"Please don't do this\" to a user, it can count as a very minor infraction for that user. An example might be \"Please don't keep arguing in favor of this feature idea after we've told you several times that it isn't feasible.\" In many cases, the Please Don't will be the minor consequence as well, but if Mods have to say \"Please Don't\" to the same user enough times, the triggering Minor Infractions will start to count as Moderate Infractions.", - "commGuidePara057A": "Some posts may be hidden because they contain sensitive information or might give people the wrong idea. Typically this does not count as an infraction, particularly not the first time it happens!", + "commGuideList07B": "Qualquer pronunciamento ou ação que provoque um \"Por Favor, Não\". Quando um Moderador precisa dizer \"Por Favor, Não faça isso\" para um usuário, isso pode contar como uma infração muito pequena ao usuário. Um exemplo poderia ser um Moderador dizer: \"Por Favor, Não continue discutindo em favor da implementação desta funcionalidade, já lhe dizemos repetidamente que isto não é viável.\" Em muitos casos, o \"Por favor, Não\" será também a pequena consequência, mas se os Moderadores precisarem dizer \"Por Favor, Não\" para o mesmo usuário repetidas vezes, as infrações Infrações antes Leves passarão a ser consideradas como Moderadas.", + "commGuidePara057A": "Algumas postagem podem ser ocultadas por conter informação sensíveis ou por serem mal interpretadas. Tipicamente isto não conta como Infração, principalmente se for a primeira vez que ocorre. ", "commGuideHeadingConsequences": "Consequências", "commGuidePara058": "No Habitica -- como na vida real -- cada ação tem uma consequência, seja ficar em forma porque você tem corrido, seja ficar com cáries porque você tem comido muito açúcar, ou seja passar de ano porque você tem estudado.", "commGuidePara059": "Similarmente, todas infrações tem consequências diretas.Alguns exemplos de consequências estão listados abaixo.", @@ -74,8 +74,8 @@ "commGuideList08A": "qual foi sua infração", "commGuideList08B": "qual é a consequência", "commGuideList08C": "o que fazer para corrigir a situação e restaurar seu status, se possível.", - "commGuidePara060A": "If the situation calls for it, you may receive a PM or email as well as a post in the forum in which the infraction occurred. In some cases you may not be reprimanded in public at all.", - "commGuidePara060B": "If your account is banned (a severe consequence), you will not be able to log into Habitica and will receive an error message upon attempting to log in. If you wish to apologize or make a plea for reinstatement, please email the staff at admin@habitica.com with your UUID (which will be given in the error message). It is your responsibility to reach out if you desire reconsideration or reinstatement.", + "commGuidePara060A": "Se a situação pedir por isso, você pode receber uma DM ou email além da postagem no fórum onde a infração ocorreu. Em alguns casos você não será sequer reprimido em público.", + "commGuidePara060B": "Caso sua conta seja banida ( uma consequência severa), você não poderá logar no Habitica e receberá uma mensagem de erro ao tentar. Caso deseja se desculpar ou pedir para ser reintegrado, por favor mande um email para a Equipe pelo email admin@habitica.com com seu UUID (que será mostrado na mensagem de erro). É sua a responsabilidade de se reaproximar para pedir uma reconsideração ou reintegração.", "commGuideHeadingSevereConsequences": "Exemplos de Consequências Severas", "commGuideList09A": "Contas banidas (veja acima) ", "commGuideList09C": "Permanentemente desabilitar (\"congelar\") progressão dos Níveis de Contribuidor", @@ -93,9 +93,9 @@ "commGuideList11D": "Exclusões (Moderadores/Equipe podem deletar conteúdo problemático)", "commGuideList11E": "Edições (Moderadoress/Equipe podem editar conteúdo problemático)", "commGuideHeadingRestoration": "Restauração", - "commGuidePara061": "Habitica is a land devoted to self-improvement, and we believe in second chances. 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.", - "commGuidePara062": "The announcement, message, and/or email that you receive explaining the consequences of your actions is a good source of information. 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, ask the Staff/Moderators for help so you can avoid committing infractions in the future. If you feel a particular decision was unfair, you can contact the staff to discuss it at admin@habitica.com.", + "commGuidePara061": "Habitica é uma terra devotada ao auto-aprimoramento e nós acreditamos em segundas chances. Se você cometeu uma infração e recebeu uma consequência, veja isso como uma chance para avaliar suas ações e empenhar-se em ser um membro melhor na comunidade.", + "commGuidePara062": "O anúncio, mensagem ou e-mail que você receber lhe explicando as consequências das suas ações é uma boa fonte de informação. Coopere com quaisquer restrições que lhe tenham sido impostas, e empenhe-se para atender os requerimentos para ter alguma penalidade removida.", + "commGuidePara063": "Se não for claro as suas consequencias ou não entender a natureza da sua infração, pergunte para a Equipe ou a Moderação como você pode evitar infrações no futuro. Caso sinta que foi uma decisão em especial foi injusta, você pode argumentar com a Equipe no email admin@habitica.com.", "commGuideHeadingMeet": "Conheça a Equipe e os Moderadores! ", "commGuidePara006": "O Habitica possui alguns cavaleiros incansáveis que unem forças com os membros da Equipe para manter a comunidade calma, entretida e livre de trolls. Cada um possui um domínio específico mas poderão ser chamados para servir em outras esferas sociais.", "commGuidePara007": "A Equipe tem etiquetas roxas marcadas com coroas. O título deles é \"Heroico\".", diff --git a/website/common/locales/pt_BR/front.json b/website/common/locales/pt_BR/front.json index b9f74e3c2a..ce665f3285 100644 --- a/website/common/locales/pt_BR/front.json +++ b/website/common/locales/pt_BR/front.json @@ -304,7 +304,7 @@ "alreadyHaveAccountLogin": "Já possui uma conta no Habitica? Faça login.", "dontHaveAccountSignup": "Não possui uma conta no Habitica? Cadastre-se.", "motivateYourself": "Motive-se a alcançar seus objetivos.", - "timeToGetThingsDone": "It's time to have fun when you get things done! Join over <%= userCountInMillions %> million Habiticans and improve your life one task at a time.", + "timeToGetThingsDone": "É hora de se divertir enquanto termina seus afazeres! Junte-se a mais de<%= userCountInMillions %> milhões de Habiticanos e melhore sua vida uma tarefa por vez.", "singUpForFree": "Cadastre-se De Graça", "or": "OU", "gamifyYourLife": "Gamifique Sua Vida", diff --git a/website/common/locales/pt_BR/gear.json b/website/common/locales/pt_BR/gear.json index 4aabe9a990..a569953837 100644 --- a/website/common/locales/pt_BR/gear.json +++ b/website/common/locales/pt_BR/gear.json @@ -327,7 +327,7 @@ "weaponArmoireWeaversCombText": "Pente do Tecelão", "weaponArmoireWeaversCombNotes": "Use esse pente para juntar seus fios em um tecido bem trançado. Aumenta Percepção em <%= per %> e Força em <%= str %>. Armário Encantado: Conjunto do Tecelão ( Item 2 de 3).", "weaponArmoireLamplighterText": "Acendedor de Lampiões", - "weaponArmoireLamplighterNotes": "This long pole has a wick on one end for lighting lamps, and a hook on the other end for putting them out. Increases Constitution by <%= con %> and Perception by <%= per %>. Enchanted Armoire: Lamplighter's Set (Item 1 of 4)", + "weaponArmoireLamplighterNotes": "Esta longa vara tem um pavio em uma extremidade para lâmpadas de iluminação e um gancho na outra extremidade para colocá-las para fora. Aumenta Constituição em <%= con %> e Percepção em <%= per %>. Armário Encantado: Conjunto do Lampião (Item 1 de 4)", "weaponArmoireCoachDriversWhipText": "Chicote do Carroceiro", "weaponArmoireCoachDriversWhipNotes": "Your steeds know what they're doing, so this whip is just for show (and the neat snapping sound!). Increases Intelligence by <%= int %> and Strength by <%= str %>. Enchanted Armoire: Coach Driver Set (Item 3 of 3).", "weaponArmoireScepterOfDiamondsText": "Cetro de Diamantes", diff --git a/website/common/locales/pt_BR/groups.json b/website/common/locales/pt_BR/groups.json index d4862cbff4..dacc41f8f5 100644 --- a/website/common/locales/pt_BR/groups.json +++ b/website/common/locales/pt_BR/groups.json @@ -106,16 +106,16 @@ "optionalMessage": "Mensagem opcional", "yesRemove": "Sim, remova-os", "foreverAlone": "Não é possível curtir a própria mensagem. Não seja 'aquela' pessoa.", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", - "ascendingAbbrev": "Asc", + "sortBackground": "Ordenar por Cenário", + "sortClass": "Ordenar por Classe", + "sortDateJoined": "Ordernar por Data de Entrada", + "sortLogin": "Ordenar por Data de Login ", + "sortLevel": "Ordenar por Nível", + "sortName": "Ordenar por Nome", + "sortTier": "Ordernar por Nível de Contribuidor", + "ascendingAbbrev": "Cresc", "descendingAbbrev": "Desc", - "applySortToHeader": "Apply Sort Options to Party Header", + "applySortToHeader": "Aplicar opção de ordem para o Cabeçalho do Grupo", "confirmGuild": "Criar Guilda por 4 Gemas?", "leaveGroupCha": "Abandonar os desafios da Guilda e...", "confirm": "Confirmar", @@ -131,10 +131,10 @@ "clearAll": "Deletar Todas as Mensagens", "confirmDeleteAllMessages": "Tem certeza que deseja deletar todas as mensagens na sua caixa de entrada? Outros usuários ainda irão ver as mensagens que você enviou para eles.", "optOutPopover": "Não gosta de mensagens privadas? Clique para desativar completamente", - "PMPlaceholderTitle": "Nothing Here Yet", - "PMPlaceholderDescription": "Select a conversation on the left", - "PMPlaceholderTitleRevoked": "Your chat privileges have been revoked", - "PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email admin@habitica.com to discuss it with the staff.", + "PMPlaceholderTitle": "Nada aqui ainda", + "PMPlaceholderDescription": "Selecione uma conversa à esquerda", + "PMPlaceholderTitleRevoked": "Seus privilégios do chat foram revogados", + "PMPlaceholderDescriptionRevoked": "Você não pode enviar mensagens pois seus privilégios do chat foram revogados. Se tiver alguma pergunta ou preocupação quanto a isso, por favor envie um email para admin@habitica.com para argumentar com a Equipe.", "block": "Bloquear", "unblock": "Desbloquear", "pm-reply": "Enviar uma resposta", diff --git a/website/common/locales/pt_BR/npc.json b/website/common/locales/pt_BR/npc.json index ba8c9d689b..eb96d2aa2b 100644 --- a/website/common/locales/pt_BR/npc.json +++ b/website/common/locales/pt_BR/npc.json @@ -80,7 +80,7 @@ "positiveAmountRequired": "Requer um número positivo", "notAccteptedType": "Tipo precisa estar em [eggs, hatchingPotions, premiumHatchingPotions, food, quests, gear]", "contentKeyNotFound": "Chave não encontrada para Conteúdo <%= type %>", - "plusGem": "+<%= count %> Gem", + "plusGem": "+<%= count %> Gema!", "typeNotSellable": "Tipo não pode ser vendido. Precisa ser um dos seguintes <%= acceptedTypes %>", "userItemsKeyNotFound": "Chave não encontrada para user.items <%= type %>", "userItemsNotEnough": "Você não tem <%= type %>suficientes.", diff --git a/website/common/locales/pt_BR/settings.json b/website/common/locales/pt_BR/settings.json index c451ed7b47..6a4c0b93e2 100644 --- a/website/common/locales/pt_BR/settings.json +++ b/website/common/locales/pt_BR/settings.json @@ -32,7 +32,7 @@ "resetAccPop": "Comece de novo removendo todos os níveis, ouro, equipamentos, histórico e tarefas.", "deleteAccount": "Excluir Conta", "deleteAccPop": "Cancela e remove sua conta do Habitica.", - "feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.", + "feedback": "Se quiser nos dar seu feedback, por favor escreva-o abaixo - adoraríamos saber o que você gosta ou desgosta no Habitica! Não fala inglês bem? Sem problemas! Pode usar o idioma que preferir.", "qrCode": "Código QR", "dataExport": "Exportação de Dados", "saveData": "Aqui estão algumas opções para salvar seus dados.", diff --git a/website/common/locales/pt_BR/subscriber.json b/website/common/locales/pt_BR/subscriber.json index a0c4203fee..736438757a 100644 --- a/website/common/locales/pt_BR/subscriber.json +++ b/website/common/locales/pt_BR/subscriber.json @@ -7,7 +7,7 @@ "buyGemsGoldText": "Alexander, o Mercador, venderá suas Gemas por 20 de ouro cada Gema. Suas remessas mensais serão limitados a 25 Gemas por mês, mas para cada 3 meses consecutivos de assinatura, este limite aumenta em 5 Gemas até o máximo de 50 Gemas por mês!", "mustSubscribeToPurchaseGems": "É necessário ser assinante para comprar gemas com Ouro.", "reachedGoldToGemCap": "Você atingiu o limite de<%= convCap %> para conversão de Ouro=>Gemas deste mês. Isto serve para prevenir abusos. O limite irá reiniciar dentro dos três primeiros dias do próximo mês.", - "reachedGoldToGemCapQuantity": "Your requested amount <%= quantity %> exceeds the Gold=>Gem conversion cap <%= convCap %> for this month. We have this to prevent abuse / farming. The cap resets within the first three days of each month.", + "reachedGoldToGemCapQuantity": "Seu pedido de <%= quantity %> gemas ultrapassa o limite de conversão deste mês (<%= convCap %>). Queremos lhe ver sempre produtivo, e que não farme as gemas em 1 mês. O limite é reiniciado nos primeiros 3 dias de cada mês.", "retainHistory": "Guardar Itens adicionais no histórico", "retainHistoryText": "Faz com que o histórico de tarefas e Afazeres completos fiquem disponíveis por mais tempo.", "doubleDrops": "Capacidade diária de drop duplicada", @@ -142,7 +142,7 @@ "mysterySet201801": "Conjunto Duende de Neve", "mysterySet201802": "Conjunto Besouro-do-amor", "mysterySet201803": "Conjunto Libélula Ousada", - "mysterySet201804": "Spiffy Squirrel Set", + "mysterySet201804": "Conjunto do Esquilo Maneiro", "mysterySet301404": "Conjunto \"Revolução Industrial Padrão\"", "mysterySet301405": "Conjunto \"Acessórios Revolução Industrial\"", "mysterySet301703": "Conjunto \"Revolução Industrial Pavão\"", diff --git a/website/common/locales/ru/backgrounds.json b/website/common/locales/ru/backgrounds.json index 209abb8861..1a477cb56b 100644 --- a/website/common/locales/ru/backgrounds.json +++ b/website/common/locales/ru/backgrounds.json @@ -348,9 +348,9 @@ "backgroundFlyingOverAncientForestNotes": "Летите над куполом Древнего Леса.", "backgrounds052018": "Набор 48: Выпущен в Мае 2018", "backgroundTerracedRiceFieldText": "Рисовое поле", - "backgroundTerracedRiceFieldNotes": "Enjoy a Terraced Rice Field in the growing season.", - "backgroundFantasticalShoeStoreText": "Fantastical Shoe Store", - "backgroundFantasticalShoeStoreNotes": "Look for fun new footwear in the Fantastical Shoe Store.", + "backgroundTerracedRiceFieldNotes": "Насладитесь усеянным рисовым полем в сезон созревания", + "backgroundFantasticalShoeStoreText": "Удивительный обувная лавка", + "backgroundFantasticalShoeStoreNotes": "Найдите себе новую пару обуви в Удивительной обувной лавке.", "backgroundChampionsColosseumText": "Колизей Чемпионов", - "backgroundChampionsColosseumNotes": "Bask in the glory of the Champions' Colosseum." + "backgroundChampionsColosseumNotes": "Окунитесь в лучах славы на Колизеи Чемпионов." } \ No newline at end of file diff --git a/website/common/locales/ru/front.json b/website/common/locales/ru/front.json index 75095a4ddc..cc9014d685 100644 --- a/website/common/locales/ru/front.json +++ b/website/common/locales/ru/front.json @@ -304,7 +304,7 @@ "alreadyHaveAccountLogin": "Уже есть учётная запись в Habitica? Войдите.", "dontHaveAccountSignup": "Нет учётной записи в Habitica? Зарегистрируйтесь.", "motivateYourself": "Мотивируйте себя на достижение ваших целей.", - "timeToGetThingsDone": "It's time to have fun when you get things done! Join over <%= userCountInMillions %> million Habiticans and improve your life one task at a time.", + "timeToGetThingsDone": "Пора повеселиться, делая дела! Присоединяйся к более чем <%= userCountInMillions %> миллионам Хабитиканцев и улучшай свою жизнь, выполняя задания одно за другим.", "singUpForFree": "Бесплатная регистрация", "or": "ИЛИ", "gamifyYourLife": "Живи играючи", diff --git a/website/common/locales/ru/groups.json b/website/common/locales/ru/groups.json index b03f0b9d2d..8c76e58259 100644 --- a/website/common/locales/ru/groups.json +++ b/website/common/locales/ru/groups.json @@ -106,15 +106,15 @@ "optionalMessage": "Необязательное сообщение", "yesRemove": "Да, удалить", "foreverAlone": "Вы не можете лайкать свое собственное сообщение. Не будьте таким человеком.", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", - "ascendingAbbrev": "Asc", - "descendingAbbrev": "Desc", + "sortBackground": "Сортировать по фону", + "sortClass": "Сортировать по классу", + "sortDateJoined": "Сортировать по дате присоединения", + "sortLogin": "Сортировать по дате входа", + "sortLevel": "Сортировать по уровню", + "sortName": "Сортировать по имени", + "sortTier": "Сортировать по рангу", + "ascendingAbbrev": "По возрастанию", + "descendingAbbrev": "По убыванию", "applySortToHeader": "Apply Sort Options to Party Header", "confirmGuild": "Создать гильдию за 4 самоцвета?", "leaveGroupCha": "Покинуть испытания Гильдии и...", @@ -131,9 +131,9 @@ "clearAll": "Удалить все сообщения", "confirmDeleteAllMessages": "Вы действительно хотите удалить входящие сообщения? Сообщения, отправленные вами другим пользователям, все еще будут им доступны.", "optOutPopover": "Не любите личные сообщения? Нажмите, чтобы отказаться от использования", - "PMPlaceholderTitle": "Nothing Here Yet", - "PMPlaceholderDescription": "Select a conversation on the left", - "PMPlaceholderTitleRevoked": "Your chat privileges have been revoked", + "PMPlaceholderTitle": "Здесь Пока Ничего Нет", + "PMPlaceholderDescription": "Выберите беседу слева", + "PMPlaceholderTitleRevoked": "Возможность отправлять сообщения на вашем аккаунте заблокирована", "PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email admin@habitica.com to discuss it with the staff.", "block": "Блокировать", "unblock": "Разблокировать", diff --git a/website/common/locales/tr/npc.json b/website/common/locales/tr/npc.json index 3159cd3b34..03762d8596 100644 --- a/website/common/locales/tr/npc.json +++ b/website/common/locales/tr/npc.json @@ -32,7 +32,7 @@ "danielTextBroken": "Tavernaya hoş geldin... yani... Eğer biraz dinlenmeye ihtiyacın varsa sana Handa bir oda ayarlayayım... Handa kaldığın sürece Günlük İşlerin gün sonunda sana hasar vermeyecektir ama onları yine de tamamlayabilirsin... enerjin kaldıysa tabii...", "danielText2Broken": "Bu arada... Eğer bir canavar görevindeysen, diğer takım üyelerinin kaçırdığı Günlük işler hala sana hasar verebilir... Bir de, Canavara vereceğin hasar (ya da toplayacağın eşyalar) Handan ayrılana kadar geçerli olmayacaktır...", "worldBossEvent": "Dünya Canavarı Etkinliği", - "worldBossDescription": "World Boss Description", + "worldBossDescription": "Dünya Canavarı Detayları", "alexander": "Tüccar Alexander", "welcomeMarket": "Pazara hoş geldin! Zor bulunan yumurtalardan ve iksirlerden al! Fazla mallarını sat! Hizmetlerden faydalan! Tekliflerimizi görmek için içeri buyur.", "welcomeMarketMobile": "Dükkanıma hoş geldin. Burada bulunması zor olan yumurta ve kuluçka iksirlerini satın alabilirsin.buyur ve fiyatlara bir bak.", diff --git a/website/common/locales/tr/pets.json b/website/common/locales/tr/pets.json index e62f6e31d0..6ee9029070 100644 --- a/website/common/locales/tr/pets.json +++ b/website/common/locales/tr/pets.json @@ -27,8 +27,8 @@ "royalPurpleGryphon": "Kraliyet Moru Griffon", "phoenix": "Anka", "magicalBee": "Büyülü Arı", - "hopefulHippogriffPet": "Hopeful Hippogriff", - "hopefulHippogriffMount": "Hopeful Hippogriff", + "hopefulHippogriffPet": "Umutlu Hippogriff", + "hopefulHippogriffMount": "Umutlu Hippogriff", "royalPurpleJackalope": "Kraliyet Moru Boynuzlu Tavşan", "invisibleAether": "Invisible Aether", "rarePetPop1": "Habitica'ya katkıda bulunarak bu ender hayvanı nasıl elde edebileceğini öğrenmek için altın patiye tıkla!", diff --git a/website/common/locales/tr/tasks.json b/website/common/locales/tr/tasks.json index 7c23446dbd..b1e2abcdd4 100644 --- a/website/common/locales/tr/tasks.json +++ b/website/common/locales/tr/tasks.json @@ -46,7 +46,7 @@ "medium": "Orta", "hard": "Zor", "attributes": "Stats", - "attributeAllocation": "Stat Allocation", + "attributeAllocation": "Nitelik Dağılımını", "attributeAllocationHelp": "Stat allocation is an option that provides methods for Habitica to automatically assign an earned Stat Point to a Stat immediately upon level-up.

You can set your Automatic Allocation method to Task Based in the Stats section of your profile.", "progress": "İlerleme Durumu", "daily": "Günlük İş", diff --git a/website/common/locales/uk/faq.json b/website/common/locales/uk/faq.json index 8dd61d981b..c18de21362 100644 --- a/website/common/locales/uk/faq.json +++ b/website/common/locales/uk/faq.json @@ -29,9 +29,9 @@ "androidFaqAnswer6": "На рівні 3 ви разблокуєте систему випадань. Кожен раз коли ви виконали завдання, ви маєте шанс отримати яйце, інкубаційне зілля або їжу. Ці предмети будуть збережені у Меню>Предмети\n\nВам потрібне яйце та інкубаційне зілля для того щоб вилупився улюбленець. Натисніть на яйце для того щоб визначити якого вида улюбленця ви хочете вилупити, та виберіть \"Вилупити використовуючи зілля.\" Тоді виберіть зілля з потрібним кольором. Для того щоб обрати улюбленця, натисніть Меню > Конюшня > Улюбленці, виберіть вид, потрібного улюбленця та натисніть на \"Вибрати\" (Ваш аватар не оновиться для відображення зміни)\n\nТакож ви можете виростити з улюбленців скакунів, годуючи їх у Меню > Конюшня[ > Улюбленці]. Натисніть на улюбленця та виберіть \"Годувати\"! Вам потрібно буде годувати улюбленця багато раз доки він не стане скакуном, проте якщо ви зможете знайти його улюблену їжу, він виросте набагато швидше. Користуйтеся методом проб та помилок або [подивіться спойлери тут](http://habitica.wikia.com/wiki/Food#Food_Preferences). Для того щоб вибрати Вашого скакуна, перейдіть у Меню > Конюшня > Скакуни, виберіть вид, натисніть на потрібного скакуна та натисніть \"Вибрати\" (Ваш аватар не оновиться для відображення зміни)\n\nВи також можете завжди отримати яйця квестових улюбленців виконуючи певні Квести. ( Дивіться нижче щоб дізнатись більше про Квести.)", "webFaqAnswer6": "На рівні 3 ви разблокуєте систему випадань. Кожен раз коли ви виконали завдання, ви маєте шанс отримати яйце, інкубаційне зілля або їжу. Ці предмети будуть збережені у Інвентар > Предмети. Вам потрібне яйце та інкубаційне зілля для того щоб вилупився улюбленець. Коли у вас є яйце і інкубаційне зілля, перейдіть до Інвентар >  Конюшня для того щоб вилупити улюбленця натиснувши на його портрет. Я тільки Ви вилупили улюбленця, Ви можете вибрати його натиснувши на ньому. Ви можете виростити улюбленця у скакуна погодувавши його у Інвентар > Конюшня. Перетягніть їжу з панелі знизу екрану на улюбленця для того щоб погодувати його. Вам потрібно буде годувати улюбленця багато раз для того щоб він став скакуном, проте якщо ви зможете вгадати його улюблену їжу то він виросте набагато скоріше. Використовуйте метод проб та помилок або [подивіться спойлери тут](http://habitica.wikia.com/wiki/Food#Food_Preferences). Як тільки у вас є скакун, натисніть на нього щоб вибрати його для свого аватару. Ви також можете отримати яйця квестових улюбленців виконуючи певні квести. (Дивіться нижче щоб дізнатися більше про Квести.)", "faqQuestion7": "Як стати воїном, магом, розбійником чи цілителем?", - "iosFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their Party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most gold and find the most item drops, and they can help their Party do the same. Finally, Healers can heal themselves and their Party members.\n\n If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click “Decide Later” and choose later under Menu > Choose Class.", - "androidFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their Party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most gold and find the most item drops, and they can help their Party do the same. Finally, Healers can heal themselves and their Party members.\n\n If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click “Opt Out” and choose later under Menu > Choose Class.", - "webFaqAnswer7": "At level 10, you can choose to become a Warrior, Mage, Rogue, or Healer. (All players start as Warriors by default.) Each Class has different equipment options, different Skills that they can cast after level 11, and different advantages. Warriors can easily damage Bosses, withstand more damage from their tasks, and help make their party tougher. Mages can also easily damage Bosses, as well as level up quickly and restore Mana for their party. Rogues earn the most Gold and find the most item drops, and they can help their party do the same. Finally, Healers can heal themselves and their party members. If you don't want to choose a Class immediately -- for example, if you are still working to buy all the gear of your current class -- you can click \"Opt Out\" and re-enable it later under Settings.", + "iosFaqAnswer7": "На рівні 10 ви можете вибрати себе воїном, магом, розбійником або цілителем. (Усі гравці починають як воїни за замовчуванням.) Кожен клас має різні варіанти обладнання, різні навички, які вони можуть чаклувати після рівня 11, і різні переваги. Воїни можуть легко пошкодити босів, витримувати більше пошкоджень від своїх завдань і допомогти зробити свій гурт прочнішим. Маги можуть також легко пошкодити босів, а також швидко отримувати новий рівень і відновлювати Ману для свого гурту. Розбійники заробляють найбільше золота і отримують найбільшу кількість випадань, і вони можуть допомогти своїй партії зробити те ж саме. Нарешті, Цілителі можуть зцілити себе та членів свого гурту.\n\n Якщо ви не бажаєте негайно вибирати клас - наприклад, якщо ви все ще працюєте, щоб придбати все спорядження вашого поточного класу, ви можете натиснути кнопку \"Вирішити Пізніше \"та вибрати пізніше в Меню > Вибрати клас.", + "androidFaqAnswer7": "На рівні 10 ви можете стати воїном, магом, розбійником або цілителем. (Усі гравці починають як воїни за замовчуванням.) Кожен клас має різні варіанти обладнання, різні навички, які вони можуть чаклувати після рівня 11, та різні переваги. Воїни можуть легко пошкодити босів, витримувати більше пошкоджень від своїх завдань і допомогти зробити свій гурт прочнішим. Маги можуть також легко пошкодити босів, а також швидко отримувати новий рівень і відновлювати Ману для свого гурту. Розбійники заробляють найбільше золота і отримують найбільшу кількість випадань, і вони можуть допомогти своїй партії зробити те ж саме. Нарешті, Цілителі можуть зцілити себе та членів свого гурту. Якщо ви не бажаєте негайно вибирати клас - наприклад, якщо ви все ще працюєте, щоб придбати все спорядження вашого поточного класу, ви можете натиснути кнопку \"Вирішити Пізніше\" та вибрати пізніше в Меню > Вибрати клас.", + "webFaqAnswer7": "На рівні 10 ви можете стати воїном, магом, розбійником або цілителем. (Усі гравці починають як воїни за замовчуванням.) Кожен клас має різні варіанти обладнання, різні навички, які вони можуть чаклувати після рівня 11, та різні переваги. Воїни можуть легко пошкодити босів, витримувати більше пошкоджень від своїх завдань і допомогти зробити свій гурт прочнішим. Маги можуть також легко пошкодити босів, а також швидко отримувати новий рівень і відновлювати Ману для свого гурту. Розбійники заробляють найбільше золота і отримують найбільшу кількість випадань, і вони можуть допомогти своїй партії зробити те ж саме. Нарешті, Цілителі можуть зцілити себе та членів свого гурту. Якщо ви не бажаєте негайно вибирати клас - наприклад, якщо ви все ще працюєте, щоб придбати все спорядження вашого поточного класу, ви можете натиснути кнопку \"Вирішити Пізніше\" та повторно активувати класи у Налаштуваннях.", "faqQuestion8": "Що це за голубий показник, котрий з'являється в заголовках після 10 рівня?", "iosFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 under Menu > Use Skills. Unlike your health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete Good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", "androidFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 under Menu > Skills. Unlike your health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete Good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", diff --git a/website/common/locales/zh/backgrounds.json b/website/common/locales/zh/backgrounds.json index 7566296515..cae9c53611 100644 --- a/website/common/locales/zh/backgrounds.json +++ b/website/common/locales/zh/backgrounds.json @@ -346,11 +346,11 @@ "backgroundFlyingOverWildflowerFieldNotes": "在一片野花上飛", "backgroundFlyingOverAncientForestText": "古老的森林", "backgroundFlyingOverAncientForestNotes": "飛過古老的樹林傘衣上", - "backgrounds052018": "SET 48: Released May 2018", - "backgroundTerracedRiceFieldText": "Terraced Rice Field", - "backgroundTerracedRiceFieldNotes": "Enjoy a Terraced Rice Field in the growing season.", - "backgroundFantasticalShoeStoreText": "Fantastical Shoe Store", - "backgroundFantasticalShoeStoreNotes": "Look for fun new footwear in the Fantastical Shoe Store.", - "backgroundChampionsColosseumText": "Champions' Colosseum", - "backgroundChampionsColosseumNotes": "Bask in the glory of the Champions' Colosseum." + "backgrounds052018": "第48组:2018年5月推出", + "backgroundTerracedRiceFieldText": "水稻梯田", + "backgroundTerracedRiceFieldNotes": "在生长的季节享受水稻梯田吧。", + "backgroundFantasticalShoeStoreText": "梦幻鞋店", + "backgroundFantasticalShoeStoreNotes": "在梦幻鞋店寻找有趣的新鞋。", + "backgroundChampionsColosseumText": "冠军斗兽场", + "backgroundChampionsColosseumNotes": "沉浸在冠军斗兽场的荣耀之中。" } \ No newline at end of file diff --git a/website/common/locales/zh/communityguidelines.json b/website/common/locales/zh/communityguidelines.json index a710346433..721a439258 100644 --- a/website/common/locales/zh/communityguidelines.json +++ b/website/common/locales/zh/communityguidelines.json @@ -7,33 +7,33 @@ "commGuidePara002": "为了保证每个人在社区中都安全,快乐,高产,我们确实有一些准则。我们谨慎地制定规则,使其尽可能友好和易读。请在开始聊天之前花一点时间阅读它们。", "commGuidePara003": "这些规定适用于我们使用到的所有社区空间,包括(但不限于)Trello、Github、Transifex还有Wikia(也就是我们的维基)。偶尔,会有一些意想不到的事情发生,例如一个新的冲突事端的出现或者是一个恶意捣乱的人.当这些发生的时候,管理员们可能会适当的修改这些准则以确保社区的安全。别担心,假如指导准则有所更动,Bailey 会发布公告来通知你。", "commGuidePara004": "现在准备你的羽毛笔和卷轴做好笔记,让我们开始吧!", - "commGuideHeadingInteractions": "Interactions in Habitica", + "commGuideHeadingInteractions": "Habitica中的互动", "commGuidePara015": "Habitica有两种社交空间:公共的和私人的。公共空间包括Tavern,公共公会,GitHub,Trello,还有Wiki。私人空间包括私人公会,队伍聊天,以及私人信息。所有显示名字必须符合公共空间准则。要修改显示名字,在网页上去用户>个人资料并点击“编辑”按钮。", "commGuidePara016": "当参与Habitica的公共区域时,为了保证所有人的安全和愉快,有一些事项需要遵守。这些对于你这样的冒险者来说简直太容易了!", - "commGuideList02A": "Respect each other. Be courteous, kind, friendly, and helpful. Remember: Habiticans come from all backgrounds and have had wildly divergent experiences. This is part of what makes Habitica so cool! Building a community means respecting and celebrating our differences as well as our similarities. Here are some easy ways to respect each other:", - "commGuideList02B": "Obey all of the Terms and Conditions.", - "commGuideList02C": "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. Not even as a joke. This includes slurs as well as statements. Not everyone has the same sense of humor, and so something that you consider a joke may be hurtful to another. Attack your Dailies, not each other.", - "commGuideList02D": "Keep discussions appropriate for all ages. We have many young Habiticans who use the site! Let's not tarnish any innocents or hinder any Habiticans in their goals.", - "commGuideList02E": "Avoid profanity. This includes milder, religious-based oaths that may be acceptable elsewhere. We have people from all religious and cultural backgrounds, and we want to make sure that all of them feel comfortable in public spaces. If a moderator or 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. Additionally, slurs will be dealt with very severely, as they are also a violation of the Terms of Service.", - "commGuideList02F": "Avoid extended discussions of divisive topics in the Tavern and where it would be off-topic. If you feel that someone has said something rude or hurtful, do not engage them. If someone mentions something that is allowed by the guidelines but which is hurtful to you, it’s okay to politely let someone know that. If it is against the guidelines or the Terms of Service, you should flag it and let a mod respond. When in doubt, flag the post.", - "commGuideList02G": "Comply immediately with any Mod request. This could include, but is not limited to, requesting you limit your posts in a particular space, editing your profile to remove unsuitable content, asking you to move your discussion to a more suitable space, etc.", - "commGuideList02H": "Take time to reflect instead of responding in anger if someone tells you that something you said or did made them uncomfortable. There is great strength in being able to sincerely apologize to someone. If you feel that the way they responded to you was inappropriate, contact a mod rather than calling them out on it publicly.", - "commGuideList02I": "Divisive/contentious conversations should be reported to mods by flagging the messages involved or using the Moderator Contact Form. If you feel that a conversation is getting heated, overly emotional, or hurtful, cease to engage. Instead, report the posts to let us know about it. Moderators will respond as quickly as possible. It's our job to keep you safe. If you feel that more context is required, you can report the problem using the Moderator Contact Form.", - "commGuideList02J": "Do not spam. Spamming may include, but is not limited to: posting the same comment or query in multiple places, posting links without explanation or context, posting nonsensical messages, posting multiple promotional messages about a Guild, Party or Challenge, or posting many messages in a row. Asking for gems or a subscription in any of the chat spaces or via Private Message is also considered spamming. If people clicking on a link will result in any benefit to you, you need to disclose that in the text of your message or that will also be considered spam.

It is up to the mods to decide if something constitutes spam or might lead to spam, even if you don’t feel that you have been spamming. For example, advertising a Guild is acceptable once or twice, but multiple posts in one day would probably constitute spam, no matter how useful the Guild is!", - "commGuideList02K": "Avoid posting large header text in the public chat spaces, particularly the Tavern. Much like ALL CAPS, it reads as if you were yelling, and interferes with the comfortable atmosphere.", - "commGuideList02L": "We highly discourage the exchange of personal information -- particularly information that can be used to identify you -- in public chat spaces. Identifying information can include but is not limited to: your address, your email address, and your API token/password. This is for your safety! Staff or moderators may remove such posts at their discretion. If you are asked for personal information in a private Guild, Party, or PM, we highly recommend that you politely refuse and alert the staff and moderators by either 1) flagging the message if it is in a Party or private Guild, or 2) filling out the Moderator Contact Form and including screenshots.", - "commGuidePara019": "In private spaces, users have more freedom to discuss whatever topics they would like, but they still may not violate the Terms and Conditions, including posting slurs or any discriminatory, violent, or threatening content. Note that, because Challenge names appear in the winner's public profile, ALL Challenge names must obey the public space guidelines, even if they appear in a private space.", + "commGuideList02A": " 彼此尊重 成为一位彬彬有礼、善良且乐于助人的人。请记得 Habiticans 来自五湖四海,拥有各种各样的经历和背景。Habitica正因如此才如此多姿多彩!建立社区意味着我们要尊重与赞赏我们之间的相似与不同。以下是一些简单的尊重彼此的方式:", + "commGuideList02B": "遵守所有的 条款和条件", + "commGuideList02C": "不要发布任何包有暴力、恐吓,或明显/隐晦的有关性的内容;禁止发布任何提倡歧视、偏见、种族歧视的信息,或者任何恶意的、骚扰性的、或伤害某人或某队伍的文字或者图片。 这包括辱骂及类似的言语表达。这些内容即使是玩笑也不合适。不是每一个人都有同样的幽默感,所以某些您认为是玩笑的话可能对他人会造成伤害。请攻击您的每日任务, 而不是攻击别人。", + "commGuideList02D": "注意!讨论对全年龄开放。 有很多年轻的Habiticans在使用这个网站。让我们不要玷污任何天真无邪的孩子以及不要阻碍任何Habiticans完成他们的目标。", + "commGuideList02E": "避免亵渎言论。这包括可能在别的网站能够接受的,轻微的,对宗教的秽语。这里的人们有着各种各样的宗教和文化背景,我们希望保证他们能在公共空间感觉到自在。如果一位版主或工作人员告知你某个词语不被Habitica接受,那么就算你不理解为什么,也要遵守这个规则。 另外,侮辱别人将会受到严重的处罚,因为这种行为也同时违反了服务条款。", + "commGuideList02F": "请避免在酒馆中对有争议的话题进行扩展讨论,并且这在酒馆属于无关言论。 如果你觉得有人说了粗鲁或有害的事情,不要接触他们。 如果有人提到了准则允许但对你有害的事情,可以礼貌地让别人知道这一点。 如果该帖子违反准则或服务条款,您应该将其标记并让版主回应。 如有疑问,请举报该帖子。", + "commGuideList02G": "立即遵守任何版主的要求。 这可能包括但不限于,要求您将帖子限制在特定地方,编辑您的个人资料以删除不合适的内容,要求您将讨论移至更合适的地方等等。", + "commGuideList02H": "花一些时间思考,而不是立刻就怒斥对方如果有人告诉你你说的话使别人很不舒服。那么能够向别人郑重的道歉就是一种美德。如果你觉得他们的反应有不当的地方,请联系一个管理员,而不是将他们轰出公共区域。", + "commGuideList02I": "引战言论应当举报通过点击相关言论的举报帖子或者使用版主联系方式。如果你觉得对话变得激烈,甚至情绪过度或伤害到别人,停止对话。作为替代,点击帖子下方的小旗帜让我们知道。 版主会尽快回复。 保证安全是我们的工作。 如果您觉得需要更多的详细内容,则可以使用 版主联系方式 报告问题。", + "commGuideList02J": "请勿发送垃圾消息。垃圾消息包括但不限于:在多个地方发布相同的评论或询问,发布没有说明和上下文的链接,发布无意义的消息,在工会,队伍或挑战中发布垃圾广告,或一次发送多条消息。在任何聊天空间或者通过私人消息中索要宝石或者捐助都被视为垃圾消息。如果用户点击某个链接会给您带来任何好处,您需要在消息中告知该信息,否则这些消息也将被视为垃圾消息。

由版主决定是否构成垃圾消息或可能导致垃圾消息,即使你不觉得是。例如,推广公会一次两次可以接受,但在一天内发布多条消息可能会构成垃圾消息,无论该公会是多么有用!", + "commGuideList02K": "请不要在公共聊天场合张贴大标题文本,尤其是在酒馆。比如说,全部大写的英文字母会让你看起来像是在叫喊,这会干扰舒适的气氛。", + "commGuideList02L": "我们非常不鼓励在公共场合交换个人信息——尤其是那些能够证明自己身份的信息。那些信息包括但不限于:你的地址、电子邮箱、API令牌和密码。这是为了你的安全!工作人员或管理员会根据自己的判断移除那些信息。如果有人在私人公会、队伍或者私聊里问到你的这些私人信息,我们强烈建议你礼貌地拒绝他,并告知工作人员或者管理员中的任意一个。方法1,如果是在队伍或者私人公会里,点击帖子下方的举报。方法2,填写 管理员联系表格 ,包括截图。", + "commGuidePara019": "在私人空间中,用户有更多自由讨论他们喜欢的话题,但是仍然不能违反条款和条件,包括发布任何歧视、暴力或恐吓内容。注意,由于挑战名称会出现在胜利者的公共角色信息中,所有的挑战名称必须遵守公共空间指南,即使它们是在私人空间中。", "commGuidePara020": "私人信息(私信) 有一些附加要求。如果某人屏蔽了你,请不要在任何别的地方联系对方来解除屏蔽。而且你不应该用私信来寻求帮助(因为对问题的公开回答会帮助整个社区)。最后,不要给任何人发私信要求赠送宝石或订阅者来作为礼物,因为这样的行为会被认为是在发送垃圾信息。", - "commGuidePara020A": "If you see a post that you believe is in violation of the public space guidelines outlined above, or if you see a post that concerns you or makes you uncomfortable, you can bring it to the attention of Moderators and Staff by clicking the flag icon to report it. A Staff member or Moderator will respond to the situation as soon as possible. Please note that intentionally reporting innocent posts is an infraction of these Guidelines (see below in “Infractions”). PMs cannot be flagged at this time, so if you need to report a PM, please contact the Mods via the form on the “Contact Us” page, which you can also access via the help menu by clicking “Contact the Moderation Team.” You may want to do this if there are multiple problematic posts by the same person in different Guilds, or if the situation requires some explanation. 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.", + "commGuidePara020A": "如果您看到一条您认为是违反公共空间指南的消息,或者您看到一条困扰您或让您不舒服的消息,您可以通过点击举报标志将其报告给管理员和工作人员。工作人员或者管理员会尽快对情况作出回应。请注意,故意举报无辜的消息也是对社区准则的一种违反哦(具体见下方的“违规”)!私信暂时还不能被举报,所以如果您需要举报一条私信,请通过“联系我们”页面上的表格与我们的管理员联系,您也可以点击“联系管理团队”,可以通过帮助菜单访问该页面。当您遇到如下情况,您也可以这样举报,比如同一人在不同公会中有多个有问题的帖子,或者需要一些情况说明。您可以用您的母语与我们联系如果这对您很方便:我们可能需要使用Google翻译,但如果您遇到问题,我们希望您能够轻松的与我们交流。", "commGuidePara021": "此外,Habitica中的一些公共区域还有另外的准则.", "commGuideHeadingTavern": "酒馆", - "commGuidePara022": "The Tavern is the main spot for Habiticans to mingle. Daniel the Innkeeper keeps the place spic-and-span, and Lemoness will happily conjure up some lemonade while you sit and chat. Just keep in mind…", - "commGuidePara023": "Conversation tends to revolve around casual chatting and productivity or life improvement tips. Because the Tavern chat can only hold 200 messages, it isn't a good place for prolonged conversations on topics, especially sensitive ones (ex. politics, religion, depression, whether or not goblin-hunting should be banned, etc.). These conversations should be taken to an applicable Guild. A Mod may direct you to a suitable Guild, but it is ultimately your responsibility to find and post in the appropriate place.", - "commGuidePara024": "Don't discuss anything addictive in the Tavern. Many people use Habitica to try to quit their bad Habits. Hearing people talk about addictive/illegal substances may make this much harder for them! Respect your fellow Tavern-goers and take this into consideration. This includes, but is not exclusive to: smoking, alcohol, pornography, gambling, and drug use/abuse.", - "commGuidePara027": "When a moderator directs you to take a conversation elsewhere, if there is no relevant Guild, they may suggest you use the Back Corner. The Back Corner Guild is a free public space to discuss potentially sensitive subjects that should only be used when directed there by a moderator. It is carefully monitored by the moderation team. It is not a place for general discussions or conversations, and you will be directed there by a mod only when it is appropriate.", + "commGuidePara022": "酒馆是Habiticans主要的交流地点。酒馆主人丹尼尔将店里打理的一尘不染,Lemoness乐意在你坐下聊天时变出几杯柠檬水。只是要记住...", + "commGuidePara023": "谈话倾向于围绕闲聊和生产力或生活改善提示 。因为酒馆只能保留200条信息,所以它不是个适合长话题的地方,尤其是敏感话题 (例如政治、宗教、抑郁,哥布林猎杀是否该被禁止等)。这些讨论必需发布在合适的公会。管理员可以指导你找到一个合适的公会,但最终你有责任找到一个适当的地方来发布信息。", + "commGuidePara024": "不要在酒馆内讨论任何让人成瘾的东西。很多人用Habitica戒掉坏习惯,听到别人谈论这些让人上瘾/非法的东西,会让他们更难戒除!来到酒馆的人,请尊重你的小伙伴,替他们着想。这包括但不限于:抽烟、喝酒、赌博、色情、滥用药物。", + "commGuidePara027": "当管理员示意您在其他地方进行对话时,如果没有相关的公会,他们可能会建议您使用Back Corner 。 Back Corner公会是一个免费的公共空间,用于讨论潜在的敏感话题,只有在管理员的邀请你才能进入公会并使用它。这个公会由管理员小组严密监控。 它不是进行正常的讨论或对话的地方,只有在适当的时候,你才会通过管理员进入公会。", "commGuideHeadingPublicGuilds": "公共公会", - "commGuidePara029": "Public Guilds are much like the Tavern, except that instead of being centered around general conversation, they have a focused theme. Public Guild chat should focus on this theme. For example, members of the Wordsmiths Guild might be cross if the conversation is suddenly focusing on gardening instead of writing, and a Dragon-Fanciers Guild might not have any interest in deciphering ancient runes. Some Guilds are more lax about this than others, but in general, try to stay on topic!", - "commGuidePara031": "Some public Guilds will contain sensitive topics such as depression, religion, politics, etc. This is fine as long as the conversations therein do not violate any of the Terms and Conditions or Public Space Rules, and as long as they stay on topic.", + "commGuidePara029": "公开的公会就像酒馆,只是除了一般讨论外,他们有一个关注的主题 。公会聊天应该聚焦在这个主题上。例如 语言大师公会 如果突然专注起园艺而不是写作,这个公会就会被取消;或者 龙的发烧友公会 对解密古老卢恩文字就不会有兴趣。一些公会对这样要求比较宽松,但整体而言,尽量不要跑题 !", + "commGuidePara031": "一些公开的公会可能包含敏感话题,比如关于抑郁、宗教或政治的话题。只要不违反条款与条件,以及公共空间准则,并将讨论限制在话题范围内,这些讨论是不被限制的。", "commGuidePara033": "Public Guilds may NOT contain 18+ content. If they plan to regularly discuss sensitive content, they should say so in the Guild description. This is to keep Habitica safe and comfortable for everyone.", "commGuidePara035": "If the Guild in question has different kinds of sensitive issues, it is respectful to your fellow Habiticans to place your comment behind a warning (ex. \"Warning: references self-harm\"). These may be characterized as trigger warnings and/or content notes, and Guilds may have their own rules in addition to those given here. If possible, please use markdown to hide the potentially sensitive content below line breaks so that those who may wish to avoid reading it can scroll past it without seeing the content. Habitica staff and moderators may still remove this material at their discretion.", "commGuidePara036": "Additionally, the sensitive material should be topical -- bringing up self-harm in a Guild focused on fighting depression may make sense, but is probably less appropriate in a music Guild. If you see someone who is repeatedly violating this guideline, especially after several requests, please flag the posts and notify the moderators via the Moderator Contact Form.", diff --git a/website/common/locales/zh/content.json b/website/common/locales/zh/content.json index 0a46eff6b2..a3e0bf12c4 100644 --- a/website/common/locales/zh/content.json +++ b/website/common/locales/zh/content.json @@ -167,9 +167,9 @@ "questEggBadgerText": "獾", "questEggBadgerMountText": "獾", "questEggBadgerAdjective": "活跃", - "questEggSquirrelText": "Squirrel", - "questEggSquirrelMountText": "Squirrel", - "questEggSquirrelAdjective": "bushy-tailed", + "questEggSquirrelText": "松鼠", + "questEggSquirrelMountText": "松鼠", + "questEggSquirrelAdjective": "毛茸茸的尾巴", "eggNotes": "将一瓶孵化药水倒在这个宠物蛋上,你就能孵化出一只<%= eggAdjective(locale) %><%= eggText(locale) %>。", "hatchingPotionBase": "普通", "hatchingPotionWhite": "白色", diff --git a/website/common/locales/zh/front.json b/website/common/locales/zh/front.json index 65916ccc34..4764b8e088 100644 --- a/website/common/locales/zh/front.json +++ b/website/common/locales/zh/front.json @@ -139,7 +139,7 @@ "playButtonFull": "进入 Habitica", "presskit": "资料包", "presskitDownload": "下载图片", - "presskitText": "Thanks for your interest in Habitica! The following images can be used for articles or videos about Habitica. For more information, please contact us at <%= pressEnquiryEmail %>.", + "presskitText": "感谢您对 Habitica 的关注,以下图片可以为关于 Habitica 的文章或视频所使用。更多信息请咨询我们<%= pressEnquiryEmail %>。", "pkQuestion1": "是甚麼啟發了Habitica呢? 它是怎麼開始的呢?", "pkAnswer1": "如果你曾经投入很多时间来给你的游戏虚拟化身升级,这就让人很难不去联想如若你把那些努力用于改进真实生活中的你自身,而不是你的虚拟形象,那么你的生活该会变得多么美好啊。为了处理这样的问题,我们开始建设Habitica。
Habitica于2013年通过Kickstarter众筹网站正式启动,我们的灵光一现从此开始腾飞。自从那时起,它成长为了一个巨大的项目,被我们了不起的开源志愿者们和慷慨的用户们支持着。", "pkQuestion2": "為甚麼Habitica能運作呢?", @@ -153,10 +153,10 @@ "pkQuestion6": "哪些人是Habitica的典型用户?", "pkAnswer6": "Lots of different people use Habitica! More than half of our users are ages 18 to 34, but we have grandparents using the site with their young grandkids and every age in-between. Often families will join a party and battle monsters together.
Many of our users have a background in games, but surprisingly, when we ran a survey a while back, 40% of our users identified as non-gamers! So it looks like our method can be effective for anyone who wants productivity and wellness to feel more fun.", "pkQuestion7": "為甚麼Habitica用像素画?", - "pkAnswer7": "Habitica uses pixel art for several reasons. In addition to the fun nostalgia factor, pixel art is very approachable to our volunteer artists who want to chip in. It's much easier to keep our pixel art consistent even when lots of different artists contribute, and it lets us quickly generate a ton of new content!", + "pkAnswer7": "Habitica使用像素艺术有以下几个原因。除了有趣的怀旧因素之外,像素艺术对于我们希望融入其中的志愿艺术家来说非常平易近人。即使有许多不同的美术家贡献了自己的像素艺术,也更容易保持一致,并且它可以让我们快速生成大量新的内容!", "pkQuestion8": "Habitica能怎樣影響別人的真實生活呢?", "pkAnswer8": "你可以在这里找到很多Habitica帮助人们的记录:https://habitversary.tumblr.com", - "pkMoreQuestions": "Do you have a question that’s not on this list? Send an email to admin@habitica.com!", + "pkMoreQuestions": "你想问的问题不在这个清单上吗?请向 admin@habitica.com 发送一封电子邮件!", "pkVideo": "视频", "pkPromo": "促销", "pkLogo": "标志", @@ -220,7 +220,7 @@ "reportCommunityIssues": "报告社区问题", "subscriptionPaymentIssues": "捐助和支付问题", "generalQuestionsSite": "关于本站的常见问题", - "businessInquiries": "Business/Marketing Inquiries", + "businessInquiries": "业务/市场咨询", "merchandiseInquiries": "实体商品(T恤,贴纸)询问", "marketingInquiries": "市场营销/媒体咨询", "tweet": "发布推特", @@ -282,8 +282,8 @@ "passwordResetEmailHtml": "如果你在Habitica的用户 <%= username %> 希望重置密码,\">点击这里 去设置一个新的密码。这个链接会在24小时后到期。

如果你没有请求重置密码,请忽略这封邮件。", "invalidLoginCredentialsLong": "噢,糟了 - 你的用户名或密码错误。\n- 确保你的用户名或电子邮箱输入正确。\n- 你可能使用Facebook登记,而不是电子邮箱。再次检查尝试用Facebook登陆。\n- 如果你忘记了密码,点击 \"忘记密码\"。", "invalidCredentials": "没有运用那些授权证书的账号。", - "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 copy your User ID into the email and include your Profile Name.", - "accountSuspendedTitle": "Account has been suspended", + "accountSuspended": "该帐户,用户ID为“<%= userId %>”因违反[社区准则](https://habitica.com/static/community-guidelines)或[服务条款](https://habitica.com/static/terms)已被冻结。有关详细信息或要求解除封禁,请发送电子邮件给我们的社区管理员<%= communityManagerEmail %> 或要求您的家长或监护人通过电子邮件发送。 请将您的用户ID复制到电子邮件中并包含您的角色信息。", + "accountSuspendedTitle": "账户已被暂停使用", "unsupportedNetwork": "当前网络不支持。", "cantDetachSocial": "帐户缺少另一个认证方式;无法分离此认证方式。", "onlySocialAttachLocal": "本地认证仅能被添加到一个社交账号。", @@ -304,7 +304,7 @@ "alreadyHaveAccountLogin": "已经是Habitica大陆的勇者了?从这里进入吧!", "dontHaveAccountSignup": "还不是我们的一份子?在这里登记。", "motivateYourself": "鼓励自己去完成你的目标。", - "timeToGetThingsDone": "It's time to have fun when you get things done! Join over <%= userCountInMillions %> million Habiticans and improve your life one task at a time.", + "timeToGetThingsDone": "当你完成所有的事情后该娱乐一下了!成为超过<%= userCountInMillions %>万的Habiticans的一份子吧,一次一个任务来改善你的生活。", "singUpForFree": "免费注册", "or": "或者", "gamifyYourLife": "游戏化你的生活", diff --git a/website/common/locales/zh/generic.json b/website/common/locales/zh/generic.json index 61a43cb934..a77289f830 100644 --- a/website/common/locales/zh/generic.json +++ b/website/common/locales/zh/generic.json @@ -33,7 +33,7 @@ "showLess": "收起", "expandToolbar": "展开列表", "collapseToolbar": "隐藏列表", - "markdownHelpLink": "Markdown formatting help", + "markdownHelpLink": "Markdown格式帮助", "showFormattingHelp": "查看格式相关帮助", "hideFormattingHelp": "隐藏格式相关帮助", "youType": "你输入了:", @@ -60,7 +60,7 @@ "groupPlansTitle": "团队套餐", "newGroupTitle": "新的团队", "subscriberItem": "神秘物品", - "newSubscriberItem": "You have new Mystery Items", + "newSubscriberItem": "你有新的神秘物品", "subscriberItemText": "每月,定期捐款者会收到一个神秘物品。这件物品一般是在月底前一周时推出。查看Wiki里的“神秘物品”页面以获得更多信息。", "all": "全部", "none": "无", @@ -136,12 +136,12 @@ "audioTheme_airuTheme": "Airu 的主题", "audioTheme_beatscribeNesTheme": "Beatscribe的新主题", "audioTheme_arashiTheme": "岚 主题", - "audioTheme_triumphTheme": "Triumph Theme", - "audioTheme_lunasolTheme": "Lunasol Theme", - "audioTheme_spacePenguinTheme": "SpacePenguin's Theme", + "audioTheme_triumphTheme": "胜利的主题", + "audioTheme_lunasolTheme": "卢娜索的主题", + "audioTheme_spacePenguinTheme": "电子琴的主题", "audioTheme_maflTheme": "MAFL主题", "audioTheme_pizildenTheme": "Pizilden的主题", - "audioTheme_farvoidTheme": "Farvoid Theme", + "audioTheme_farvoidTheme": "Farvoid的主题", "askQuestion": "问个问题", "reportBug": "报告一个问题", "HabiticaWiki": "Habitica 维基", @@ -167,13 +167,13 @@ "achievementBurnoutText": "在2015秋季节事件中打败了疲惫魔,复原了锻炼精魂!", "achievementBewilder": "Mistiflying城的拯救者", "achievementBewilderText": "在2016年春季嘉年华事件中协助战胜迷失怪!", - "achievementDysheartener": "Savior of the Shattered", + "achievementDysheartener": "破碎的心的拯救者", "achievementDysheartenerText": "Helped defeat the Dysheartener during the 2018 Valentine's Event!", "checkOutProgress": "看一下我在Habitica的进步!", "cards": "卡片", - "sentCardToUser": "You sent a card to <%= profileName %>", - "cardReceivedFrom": "<%= cardType %> from <%= userName %>", - "cardReceived": "You received a <%= card %>", + "sentCardToUser": "你寄给<%= profileName %>一张卡片", + "cardReceivedFrom": "来自<%= userName %>的<%= cardType %>", + "cardReceived": "你收到一张<%= card %>", "greetingCard": "祝贺卡", "greetingCardExplanation": "你们两个人都获得了“欢乐伙伴”成就!", "greetingCardNotes": "给一个队友发一张祝贺卡。", @@ -278,14 +278,14 @@ "spirituality": "灵性", "time_management": "时间管理和责任感", "recovery_support_groups": "恢复+支持小组", - "dismissAll": "Dismiss All", + "dismissAll": "关闭全部", "messages": "私信", "emptyMessagesLine1": "你没有任何私信", "emptyMessagesLine2": "发送一条私信来展开一次讨论吧!", - "userSentMessage": "<%= user %> sent you a message", + "userSentMessage": "<%= user %>给你发送了一条私信", "letsgo": "我们出发吧!", "selected": "已选择", "howManyToBuy": "你想买多少呢?", "habiticaHasUpdated": "有一個新的Habitica更新。刷新以獲取最新版本!", - "contactForm": "Contact the Moderation Team" + "contactForm": "联系版主小组" } \ No newline at end of file diff --git a/website/common/locales/zh/groups.json b/website/common/locales/zh/groups.json index a67fb30bdf..8d35a014f2 100644 --- a/website/common/locales/zh/groups.json +++ b/website/common/locales/zh/groups.json @@ -34,7 +34,7 @@ "communityGuidelines": "社区准则", "communityGuidelinesRead1": "请阅读我们的", "communityGuidelinesRead2": "在聊天之前", - "bannedWordUsed": "Oops! Looks like this post contains a swearword, religious oath, or reference to an addictive substance or adult topic (<%= swearWordsUsed %>). Habitica has users from all backgrounds, so we keep our chat very clean. Feel free to edit your message so you can post it!", + "bannedWordUsed": "哦呀!似乎这篇的文章包含脏话,宗教的诅咒,或者涉及到成瘾物质或成人话题(<%= swearWordsUsed %>)。habitica的用户拥有各种不同的背景,所以我们得保持我们的聊天环境很干净。请修改您的消息以发送它!", "bannedSlurUsed": "您的帖子包含不合适的语言,您的聊天权限已被取消。", "party": "队伍", "createAParty": "创建一个队伍", @@ -42,30 +42,30 @@ "errorNotInParty": "你没有参加队伍", "noPartyText": "你也许不在一个队伍中,或者你的队伍还需要一段时间来加载。你也可以创建一个新队伍来邀请朋友。或者如果你想加入一个队伍,你可以把下方你的用户 ID 给他们,然后返回这里查看邀请信息。", "LFG": "招募队友,宣传你的队伍,或加入一个已有队伍,请到<%= linkStart %>集结队伍 (寻找小组) <%= linkEnd %>公会。", - "wantExistingParty": "Want to join an existing Party? Go to the <%= linkStart %>Party Wanted Guild<%= linkEnd %> and post this User ID:", + "wantExistingParty": "想加入一个队伍吗? 点击 <%= linkStart %>Party Wanted Guild<%= linkEnd %> 把这个用户ID填上:", "joinExistingParty": "加入别人的队伍", - "needPartyToStartQuest": "Whoops! You need to create or join a Party before you can start a quest!", + "needPartyToStartQuest": "哇哦!在你开始一个任务之前,你需要创建或加入一个队伍!", "createGroupPlan": "建立", "create": "建立", "userId": "用户ID", "invite": "邀请", "leave": "离开", - "invitedToParty": "You were invited to join the Party <%= party %>", - "invitedToPrivateGuild": "You were invited to join the private Guild <%= guild %>", - "invitedToPublicGuild": "You were invited to join the Guild <%= guild %>", - "partyInvitationsText": "You have <%= numberInvites %> Party invitations! Choose wisely, because you can only be in one Party at a time.", - "joinPartyConfirmationText": "Are you sure you want to join the Party \"<%= partyName %>\"? You can only be in one Party at a time. If you join, all other Party invitations will be rejected.", + "invitedToParty": "你被邀请加入队伍<%= party %>", + "invitedToPrivateGuild": "你被邀请加入一个私人工会<%= guild %>", + "invitedToPublicGuild": "你被邀请加入一个工会<%= guild %>", + "partyInvitationsText": "您有<%= numberInvites %>个队伍邀请!您一次只能加入一个队伍,因此请谨慎选择。", + "joinPartyConfirmationText": "您确定要加入队伍“<%= partyName %>”吗?您同时只能加入一个队伍。如果您加入这个队伍,其他邀请将被拒绝。", "invitationAcceptedHeader": "你的邀请已经被接受", "invitationAcceptedBody": "<%= username %>接受了你的邀请加入<%= groupName %>!", "joinNewParty": "加入新队伍", "declineInvitation": "拒绝邀请", - "partyLoading1": "Your Party is being summoned. Please wait...", - "partyLoading2": "Your Party is coming in from battle. Please wait...", - "partyLoading3": "Your Party is gathering. Please wait...", - "partyLoading4": "Your Party is materializing. Please wait...", + "partyLoading1": "你的队伍正在被召唤中。请等待...", + "partyLoading2": "你的队伍正在战斗中。请稍等...", + "partyLoading3": "你的队伍正在聚集中。请稍等...", + "partyLoading4": "你的队伍正在成形中。请稍等...", "systemMessage": "系统消息", - "newMsgGuild": "<%= name %> has new posts", - "newMsgParty": "Your Party, <%= name %>, has new posts", + "newMsgGuild": "有<%= name %>条新消息", + "newMsgParty": "您的队伍 <%= name %> 有新消息", "chat": "聊天", "sendChat": "发送", "toolTipMsg": "查看最近的消息", @@ -85,7 +85,7 @@ "assignLeader": "任命队长", "members": "成员", "memberList": "成员列表", - "partyList": "Order for Party members in header", + "partyList": "给队伍成员的置顶消息", "banTip": "引导成员", "moreMembers": "更多成员", "invited": "已邀请", @@ -106,16 +106,16 @@ "optionalMessage": "可选消息", "yesRemove": "是的,移除", "foreverAlone": "你不可以赞你自己的信息。不要成为那样的人。", - "sortBackground": "Sort by Background", - "sortClass": "Sort by Class", - "sortDateJoined": "Sort by Join Date", - "sortLogin": "Sort by Login Date", - "sortLevel": "Sort by Level", - "sortName": "Sort by Name", - "sortTier": "Sort by Tier", - "ascendingAbbrev": "Asc", - "descendingAbbrev": "Desc", - "applySortToHeader": "Apply Sort Options to Party Header", + "sortBackground": "以背景排序", + "sortClass": "以职业类型排序", + "sortDateJoined": "以加入队伍日期排序", + "sortLogin": "以登陆日期排序", + "sortLevel": "以等级排序", + "sortName": "以角色名称排序", + "sortTier": "以贡献等级排序", + "ascendingAbbrev": "升序", + "descendingAbbrev": "降序", + "applySortToHeader": "在主页队伍成员展示处应用排序选项", "confirmGuild": "用4个宝石来创建公会?", "leaveGroupCha": "退出公会挑战并…", "confirm": "确定", @@ -131,10 +131,10 @@ "clearAll": "删除所有消息", "confirmDeleteAllMessages": "确定要删除收件箱里的所有消息吗?其他用户依然会看到你已发送给他们的消息。", "optOutPopover": "不喜欢私信?点击不再接收", - "PMPlaceholderTitle": "Nothing Here Yet", - "PMPlaceholderDescription": "Select a conversation on the left", - "PMPlaceholderTitleRevoked": "Your chat privileges have been revoked", - "PMPlaceholderDescriptionRevoked": "You are not able to send private messages because your chat privileges have been revoked. If you have questions or concerns about this, please email admin@habitica.com to discuss it with the staff.", + "PMPlaceholderTitle": "这里没有对话", + "PMPlaceholderDescription": "在左侧选择对话", + "PMPlaceholderTitleRevoked": "您的聊天权利已被取消", + "PMPlaceholderDescriptionRevoked": "您无法发送私信,因为您的聊天权限已被撤销。 如果您对此有任何疑问或疑虑,请发送电子邮件至 admin@habitica.com 与工作人员讨论。", "block": "阻止", "unblock": "解锁", "pm-reply": "发送回复", @@ -150,13 +150,13 @@ "report": "举报", "abuseFlag": "举报违反社区准则的用户", "abuseFlagModalHeading": "举报违规行为", - "abuseFlagModalBody": "Are you sure you want to report this post? You should only report a post that violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Inappropriately reporting a post is a violation of the Community Guidelines and may give you an infraction.", + "abuseFlagModalBody": "你确定要举报这个帖子?你 只能 举报违反了<%= firstLinkStart %>社会准则<%= linkEnd %>和/或者<%= secondLinkStart %>服务条款<%= linkEnd %> 的消息。不当的举报是违反社区准则的,并且你会因此违规。", "abuseFlagModalButton": "举报违规", "abuseReported": "感谢您报告此违反服务条款的行为。版主已经接到通知。", "abuseAlreadyReported": "你已经举报过此信息。", - "whyReportingPost": "Why are you reporting this post?", - "whyReportingPostPlaceholder": "Please help our moderators by letting us know why you are reporting this post for a violation, e.g., spam, swearing, religious oaths, bigotry, slurs, adult topics, violence.", - "optional": "Optional", + "whyReportingPost": "你为什么要举报该消息?", + "whyReportingPostPlaceholder": "请通过让我们知道您为什么举报这个帖子违规来帮助我们的版主,例如垃圾邮件,脏话,宗教宣誓,偏见,诽谤,成人话题,暴力等。", + "optional": "非必填", "needsText": "请输入一个信息", "needsTextPlaceholder": "请在这里输入信息", "copyMessageAsToDo": "将消息复制为代办事项", @@ -167,9 +167,9 @@ "leaderOnlyChallenges": "只有会长能创建挑战", "sendGift": "赠送礼物", "inviteFriends": "邀请朋友", - "partyMembersInfo": "Your Party currently has <%= memberCount %> members and <%= invitationCount %> pending invitations. The limit of members in a Party is <%= limitMembers %>. Invitations above this limit cannot be sent.", + "partyMembersInfo": "你的队伍目前有 <%= memberCount %> 位小伙伴和 <%= invitationCount %>封待定的邀请函。队伍的剩余成员数是<%= limitMembers %>。超过此限制邀请将不能发送。", "inviteByEmail": "通过邮件邀请", - "inviteByEmailExplanation": "If a friend joins Habitica via your email, they'll automatically be invited to your Party!", + "inviteByEmailExplanation": "如果你的朋友通过你的邮件加入Habitica,他们将自动被邀请加入你的队伍!", "inviteMembersHowTo": "通过有效的电子邮件或36位用户ID邀请他人。 如果电子邮件尚未注册,我们将邀请他们加入Habitica。", "inviteFriendsNow": "现在邀请你的朋友", "inviteFriendsLater": "稍后邀请", @@ -195,18 +195,18 @@ "battleWithFriends": "与朋友一起大战怪兽", "startPartyWithFriends": "和你的朋友们组建新队伍", "startAParty": "创建一个队伍", - "addToParty": "Add someone to your Party", + "addToParty": "加入队伍成员", "likePost": "如果你喜欢这个公告请点击!", "partyExplanation1": "和朋友们一起玩Habitica ,互相监督!", "partyExplanation2": "与怪兽作战或者创建挑战!", "partyExplanation3": "现在,邀请朋友来获取探索任务卷轴!", "wantToStartParty": "你想创建一支队伍吗?", - "exclusiveQuestScroll": "Inviting a friend to your Party will grant you an exclusive Quest Scroll to battle the Basi-List together!", + "exclusiveQuestScroll": "邀请朋友加入队伍,你将获得独家探索任务卷轴,与他们一起挑战Basi-List!", "nameYourParty": "为你的队伍命名!", - "partyEmpty": "You're the only one in your Party. Invite your friends!", - "partyChatEmpty": "Your Party chat is empty! Type a message in the box above to start chatting.", + "partyEmpty": "你孤身一人,快邀请你的朋友们!", + "partyChatEmpty": "队伍聊天框里空空如也!在上面的聊天框里打字来开始聊天。", "guildChatEmpty": "公会聊天框里空空如也!在上面的聊天框打字来开始聊天。", - "requestAcceptGuidelines": "If you would like to post messages in the Tavern or any Party or Guild chat, please first read our <%= linkStart %>Community Guidelines<%= linkEnd %> and then click the button below to indicate that you accept them.", + "requestAcceptGuidelines": "如果你想在酒馆里,或是队伍和公会里发布信息,请先阅读<%= linkStart %>社区指南<%= linkEnd %>并点击下面按钮,表示您接受其中的条款。 ", "partyUpName": "举行派对", "partyOnName": "欢乐派对", "partyUpText": "和另一个人一起加入队伍!愉快的打怪并互相支持吧!玩的愉快嗷~!", @@ -214,7 +214,7 @@ "groupNotFound": "没有找到这个小组,或者你没有权限。", "groupTypesRequired": "你必须提供一个有效的\"type\"查询字符串。", "questLeaderCannotLeaveGroup": "需要放弃已开始的探索任务才能退出团队。", - "cannotLeaveWhileActiveQuest": "You cannot leave Party during an active quest. Please leave the quest first.", + "cannotLeaveWhileActiveQuest": "你不能在进行探索任务期间离开队伍。请先退出探索任务。", "onlyLeaderCanRemoveMember": "只有小组长能移除一个成员!", "cannotRemoveCurrentLeader": "你不能移除小组的组长。请先选出一个新组长。", "memberCannotRemoveYourself": "你不能移除自己!", @@ -225,12 +225,12 @@ "inviteMissingUuid": "邀请中缺失用户ID", "inviteMustNotBeEmpty": "邀请不能是空的。", "partyMustbePrivate": "队伍必须是私有的", - "userAlreadyInGroup": "UserID: <%= userId %>, User \"<%= username %>\" already in that group.", - "youAreAlreadyInGroup": "You are already a member of this group.", + "userAlreadyInGroup": "用户ID:<%= userId %> ,用户 “<%= username %>”已经在这个队伍中。", + "youAreAlreadyInGroup": "你已经是这个队伍的成员。", "cannotInviteSelfToGroup": "你不能邀请自己到一个小组", - "userAlreadyInvitedToGroup": "UserID: <%= userId %>, User \"<%= username %>\" already invited to that group.", - "userAlreadyPendingInvitation": "UserID: <%= userId %>, User \"<%= username %>\" already pending invitation.", - "userAlreadyInAParty": "UserID: <%= userId %>, User \"<%= username %>\" already in a party.", + "userAlreadyInvitedToGroup": "用户ID:<%= userId %>,用户“<%= username %>”已经被邀请进入这个小组。", + "userAlreadyPendingInvitation": "用户ID:<%= userId %>,用户“<%= username %>”等待接受邀请。", + "userAlreadyInAParty": "用户ID:<%= userId %> ,用户 “<%= username %>”已经在一个队伍中。", "userWithIDNotFound": "这个ID \"<%= userId %>\"的用户没有找到。", "userHasNoLocalRegistration": "用户不能有一个本地注册(用户名,电子邮件,密码)。", "uuidsMustBeAnArray": "用户ID邀请必须是一个数组。", @@ -249,13 +249,13 @@ "confirmClaim": "你肯定你要接受這個任务?", "confirmUnClaim": "你肯定你要放棄這個任务?", "confirmApproval": "你肯定你要批准這個任务?", - "confirmNeedsWork": "Are you sure you want to mark this task as needing work?", + "confirmNeedsWork": "您确定要将此任务标记为需要处理吗?", "userRequestsApproval": "<%= userName %>的请求被肯定了", "userCountRequestsApproval": "<%= userCount %>個请求被肯定了", "youAreRequestingApproval": "你在等待请求被肯定", - "chatPrivilegesRevoked": "You cannot do that because your chat privileges have been revoked.", - "cannotCreatePublicGuildWhenMuted": "You cannot create a public guild because your chat privileges have been revoked.", - "cannotInviteWhenMuted": "You cannot invite anyone to a guild or party because your chat privileges have been revoked.", + "chatPrivilegesRevoked": "您不能发送消息因为您的聊天权利已被撤销。", + "cannotCreatePublicGuildWhenMuted": "您不能创建一个公共的工会因为您的聊天权利已被撤销。", + "cannotInviteWhenMuted": "您不能邀请任何人加入一个工会或者队伍因为您的聊天权利已被撤销。", "newChatMessagePlainNotification": "<%= groupName %>中有来自<%= authorName %>的消息. 点击这里进行聊天!", "newChatMessageTitle": "<%= groupName %> 中有新的消息", "exportInbox": "输出消息", @@ -271,12 +271,12 @@ "claim": "索赔", "removeClaim": "移除公告", "onlyGroupLeaderCanManageSubscription": "只有组长可以修改小组的订购方式", - "yourTaskHasBeenApproved": "Your task <%= taskText %> has been approved.", - "taskNeedsWork": "<%= managerName %> marked <%= taskText %> as needing additional work.", - "userHasRequestedTaskApproval": "<%= user %> requests approval for <%= taskName %>", + "yourTaskHasBeenApproved": "您的任务<%= taskText %> 已经被批准。", + "taskNeedsWork": "<%= managerName %> 标记 <%= taskText %> 为需要额外工作。", + "userHasRequestedTaskApproval": "<%= user %> 请求 <%= taskName %> 的批准", "approve": "许可", "approveTask": "许可任务", - "needsWork": "Needs Work", + "needsWork": "需要处理", "viewRequests": "查看申请", "approvalTitle": "<%= userName %>已经完成了<%= type %>:“<%= text %>”", "confirmTaskApproval": "你要把击败任务的奖励,给予这位勇士——<%= username %>吗?", @@ -381,7 +381,7 @@ "groupDescription": "详细描述", "guildDescriptionPlaceholder": "在这里输入公会会员应该了解公会的所有内容。 有用的提示,有帮助的链接和激励人心的标语都在这里!", "markdownFormattingHelp": "[Markdown 语法帮助](http://habitica.wikia.com/wiki/Markdown_Cheat_Sheet)", - "partyDescriptionPlaceholder": "This is our Party's description. It describes what we do in this Party. If you want to learn more about what we do in this Party, read the description. Party on.", + "partyDescriptionPlaceholder": "这是我们队伍的描述。 它描述了我们在这个队伍里做什么。 如果你想了解更多关于我们在这个队伍所做的事,请阅读说明。 派对继续。", "guildGemCostInfo": "花费宝石促进高质量的公会,宝石会转移到您的公会的银行。", "noGuildsTitle": "你不是任何公会的成员。", "noGuildsParagraph1": "公会是由其他玩家创建的社会团体,可以为您提供支持,加强自身的责任和激励人心的聊天。", @@ -424,42 +424,42 @@ "managerAdded": "成功添加管理员", "managerRemoved": "成功移除管理员", "leaderChanged": "首領被改變了", - "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", - "whatIsWorldBoss": "What is a World Boss?", - "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", - "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", - "worldBossBullet1": "Complete tasks to damage the World Boss", - "worldBossBullet2": "The World Boss won’t damage you for missed tasks, but its Rage meter will go up. If the bar fills up, the Boss will attack one of Habitica’s shopkeepers!", - "worldBossBullet3": "You can continue with normal Quest Bosses, damage will apply to both", + "groupNoNotifications": "这个工会因为成员太多不能收到通知!确保经常进入该工会来查看回复您的消息!", + "whatIsWorldBoss": "什么是世界级怪物?", + "worldBossDesc": "世界怪物是一个特殊的事件,把Habitica社区聚集在一起并使用他们的任务来击败强大的怪物! 所有的Habitica用户在击败怪物后都会得到奖励,即使是那些一直在旅馆休息或者没有使用Habitica完成任务的人。", + "worldBossLink": "在Wiki上阅读更多关于以前的世界怪物的内容。", + "worldBossBullet1": "完成任务来攻击世界怪物", + "worldBossBullet2": "世界怪物不会因为你未完成的任务而伤害你,但它的怒气值会上升。 如果怒气值满了,怪物会攻击Habitica的店主之一!", + "worldBossBullet3": "你可以继续正常的怪物任务,你发出的伤害会攻击双方。", "worldBossBullet4": "Check the Tavern regularly to see World Boss progress and Rage attacks", - "worldBoss": "World Boss", - "groupPlanTitle": "Need more for your crew?", - "groupPlanDesc": "Managing a small team or organizing household chores? Our group plans grant you exclusive access to a private task board and chat area dedicated to you and your group members!", - "billedMonthly": "*billed as a monthly subscription", - "teamBasedTasksList": "Team-Based Task List", - "teamBasedTasksListDesc": "Set up an easily-viewed shared task list for the group. Assign tasks to your fellow group members, or let them claim their own tasks to make it clear what everyone is working on!", - "groupManagementControls": "Group Management Controls", - "groupManagementControlsDesc": "Use task approvals to verify that a task that was really completed, add Group Managers to share responsibilities, and enjoy a private group chat for all team members.", - "inGameBenefits": "In-Game Benefits", - "inGameBenefitsDesc": "Group members get an exclusive Jackalope Mount, as well as full subscription benefits, including special monthly equipment sets and the ability to buy gems with gold.", - "inspireYourParty": "Inspire your party, gamify life together.", - "letsMakeAccount": "First, let’s make you an account", - "nameYourGroup": "Next, Name Your Group", - "exampleGroupName": "Example: Avengers Academy", + "worldBoss": "世界级怪物", + "groupPlanTitle": "需要更多的成员?", + "groupPlanDesc": "管理着一个小团队或准备组织家务? 我们的团队计划为您和您的小组成员授予专有的私人任务板块和聊天区!", + "billedMonthly": "*按月捐助收费", + "teamBasedTasksList": "基于团队的任务清单", + "teamBasedTasksListDesc": "为团队设置一个易于查看的共享任务列表。将任务分配给您的同事小组成员,或让他们提出自己的任务以明确每个人的工作!", + "groupManagementControls": "团队管理员的权限", + "groupManagementControlsDesc": "使用任务审批来验证任务是否完成,添加团队管理员以分担责任,并享受为所有小组成员建立的一个私人团队聊天区域。", + "inGameBenefits": "游戏福利", + "inGameBenefitsDesc": "小组成员可获得独家的鹿角兔坐骑以及全套捐助优惠,包括特殊的月度捐助装备套装和使用金币购买宝石的权利。", + "inspireYourParty": "激励你的队伍,一起游戏化生活。", + "letsMakeAccount": "首先,来注册一个账号", + "nameYourGroup": "然后,给你的队伍命名", + "exampleGroupName": "例如:复仇者联盟", "exampleGroupDesc": "For those selected to join the training academy for The Avengers Superhero Initiative", - "thisGroupInviteOnly": "This group is invitation only.", - "gettingStarted": "Getting Started", - "congratsOnGroupPlan": "Congratulations on creating your new Group! Here are a few answers to some of the more commonly asked questions.", - "whatsIncludedGroup": "What's included in the subscription", - "whatsIncludedGroupDesc": "All members of the Group receive full subscription benefits, including the monthly subscriber items, the ability to buy Gems with Gold, and the Royal Purple Jackalope mount, which is exclusive to users with a Group Plan membership.", - "howDoesBillingWork": "How does billing work?", - "howDoesBillingWorkDesc": "Group Leaders are billed based on group member count on a monthly basis. This charge includes the $9 (USD) price for the Group Leader subscription, plus $3 USD for each additional group member. For example: A group of four users will cost $18 USD/month, as the group consists of 1 Group Leader + 3 group members.", - "howToAssignTask": "How do you assign a Task?", - "howToAssignTaskDesc": "Assign any Task to one or more Group members (including the Group Leader or Managers themselves) by entering their usernames in the \"Assign To\" field within the Create Task modal. You can also decide to assign a Task after creating it, by editing the Task and adding the user in the \"Assign To\" field!", - "howToRequireApproval": "How do you mark a Task as requiring approval?", - "howToRequireApprovalDesc": "Toggle the \"Requires Approval\" setting to mark a specific task as requiring Group Leader or Manager confirmation. The user who checked off the task won't get their rewards for completing it until it has been approved.", - "howToRequireApprovalDesc2": "Group Leaders and Managers can approve completed Tasks directly from the Task Board or from the Notifications panel.", - "whatIsGroupManager": "What is a Group Manager?", - "whatIsGroupManagerDesc": "A Group Manager is a user role that do not have access to the group's billing details, but can create, assign, and approve shared Tasks for the Group's members. Promote Group Managers from the Group’s member list.", - "goToTaskBoard": "Go to Task Board" + "thisGroupInviteOnly": "这个队伍仅限邀请加入。", + "gettingStarted": "现在加入我们", + "congratsOnGroupPlan": "恭喜您创建您的新队伍! 以下是一些常见问题的答案。", + "whatsIncludedGroup": "捐助中包括了什么", + "whatsIncludedGroupDesc": "本团队所有成员均可获得完整的捐助福利,包括每月捐助者赠品,使用金币购买钻石的能力以及皇家紫鹿角兔坐骑,这些是拥有团队计划会员资格的用户所专有的。", + "howDoesBillingWork": "我要如何付费?", + "howDoesBillingWorkDesc": "团队队长每月按小组成员人数付费。 该费用包括团体队长捐助的9美元(美元)价格,以及每个额外团体成员3美元的费用。 例如:一个团队的四位用户将花费18美元/月,因为该团队由1名队长+ 3名队员组成。", + "howToAssignTask": "这个团队计划如何分配任务?", + "howToAssignTaskDesc": "通过在创建任务模式中的“分配给”区域中输入队员的用户名,将任何任务分配给一个或多个组成员(包括团队队长或管理员他们自己)。 您也可以决定在创建任务后分配任务,方法是编辑任务并在“分配给”区域中添加用户!", + "howToRequireApproval": "如何将任务标记为需要审批?", + "howToRequireApprovalDesc": "改变“需要批准”的设置,将特定任务标记为需要队长或管理员确认。等待审批任务的用户在获得批准之前不会获得完成任务的奖励。", + "howToRequireApprovalDesc2": "团队队长和管理员可以直接从任务板或通知面板批准完成的任务。", + "whatIsGroupManager": "什么是团队管理员?", + "whatIsGroupManagerDesc": "团队管理员无权访问小组的帐单详细信息,但可以为小组成员创建,分配和批准共享任务。 从团队成员名单中设置团队管理员。", + "goToTaskBoard": "前往任务板" } \ No newline at end of file diff --git a/website/common/locales/zh/limited.json b/website/common/locales/zh/limited.json index 8ab67e5515..1db2bc9500 100644 --- a/website/common/locales/zh/limited.json +++ b/website/common/locales/zh/limited.json @@ -32,9 +32,9 @@ "seasonalShopSummerText": "快乐夏天嘉年华!你想买些稀罕东西吗?7月31日前购买!", "seasonalShopFallText": "快乐秋天嘉年华!你想买些稀罕东西吗?10月31日前购买!", "seasonalShopWinterText": "快乐冬天嘉年华!你想买些稀罕东西吗?1月31日前购买!", - "seasonalShopSpringText": "Happy Spring Fling!! Would you like to buy some rare items? They’ll only be available until April 30th!", + "seasonalShopSpringText": "快乐春天嘉年华!你想买些稀罕东西吗?4月30日前购买!", "seasonalShopFallTextBroken": "啊……欢迎来到季节商店……我们正在准备秋季特供产品,还有其他一些什么的…… 这里所有的东西都会在每年秋季节庆期间开放购买,但我们只开门到10月31日……你可能现在可以开始囤货了,或者只能继续等,等,等…… *叹气*", - "seasonalShopBrokenText": "My pavilion!!!!!!! My decorations!!!! Oh, the Dysheartener's destroyed everything :( Please help defeat it in the Tavern so I can rebuild!", + "seasonalShopBrokenText": "我的亭子!!!我的装饰品!!! 哦,Dysheartener毁了一切 : ( 请在酒馆中帮助我击败它,所以我可以重建!", "seasonalShopRebirth": "如果你曾经购买过这件装备,但是现在失去了它,那么你可以从奖励栏中重新购买它。最初,你只能购买你当前职业的装备(默认职业是战士),但是不用担心,当你转换职业时,其他职业的装备你就可以购买了。", "candycaneSet": "拐杖糖 (法师)", "skiSet": "雪橇刺客 (盗贼)", @@ -118,11 +118,11 @@ "winter2018MistletoeSet": "槲寄生医师 (医师)", "winter2018ReindeerSet": "驯鹿盗贼 (盗贼)", "spring2018SunriseWarriorSet": "Sunrise Warrior (Warrior)", - "spring2018TulipMageSet": "Tulip Mage (Mage)", + "spring2018TulipMageSet": "郁金香法师(法师)", "spring2018GarnetHealerSet": "Garnet Healer (Healer)", "spring2018DucklingRogueSet": "Duckling Rogue (Rogue)", "eventAvailability": "在<%= date(locale) %>前可购买。", - "dateEndMarch": "April 30", + "dateEndMarch": "4月30日", "dateEndApril": "4月19日", "dateEndMay": "5月17日", "dateEndJune": "6月14日", diff --git a/website/common/locales/zh/loadingscreentips.json b/website/common/locales/zh/loadingscreentips.json index fd054c2128..a0cb1ffcd5 100644 --- a/website/common/locales/zh/loadingscreentips.json +++ b/website/common/locales/zh/loadingscreentips.json @@ -25,7 +25,7 @@ "tip23": "升到100级吧!这样你就可以免费解锁重生球,并且开始全新的冒险!", "tip24": "有问题?在“Habitica帮助公会”提问吧!", "tip25": "四季盛会会在接近二至日和二分点的时候开始", - "tip26": "You can look for a Party or find Party members in the Party Wanted Guild!", + "tip26": "你可以在Party Wanted Guild寻找一个队伍或者队伍成员!", "tip27": "昨天完成了每日任务,但是忘记点了?别担心!你可以在开始新的一天之前,把它补点上!", "tip28": "在\"用户\"图标下,设置“自定义起始日期”>设置是用来控制你这一天什么时候会重置。", "tip29": "完成所有每日任务来获得完美日的增益来提升属性!", diff --git a/website/common/locales/zh/messages.json b/website/common/locales/zh/messages.json index 3ab7cec5c2..858a7ff142 100644 --- a/website/common/locales/zh/messages.json +++ b/website/common/locales/zh/messages.json @@ -59,7 +59,7 @@ "messageUserOperationProtected": "路径 `<%= operation %>`因受到保护未保存。", "messageUserOperationNotFound": "<%= operation %> 无法找到此操作。", "messageNotificationNotFound": "找不到消息", - "messageNotAbleToBuyInBulk": "This item cannot be purchased in quantities above 1.", + "messageNotAbleToBuyInBulk": "这件物品不能以大于1的数量购买。", "notificationsRequired": "需要Notification ids", "unallocatedStatsPoints": "你有<%= points %>没分配的属性点", "beginningOfConversation": "现在开始和<%= userName %>愉快的聊天吧!记住要善待和尊重他人并遵守社区准则!" diff --git a/website/common/locales/zh/npc.json b/website/common/locales/zh/npc.json index 050d58b402..852a7b4dd7 100644 --- a/website/common/locales/zh/npc.json +++ b/website/common/locales/zh/npc.json @@ -31,8 +31,8 @@ "danielText2": "警告:如果你正在参与一个Boss战任务,你仍然会因为队友未完成的每日任务受到boss的伤害!同样,你对Boss的伤害(或者道具的收集)在你离开客栈之前不会结算。", "danielTextBroken": "欢迎来到酒馆……我想……如果你需要休息,我会把你安置在客栈里……入住之后,你的每日任务就不会在一天结束时给你造成伤害,不过你仍然可以签到……只要你还有精力就行……", "danielText2Broken": "哦……如果你正在一场BOSS战当中,你仍然会因为队友未完成的每日任务受到BOSS的伤害……同样,你对Boss的伤害(或者道具的收集)在你离开客栈之前不会结算……", - "worldBossEvent": "World Boss Event", - "worldBossDescription": "World Boss Description", + "worldBossEvent": "世界怪物事件", + "worldBossDescription": "世界怪物的介绍", "alexander": "商人Alexander", "welcomeMarket": "欢迎来到市场!在这里购买稀有的蛋和药水!卖掉你多余的物品!委托服务!来瞧瞧我们能为你提供什么。", "welcomeMarketMobile": "欢迎来到市场!在这里购买稀有的蛋和药水!来瞧瞧我们能为你提供什么。", @@ -80,7 +80,7 @@ "positiveAmountRequired": "Positive amount is required", "notAccteptedType": "种类必须在 [蛋, 孵化药水, 食物, 任务, 装备] 中", "contentKeyNotFound": "内容<%= type %>找不到Key", - "plusGem": "+<%= count %> Gem", + "plusGem": "+<%= count %>颗宝石", "typeNotSellable": "Type不出售。必须是<%= acceptedTypes %>其中之一。", "userItemsKeyNotFound": "user.items <%= type %>找不到Key ", "userItemsNotEnough": "你没有足够的<%= type %>。", @@ -88,11 +88,11 @@ "unlocked": "物品已经解锁", "alreadyUnlocked": "全套已经解锁", "alreadyUnlockedPart": "全套已经部分解锁", - "invalidQuantity": "Quantity to purchase must be a number.", + "invalidQuantity": "购买数量必须是数字。", "USD": "(美元)", - "newStuff": "New Stuff by Bailey", + "newStuff": "Bailey的新品", "newBaileyUpdate": "New Bailey Update!", - "tellMeLater": "Tell Me Later", + "tellMeLater": "稍后通知我", "dismissAlert": "不再显示", "donateText1": "在你的账号里增加20个宝石。宝石可以用来购买特殊的虚拟物品,例如衣服和发型。", "donateText2": "帮助与支持Habitica", @@ -105,9 +105,9 @@ "paymentMethods": "支付通过", "classGear": "职业装备", "classGearText": "祝贺你选了一个职业!我已经将你的的基本武器放到物品栏了。看看下面来装备它吧!", - "classStats": "These are your class's Stats; they affect the game-play. Each time you level up, you get one Point to allocate to a particular Stat. Hover over each Stat for more information.", + "classStats": "这是你职业的属性点:它们会影响游戏的操作和过程。每次升级时,你将获得一点自由分配点,用来给某一特定属性加成。将鼠标悬停在每个属性上来查看更多信息。", "autoAllocate": "自动分配", - "autoAllocateText": "If 'Automatic Allocation' is selected, your avatar gains Stats automatically based on your tasks' Stats, which you can find in TASK > Edit > Advanced Settings > Stat Allocation. Eg, if you hit the gym often, and your 'Gym' Daily is set to 'Strength', you'll gain Strength automatically.", + "autoAllocateText": "如果“自动分配”被选中,你的人物会自动根据你的任务的属性获得属性点,你可以在任务>编辑>高级设置>属性分配中找到它。例如,如果你经常点健身房任务,并且你的“健身房”每日任务设置为“力量”,你就会自动获得力量点数。", "spells": "技能", "spellsText": "你现在可以解锁职业技能了。你会在11级时得到第一个技能。你的法力每天都会回复10点,每完成一个待办事项你就会回复1点法力。", "skillsTitle": "技能", @@ -133,7 +133,7 @@ "tourHallPage": "这里是英雄的殿堂,纪念在开源项目中对Habitica做出贡献的人们。无论是代码、图画、音乐、剧本,甚至只是一些帮助,他们得到了 宝石,独有装备 以及尊贵头衔。你也可以向Habitica捐助!", "tourPetsPage": "这里是马厩!!3级后,你可以在打倒任务怪的同时随机搜集到宠物蛋和孵化药水。孵化出宠物后,它会被传送到这里~!点击一只宠物,它就会出现在你身边,和你一起战斗、成长。给它们喂你3级后能找到的食物,它们就会成长为更有力量的坐骑~~!", "tourMountsPage": "一旦你给一只宠物喂了足够的食物,当它成长为坐骑时,它就会出现在这里。点击一只坐骑乘上吧!", - "tourEquipmentPage": "This is where your Equipment is stored! Your Battle Gear affects your Stats. If you want to show different Equipment on your avatar without changing your Stats, click \"Enable Costume.\"", + "tourEquipmentPage": "这里是你的装备库!你的战斗工具影响你的属性点。如果你想要在不影响属性点的情况下在你的角色形象上展示不同的装备,点击“使用服装”。", "equipmentAlreadyOwned": "你已经拥有那件装备", "tourOkay": "好的!", "tourAwesome": "太好了!", diff --git a/website/common/locales/zh/pets.json b/website/common/locales/zh/pets.json index d766064e67..f09c5d9e0f 100644 --- a/website/common/locales/zh/pets.json +++ b/website/common/locales/zh/pets.json @@ -27,8 +27,8 @@ "royalPurpleGryphon": "紫御狮鹫", "phoenix": "凤凰", "magicalBee": "魔法蜜蜂", - "hopefulHippogriffPet": "Hopeful Hippogriff", - "hopefulHippogriffMount": "Hopeful Hippogriff", + "hopefulHippogriffPet": "充满希望的鹰头马", + "hopefulHippogriffMount": "充满希望的鹰头马", "royalPurpleJackalope": "紫御鹿角兔", "invisibleAether": "隐形以太", "rarePetPop1": "按按金色的爪印查看怎么通过为Habitica贡献来获得这只稀有宠物!", @@ -83,7 +83,7 @@ "petNotOwned": "你没有拥有这个宠物。", "mountNotOwned": "您还未拥有这一坐骑", "earnedCompanion": "因为你的不懈努力,你又获得了一个新的伙伴,好好喂养它,让它成长!", - "feedPet": "Feed <%= text %> to your <%= name %>?", + "feedPet": "喂你的<%= text %> 一个 <%= name %> ?", "useSaddle": "把鞍用在<%= pet %>上?", "raisedPet": "你让你的<%= pet %>长大了!", "earnedSteed": "通过完成你的任务,你获得了一匹忠诚的坐骑!", @@ -91,18 +91,18 @@ "rideLater": "稍后骑上", "petName": "<%= potion(locale) %> <%= egg(locale) %>", "mountName": "<%= potion(locale) %> <%= mount(locale) %>", - "keyToPets": "Key to the Pet Kennels", - "keyToPetsDesc": "Release all standard Pets so you can collect them again. (Quest Pets and rare Pets are not affected.)", - "keyToMounts": "Key to the Mount Kennels", - "keyToMountsDesc": "Release all standard Mounts so you can collect them again. (Quest Mounts and rare Mounts are not affected.)", - "keyToBoth": "Master Keys to the Kennels", - "keyToBothDesc": "Release all standard Pets and Mounts so you can collect them again. (Quest Pets/Mounts and rare Pets/Mounts are not affected.)", - "releasePetsConfirm": "Are you sure you want to release your standard Pets?", - "releasePetsSuccess": "Your standard Pets have been released!", - "releaseMountsConfirm": "Are you sure you want to release your standard Mounts?", - "releaseMountsSuccess": "Your standard Mounts have been released!", - "releaseBothConfirm": "Are you sure you want to release your standard Pets and Mounts?", - "releaseBothSuccess": "Your standard Pets and Mounts have been released!", + "keyToPets": "宠物马厩的钥匙", + "keyToPetsDesc": "释放所有基础宠物,以便您可以再次收集它们。 (任务宠物和稀有宠物不受影响。)", + "keyToMounts": "坐骑马厩的钥匙", + "keyToMountsDesc": "释放所有基础坐骑,以便您可以再次收集它们。 (任务坐骑和稀有坐骑不受影响。)", + "keyToBoth": "马厩的主钥匙", + "keyToBothDesc": "释放所有基础宠物和坐骑,以便您可以再次收集它们。 (任务宠物/坐骑和稀有宠物/坐骑不受影响。)", + "releasePetsConfirm": "您确定要释放您的基础宠物吗?", + "releasePetsSuccess": "您的基础宠物已经被释放!", + "releaseMountsConfirm": "您确定要释放您的基础坐骑吗?", + "releaseMountsSuccess": "您的基础坐骑已经被释放!", + "releaseBothConfirm": "您确定要释放您的基础宠物和坐骑吗?", + "releaseBothSuccess": "您的基础宠物和坐骑已经被释放!", "petKeyName": "狗舍的钥匙", "petKeyPop": "让你拥有的宠物自由,释放并让它们自己进行冒险,使自己再一次燃起驯兽师的热情!", "petKeyBegin": "狗舍的钥匙:再一次经历 <%= title %> !", @@ -138,8 +138,8 @@ "dragThisPotion": "把<%= potionName %>拖到到一个宠物蛋上来孵化一个新宠物!", "clickOnEggToHatch": "点击一个宠物蛋,使用你的<%= potionName %>孵化药水来孵化一个新的宠物!", "hatchDialogText": "将您的<%= potionName %>孵化药水倒在您的<%= eggName %>蛋上,它将孵化成一个<%= petName %>。", - "clickOnPotionToHatch": "Click on a hatching potion to use it on your <%= eggName %> and hatch a new pet!", - "notEnoughPets": "You have not collected enough pets", - "notEnoughMounts": "You have not collected enough mounts", - "notEnoughPetsMounts": "You have not collected enough pets and mounts" + "clickOnPotionToHatch": "点击一个孵化药水,倒在您的<%= eggName %>蛋上,并孵化一个新宠物!", + "notEnoughPets": "您还没有收集足够的宠物", + "notEnoughMounts": "您还没有收集足够的坐骑", + "notEnoughPetsMounts": "您还没有收集足够的宠物和坐骑" } \ No newline at end of file diff --git a/website/common/locales/zh/quests.json b/website/common/locales/zh/quests.json index 2748e6392f..389589c386 100644 --- a/website/common/locales/zh/quests.json +++ b/website/common/locales/zh/quests.json @@ -25,7 +25,7 @@ "questInvitation": "任务邀请:", "questInvitationTitle": "任务邀请", "questInvitationInfo": "探索任务邀请<%= quest %>", - "invitedToQuest": "You were invited to the Quest <%= quest %>", + "invitedToQuest": "你被邀请加入任务<%= quest %>", "askLater": "稍后再问", "questLater": "后续任务", "buyQuest": "购买任务", @@ -120,10 +120,10 @@ "questBundles": "打折的任务包", "buyQuestBundle": "购买任务包", "noQuestToStart": "找不到一个可以开始的任务? 尝试查看市场上新版本的任务商店!", - "pendingDamage": "<%= damage %> pending damage", - "pendingDamageLabel": "pending damage", - "bossHealth": "<%= currentHealth %> / <%= maxHealth %> Health", - "rageAttack": "Rage Attack:", - "bossRage": "<%= currentRage %> / <%= maxRage %> Rage", - "rageStrikes": "Rage Strikes" + "pendingDamage": "即将对Boss造成<%= damage %>点伤害", + "pendingDamageLabel": "即将造成的伤害", + "bossHealth": "<%= currentHealth %>/ <%= maxHealth %> 生命值", + "rageAttack": "狂暴攻击:", + "bossRage": "<%= currentRage %> / <%= maxRage %> 愤怒值", + "rageStrikes": "狂暴打击" } \ No newline at end of file diff --git a/website/common/locales/zh/questscontent.json b/website/common/locales/zh/questscontent.json index 10a658846f..6a51782923 100644 --- a/website/common/locales/zh/questscontent.json +++ b/website/common/locales/zh/questscontent.json @@ -17,13 +17,13 @@ "questGryphonDropGryphonEgg": "狮鹫 (宠物蛋)", "questGryphonUnlockText": "解锁狮鹫蛋购买功能", "questHedgehogText": "巨型刺猬", - "questHedgehogNotes": "Hedgehogs are a funny group of animals. They are some of the most affectionate pets a Habiteer could own. But rumor has it, if you feed them milk after midnight, they grow quite irritable. And fifty times their size. And InspectorCaracal did just that. Oops.", + "questHedgehogNotes": "刺猬是一种有趣的生物。他们是Habit世界居民可以拥有的最可爱的宠物之一。但是有谣言称,如果你在午夜零点后喂它们牛奶,他们就会变得越来越暴躁,并且变大50倍。啊哦,j检查员Caracal刚刚就这么做了。", "questHedgehogCompletion": "你的队伍成功地让巨型刺猬平静了下来!缩回她原来的大小后,她蹒跚着爬向她的蛋。她边吱吱叫边把她的一些蛋推向你的队伍。但愿这些刺猬更喜欢牛奶!", "questHedgehogBoss": "巨型刺猬", "questHedgehogDropHedgehogEgg": "刺猬 (宠物蛋)", "questHedgehogUnlockText": "解锁刺猬购买功能", "questGhostStagText": "春之幽灵", - "questGhostStagNotes": "Ahh, Spring. The time of year when color once again begins to fill the landscape. Gone are the cold, snowy mounds of winter. Where frost once stood, vibrant plant life takes its place. Luscious green leaves fill in the trees, grass returns to its former vivid hue, a rainbow of flowers rise along the plains, and a white mystical fog covers the land! ... Wait. Mystical fog? \"Oh no,\" InspectorCaracal says apprehensively, \"It would appear that some kind of spirit is the cause of this fog. Oh, and it is charging right at you.\"", + "questGhostStagNotes": "啊,春天!春色又一次铺满大地。冬季的积雪早已融化,青翠的植物取代了寒冷的冰霜。树木舒展着嫩绿的树叶,草地恢复了往日的色彩。平原之上,艳丽的花儿竞相开放,神秘的白雾覆盖着这片大地。。。等等,为什么会有雾?“糟了,”检查员Caracal 担忧地说,“看来是什么幽灵带来了这场大雾。天啊,它朝这里冲过来了!”", "questGhostStagCompletion": "几乎毫发无伤的幽灵低下了头颅,用鼻子亲吻地面。平静的声音笼罩着你的队伍:“请接受我的道歉。我刚刚从沉睡中苏醒,我的意识显然还没有完全恢复。请收下这份礼物作为补偿。” 几颗蛋出现在幽灵的脚下。它即刻消失在了森林深处,在身后留下了点点飘落的花瓣。", "questGhostStagBoss": "雄鹿鬼魂", "questGhostStagDropDeerEgg": "鹿 (宠物蛋)", @@ -62,12 +62,12 @@ "questVice1Text": "恶习之龙,第1部分:逃出恶习之龙的控制", "questVice1Notes": "

传言说,有一个可怕的恶魔藏身于Habitica山的洞穴中。它会扭转接近这片土地的英雄坚强的意志,让他们染上恶习并变得懒惰!这个野兽由巨大的力量和阴影组成,并化身为一条奸诈的阴影巨龙——恶习之龙。勇敢的Habitica居民,一起站出来,击败这个邪恶的怪物。但是,你一定要相信自己能抵抗他巨大的邪恶之力。

恶习第1部:

小心不要让他控制你的意志,不然你怎么和他战斗?不要成为懒惰和恶习的牺牲品!努力与巨龙的力量对抗吧,逃出他邪恶之力的影响!

", "questVice1Boss": "恶习之龙的阴影", - "questVice1Completion": "With Vice's influence over you dispelled, you feel a surge of strength you didn't know you had return to you. Congratulations! But a more frightening foe awaits...", + "questVice1Completion": "随着坏习惯对你的影响力被驱散,你感到一股你不知道的力量回到了你身上。恭喜! 但一个更可怕的敌人在等待着......", "questVice1DropVice2Quest": "恶习之龙第2部 (卷轴)", "questVice2Text": "恶习之龙,第2部分:寻找巨龙的巢穴", - "questVice2Notes": "Confident in yourselves and your ability to withstand the influence of Vice the Shadow Wyrm, your Party makes its way to Mt. Habitica. You approach the entrance to the mountain's caverns and pause. Swells of shadows, almost like fog, wisp out from the opening. It is near impossible to see anything in front of you. The light from your lanterns seem to end abruptly where the shadows begin. It is said that only magical light can pierce the dragon's infernal haze. If you can find enough light crystals, you could make your way to the dragon.", + "questVice2Notes": "带着必胜的信念,你的队伍又一次充满自信的踏上了前往Habitica山的路。你们在山洞的入口停了下来。从洞里不断涌出漆黑的暗影,像雾一样笼罩着洞口。洞里漆黑一片,伸手不见五指。从灯笼里发出的光根本无法触及暗影笼罩的区域。据说只有用魔力点亮的光可以渗入巨龙的阴霾中。如果能找到足够多的神光水晶,你就可以找到去巨龙那里的路了。", "questVice2CollectLightCrystal": "神光水晶", - "questVice2Completion": "As you lift the final crystal aloft, the shadows are dispelled, and your path forward is clear. With a quickening heart, you step forward into the cavern.", + "questVice2Completion": "当你把最后的水晶提升到高处时,阴影就会被驱散,你的前进道路就会清晰起来。 随着心跳的加速,你向前走进洞穴。", "questVice2DropVice3Quest": "恶习之龙第3部 (卷轴)", "questVice3Text": "恶习之龙,第3部分:恶习缓醒", "questVice3Notes": "在不断的努力之下,你的队伍终于发现了恶习之龙的巢穴.这个庞大的怪物用厌恶的眼神盯着你的队伍.黑暗的漩涡围绕着你们,一个声音在你们的脑海中耳语.“又有更多愚蠢的Habitica居民来阻止我了吗?有意思.你们会后悔来到这里的.”这只长满鳞片的巨物抬起了头,回过身来准备攻击.你们的机会来了!尽你们所能,最后一次击败恶习吧!", @@ -80,15 +80,15 @@ "questMoonstone1Text": "故态复萌,第1部:月长石链", "questMoonstone1Notes": "一个可怕的麻烦困扰着Habitica居民。已经消失很久的坏习惯回来复仇了。盘子没有清洗,课本很长时间没有看,拖延症开始猖獗!

你跟踪着你自己的一些归来的坏习惯,来到了淤塞之沼,并发现了这一切的元凶:可怕的死灵巫师,雷茜德维特。你冲了进去,挥舞着你的武器,但是它们都穿过了她幽灵一般的身体,没有造成任何伤害。

“别费劲儿了,”她用粗糙刺耳的声音嘶嘶得说。“没有月长石项链的话,没有什么可以伤害我--而且宝石大师@aurakami很久以前就将月长石分散到了Habitica的各处!”虽然你气喘吁吁的撤退了... 但是你知道你需要做什么。", "questMoonstone1CollectMoonstone": "月长石", - "questMoonstone1Completion": "At last, you manage to pull the final moonstone from the swampy sludge. It’s time to go fashion your collection into a weapon that can finally defeat Recidivate!", + "questMoonstone1Completion": "终于,你设法从沼泽污泥中捞出最后的月石。 现在是时候把你的收集物品变成一件武器来击败雷茜德维特!", "questMoonstone1DropMoonstone2Quest": "故态复萌,第2部:亡灵法师——雷茜德维特(卷轴)", "questMoonstone2Text": "故态复萌,第2部:亡灵法师——雷茜德维特", - "questMoonstone2Notes": "The brave weaponsmith @InspectorCaracal helps you fashion the enchanted moonstones into a chain. You’re ready to confront Recidivate at last, but as you enter the Swamps of Stagnation, a terrible chill sweeps over you.

Rotting breath whispers in your ear. \"Back again? How delightful...\" You spin and lunge, and under the light of the moonstone chain, your weapon strikes solid flesh. \"You may have bound me to the world once more,\" Recidivate snarls, \"but now it is time for you to leave it!\"", + "questMoonstone2Notes": "勇敢的武器铸造师 @检查员Caracal 帮你将附魔的月长石铸造成了一条项链。你现在已经准备好面对雷茜德维特了,但是当你进入淤塞之沼的时候,感觉寒气逼人。

腐朽的气息在你的耳边低语。“又回来了?真令人高兴啊...”你冲向前去,猛地刺出,在月长石项链的光芒下,你的武器击中了她的肉体。“你再次将我与这个世界束缚在了一起,”雷茜德维特咆哮着,“但是这次该是你离开这个世界了!”", "questMoonstone2Boss": "死灵法师", - "questMoonstone2Completion": "Recidivate staggers backwards under your final blow, and for a moment, your heart brightens – but then she throws back her head and lets out a horrible laugh. What’s happening?", + "questMoonstone2Completion": "在你的最后一击下,雷茜德维特向后蹒跚几步,过了一会儿,你的心变得明亮起来 - 但是随后她回头,发出了可怕的笑声。 发生了什么?", "questMoonstone2DropMoonstone3Quest": "故态复萌,第3部:雷茜德维特变形!(卷轴)", "questMoonstone3Text": "故态复萌,第3部:雷茜德维特变形!", - "questMoonstone3Notes": "Laughing wickedly, Recidivate crumples to the ground, and you strike at her again with the moonstone chain. To your horror, Recidivate seizes the gems, eyes burning with triumph.

\"Foolish creature of flesh!\" she shouts. \"These moonstones will restore me to a physical form, true, but not as you imagined. As the full moon waxes from the dark, so too does my power flourish, and from the shadows I summon the specter of your most feared foe!\"

A sickly green fog rises from the swamp, and Recidivate’s body writhes and contorts into a shape that fills you with dread – the undead body of Vice, horribly reborn.", + "questMoonstone3Notes": "雷茜德维特蜷缩在地上邪恶的笑着,你用月长石项链给她致命一击。可怕的事情发生了,她抓住了宝石,眼中闪耀着胜利的火焰。

“愚蠢的生物!”她喊道。“这些月长石的确能够让我回复成物质形态,但是并不像你想象的那样。当满月在黑暗中变圆的时候,我的力量也会变得强大,我从阴影之中召唤了你们最为恐惧的家伙!”

一股浓烈的雾从沼泽中升起,雷茜德维特的身体扭曲变形成了让人恐惧的形状--恶习之龙的不死之身,恐怖的再生了。", "questMoonstone3Completion": "当这不死的巨龙崩溃的时候,你的呼吸变得困难,汗水刺激着你的眼睛。雷茜德维特的残留物消散成了一片稀薄的灰雾,在微风的吹拂下很快散去了,你听到Habitica居民为永远打败了他们的坏习惯而呐喊的声音从四处传来。

驯兽师@Baconsaur骑着狮鹫从天上俯冲而下。“我在天上看到了你最后的战斗,我被深深的感动了。请务必收下这个附魔的束腰上衣--你的勇敢展现了你高贵的心灵,我相信命中注定你要收下它。”", "questMoonstone3Boss": "死者-恶习", "questMoonstone3DropRottenMeat": "腐肉 (食物)", @@ -97,12 +97,12 @@ "questGoldenknight1Text": "黄金骑士,第1部分:一场严肃的谈话", "questGoldenknight1Notes": "黄金骑士得知了可怜的Habitica居民们的情况。你们没有将每日任务全部完成?点击了一个不好的习惯?她会以此为理由来不断的骚扰你,教你怎样追寻她的脚步。她是完美的Habitica居民光辉的榜样,而你只不过是一个失败者。好吧,这一点也不好!所有人都会犯错。那些犯了错的人也不应因此就受到这样的否定。也许现在对你来说正是时候,从受到伤害的Habitica居民们那里收集一些证据,然后和黄金骑士来一场严肃的谈话", "questGoldenknight1CollectTestimony": "证据", - "questGoldenknight1Completion": "Look at all these testimonies! Surely this will be enough to convince the Golden Knight. Now all you need to do is find her.", + "questGoldenknight1Completion": "看看这些全部的证词! 这当然足以说服黄金骑士。 现在你需要做的就是找到她。", "questGoldenknight1DropGoldenknight2Quest": "黄金骑士第2部:黄金骑士 (卷轴)", "questGoldenknight2Text": "黄金骑士,第2部:黄金骑士", "questGoldenknight2Notes": "从无数Habitica居民们那里收集到证据后,你终于站在黄金骑士的面前。你引用Habitica居民们对她的抱怨。“同时@Pfeffernusse 说你不断地炫耀……”骑士举手打断你并嘲笑说:“拜托,这些人只是嫉妒我的成功。他们应该像我这样努力而不是抱怨。或许我该向你展示我靠勤奋获得的力量!”她举起了她的流星锤准备攻击你!", "questGoldenknight2Boss": "黄金骑士", - "questGoldenknight2Completion": "The Golden Knight lowers her Morningstar in consternation. “I apologize for my rash outburst,” she says. “The truth is, it’s painful to think that I’ve been inadvertently hurting others, and it made me lash out in defense… but perhaps I can still apologize?”", + "questGoldenknight2Completion": "黄金骑士惊恐地放低了她的流星锤。 “我为我的鲁莽道歉,”她说。 “事实是,想到我无意中伤害了其他人,这令我感到痛苦,并且使我在防守中大打出手.....但或许我仍然可以道歉?”", "questGoldenknight2DropGoldenknight3Quest": "黄金骑士第3部:钢铁骑士 (卷轴)", "questGoldenknight3Text": "黄金骑士第3部:钢铁骑士", "questGoldenknight3Notes": "@Jon Arinbjorn的向你大喊试图引起你的注意。战斗之余,一个新的人物出现了。一个手中握着剑身上穿着染上黑色血污的铁铠的骑士慢慢地走近了你。黄金骑士对这个人大喊道:“爸爸,不!”但是骑士丝毫没有停止的迹象。她转身对你说:“我很抱歉。我一直是个大傻瓜,我太傲慢了,都不到自己曾有多残忍。但我父亲比过去的我还要残忍得多。如果他不停下来,他就会毁了我们所有人。来吧,拿着我的流星锤去阻止钢铁骑士吧!”", @@ -143,14 +143,14 @@ "questAtom1Notes": "你到了一个洗手池旁好好休息一下……但是洗手池被一堆没洗的盘子污染了!这怎么可以?你当然不能允许它在这种状态。你唯一能做的事情就是:洗掉这些盘子,拯救你的休息区!最好找些肥皂来清洗这团糟。要好多肥皂……", "questAtom1CollectSoapBars": "块肥皂", "questAtom1Drop": "好吃懒做怪(卷轴)", - "questAtom1Completion": "After some thorough scrubbing, all the dishes are stacked safely on the shore! You stand back and proudly survey your hard work.", + "questAtom1Completion": "经过彻底的擦洗后,所有的盘子都安全地堆放在岸边! 你站起来,骄傲地看着你的辛勤工作的成果。", "questAtom2Text": "平凡世界的攻势:卷2:不吃零食的怪兽", "questAtom2Notes": "呼呼,盘子洗掉之后这个地方看起来舒服多了。也许,你终于可以找点乐子休息一下了。喔——那看起来有个披萨饼盒子浮在池子里。好吧,下一个清理一个是什么东西?哎呀,不是一个披萨盒那么简单!那个盒子突然从水里升高,原来是一个怪物的脑袋。不会吧!传说中的好吃懒做怪?据说它自从史前就一直隐藏在池子里:一个从废弃食品和垃圾中召唤出的古老Habit生物。呕!", "questAtom2Boss": "好吃懒做怪", "questAtom2Drop": "洗衣终结者(卷轴)", - "questAtom2Completion": "With a deafening cry, and five delicious types of cheese bursting from its mouth, the Snackless Monster falls to pieces. Well done, brave adventurer! But wait... is there something else wrong with the lake?", + "questAtom2Completion": "随着一声震耳欲聋的呐喊,以及五种美味的奶酪从它的口中喷涌而出,好吃懒做怪摔成碎片。做得好,勇敢的冒险家! 但是等等...湖里还有什么不对吗?", "questAtom3Text": "平凡世界的攻势:,卷3:洗衣终结者", - "questAtom3Notes": "Just when you thought that your trials had ended, Washed-Up Lake begins to froth violently. “HOW DARE YOU!” booms a voice from beneath the water's surface. A robed, blue figure emerges from the water, wielding a magic toilet brush. Filthy laundry begins to bubble up to the surface of the lake. \"I am the Laundromancer!\" he angrily announces. \"You have some nerve - washing my delightfully dirty dishes, destroying my pet, and entering my domain with such clean clothes. Prepare to feel the soggy wrath of my anti-laundry magic!\"", + "questAtom3Notes": "就在你认为你的试验已经结束的时候,洗脑湖开始猛烈地起泡。 “是谁这么大的胆子!”从水面下方传出一个声音。一个穿着蓝色长袍的身影从水中浮现出来,挥舞着一把神奇的马桶刷。 湖的表面开始冒泡,肮脏的衣服漂浮到水面。 “我是洗衣终结者!” 他愤怒地宣告。 “你有点胆量 - 洗了我那可爱的脏盘子,摧毁了我的宠物,然后穿着这么干净的衣服进入我的地盘,准备好感受我反洗衣魔法的潮湿的愤怒吧!”", "questAtom3Completion": "邪恶的洗衣终结者被打败了!干净的衣服从空中飘下,堆在了你们身边。这一切看起来好极了。当你准备穿过这些新熨好的衣服时,一道金属的闪光吸引了你的注意——一个闪闪发光的头盔。已经无法知道这个闪亮的物品的原主人是谁了,但是当你把它带上时,你感觉到他的慷慨带给你的温暖。真可惜,他们忘了把自己的名字缝在边上。", "questAtom3Boss": "洗衣终结者", "questAtom3DropPotion": "普通孵化药水", @@ -295,7 +295,7 @@ "questUnicornDropUnicornEgg": "独角兽(宠物蛋)", "questUnicornUnlockText": "解锁独角兽蛋购买功能", "questSabretoothText": "剑齿猫", - "questSabretoothNotes": "A roaring monster is terrorizing Habitica! The creature stalks through the wilds and woods, then bursts forth to attack before vanishing again. It's been hunting innocent pandas and frightening the flying pigs into fleeing their pens to roost in the trees. @InspectorCaracal and @icefelis explain that the Zombie Sabre Cat was set free while they were excavating in the ancient, untouched ice-fields of the Stoïkalm Steppes. \"It was perfectly friendly at first – I don't know what happened. Please, you have to help us recapture it! Only a champion of Habitica can subdue this prehistoric beast!\"", + "questSabretoothNotes": "咆哮的怪兽让Habitica颤抖!怪兽昂首阔步地走过荒野和森林,在再次消失前爆发出攻击。它在狩猎无辜的熊猫,吓得飞猪逃离它们树上的栖息围栏。 @InspectorCaracal 和 @icefelis 交待他们在古代的Stoikalm草原的冰原挖掘的时候释放了僵尸剑齿猫。“最初,它非常友好 – 我不知道发生了什么。请你一定要帮帮我们再次抓到它!只有Habitica赢家能征服这个史前野兽!”", "questSabretoothCompletion": "长时间艰苦的战斗后,你和僵尸剑齿猫扭打到了地上。在你最终接近的时候,你发现它的剑齿上有一个讨厌的洞。突然你意识到什么导致了猫的愤怒,你能够用 @Fandekasp 补上洞,然后建议每一个人不要在以后给他们的朋友甜食了。剑齿猫猫好起来,出于感激,它的 Cat flourishes送给你一份厚报 – 一组剑齿虎蛋!", "questSabretoothBoss": "僵尸剑齿猫", "questSabretoothDropSabretoothEgg": "剑齿虎(蛋)", @@ -357,7 +357,7 @@ "questArmadilloDropArmadilloEgg": "犰狳(蛋)", "questArmadilloUnlockText": "解锁犰狳蛋购买功能", "questCowText": "变异奶牛", - "questCowNotes": "It’s been a long, hot day at Sparring Farms, and there is nothing more you want than a long sip of water and some sleep. You're standing there daydreaming when @Soloana suddenly screams, \"Everyone run! The prize cow has mootated!\"

@eevachu gulps. \"It must be our bad habits that infected it.\"

\"Quick!\" @Feralem Tau says. \"Let’s do something before the udder cows mootate, too.\"

You’ve herd enough. No more daydreaming -- it's time to get those bad habits under control!", + "questCowNotes": "那是在斯巴英农场中又热又长的一天,除了痛快地喝口水后去睡觉,你再也不想做什么别的了。正当你呆在那里做白日梦的时候,@Soloana突然尖叫起来,“所有人快跑!被捕获的奶牛开始暴动了!”

@eevachu 吞了一口唾沫,“它一定是被我们的坏习惯感染了。”

“快点!”Feralem Tau喊道,“在变异奶牛来临前行动起来!”

你对自己的放羊时间已经够长了,不要再做白日梦了,是时候获取那些坏习惯的控制权了!", "questCowCompletion": "当你的好习惯奶牛一直保持有价值的时候,你从中挤出牛奶, 直到好习惯奶牛回复成它原来的样子。奶牛用它的棕色漂亮的眼睛看着你,并产出三个蛋。

@fuzzytrees 一边笑着将这些蛋交给你,”如果蛋里面有牛宝宝,也许它仍然是变异的。但是我相信你抚养它们的时候,会坚持你的好习惯!”", "questCowBoss": "变异奶牛", "questCowDropCowEgg": "奶牛 (宠物蛋)", @@ -399,7 +399,7 @@ "questFerretDropFerretEgg": "雪貂(宠物蛋)", "questFerretUnlockText": "解锁雪貂蛋购买功能", "questDustBunniesText": "野生的灰尘兔子", - "questDustBunniesNotes": "It's been a while since you've done any dusting in here, but you're not too worried—a little dust never hurt anyone, right? It's not until you stick your hand into one of the dustiest corners and feel something bite that you remember @InspectorCaracal's warning: leaving harmless dust sit too long causes it to turn into vicious dust bunnies! You'd better defeat them before they cover all of Habitica in fine particles of dirt!", + "questDustBunniesNotes": "距离你上次打扫这里已经有一会儿了,但你不是很担心——一点灰尘不会怎么样的,对吧?等你把手伸进其中一个灰尘最多的角落,感受到被什么东西咬了之后,你才想起@InspectorCaracal的警告:在你家寄养的小灰尘兔子感受不到你的关爱,就会变成野生灰尘兔到处乱窜。你最好在所有灰尘兔子野化之前温柔地再次驯养它们!", "questDustBunniesCompletion": "灰尘兔子们消失在……唔,灰尘中。这里干净了,你环顾四周。你一度遗忘这里在干净的时候是多么美好。你在之前灰尘所处的角落找到了一小堆金子。好吧,你都忘了这里之前是放金子的地方!", "questDustBunniesBoss": "野生的灰尘兔子", "questGroupMoon": "月亮之战", diff --git a/website/common/locales/zh/settings.json b/website/common/locales/zh/settings.json index 13668701f5..117a786ce0 100644 --- a/website/common/locales/zh/settings.json +++ b/website/common/locales/zh/settings.json @@ -32,7 +32,7 @@ "resetAccPop": "从头再来,移除所有等级,金币,装备,历史和任务。", "deleteAccount": "删除帐户", "deleteAccPop": "取消并移除你的Habitica帐户。", - "feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.", + "feedback": "如果您愿意给我们反馈,点击进入下面的链接——我们想要知道关于habitica你喜欢什么又不喜欢什么!英语不好?没关系!用你喜欢的语言就好了。", "qrCode": "QR码", "dataExport": "导出数据", "saveData": "以下是用于保存数据的几个选项。", diff --git a/website/common/locales/zh/subscriber.json b/website/common/locales/zh/subscriber.json index 1cdd250a76..65f060ea3b 100644 --- a/website/common/locales/zh/subscriber.json +++ b/website/common/locales/zh/subscriber.json @@ -7,7 +7,7 @@ "buyGemsGoldText": "商人亚历山大将以每个20金币的价格卖给你宝石。他的每月发货量最初为每月25个宝石,但你每订阅3个月,这个上限将增加5个,最多每月50宝石!", "mustSubscribeToPurchaseGems": "必须捐赠来用GP购买宝石", "reachedGoldToGemCap": "来自财富女神的提醒,你本月的兑换额度已达到你当前信仰级别的上限 <%= convCap %> ,刚刚的兑换交易已经撤销。该上限用于防止土豪破环游戏平衡,该上限每月的前三个自然日会重置。财富女神与你同在,阿门!", - "reachedGoldToGemCapQuantity": "Your requested amount <%= quantity %> exceeds the Gold=>Gem conversion cap <%= convCap %> for this month. We have this to prevent abuse / farming. The cap resets within the first three days of each month.", + "reachedGoldToGemCapQuantity": "来自财富女神的提醒,您本月要求的兑换数量<%= quantity %>已达到你当前信仰级别的上限 <%= convCap %> 。该上限用于防止土豪破环游戏平衡,该上限每月的前三个自然日会重置。财富女神与你同在!", "retainHistory": "保留额外的历史条目", "retainHistoryText": "使完成的待办事项和任务的历史纪录更长时间保留。", "doubleDrops": "每日任务掉率翻倍!", @@ -142,7 +142,7 @@ "mysterySet201801": "冰霜精灵套装", "mysterySet201802": "爱虫套装", "mysterySet201803": "勇敢蜻蜓套装", - "mysterySet201804": "Spiffy Squirrel Set", + "mysterySet201804": "漂亮的松鼠套装", "mysterySet301404": "蒸汽朋克标准套装", "mysterySet301405": "蒸汽朋克配饰套装", "mysterySet301703": "孔雀蒸汽朋克套装", diff --git a/website/common/locales/zh/tasks.json b/website/common/locales/zh/tasks.json index 7b093fefa6..2c6d010d89 100644 --- a/website/common/locales/zh/tasks.json +++ b/website/common/locales/zh/tasks.json @@ -211,5 +211,5 @@ "repeatDayError": "请在一周中至少选择一天", "searchTasks": "搜索标题和描述说明...", "sessionOutdated": "你的会期已过期。请刷新或同步。", - "errorTemporaryItem": "This item is temporary and cannot be pinned." + "errorTemporaryItem": "这件物品是限定的不能被固定。" } \ No newline at end of file From 959adb05cf8cafc855d08ef65ff197fcb0780c7e Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Tue, 15 May 2018 21:11:35 +0000 Subject: [PATCH 57/76] 4.42.4 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec48f0853a..f28d078ff9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.42.3", + "version": "4.42.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 58d8803c9a..abf905cce5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.42.3", + "version": "4.42.4", "main": "./website/server/index.js", "dependencies": { "@slack/client": "^3.8.1", From ad191c2c5ccf00691295a574acef48c615703a1f Mon Sep 17 00:00:00 2001 From: Alys Date: Wed, 16 May 2018 20:45:35 +1000 Subject: [PATCH 58/76] change apidoc to explain that the equip route also unequips --- website/server/controllers/api-v3/user.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/website/server/controllers/api-v3/user.js b/website/server/controllers/api-v3/user.js index a51da7602d..e987721c11 100644 --- a/website/server/controllers/api-v3/user.js +++ b/website/server/controllers/api-v3/user.js @@ -948,12 +948,12 @@ api.hatch = { }; /** - * @api {post} /api/v3/user/equip/:type/:key Equip an item + * @api {post} /api/v3/user/equip/:type/:key Equip or unequip an item * @apiName UserEquip * @apiGroup User * - * @apiParam (Path) {String="mount","pet","costume","equipped"} type The type of item to equip - * @apiParam (Path) {String} key The item to equip + * @apiParam (Path) {String="mount","pet","costume","equipped"} type The type of item to equip or unequip + * @apiParam (Path) {String} key The item to equip or unequip * * @apiParamExample {URL} Example-URL * https://habitica.com/api/v3/user/equip/equipped/weapon_warrior_2 From 6b5f46c5e13a2d9ee7c00beca50c3ec12cd12263 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Thu, 17 May 2018 20:57:57 +0000 Subject: [PATCH 59/76] chore(i18n): update locales --- Dockerfile-Production | 2 +- website/common/locales/bg/challenge.json | 4 + website/common/locales/bg/groups.json | 4 +- website/common/locales/bg/npc.json | 1 + website/common/locales/cs/challenge.json | 4 + website/common/locales/cs/groups.json | 4 +- website/common/locales/cs/npc.json | 1 + website/common/locales/da/challenge.json | 4 + website/common/locales/da/groups.json | 4 +- website/common/locales/da/npc.json | 1 + website/common/locales/de/challenge.json | 4 + website/common/locales/de/groups.json | 30 +++---- website/common/locales/de/npc.json | 1 + website/common/locales/de/settings.json | 2 +- .../common/locales/en@pirate/challenge.json | 4 + website/common/locales/en@pirate/groups.json | 4 +- website/common/locales/en@pirate/npc.json | 1 + website/common/locales/en_GB/challenge.json | 4 + website/common/locales/en_GB/groups.json | 4 +- website/common/locales/en_GB/npc.json | 1 + website/common/locales/es/challenge.json | 4 + website/common/locales/es/groups.json | 4 +- website/common/locales/es/npc.json | 1 + website/common/locales/es_419/challenge.json | 4 + website/common/locales/es_419/groups.json | 4 +- website/common/locales/es_419/npc.json | 1 + website/common/locales/fr/challenge.json | 4 + website/common/locales/fr/groups.json | 4 +- website/common/locales/fr/npc.json | 1 + website/common/locales/he/challenge.json | 4 + website/common/locales/he/groups.json | 4 +- website/common/locales/he/npc.json | 1 + website/common/locales/hu/challenge.json | 4 + website/common/locales/hu/groups.json | 4 +- website/common/locales/hu/npc.json | 1 + website/common/locales/id/challenge.json | 4 + website/common/locales/id/groups.json | 4 +- website/common/locales/id/npc.json | 1 + website/common/locales/it/challenge.json | 4 + website/common/locales/it/groups.json | 4 +- website/common/locales/it/npc.json | 1 + website/common/locales/ja/challenge.json | 4 + website/common/locales/ja/groups.json | 4 +- website/common/locales/ja/npc.json | 1 + website/common/locales/nl/challenge.json | 4 + website/common/locales/nl/groups.json | 4 +- website/common/locales/nl/npc.json | 1 + website/common/locales/pl/challenge.json | 4 + website/common/locales/pl/groups.json | 4 +- website/common/locales/pl/npc.json | 1 + website/common/locales/pt/challenge.json | 4 + website/common/locales/pt/front.json | 2 +- website/common/locales/pt/gear.json | 8 +- website/common/locales/pt/groups.json | 4 +- website/common/locales/pt/npc.json | 1 + website/common/locales/pt_BR/challenge.json | 4 + website/common/locales/pt_BR/groups.json | 4 +- website/common/locales/pt_BR/npc.json | 1 + website/common/locales/ro/challenge.json | 4 + website/common/locales/ro/groups.json | 4 +- website/common/locales/ro/npc.json | 1 + website/common/locales/ru/challenge.json | 4 + website/common/locales/ru/gear.json | 8 +- website/common/locales/ru/groups.json | 4 +- website/common/locales/ru/npc.json | 1 + website/common/locales/sk/challenge.json | 4 + website/common/locales/sk/groups.json | 4 +- website/common/locales/sk/npc.json | 1 + website/common/locales/sr/challenge.json | 4 + website/common/locales/sr/groups.json | 4 +- website/common/locales/sr/npc.json | 1 + website/common/locales/sv/challenge.json | 4 + website/common/locales/sv/content.json | 84 +++++++++---------- website/common/locales/sv/groups.json | 4 +- website/common/locales/sv/npc.json | 1 + website/common/locales/tr/challenge.json | 4 + website/common/locales/tr/groups.json | 4 +- website/common/locales/tr/npc.json | 1 + website/common/locales/uk/challenge.json | 4 + website/common/locales/uk/faq.json | 8 +- website/common/locales/uk/groups.json | 4 +- website/common/locales/uk/npc.json | 1 + website/common/locales/zh/challenge.json | 4 + .../locales/zh/communityguidelines.json | 24 +++--- website/common/locales/zh/generic.json | 2 +- website/common/locales/zh/groups.json | 8 +- website/common/locales/zh/npc.json | 3 +- website/common/locales/zh/quests.json | 2 +- website/common/locales/zh_TW/challenge.json | 4 + website/common/locales/zh_TW/groups.json | 4 +- website/common/locales/zh_TW/npc.json | 1 + 91 files changed, 303 insertions(+), 114 deletions(-) diff --git a/Dockerfile-Production b/Dockerfile-Production index 98320a8fb1..d881667b24 100644 --- a/Dockerfile-Production +++ b/Dockerfile-Production @@ -17,7 +17,7 @@ RUN npm install -g gulp-cli mocha # Clone Habitica repo and install dependencies RUN mkdir -p /usr/src/habitrpg WORKDIR /usr/src/habitrpg -RUN git clone --branch v4.42.3 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg +RUN git clone --branch v4.42.4 https://github.com/HabitRPG/habitica.git /usr/src/habitrpg RUN npm install RUN gulp build:prod --force diff --git a/website/common/locales/bg/challenge.json b/website/common/locales/bg/challenge.json index c4c26315db..0c33c92da7 100644 --- a/website/common/locales/bg/challenge.json +++ b/website/common/locales/bg/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Беше победител в следните предизвикателства", "challenges": "Предизвикателства", "challengesLink": "Предизвикателства", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Все още няма предизвикателства. Посетете", "toCreate": "за да създадете.", "selectWinner": "Изберете победител и завършете предизвикателството:", @@ -23,7 +25,9 @@ "filter": "Филтриране", "groups": "Групи", "noNone": "Нищо", + "category": "Category", "membership": "Участие", + "ownership": "Ownership", "participating": "Участвам", "notParticipating": "Не участвам", "either": "Без значение", diff --git a/website/common/locales/bg/groups.json b/website/common/locales/bg/groups.json index 23e85e30c4..dd18aa1d02 100644 --- a/website/common/locales/bg/groups.json +++ b/website/common/locales/bg/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Задачи, чакащи одобрение", "upgradeTitle": "Надграждане", "blankApprovalsDescription": "Когато групата Ви завърши задача, която се нуждае от одобрение, тя ще се появи тук! Можете да зададете дали дадена задача се нуждае от одобрение в настройките ѝ при редактиране.", - "userIsClamingTask": "`<%= username %> пое „<%= task %>“`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Заявено е одобрение", "refreshApprovals": "Опресняване на одобренията", "refreshGroupTasks": "Опресняване на груповите задачи", @@ -366,9 +366,11 @@ "recentActivity": "Последна дейност", "myGuilds": "Моите гилдии", "guildsDiscovery": "Разглеждане на гилдиите", + "role": "Role", "guildOrPartyLeader": "Водач", "guildLeader": "Водач на гилдията", "member": "Член", + "guildSize": "Guild Size", "goldTier": "Златно ниво", "silverTier": "Сребърно ниво", "bronzeTier": "Бронзово ниво", diff --git a/website/common/locales/bg/npc.json b/website/common/locales/bg/npc.json index c575915b33..b1b58471df 100644 --- a/website/common/locales/bg/npc.json +++ b/website/common/locales/bg/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Препоръчани предмети!", "hideLocked": "Скриване на заключените", "hidePinned": "Скриване на закачените", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> точки опит", "amountGold": "<%= amount %> злато", "namedHatchingPotion": "Излюпваща отвара с(ъс) <%= type %>", diff --git a/website/common/locales/cs/challenge.json b/website/common/locales/cs/challenge.json index 80dd9ffb3a..99c53bcbc1 100644 --- a/website/common/locales/cs/challenge.json +++ b/website/common/locales/cs/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Stal se výhercem následujících výzev", "challenges": "Výzvy", "challengesLink": "Challenges", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Zatím nemáš žádné výzvy. Navštiv", "toCreate": "abys nějakou vytvořil.", "selectWinner": "Zvolit vítěze a zavřít výzvu:", @@ -23,7 +25,9 @@ "filter": "Filtr", "groups": "Skupiny", "noNone": "Žádné", + "category": "Category", "membership": "Členství", + "ownership": "Ownership", "participating": "Účastní se", "notParticipating": "Neúčastní se", "either": "Obojí", diff --git a/website/common/locales/cs/groups.json b/website/common/locales/cs/groups.json index fb8930f31c..e046c75e0c 100644 --- a/website/common/locales/cs/groups.json +++ b/website/common/locales/cs/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/cs/npc.json b/website/common/locales/cs/npc.json index 1e7debd6d1..6b980811ff 100644 --- a/website/common/locales/cs/npc.json +++ b/website/common/locales/cs/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Zmíněné předměty!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Zkušenost", "amountGold": "<%= amount %> Zlato", "namedHatchingPotion": "<%= type %> Líhnoucí lektvar", diff --git a/website/common/locales/da/challenge.json b/website/common/locales/da/challenge.json index 2ccf9b4452..0913d5f145 100644 --- a/website/common/locales/da/challenge.json +++ b/website/common/locales/da/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Blev vinderen i de følgende udfordringer", "challenges": "Udfordringer", "challengesLink": "Udfordringer", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Ingen udfordringer endnu, besøg", "toCreate": "for at oprette en.", "selectWinner": "Vælg en vinder og luk udfordringen:", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Grupper", "noNone": "Ingen", + "category": "Category", "membership": "Medlemskab", + "ownership": "Ownership", "participating": "Deltager", "notParticipating": "Deltager ikke", "either": "Begge", diff --git a/website/common/locales/da/groups.json b/website/common/locales/da/groups.json index 2542bcaac3..31075c5840 100644 --- a/website/common/locales/da/groups.json +++ b/website/common/locales/da/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Opgradér", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> har gjort krav på \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Godkendelse anmodet", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/da/npc.json b/website/common/locales/da/npc.json index 88baf92303..28aa11c899 100644 --- a/website/common/locales/da/npc.json +++ b/website/common/locales/da/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/de/challenge.json b/website/common/locales/de/challenge.json index 1f20be3f72..ea8379b6cb 100644 --- a/website/common/locales/de/challenge.json +++ b/website/common/locales/de/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Hat die folgenden Wettbewerbe gewonnen", "challenges": "Wettbewerbe", "challengesLink": "Herausforderungen", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Keine Wettbewerbe gefunden, besuche", "toCreate": "um einen Wettbewerb zu erstellen.", "selectWinner": "Wähle einen Gewinner und beende den Wettbewerb.", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Gruppen", "noNone": "Niemand", + "category": "Category", "membership": "Mitgliedschaft", + "ownership": "Ownership", "participating": "Teilnehmer", "notParticipating": "Nicht Teilnehmer", "either": "Beides", diff --git a/website/common/locales/de/groups.json b/website/common/locales/de/groups.json index 44d145a6c8..9406d633e9 100644 --- a/website/common/locales/de/groups.json +++ b/website/common/locales/de/groups.json @@ -150,12 +150,12 @@ "report": "Melden", "abuseFlag": "Verletzung der Community-Richtlinien melden", "abuseFlagModalHeading": "Melde einen Verstoß", - "abuseFlagModalBody": "Are you sure you want to report this post? You should only report a post that violates the <%= firstLinkStart %>Community Guidelines<%= linkEnd %> and/or <%= secondLinkStart %>Terms of Service<%= linkEnd %>. Inappropriately reporting a post is a violation of the Community Guidelines and may give you an infraction.", + "abuseFlagModalBody": "Möchtest Du diesen Beitrag wirklich melden? Du solltest ausschließlich Beiträge melden, die unsere <%= firstLinkStart %>Community-Richtlinien<%= linkEnd %> und/oder unsere <%= secondLinkStart %>Nutzungsbedingungen<%= linkEnd %> verletzen. Das ungerechtfertigte Melden von Beiträgen stellt eine Verletzung der Community-Richtlinien dar und kann geahndet werden.", "abuseFlagModalButton": "Verstoß melden", "abuseReported": "Danke, dass Du diesen Verstoß gemeldet hast. Die Moderatoren wurden benachrichtigt.", "abuseAlreadyReported": "Du hast diese Nachricht bereits gemeldet.", "whyReportingPost": "Wieso meldest Du diesen Post?", - "whyReportingPostPlaceholder": "Please help our moderators by letting us know why you are reporting this post for a violation, e.g., spam, swearing, religious oaths, bigotry, slurs, adult topics, violence.", + "whyReportingPostPlaceholder": "Bitte hilf unseren Moderatoren und gib einen Grund an, warum Du diesen Beitrag als Verstoß gemeldet hast, z.B. Spam, Fluchen, Religiöse Schwüre, Intoleranz, Beleidigungen, Nicht jugendfreie Themen, Gewalt.", "optional": "Wahlweise", "needsText": "Bitte gib eine Nachricht ein.", "needsTextPlaceholder": "Gib Deine Nachricht hier ein.", @@ -167,7 +167,7 @@ "leaderOnlyChallenges": "Nur der Gruppenleiter kann Wettbewerbe erstellen", "sendGift": "Geschenk schicken", "inviteFriends": "Lade Freunde ein", - "partyMembersInfo": "Your Party currently has <%= memberCount %> members and <%= invitationCount %> pending invitations. The limit of members in a Party is <%= limitMembers %>. Invitations above this limit cannot be sent.", + "partyMembersInfo": "Deine Gruppe hat aktuell <%= memberCount %> Mitglieder und <%= invitationCount %> ausstehende Einladungen. Die maximale Anzahl an Mitgliedern in einer Gruppe ist <%= limitMembers %>. Einladungen über diesem Limit können nicht verschickt werden.", "inviteByEmail": "Lade per E-Mail ein", "inviteByEmailExplanation": "Wenn Freunde über Deine E-Mail zu Habitica stoßen, werden sie automatisch zu Deiner Gruppe eingeladen!", "inviteMembersHowTo": "Leute einladen: mit einer gültigen Email-Adresse oder der 36-stelligen Nutzer ID. Wenn eine Email-Adresse noch nicht registriert ist, laden wir diejenigen nach Habitica ein.", @@ -201,12 +201,12 @@ "partyExplanation2": "Bekämpfe Monster und nimm an Wettbewerben teil!", "partyExplanation3": "Lade jetzt Freunde ein und erhalte eine Questschriftrolle!", "wantToStartParty": "Willst Du eine Gruppe gründen?", - "exclusiveQuestScroll": "Inviting a friend to your Party will grant you an exclusive Quest Scroll to battle the Basi-List together!", + "exclusiveQuestScroll": "Wenn Du Freunde in Deine Gruppe einlädst, erhältst Du eine exklusive Questschriftrolle, mit der ihr gemeinsam den Basi-List bekämpfen könnt!", "nameYourParty": "Gib Deiner neuen Gruppe einen Namen!", "partyEmpty": "Du bist alleine in Deiner Gruppe. Lade Deine Freunde ein!", "partyChatEmpty": "Dein Gruppenchat ist leer. Tippe eine Nachricht in die Box oben, um mit dem Chat zu beginnen.", "guildChatEmpty": "Dieser Gildenchat ist leer. Gib eine Nachricht ein und beginne mit dem Chat.", - "requestAcceptGuidelines": "If you would like to post messages in the Tavern or any Party or Guild chat, please first read our <%= linkStart %>Community Guidelines<%= linkEnd %> and then click the button below to indicate that you accept them.", + "requestAcceptGuidelines": "Wenn Du Nachrichten im Gasthaus oder in irgendeinem Gruppen- oder Gilden-Chat posten willst, lies bitte zuerst unsere <%= linkStart %>Community-Richtlinien<%= linkEnd %>. Klicke danach unten auf den Button, um sie zu akzeptieren.", "partyUpName": "Party!", "partyOnName": "Riesenparty!", "partyUpText": "Du bist einer Gruppe mit einer anderen Person beigetreten! Ihr werdet zusammen Monster bekämpfen und euch unterstützen - viel Spaß dabei. ", @@ -249,13 +249,13 @@ "confirmClaim": "Bist Du sicher, dass Du diese Aufgabe beanspruchen möchtest?", "confirmUnClaim": "Bist Du sicher, dass Du diese Aufgabe abgeben möchtest?", "confirmApproval": "Bist Du sicher, dass Du diese Aufgabe bestätigen möchtest?", - "confirmNeedsWork": "Are you sure you want to mark this task as needing work?", + "confirmNeedsWork": "Bist Du sicher, dass Du diese Aufgabe auf \"Benötigt Arbeit\" setzen möchtest?", "userRequestsApproval": "<%= userName %> beantragt eine Bestätigung", "userCountRequestsApproval": "<%= userCount %> beantragen eine Bestätigung", "youAreRequestingApproval": "Du beantragst eine Bestätigung", - "chatPrivilegesRevoked": "You cannot do that because your chat privileges have been revoked.", - "cannotCreatePublicGuildWhenMuted": "You cannot create a public guild because your chat privileges have been revoked.", - "cannotInviteWhenMuted": "You cannot invite anyone to a guild or party because your chat privileges have been revoked.", + "chatPrivilegesRevoked": "Du kannst dies nicht tun, da Dir Deine Chat-Privilegien entzogen wurden.", + "cannotCreatePublicGuildWhenMuted": "Du kannst keine öffentliche Gilde erstellen, da Dir Deine Chat-Privilegien entzogen wurden.", + "cannotInviteWhenMuted": "Du kannst niemanden zu einer Gruppe oder Gilde einladen, da Dir Deine Chat-Privilegien entzogen wurden.", "newChatMessagePlainNotification": "Neue Nachricht in <%= groupName %> von <%= authorName %>. Hier geht's zur Chat Seite!", "newChatMessageTitle": "Neue Nachricht in <%= groupName %>", "exportInbox": "Nachrichten exportieren", @@ -269,7 +269,7 @@ "groupHomeTitle": "Startseite", "assignTask": "Aufgabe zuweisen", "claim": "Anspruch", - "removeClaim": "Remove Claim", + "removeClaim": "Anspruch abtreten", "onlyGroupLeaderCanManageSubscription": "Nur der Team-Leiter kann Team-Registrierungen verwalten", "yourTaskHasBeenApproved": "Your task <%= taskText %> has been approved.", "taskNeedsWork": "<%= managerName %> marked <%= taskText %> as needing additional work.", @@ -316,7 +316,7 @@ "approvalsTitle": "Aufgaben-Zustimmung erwartet", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "Wenn Dein Team Aufgaben erledigt, die deine Zustimmung brauchen, erscheinen sie hier! Passe die Zustimmungs-Einstellungen in den Aufgaben an.", - "userIsClamingTask": "`<%= username %> hat \"<%= task %>\"` eingefordert", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Zustimmung erbeten", "refreshApprovals": "Zustimmungen aktualisieren", "refreshGroupTasks": "Team-Aufgaben aktualisieren", @@ -366,9 +366,11 @@ "recentActivity": "Kürzliche Aktivitäten", "myGuilds": "Meine Gilden", "guildsDiscovery": "Gilden entdecken", + "role": "Role", "guildOrPartyLeader": "Leiter", "guildLeader": "Gildenleiter", "member": "Mitglied", + "guildSize": "Guild Size", "goldTier": "Gold", "silverTier": "Silber", "bronzeTier": "Bronze", @@ -424,10 +426,10 @@ "managerAdded": "Manager erfolgreich hinzugefügt", "managerRemoved": "Manager erfolgreich entfernt", "leaderChanged": "Gruppenleitung wurde gewechselt", - "groupNoNotifications": "This Guild does not have notifications due to member size. Be sure to check back often for replies to your messages!", + "groupNoNotifications": "Diese Gilde ist zu groß, um Hinweismeldungen zu unterstützen! Schau öfter rein, um keine Antwort auf Deine Nachrichten zu verpassen!", "whatIsWorldBoss": "Was ist ein Weltboss?", - "worldBossDesc": "A World Boss is a special event that brings the Habitica community together to take down a powerful monster with their tasks! All Habitica users are rewarded upon its defeat, even those who have been resting in the Inn or have not used Habitica for the entirety of the quest.", - "worldBossLink": "Read more about the previous World Bosses of Habitica on the Wiki.", + "worldBossDesc": "Ein Weltboss ist ein besonderes Ereignis, bei dem die ganze Habitica Community zusammen arbeitet, um ein mächtiges Monster durch ihre Aufgaben zu besiegen! Alle Benutzer Habiticas erhalten nach dem Sieg eine Belohnung, sogar diejenigen, die im Gasthaus waren oder Habitica während der ganzen Quest nicht genutzt haben.", + "worldBossLink": "Erfahre mehr über die vorigen Weltbosse von Habitica im Wiki.", "worldBossBullet1": "Erfülle Deine Aufgaben, um dem Welt-Boss Schaden zuzufügen", "worldBossBullet2": "Der Welt-Boss wird Dir keinen Schaden für nicht erledigte Aufgaben zufügen, aber sein Raserei-Balken wird ansteigen. Wenn dieser voll ist, wird der Boss einen von Habiticas Händlern angreifen!", "worldBossBullet3": "Du kannst weiterhin Quest-Bosse bekämpfen, Dein Schaden wird beiden zugefügt werden.", diff --git a/website/common/locales/de/npc.json b/website/common/locales/de/npc.json index 34794bb296..e02d35bce6 100644 --- a/website/common/locales/de/npc.json +++ b/website/common/locales/de/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Besondere Empfehlungen!", "hideLocked": "Gesperrte verbergen", "hidePinned": "In der Pinnwand angezeigte verbergen", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Erfahrung", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Schlüpfelixier", diff --git a/website/common/locales/de/settings.json b/website/common/locales/de/settings.json index 86b62ea333..ff63561772 100644 --- a/website/common/locales/de/settings.json +++ b/website/common/locales/de/settings.json @@ -32,7 +32,7 @@ "resetAccPop": "Starte neu, dabei werden alle Level, Gold, Ausrüstung, Verlauf und Aufgaben entfernt.", "deleteAccount": "Konto löschen", "deleteAccPop": "Kündige und entferne Dein Habitica-Konto.", - "feedback": "If you'd like to give us feedback, please enter it below - we'd love to know what you liked or didn't like about Habitica! Don't speak English well? No problem! Use the language you prefer.", + "feedback": "Wenn Du uns Feedback geben möchtest, gib es bitte unten ein - wir freuen uns darauf zu erfahren, was Dir an Habitica gefällt - oder auch nicht gefällt! Und falls Du Schwierigkeiten mit Englisch hast? Kein Problem! Schreib' in der Sprache, die Dir liegt.", "qrCode": "QR-Code", "dataExport": "Daten exportieren", "saveData": "Hier sind ein paar Möglichkeiten Deine Daten zu sichern.", diff --git a/website/common/locales/en@pirate/challenge.json b/website/common/locales/en@pirate/challenge.json index 66ecdcf2bf..a631ac7004 100644 --- a/website/common/locales/en@pirate/challenge.json +++ b/website/common/locales/en@pirate/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Was t' victor in t' followin' challenges", "challenges": "Challenges", "challengesLink": "Challenges", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "No challenges yet, visit", "toCreate": "t' create one.", "selectWinner": "Select a winner an' close th' challenge:", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Groups", "noNone": "None", + "category": "Category", "membership": "Membership", + "ownership": "Ownership", "participating": "Embarking", "notParticipating": "Not Embarking", "either": "Either", diff --git a/website/common/locales/en@pirate/groups.json b/website/common/locales/en@pirate/groups.json index 71a1dc4742..2ce032471e 100644 --- a/website/common/locales/en@pirate/groups.json +++ b/website/common/locales/en@pirate/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/en@pirate/npc.json b/website/common/locales/en@pirate/npc.json index 469e726ee0..50d892b210 100644 --- a/website/common/locales/en@pirate/npc.json +++ b/website/common/locales/en@pirate/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/en_GB/challenge.json b/website/common/locales/en_GB/challenge.json index 50610d482a..f3f1138baa 100644 --- a/website/common/locales/en_GB/challenge.json +++ b/website/common/locales/en_GB/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Was the winner in the following challenges", "challenges": "Challenges", "challengesLink": "Challenges", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "No challenges yet, visit", "toCreate": "to create one.", "selectWinner": "Select a winner and close the challenge:", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Groups", "noNone": "None", + "category": "Category", "membership": "Membership", + "ownership": "Ownership", "participating": "Participating", "notParticipating": "Not Participating", "either": "Either", diff --git a/website/common/locales/en_GB/groups.json b/website/common/locales/en_GB/groups.json index 1c7a36068c..7cc32afd49 100644 --- a/website/common/locales/en_GB/groups.json +++ b/website/common/locales/en_GB/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/en_GB/npc.json b/website/common/locales/en_GB/npc.json index 861871c7ed..3ff4aaf625 100644 --- a/website/common/locales/en_GB/npc.json +++ b/website/common/locales/en_GB/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/es/challenge.json b/website/common/locales/es/challenge.json index b5ba3b9445..6f4292aade 100644 --- a/website/common/locales/es/challenge.json +++ b/website/common/locales/es/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Ha ganado los siguientes desafíos", "challenges": "Desafíos", "challengesLink": "Desafíos", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Ningún desafío todavía, visita", "toCreate": "para crear uno.", "selectWinner": "Seleccionar un ganador y cerrar el desafío:", @@ -23,7 +25,9 @@ "filter": "Filtro", "groups": "Grupos", "noNone": "Ninguno", + "category": "Category", "membership": "Membresía", + "ownership": "Ownership", "participating": "Participando", "notParticipating": "No participando", "either": "Ambos", diff --git a/website/common/locales/es/groups.json b/website/common/locales/es/groups.json index 686274fc7f..be98a17269 100644 --- a/website/common/locales/es/groups.json +++ b/website/common/locales/es/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tareas Pendientes de Aprobación", "upgradeTitle": "Actualizar", "blankApprovalsDescription": "Cuando el grupo completa tareas que necesitan de tu aprobación, aparecerán aquí. Ajusta los requisitos de aprobación en la edición de tareas.", - "userIsClamingTask": "`<%= username %> se encarga de \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Aprobación Solicitada", "refreshApprovals": "Actualizar las Aprobaciones", "refreshGroupTasks": "Actualizar las Tareas del Grupo", @@ -366,9 +366,11 @@ "recentActivity": "Actividad reciente", "myGuilds": "Mis hermandades", "guildsDiscovery": "Descubre hermandades", + "role": "Role", "guildOrPartyLeader": "Líder", "guildLeader": "Líder de hermandad", "member": "Miembro", + "guildSize": "Guild Size", "goldTier": "Nivel Oro", "silverTier": "Nivel Plata", "bronzeTier": "Nivel Bronce", diff --git a/website/common/locales/es/npc.json b/website/common/locales/es/npc.json index 592a44e8b5..bd7944c911 100644 --- a/website/common/locales/es/npc.json +++ b/website/common/locales/es/npc.json @@ -48,6 +48,7 @@ "featuredItems": "¡Objetos patrocinados!", "hideLocked": "Ocultar los bloqueados", "hidePinned": "Ocultar los fijados", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> de experiencia", "amountGold": "<%= amount %>de oro", "namedHatchingPotion": "Poción de eclosión de <%= type %>", diff --git a/website/common/locales/es_419/challenge.json b/website/common/locales/es_419/challenge.json index 3594f35afb..8789f191d4 100644 --- a/website/common/locales/es_419/challenge.json +++ b/website/common/locales/es_419/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Fue el ganador en los siguientes desafíos", "challenges": "Desafíos", "challengesLink": "Desafíos", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Ningún desafío todavía, visita", "toCreate": "para crear uno.", "selectWinner": "Seleccionar un ganador y cerrar el desafío:", @@ -23,7 +25,9 @@ "filter": "Filtrar", "groups": "Grupos", "noNone": "Ninguno", + "category": "Category", "membership": "Membresía", + "ownership": "Ownership", "participating": "Participando", "notParticipating": "No participando", "either": "Ambos", diff --git a/website/common/locales/es_419/groups.json b/website/common/locales/es_419/groups.json index b0e62af8a7..9742eeb0af 100644 --- a/website/common/locales/es_419/groups.json +++ b/website/common/locales/es_419/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tareas esperando ser aprobadas", "upgradeTitle": "Actualizar", "blankApprovalsDescription": "!Cuando tu grupo complete tareas que necesitan tu aprobación, ellas aparecerán aquí! Ajusta los requisitos de aprobación en edición de tareas.", - "userIsClamingTask": "`<%= username %> ha solicitado \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Aprobación Solicitada", "refreshApprovals": "Actualizar permisos", "refreshGroupTasks": "Actualiza las tareas grupales", @@ -366,9 +366,11 @@ "recentActivity": "Actividad Reciente", "myGuilds": "Mis Gremios", "guildsDiscovery": "Descubrir Gremios", + "role": "Role", "guildOrPartyLeader": "Líder", "guildLeader": "Líder del Gremio", "member": "Miembro", + "guildSize": "Guild Size", "goldTier": "Nivel Oro", "silverTier": "Nivel Plata", "bronzeTier": "Nivel Bronce", diff --git a/website/common/locales/es_419/npc.json b/website/common/locales/es_419/npc.json index 5de4597f36..40e4d3a3a4 100644 --- a/website/common/locales/es_419/npc.json +++ b/website/common/locales/es_419/npc.json @@ -48,6 +48,7 @@ "featuredItems": "¡Artículos Destacados!", "hideLocked": "Ocultar bloqueados", "hidePinned": "Ocultar fijados", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experiencia", "amountGold": "<%= amount %> Oro", "namedHatchingPotion": "<%= type %> Poción de Nacimiento", diff --git a/website/common/locales/fr/challenge.json b/website/common/locales/fr/challenge.json index 2a0a357b4d..5d4dde2571 100644 --- a/website/common/locales/fr/challenge.json +++ b/website/common/locales/fr/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "A remporté les défis suivants", "challenges": "Défis", "challengesLink": "Défis", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Pas encore de défi, visitez", "toCreate": "pour en créer un.", "selectWinner": "Désigner un vainqueur et clore le défi :", @@ -23,7 +25,9 @@ "filter": "Filtre", "groups": "Groupes", "noNone": "Aucun", + "category": "Category", "membership": "Participation", + "ownership": "Ownership", "participating": "Je participe", "notParticipating": "Je ne participe pas", "either": "Les deux", diff --git a/website/common/locales/fr/groups.json b/website/common/locales/fr/groups.json index 1c19b95fd3..985c85f530 100644 --- a/website/common/locales/fr/groups.json +++ b/website/common/locales/fr/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tâches en attente d'approbation", "upgradeTitle": "Mise à niveau", "blankApprovalsDescription": "Quand votre groupe réalise des tâches que vous devez approuver, elles apparaîtront ici ! Ajustez les paramètres d'approbation des tâches dans leur menu « Modifier ».", - "userIsClamingTask": "`<%= username %> a revendiqué \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approbation demandée", "refreshApprovals": "Actualiser les approbations", "refreshGroupTasks": "Actualiser les tâches de groupe", @@ -366,9 +366,11 @@ "recentActivity": "Activité récente", "myGuilds": "Mes guildes", "guildsDiscovery": "Découvrir des guildes", + "role": "Role", "guildOrPartyLeader": "Responsable", "guildLeader": "Responsable de la guilde", "member": "Membre", + "guildSize": "Guild Size", "goldTier": "Palier or", "silverTier": "Palier argent", "bronzeTier": "Palier bronze", diff --git a/website/common/locales/fr/npc.json b/website/common/locales/fr/npc.json index a9ed7e0f1c..43ff834753 100644 --- a/website/common/locales/fr/npc.json +++ b/website/common/locales/fr/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Objets du moment !", "hideLocked": "Cacher ce qui est verrouillé", "hidePinned": "Cacher ce qui est épinglé", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Expérience", "amountGold": "<%= amount %> Or", "namedHatchingPotion": "Potion d'éclosion <%= type %>", diff --git a/website/common/locales/he/challenge.json b/website/common/locales/he/challenge.json index 38c4d29456..7c9fbf612c 100644 --- a/website/common/locales/he/challenge.json +++ b/website/common/locales/he/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "ניצחו באתגרים הבאים", "challenges": "אתגרים", "challengesLink": "אתגרים", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "עדיין אין לכם אתגרים, בקרו ב", "toCreate": "כדי ליצור אחד.", "selectWinner": "בחרו מנצח כדי לסגור את האתגר:", @@ -23,7 +25,9 @@ "filter": "מסנן", "groups": "קבוצות", "noNone": "אף אחת", + "category": "Category", "membership": "חברות", + "ownership": "Ownership", "participating": "משתתפים", "notParticipating": "לא משתתפים", "either": "בחרו אחד", diff --git a/website/common/locales/he/groups.json b/website/common/locales/he/groups.json index b67f48d4ca..2e88ff3cf5 100644 --- a/website/common/locales/he/groups.json +++ b/website/common/locales/he/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/he/npc.json b/website/common/locales/he/npc.json index 71c1fb8ad5..82d16c6932 100644 --- a/website/common/locales/he/npc.json +++ b/website/common/locales/he/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/hu/challenge.json b/website/common/locales/hu/challenge.json index ae6124a882..b12b88bf5f 100644 --- a/website/common/locales/hu/challenge.json +++ b/website/common/locales/hu/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "A következő kihívásokat nyerte meg", "challenges": "Kihívások", "challengesLink": "Kihívások", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Még nincsenek kihívások, kattints ide", "toCreate": "hogy létrehozz egyet.", "selectWinner": "Válassz győztest és zárd le a kihívást:", @@ -23,7 +25,9 @@ "filter": "Szűrő", "groups": "Csoportok", "noNone": "Egyik sem", + "category": "Category", "membership": "Tagság", + "ownership": "Ownership", "participating": "Részt vesz", "notParticipating": "Nem vesz részt", "either": "Bármelyik", diff --git a/website/common/locales/hu/groups.json b/website/common/locales/hu/groups.json index 5bb51be5df..e78828c962 100644 --- a/website/common/locales/hu/groups.json +++ b/website/common/locales/hu/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Jóváhagyás kérése", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/hu/npc.json b/website/common/locales/hu/npc.json index 31a3da6a64..4464d37638 100644 --- a/website/common/locales/hu/npc.json +++ b/website/common/locales/hu/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/id/challenge.json b/website/common/locales/id/challenge.json index f1d18f04c1..3175e40f6d 100644 --- a/website/common/locales/id/challenge.json +++ b/website/common/locales/id/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Adalah pemenang dari tantangan berikut", "challenges": "Tantangan", "challengesLink": "Tantangan", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Belum ada tantangan, kunjungi", "toCreate": "untuk membuat tantangan baru.", "selectWinner": "Pilih pemenang dan tutup tantangan:", @@ -23,7 +25,9 @@ "filter": "Penyaring", "groups": "Kelompok", "noNone": "Tidak satupun", + "category": "Category", "membership": "Keanggotaan", + "ownership": "Ownership", "participating": "Berpartisipasi", "notParticipating": "Tidak Berpartisipasi", "either": "Yang mana saja", diff --git a/website/common/locales/id/groups.json b/website/common/locales/id/groups.json index 1966920337..05cf01702c 100644 --- a/website/common/locales/id/groups.json +++ b/website/common/locales/id/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tugas-Tugas yang Menunggu Persetujuan", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "Saat grupmu menyelesaikan tugas yang butuh persetujuanmu, mereka akan muncul di sini! Atur syarat persetujuan saat mengedit tugas.", - "userIsClamingTask": "`<%= username %> telah mengklaim \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Meminta Persetujuan", "refreshApprovals": "Muat ulang Persetujuan", "refreshGroupTasks": "Muat ulang Tugas Grup", @@ -366,9 +366,11 @@ "recentActivity": "Aktivitas Terkini", "myGuilds": "Guild-ku", "guildsDiscovery": "Temukan Guild", + "role": "Role", "guildOrPartyLeader": "Pemimpin", "guildLeader": "Pemimpin Guild", "member": "Anggota", + "guildSize": "Guild Size", "goldTier": "Pangkat Emas", "silverTier": "Pangkat Perak", "bronzeTier": "Pangkat Perunggu", diff --git a/website/common/locales/id/npc.json b/website/common/locales/id/npc.json index f6440a0014..5e18a16667 100644 --- a/website/common/locales/id/npc.json +++ b/website/common/locales/id/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Barang Sorotan!", "hideLocked": "Sembunyikan yang terkunci", "hidePinned": "Sembunyikan yang sudah disematkan", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Pengalaman", "amountGold": "<%= amount %> Koin Emas", "namedHatchingPotion": "Ramuan Penetas <%= type %>", diff --git a/website/common/locales/it/challenge.json b/website/common/locales/it/challenge.json index cbd061b95e..9a62a8e2d4 100644 --- a/website/common/locales/it/challenge.json +++ b/website/common/locales/it/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Ha vinto le seguenti sfide:", "challenges": "Sfide", "challengesLink": "Sfide", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Ancora nessuna sfida, visita", "toCreate": "per crearne una.", "selectWinner": "Scegli un vincitore e chiudi la sfida:", @@ -23,7 +25,9 @@ "filter": "Filtro", "groups": "Gruppi", "noNone": "Nessuno", + "category": "Category", "membership": "Partecipazione", + "ownership": "Ownership", "participating": "Sto partecipando", "notParticipating": "Non sto partecipando", "either": "Entrambi", diff --git a/website/common/locales/it/groups.json b/website/common/locales/it/groups.json index 515adf7f76..19a2710d93 100644 --- a/website/common/locales/it/groups.json +++ b/website/common/locales/it/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Attività in attesa di approvazione", "upgradeTitle": "Effettua l'upgrade", "blankApprovalsDescription": "Quando il tuo gruppo completa delle attività che richiedono la tua approvazione, appariranno qui! Puoi regolare i requisiti di approvazione durante la modifica delle attività.", - "userIsClamingTask": "`<%= username %> ha richiesto \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approvazione richiesta", "refreshApprovals": "Aggiorna approvazioni", "refreshGroupTasks": "Ricarica attività del gruppo", @@ -366,9 +366,11 @@ "recentActivity": "Attività recenti", "myGuilds": "Le mie Gilde", "guildsDiscovery": "Esplora Gilde", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Leader della Gilda", "member": "Membro", + "guildSize": "Guild Size", "goldTier": "Rango oro", "silverTier": "Rango argento", "bronzeTier": "Rango bronzo", diff --git a/website/common/locales/it/npc.json b/website/common/locales/it/npc.json index a2d394fc3e..e0b18fd503 100644 --- a/website/common/locales/it/npc.json +++ b/website/common/locales/it/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Oggetti in vetrina!", "hideLocked": "Nascondi bloccati", "hidePinned": "Nascondi Preferiti", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Esperienza", "amountGold": "<%= amount %> Oro", "namedHatchingPotion": "Pozione di schiusura <%= type %>", diff --git a/website/common/locales/ja/challenge.json b/website/common/locales/ja/challenge.json index bf4f66b43d..6fc2323fa0 100644 --- a/website/common/locales/ja/challenge.json +++ b/website/common/locales/ja/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "以下のチャレンジで優勝しました。", "challenges": "チャレンジ", "challengesLink": "チャレンジ", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "まだチャレンジ登録はしていません。", "toCreate": "でチャレンジを作成可能", "selectWinner": "優勝者を選び、チャレンジを終了する", @@ -23,7 +25,9 @@ "filter": "フィルター", "groups": "グループ", "noNone": "なし", + "category": "Category", "membership": "会員登録状況", + "ownership": "Ownership", "participating": "参加", "notParticipating": "不参加", "either": "どちらも", diff --git a/website/common/locales/ja/groups.json b/website/common/locales/ja/groups.json index 1a5303580e..1fb7733f6d 100644 --- a/website/common/locales/ja/groups.json +++ b/website/common/locales/ja/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "承認待ちのタスク", "upgradeTitle": "アップグレード", "blankApprovalsDescription": "あなたのグループが、あなたの承認を必要とするタスクを片付けた場合はここに表示されます!タスクの編集にて承認の条件について設定することができます。", - "userIsClamingTask": "`<%= username %> が \"<%= task %>\" を確保しました`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "承認が申請されました", "refreshApprovals": "承認の更新", "refreshGroupTasks": "グループタスクの更新", @@ -366,9 +366,11 @@ "recentActivity": "最近の活動", "myGuilds": "所属ギルド", "guildsDiscovery": "ギルドを探す", + "role": "Role", "guildOrPartyLeader": "リーダー", "guildLeader": "ギルドリーダー", "member": "メンバー", + "guildSize": "Guild Size", "goldTier": "ゴールド段位", "silverTier": "シルバー段位", "bronzeTier": "ブロンズ段位", diff --git a/website/common/locales/ja/npc.json b/website/common/locales/ja/npc.json index d1ae9818a2..6149a3fcc2 100644 --- a/website/common/locales/ja/npc.json +++ b/website/common/locales/ja/npc.json @@ -48,6 +48,7 @@ "featuredItems": "注目アイテム!", "hideLocked": "ロックされたアイテムを隠す", "hidePinned": "ピン留めされたアイテムを隠す", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> 経験値", "amountGold": "<%= amount %> ゴールド", "namedHatchingPotion": "<%= type %> たまごがえしの薬", diff --git a/website/common/locales/nl/challenge.json b/website/common/locales/nl/challenge.json index 67743cdf10..4b25163895 100644 --- a/website/common/locales/nl/challenge.json +++ b/website/common/locales/nl/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Heeft de volgende uitdagingen gewonnen", "challenges": "Uitdagingen", "challengesLink": "Uitdagingen", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Nog geen uitdagingen, ga naar", "toCreate": "om er een aan te maken.", "selectWinner": "Kies een winnaar en sluit de uitdaging af:", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Groepen", "noNone": "Geen", + "category": "Category", "membership": "Lidmaatschap", + "ownership": "Ownership", "participating": "Deelnemend", "notParticipating": "Niet deelnemend", "either": "Beide", diff --git a/website/common/locales/nl/groups.json b/website/common/locales/nl/groups.json index c3f83c6abf..491f76c699 100644 --- a/website/common/locales/nl/groups.json +++ b/website/common/locales/nl/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Taken wachtend op goedkeuring", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "Wanneer je groep taken voltooid die je goedkeuring vereisen, verschijnen ze hier! Pas de vereisten voor goedkeuring aan onder taakbewerking.", - "userIsClamingTask": "`<%= username %> heeft \"<%= task %>\" geclaimd.`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Goedkeuring aangevraagd", "refreshApprovals": "Vernieuw goedkeuringen", "refreshGroupTasks": "Vernieuw groepstaken", @@ -366,9 +366,11 @@ "recentActivity": "Recente activiteit", "myGuilds": "Mijn gilden", "guildsDiscovery": "Gilden ontdekken", + "role": "Role", "guildOrPartyLeader": "Leider", "guildLeader": "Gildeleider", "member": "Lid", + "guildSize": "Guild Size", "goldTier": "Gouden rang", "silverTier": "Zilveren rank", "bronzeTier": "Bronzen rang", diff --git a/website/common/locales/nl/npc.json b/website/common/locales/nl/npc.json index 617e9c45ca..998f720a22 100644 --- a/website/common/locales/nl/npc.json +++ b/website/common/locales/nl/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Uitgelichte items!", "hideLocked": "Verberg vergrendelde", "hidePinned": "Vastgepinde verbergen", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> ervaring", "amountGold": "<%= amount %> goud", "namedHatchingPotion": "<%= type %> uitbroeddrank", diff --git a/website/common/locales/pl/challenge.json b/website/common/locales/pl/challenge.json index b91e974da4..bf5e2a6984 100644 --- a/website/common/locales/pl/challenge.json +++ b/website/common/locales/pl/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Jest zwycięzcą następujących wyzwań", "challenges": "Wyzwania", "challengesLink": "Wyzwania", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Nie ma jeszcze żadnych wyzwań, udaj się do", "toCreate": "żeby stworzyć wyzwanie.", "selectWinner": "Wybierz zwycięzcę i zakończ wyzwanie:", @@ -23,7 +25,9 @@ "filter": "Filtruj", "groups": "Grupy", "noNone": "Żadne", + "category": "Category", "membership": "Członkostwo", + "ownership": "Ownership", "participating": "Biorę udział", "notParticipating": "Nie biorę udziału", "either": "Wszystkie", diff --git a/website/common/locales/pl/groups.json b/website/common/locales/pl/groups.json index bb2d2ac7ef..87b0b68052 100644 --- a/website/common/locales/pl/groups.json +++ b/website/common/locales/pl/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Zadania czekające na aprobatę", "upgradeTitle": "Kup abonament", "blankApprovalsDescription": "Kiedy twoja grupa ukończy zadania wymagające twojego zatwierdzenia, pojawią się one tutaj! Ustawienia zatwierdzania możesz dostosować w edycji zadań.", - "userIsClamingTask": "`<%= username %> zgłosił udział w zadaniu \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Wymagana aprobata", "refreshApprovals": "Odśwież aprobaty", "refreshGroupTasks": "Odśwież zadania grupy", @@ -366,9 +366,11 @@ "recentActivity": "Ostatnia aktywność", "myGuilds": "Moje GIldie", "guildsDiscovery": "Odkryj Gildie", + "role": "Role", "guildOrPartyLeader": "Przywódca", "guildLeader": "Przywódca Gildii", "member": "Członek", + "guildSize": "Guild Size", "goldTier": "Ranga Złota", "silverTier": "Ranga Srebrna", "bronzeTier": "Ranga Brązowa", diff --git a/website/common/locales/pl/npc.json b/website/common/locales/pl/npc.json index eea9a44a7a..027a209edf 100644 --- a/website/common/locales/pl/npc.json +++ b/website/common/locales/pl/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Wyróżnione Przedmioty!", "hideLocked": "Ukryj niedostępne", "hidePinned": "Ukryj przypięte", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Doświadzenia", "amountGold": "<%= amount %> Złota", "namedHatchingPotion": "<%= type %> eliksir wyklucia", diff --git a/website/common/locales/pt/challenge.json b/website/common/locales/pt/challenge.json index e3e7bb1160..2af6ec2e88 100644 --- a/website/common/locales/pt/challenge.json +++ b/website/common/locales/pt/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Vencedor dos seguintes desafios", "challenges": "Desafios", "challengesLink": "Desafios", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Nenhum desafio ainda, visite", "toCreate": "para criar um.", "selectWinner": "Selecione um vencedor e termine o desafio:", @@ -23,7 +25,9 @@ "filter": "Filtro", "groups": "Grupos", "noNone": "Nenhum", + "category": "Category", "membership": "Associação", + "ownership": "Ownership", "participating": "Participando", "notParticipating": "Não Participando", "either": "Ambos", diff --git a/website/common/locales/pt/front.json b/website/common/locales/pt/front.json index c49cf8d29b..6636fc8f98 100644 --- a/website/common/locales/pt/front.json +++ b/website/common/locales/pt/front.json @@ -283,7 +283,7 @@ "invalidLoginCredentialsLong": "Uh-oh - your email address / login name or password is incorrect.\n- Make sure they are typed correctly. Your login name 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": "Não há uma conta que usa essas credenciais.", "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 copy your User ID into the email and include your Profile Name.", - "accountSuspendedTitle": "Account has been suspended", + "accountSuspendedTitle": "Esta conta foi suspensa", "unsupportedNetwork": "Atualmente, esta rede não é suportada.", "cantDetachSocial": "A conta não possui outra forma de autenticação; não se pode remover este método de autenticação.", "onlySocialAttachLocal": "Autenticação local só pode ser adicionada à uma conta social.", diff --git a/website/common/locales/pt/gear.json b/website/common/locales/pt/gear.json index d9664303c0..98dae2f0c9 100644 --- a/website/common/locales/pt/gear.json +++ b/website/common/locales/pt/gear.json @@ -334,7 +334,7 @@ "weaponArmoireScepterOfDiamondsNotes": "Este ceptro reluz em tons quentes e avermelhados enquanto intensifica a tua força de vontade. Aumenta Força em <%= str %>. Armário Encantado: Conjunto de Rei de Ouros (Item 3 de 3).", "weaponArmoireFlutteryArmyText": "Exército Tremulante", "weaponArmoireFlutteryArmyNotes": "Este grupo desconexo de lepidópteros está pronto a bater asas ferozmente para arrefecer as suas tarefas mais vermelhas! Aumenta Constituição, Inteligência e Força em <%= attrs %> cada. Armário Encantado: Conjunto do Traje Tremulante (Item 3 de 3).", - "weaponArmoireCobblersHammerText": "Cobbler's Hammer", + "weaponArmoireCobblersHammerText": "Martelo do Sapateiro", "weaponArmoireCobblersHammerNotes": "This hammer is specially made for leatherwork. It can do a real number on a red Daily in a pinch, though. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 2 of 3).", "armor": "armadura", "armorCapitalized": "Armadura", @@ -1524,7 +1524,7 @@ "eyewearMystery301703Notes": "Perfeita para um baile de máscaras elegante ou para se mover de forma furtiva numa multidão particularmente bem vestida. Não confere benefícios. Item de Assinante de Março de 3017.", "eyewearArmoirePlagueDoctorMaskText": "Máscara Doutor Praga", "eyewearArmoirePlagueDoctorMaskNotes": "An authentic mask worn by the doctors who battle the Plague of Procrastination. Increases Constitution and Intelligence by <%= attrs %> each. Enchanted Armoire: Plague Doctor Set (Item 2 of 3).", - "eyewearArmoireGoofyGlassesText": "Goofy Glasses", - "eyewearArmoireGoofyGlassesNotes": "Perfect for going incognito or just making your partymates giggle. Increases Perception by <%= per %>. Enchanted Armoire: Independent Item.", - "twoHandedItem": "Two-handed item." + "eyewearArmoireGoofyGlassesText": "Óculos Tontos", + "eyewearArmoireGoofyGlassesNotes": "Perfeitos para andar incógnito ou simplesmente fazer os teus colegas de equipa rir. Aumenta a Percepção em <%= per %>. Armário Encantado: Item Solto.", + "twoHandedItem": "Item de duas mãos." } \ No newline at end of file diff --git a/website/common/locales/pt/groups.json b/website/common/locales/pt/groups.json index 212703f97f..08e713e851 100644 --- a/website/common/locales/pt/groups.json +++ b/website/common/locales/pt/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tarefas a Aguardar Aprovação", "upgradeTitle": "Atualizar", "blankApprovalsDescription": "Quando o seu grupo termina tarefas que necessitam a sua aprovação, elas aparecerão aqui! Ajuste os requisitos de aprovação de uma tarefa ao editar a mesma.", - "userIsClamingTask": "\\`<%= username %> reclamou \\\"<%= task %>\\\"\\`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Aprovação Solicitada", "refreshApprovals": "Atualizar Aprovações", "refreshGroupTasks": "Atualizar Tarefas de Grupo", @@ -366,9 +366,11 @@ "recentActivity": "Atividade Recente", "myGuilds": "As minhas Guildas", "guildsDiscovery": "Descobrir Guildas", + "role": "Role", "guildOrPartyLeader": "Líder", "guildLeader": "Líder da Guilda", "member": "Membro", + "guildSize": "Guild Size", "goldTier": "Nível Dourado", "silverTier": "Nível Prateado", "bronzeTier": "Nível Bronzeado", diff --git a/website/common/locales/pt/npc.json b/website/common/locales/pt/npc.json index 239d3eb226..3cda998b42 100644 --- a/website/common/locales/pt/npc.json +++ b/website/common/locales/pt/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experiência", "amountGold": "<%= amount %> Ouro", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/pt_BR/challenge.json b/website/common/locales/pt_BR/challenge.json index dd2a21c056..f5f62ec8b5 100644 --- a/website/common/locales/pt_BR/challenge.json +++ b/website/common/locales/pt_BR/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Vencedor(a) dos seguintes desafios", "challenges": "Desafios", "challengesLink": "Desafios", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Nenhum desafio ainda, visite", "toCreate": "para criar um.", "selectWinner": "Selecione um vencedor e finalize o desafio:", @@ -23,7 +25,9 @@ "filter": "Filtro", "groups": "Times", "noNone": "Nenhum", + "category": "Category", "membership": "Associação", + "ownership": "Ownership", "participating": "Participando", "notParticipating": "Não Participando", "either": "Ambos", diff --git a/website/common/locales/pt_BR/groups.json b/website/common/locales/pt_BR/groups.json index dacc41f8f5..819dbb4666 100644 --- a/website/common/locales/pt_BR/groups.json +++ b/website/common/locales/pt_BR/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tarefas Esperando Aprovação", "upgradeTitle": "Melhora", "blankApprovalsDescription": "Quando seu grupo completa tarefas que precisam de aprovação, elas irão aparecer aqui! Ajuste os requisitos da aprovação na aba de edição da tarefa.", - "userIsClamingTask": "`<%= username %> assumiu \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Aprovação Solicitada", "refreshApprovals": "Atualizar Aprovações", "refreshGroupTasks": "Atualizar Tarefas de Grupo", @@ -366,9 +366,11 @@ "recentActivity": "Atividade Recente", "myGuilds": "Minhas Guildas", "guildsDiscovery": "Encontre Guildas", + "role": "Role", "guildOrPartyLeader": "Líder", "guildLeader": "Líder da Guilda", "member": "Membro", + "guildSize": "Guild Size", "goldTier": "Nível Ouro", "silverTier": "Nível Prata", "bronzeTier": "Nível Bronze", diff --git a/website/common/locales/pt_BR/npc.json b/website/common/locales/pt_BR/npc.json index eb96d2aa2b..33501aaa8f 100644 --- a/website/common/locales/pt_BR/npc.json +++ b/website/common/locales/pt_BR/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Itens em Destaque!", "hideLocked": "Esconder bloqueados", "hidePinned": "Esconder fixados", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> de Experiência", "amountGold": "<%= amount %> de Ouro", "namedHatchingPotion": "Poção de Eclosão <%= type %>", diff --git a/website/common/locales/ro/challenge.json b/website/common/locales/ro/challenge.json index 6a69d203a9..597e953b12 100644 --- a/website/common/locales/ro/challenge.json +++ b/website/common/locales/ro/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "A câștigat următoarele provocări:", "challenges": "Provocări", "challengesLink": "Provocări", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Nico provocare încă, vizitează", "toCreate": "pentru a crea una.", "selectWinner": "Alege un câștigător și închide provocarea:", @@ -23,7 +25,9 @@ "filter": "Filtru", "groups": "Grupuri", "noNone": "Niciunul", + "category": "Category", "membership": "Apartenență", + "ownership": "Ownership", "participating": "Participi", "notParticipating": "Nu participi", "either": "Oricare", diff --git a/website/common/locales/ro/groups.json b/website/common/locales/ro/groups.json index 0b4f45d650..3e99b3f40f 100644 --- a/website/common/locales/ro/groups.json +++ b/website/common/locales/ro/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/ro/npc.json b/website/common/locales/ro/npc.json index 1cae2f5303..a6b3136492 100644 --- a/website/common/locales/ro/npc.json +++ b/website/common/locales/ro/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/ru/challenge.json b/website/common/locales/ru/challenge.json index c9ca046e27..49fc884c34 100644 --- a/website/common/locales/ru/challenge.json +++ b/website/common/locales/ru/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Победитель следующих испытаний", "challenges": "Испытания", "challengesLink": "Испытания", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Пока нет доступных испытаний, посетите", "toCreate": "для создания нового.", "selectWinner": "Выбрать победителя и закрыть испытание:", @@ -23,7 +25,9 @@ "filter": "Фильтр", "groups": "Группы", "noNone": "Очистить", + "category": "Category", "membership": "Членство", + "ownership": "Ownership", "participating": "Участвую", "notParticipating": "Не участвую", "either": "Все", diff --git a/website/common/locales/ru/gear.json b/website/common/locales/ru/gear.json index 7eda95c0b9..0b3cbd7ba3 100644 --- a/website/common/locales/ru/gear.json +++ b/website/common/locales/ru/gear.json @@ -334,7 +334,7 @@ "weaponArmoireScepterOfDiamondsNotes": "Это скипетр светит теплым красным светом и наполняет вас силой воли. Увеличивает силу на <%= str %>. Зачарованный сундук: Набор Бубнового короля (Предмет 3 из 3).", "weaponArmoireFlutteryArmyText": "Порхающая армия", "weaponArmoireFlutteryArmyNotes": "Эта группа пестрых чешуекрылых готова махать неистово и охладить ваши самые красные задачи! Увеличивает силу, интеллект и телосложение на <%= attrs %> каждое. Зачарованный сундук: Набор порхающего платья (предмет 3 из 3).", - "weaponArmoireCobblersHammerText": "Cobbler's Hammer", + "weaponArmoireCobblersHammerText": "Молоток Башмачника", "weaponArmoireCobblersHammerNotes": "This hammer is specially made for leatherwork. It can do a real number on a red Daily in a pinch, though. Increases Constitution and Strength by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 2 of 3).", "armor": "Броня", "armorCapitalized": "Броня", @@ -718,7 +718,7 @@ "armorArmoireRobeOfDiamondsNotes": "Эти королевская мантия не только заставляют вас казаться благородным, она позволяет увидеть благородство в других. Увеличивает восприятие на <%= per %>. Зачарованный сундук: Набор Бубнового короля (предмет 1 из 3).", "armorArmoireFlutteryFrockText": "Порхающее платье", "armorArmoireFlutteryFrockNotes": "Легкое и воздушное платье с широкой юбкой, которую бабочки могут ошибочно принять за большое соцветие! Увеличивает телосложение, восприятие и силу на <%= attrs %> каждое. Зачарованный сундук: Набор порхающего платья (предмет 1 из 3).", - "armorArmoireCobblersCoverallsText": "Cobbler's Coveralls", + "armorArmoireCobblersCoverallsText": "Костюм Башмачника", "armorArmoireCobblersCoverallsNotes": "These sturdy coveralls have lots of pockets for tools, leather scraps, and other useful items! Increases Perception and Strength by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 1 of 3).", "headgear": "Головной убор", "headgearCapitalized": "Головной убор", @@ -1326,8 +1326,8 @@ "shieldArmoireShieldOfDiamondsNotes": "Этот светящийся щит не только защищает, но и подкрепляет вашу стойкость! Повышает Телосложение на <%= con %>. Зачарованный сундук: независимый предмет", "shieldArmoireFlutteryFanText": "Витиеватый веер", "shieldArmoireFlutteryFanNotes": "В жаркий денек ничто не сравнится с узорчатым веером в способности сохранять владельца хладнокровным умом и телом. Повышает Телосложение, Интеллект и Восприятие на <%= attrs %>. Зачарованный сундук: независимый предмет. ", - "shieldArmoireFancyShoeText": "Fancy Shoe", - "shieldArmoireFancyShoeNotes": "A very special shoe you're working on. It's fit for royalty! Increases Intelligence and Perception by <%= attrs %> each. Enchanted Armoire: Cobbler Set (Item 3 of 3).", + "shieldArmoireFancyShoeText": "Стильный башмак", + "shieldArmoireFancyShoeNotes": "Очень особенный башмак, над которым вы работаете. Он отлично смотрится с вашем величием! Увеличивает Интеллект и Восприятие на <%= attrs %>. Зачарованный сундук: Набор Сапожника (предмет 3 из 3).", "back": "Аксессуар на спину", "backCapitalized": "Аксессуар на спину", "backBase0Text": "Нет аксессуаров на спине", diff --git a/website/common/locales/ru/groups.json b/website/common/locales/ru/groups.json index 8c76e58259..c8070c75d2 100644 --- a/website/common/locales/ru/groups.json +++ b/website/common/locales/ru/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Задачи, ожидающие подтверждения", "upgradeTitle": "Перейти", "blankApprovalsDescription": "Когда ваша группа выполнит задачи, требующие вашего подтверждения, они появятся здесь! Измените настройки подтверждения в редакторе задачи.", - "userIsClamingTask": "<%= username %> взял на исполнение задачу \"<%= task %>\"", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Запрошено подтверждение", "refreshApprovals": "Обновить подтверждения", "refreshGroupTasks": "Обновить групповые задачи", @@ -366,9 +366,11 @@ "recentActivity": "Недавние действия", "myGuilds": "Мои гильдии", "guildsDiscovery": "Найти гильдии", + "role": "Role", "guildOrPartyLeader": "Предводитель", "guildLeader": "Глава гильдии", "member": "Участник", + "guildSize": "Guild Size", "goldTier": "Золотой ранг", "silverTier": "Серебряный ранг", "bronzeTier": "Бронзовый ранг", diff --git a/website/common/locales/ru/npc.json b/website/common/locales/ru/npc.json index e6cc2611bb..5f14ec5483 100644 --- a/website/common/locales/ru/npc.json +++ b/website/common/locales/ru/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Особенные предметы!", "hideLocked": "Скрыть заблокированное", "hidePinned": "Скрыть закреплённое", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> опыта", "amountGold": "<%= amount %> золота", "namedHatchingPotion": "<%= type %> инкубационный эликсир", diff --git a/website/common/locales/sk/challenge.json b/website/common/locales/sk/challenge.json index 089c4631aa..88d62e4c21 100644 --- a/website/common/locales/sk/challenge.json +++ b/website/common/locales/sk/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "sa stal víťazom nasledujúcich výziev", "challenges": "Výzvy", "challengesLink": "Výzvy", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Zatial žiadne výzvy, choď na", "toCreate": "ak chceš nejakú vytvoriť.", "selectWinner": "Vyber víťaza a uzavri výzvu:", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Skupiny", "noNone": "Žiadne", + "category": "Category", "membership": "Členstvo", + "ownership": "Ownership", "participating": "Zúčastnený", "notParticipating": "Nezúčastnený", "either": "Oboje", diff --git a/website/common/locales/sk/groups.json b/website/common/locales/sk/groups.json index b092aa9f79..1dffab5313 100644 --- a/website/common/locales/sk/groups.json +++ b/website/common/locales/sk/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/sk/npc.json b/website/common/locales/sk/npc.json index f8301f3833..01c5b83de7 100644 --- a/website/common/locales/sk/npc.json +++ b/website/common/locales/sk/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Špeciálne Predmety!", "hideLocked": "Ukry zamknuté", "hidePinned": "Ukry pripnuté", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %>Skúseností", "amountGold": "<%= amount %>Zlata", "namedHatchingPotion": "<%= type %>Liahoxír", diff --git a/website/common/locales/sr/challenge.json b/website/common/locales/sr/challenge.json index 18c0f5fde6..de9a02b8cb 100644 --- a/website/common/locales/sr/challenge.json +++ b/website/common/locales/sr/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Pobednik u sledećim izazovima", "challenges": "Izazovi", "challengesLink": "Challenges", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Nema izazova, posetite", "toCreate": "da biste napravili izazov.", "selectWinner": "Odaberite pobednika i završite izazov:", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Grupe", "noNone": "Nijedna", + "category": "Category", "membership": "Prikazati", + "ownership": "Ownership", "participating": "Gde učestvujem", "notParticipating": "Gde ne učestvujem", "either": "Oba", diff --git a/website/common/locales/sr/groups.json b/website/common/locales/sr/groups.json index 8a1a832de0..50dd0960a7 100644 --- a/website/common/locales/sr/groups.json +++ b/website/common/locales/sr/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/sr/npc.json b/website/common/locales/sr/npc.json index d7ef0d3c4e..fbdd617d6f 100644 --- a/website/common/locales/sr/npc.json +++ b/website/common/locales/sr/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/sv/challenge.json b/website/common/locales/sv/challenge.json index 1b3ea24dba..3ae8d5f831 100644 --- a/website/common/locales/sv/challenge.json +++ b/website/common/locales/sv/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Var vinnaren av de följande utmaningarna", "challenges": "Utmaningar", "challengesLink": "Utmaningar", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Inga utmaningar ännu, gå till", "toCreate": "för att skapa en.", "selectWinner": "Välj en vinnare och avsluta utmaningen:", @@ -23,7 +25,9 @@ "filter": "Filter", "groups": "Grupper", "noNone": "Ingen", + "category": "Category", "membership": "Medlemskap", + "ownership": "Ownership", "participating": "Deltar", "notParticipating": "Deltar inte", "either": "Vilket som", diff --git a/website/common/locales/sv/content.json b/website/common/locales/sv/content.json index bec0909471..0f75068d39 100644 --- a/website/common/locales/sv/content.json +++ b/website/common/locales/sv/content.json @@ -5,54 +5,54 @@ "armoireNotesFull": "Öppna vapenskåpet för att få en slumpmässig specialutrustning, erfarenhet eller mat! Utrustningsdelar som finns kvar:", "armoireLastItem": "Du har hittat den sista ovanliga utrustningen i det förtrollade vapenskåpet.", "armoireNotesEmpty": "Klädskåpet kommer att ha ny utrustning den första veckan varje månad. Tills dess kan du fortsätta klicka för erfarenhet och mat!", - "dropEggWolfText": "varg", + "dropEggWolfText": "Varg", "dropEggWolfMountText": "Varg", "dropEggWolfAdjective": "en lojal", - "dropEggTigerCubText": "tigerunge", + "dropEggTigerCubText": "Tigerunge", "dropEggTigerCubMountText": "tiger", - "dropEggTigerCubAdjective": "vild", - "dropEggPandaCubText": "pandaunge", - "dropEggPandaCubMountText": "panda", - "dropEggPandaCubAdjective": "lugn", - "dropEggLionCubText": "lejonunge", - "dropEggLionCubMountText": "lejon", + "dropEggTigerCubAdjective": "en vild", + "dropEggPandaCubText": "Pandaunge", + "dropEggPandaCubMountText": "Panda", + "dropEggPandaCubAdjective": "en lugn", + "dropEggLionCubText": "Lejonunge", + "dropEggLionCubMountText": "Lejon", "dropEggLionCubAdjective": "kunglig", - "dropEggFoxText": "räv", + "dropEggFoxText": "Räv", "dropEggFoxMountText": "Räv", - "dropEggFoxAdjective": "lömsk", - "dropEggFlyingPigText": "flygande gris", + "dropEggFoxAdjective": "en lömsk", + "dropEggFlyingPigText": "Flygande gris", "dropEggFlyingPigMountText": "Flygande Gris", - "dropEggFlyingPigAdjective": "nyckfull", - "dropEggDragonText": "drake", + "dropEggFlyingPigAdjective": "en nyckfull", + "dropEggDragonText": "Drake", "dropEggDragonMountText": "Drake", - "dropEggDragonAdjective": "mäktig", - "dropEggCactusText": "kaktus", + "dropEggDragonAdjective": "en mäktig", + "dropEggCactusText": "Kaktus", "dropEggCactusMountText": "Kaktus", "dropEggCactusAdjective": "retlig", - "dropEggBearCubText": "björnunge", - "dropEggBearCubMountText": "björn", + "dropEggBearCubText": "Björnunge", + "dropEggBearCubMountText": "Björn", "dropEggBearCubAdjective": "en modig", "questEggGryphonText": "Grip", "questEggGryphonMountText": "Grip", - "questEggGryphonAdjective": "stolt", - "questEggHedgehogText": "igelkott", + "questEggGryphonAdjective": "en stolt", + "questEggHedgehogText": "Igelkott", "questEggHedgehogMountText": "Igelkott", - "questEggHedgehogAdjective": "taggig", - "questEggDeerText": "hjort", + "questEggHedgehogAdjective": "en taggig", + "questEggDeerText": "Hjort", "questEggDeerMountText": "Hjort", - "questEggDeerAdjective": "elegant", - "questEggEggText": "ägg", - "questEggEggMountText": "äggkorg", - "questEggEggAdjective": "ärgglad", - "questEggRatText": "råtta", + "questEggDeerAdjective": "en elegant", + "questEggEggText": "Ägg", + "questEggEggMountText": "Äggkorg", + "questEggEggAdjective": "en färgglad", + "questEggRatText": "Råtta", "questEggRatMountText": "Råtta", "questEggRatAdjective": "en social", - "questEggOctopusText": "bläckfisk", + "questEggOctopusText": "Bläckfisk", "questEggOctopusMountText": "Bläckfisk", - "questEggOctopusAdjective": "slemmig", - "questEggSeahorseText": "sjöhäst", + "questEggOctopusAdjective": "en slemmig", + "questEggSeahorseText": "Sjöhäst", "questEggSeahorseMountText": "Sjöhäst", - "questEggSeahorseAdjective": "vinst", + "questEggSeahorseAdjective": "en vinst", "questEggParrotText": "papegoja", "questEggParrotMountText": "Papegoja", "questEggParrotAdjective": "livfull", @@ -79,10 +79,10 @@ "questEggBunnyAdjective": "gosig", "questEggSlimeText": "Marshmallowslem", "questEggSlimeMountText": "Marshmallowslem", - "questEggSlimeAdjective": "söt", + "questEggSlimeAdjective": "en söt", "questEggSheepText": "Får", "questEggSheepMountText": "Får", - "questEggSheepAdjective": "ullig", + "questEggSheepAdjective": "en ullig", "questEggCuttlefishText": "Bläckfisk", "questEggCuttlefishMountText": "Bläckfisk", "questEggCuttlefishAdjective": "kelig", @@ -115,13 +115,13 @@ "questEggSnailAdjective": "en långsam men stadig", "questEggFalconText": "Falk", "questEggFalconMountText": "Falk", - "questEggFalconAdjective": "snabbt", + "questEggFalconAdjective": "en snabb", "questEggTreelingText": "Trädling", "questEggTreelingMountText": "Trädling", "questEggTreelingAdjective": "en lövaktig", "questEggAxolotlText": "Axolotl", "questEggAxolotlMountText": "Axolotl", - "questEggAxolotlAdjective": "lite", + "questEggAxolotlAdjective": "en liten", "questEggTurtleText": "Havssköldpadda", "questEggTurtleMountText": "Gigantisk Havssköldpadda", "questEggTurtleAdjective": "en fridfull", @@ -149,7 +149,7 @@ "questEggPeacockText": "Påfågel", "questEggPeacockMountText": "Påfågel", "questEggPeacockAdjective": "en dansande", - "questEggButterflyText": "Fjärilslarv\n", + "questEggButterflyText": "Fjärilslarv", "questEggButterflyMountText": "Fjäril", "questEggButterflyAdjective": "en söt", "questEggNudibranchText": "Nakensnäcka", @@ -167,8 +167,8 @@ "questEggBadgerText": "Grävling", "questEggBadgerMountText": "Grävling", "questEggBadgerAdjective": "bustling", - "questEggSquirrelText": "Squirrel", - "questEggSquirrelMountText": "Squirrel", + "questEggSquirrelText": "Ekorre", + "questEggSquirrelMountText": "Ekorre", "questEggSquirrelAdjective": "bushy-tailed", "eggNotes": "Hitta en kläckningsdryck och häll på det här ägget så kommer det kläckas till <%= eggAdjective(locale) %> <%= eggText(locale) %>.", "hatchingPotionBase": "Standard", @@ -180,8 +180,8 @@ "hatchingPotionZombie": "Zombie", "hatchingPotionCottonCandyPink": "Ljusrosa", "hatchingPotionCottonCandyBlue": "Ljusblå", - "hatchingPotionGolden": "Guld", - "hatchingPotionSpooky": "läskig", + "hatchingPotionGolden": "Guldig", + "hatchingPotionSpooky": "Läskig", "hatchingPotionPeppermint": "Pepparmint", "hatchingPotionFloral": "Blommig", "hatchingPotionAquatic": "Akvatisk", @@ -194,7 +194,7 @@ "hatchingPotionShimmer": "Skimmer", "hatchingPotionFairy": "Älva", "hatchingPotionStarryNight": "Stjärnklar Natt", - "hatchingPotionRainbow": "Rainbow", + "hatchingPotionRainbow": "Regnbåge", "hatchingPotionNotes": "Häll den här på ett ägg, så kläcks det som ett <%= potText(locale) %> husdjur.", "premiumPotionAddlNotes": "Kan ej användas på ägg till uppdragshusdjur", "foodMeat": "Kött", @@ -221,7 +221,7 @@ "foodCottonCandyPink": "Rosa sockervadd", "foodCottonCandyPinkThe": "Den rosa sockervadden", "foodCottonCandyPinkA": "Rosa Sockervadd", - "foodCottonCandyBlue": "Blå sockervadd", + "foodCottonCandyBlue": "Blå Sockervadd", "foodCottonCandyBlueThe": "Den blåa sockervadden", "foodCottonCandyBlueA": "Blå Sockervadd", "foodHoney": "Honung", @@ -260,7 +260,7 @@ "foodCandySkeleton": "Bengodis", "foodCandySkeletonThe": "the Bare Bones Candy", "foodCandySkeletonA": "Bare Bones Candy", - "foodCandyBase": "Standardgodis", + "foodCandyBase": "Vanligt Godis", "foodCandyBaseThe": "the Basic Candy", "foodCandyBaseA": "Vanligt Godis", "foodCandyCottonCandyBlue": "Sur Blå Godisbit", diff --git a/website/common/locales/sv/groups.json b/website/common/locales/sv/groups.json index 371b9c44fd..d3209b0787 100644 --- a/website/common/locales/sv/groups.json +++ b/website/common/locales/sv/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Uppgifter Avvaktar Godkännande", "upgradeTitle": "Uppgradera", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> har gjort anspråk på \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Godkännande Ansökt", "refreshApprovals": "Ladda Om Godkännanden", "refreshGroupTasks": "Ladda om Gruppuppgifter", @@ -366,9 +366,11 @@ "recentActivity": "Nylig Aktivitet", "myGuilds": "Mina gillen", "guildsDiscovery": "Upptäck Gillen", + "role": "Role", "guildOrPartyLeader": "Ledare", "guildLeader": "Gilleledare", "member": "Medlem", + "guildSize": "Guild Size", "goldTier": "Guldrank", "silverTier": "Silverrank", "bronzeTier": "Bronsrank", diff --git a/website/common/locales/sv/npc.json b/website/common/locales/sv/npc.json index 9fe6a06b4a..ae0c111f77 100644 --- a/website/common/locales/sv/npc.json +++ b/website/common/locales/sv/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Utvalda Objekt!", "hideLocked": "Göm låsta", "hidePinned": "Göm fastnålade objekt", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Erfarenhet", "amountGold": "<%= amount %> Guld", "namedHatchingPotion": "<%= type %> Kläckningsdryck", diff --git a/website/common/locales/tr/challenge.json b/website/common/locales/tr/challenge.json index 0910951d0a..54c6065418 100644 --- a/website/common/locales/tr/challenge.json +++ b/website/common/locales/tr/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Takip eden mücadelelerin kazanı", "challenges": "Mücadeleler", "challengesLink": "Mücadeleler", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Henüz mücadele yok, yeni bir tane oluşturmak için", "toCreate": "sekmesini ziyaret et.", "selectWinner": "Kazananı seç ve mücadeleyi bitir:", @@ -23,7 +25,9 @@ "filter": "Filtrele", "groups": "Gruplar", "noNone": "Hiçbiri", + "category": "Category", "membership": "Üyelik", + "ownership": "Ownership", "participating": "Üye Oldukların", "notParticipating": "Üye Olmadıkların", "either": "Tümü", diff --git a/website/common/locales/tr/groups.json b/website/common/locales/tr/groups.json index 3e2d7ecdc3..df52387ea4 100644 --- a/website/common/locales/tr/groups.json +++ b/website/common/locales/tr/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Onay Bekleyen İşler", "upgradeTitle": "Yükselt", "blankApprovalsDescription": "Grubun senin onayını bekleyen bir işi bitirdiğinde, iş burada belirir! İş düzenleme kısmından onay gereksinimini ayarlayabilirsin.", - "userIsClamingTask": "`<%= username %>, \"<%= task %>\" üzerinde çalışmaya başladı", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Onay Talebi Gönderildi", "refreshApprovals": "Onayları Yenile", "refreshGroupTasks": "Grup İşlerini Yenile", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Üye", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/tr/npc.json b/website/common/locales/tr/npc.json index 03762d8596..13dce55866 100644 --- a/website/common/locales/tr/npc.json +++ b/website/common/locales/tr/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Öne Çıkan Eşyalar!", "hideLocked": "Kilidi açılmamış olanları gizle", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %>tecrübe", "amountGold": "<%= amount %>Altın", "namedHatchingPotion": "<%= type %>Kuluçka İksiri", diff --git a/website/common/locales/uk/challenge.json b/website/common/locales/uk/challenge.json index 6457f2495f..e91a2f20e9 100644 --- a/website/common/locales/uk/challenge.json +++ b/website/common/locales/uk/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "Подолав такі випробування", "challenges": "Випробування", "challengesLink": "Випробування", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "Ще немає випробувань, відвідайте", "toCreate": "аби створити одне.", "selectWinner": "Обрати переможця та закрити випробування:", @@ -23,7 +25,9 @@ "filter": "Вибірка", "groups": "Ватагами", "noNone": "Жодного", + "category": "Category", "membership": "Членство", + "ownership": "Ownership", "participating": "Бере участь", "notParticipating": "Не бере участь", "either": "Будь-хто", diff --git a/website/common/locales/uk/faq.json b/website/common/locales/uk/faq.json index c18de21362..bc12efcc3c 100644 --- a/website/common/locales/uk/faq.json +++ b/website/common/locales/uk/faq.json @@ -33,9 +33,9 @@ "androidFaqAnswer7": "На рівні 10 ви можете стати воїном, магом, розбійником або цілителем. (Усі гравці починають як воїни за замовчуванням.) Кожен клас має різні варіанти обладнання, різні навички, які вони можуть чаклувати після рівня 11, та різні переваги. Воїни можуть легко пошкодити босів, витримувати більше пошкоджень від своїх завдань і допомогти зробити свій гурт прочнішим. Маги можуть також легко пошкодити босів, а також швидко отримувати новий рівень і відновлювати Ману для свого гурту. Розбійники заробляють найбільше золота і отримують найбільшу кількість випадань, і вони можуть допомогти своїй партії зробити те ж саме. Нарешті, Цілителі можуть зцілити себе та членів свого гурту. Якщо ви не бажаєте негайно вибирати клас - наприклад, якщо ви все ще працюєте, щоб придбати все спорядження вашого поточного класу, ви можете натиснути кнопку \"Вирішити Пізніше\" та вибрати пізніше в Меню > Вибрати клас.", "webFaqAnswer7": "На рівні 10 ви можете стати воїном, магом, розбійником або цілителем. (Усі гравці починають як воїни за замовчуванням.) Кожен клас має різні варіанти обладнання, різні навички, які вони можуть чаклувати після рівня 11, та різні переваги. Воїни можуть легко пошкодити босів, витримувати більше пошкоджень від своїх завдань і допомогти зробити свій гурт прочнішим. Маги можуть також легко пошкодити босів, а також швидко отримувати новий рівень і відновлювати Ману для свого гурту. Розбійники заробляють найбільше золота і отримують найбільшу кількість випадань, і вони можуть допомогти своїй партії зробити те ж саме. Нарешті, Цілителі можуть зцілити себе та членів свого гурту. Якщо ви не бажаєте негайно вибирати клас - наприклад, якщо ви все ще працюєте, щоб придбати все спорядження вашого поточного класу, ви можете натиснути кнопку \"Вирішити Пізніше\" та повторно активувати класи у Налаштуваннях.", "faqQuestion8": "Що це за голубий показник, котрий з'являється в заголовках після 10 рівня?", - "iosFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 under Menu > Use Skills. Unlike your health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete Good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", - "androidFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 under Menu > Skills. Unlike your health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete Good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", - "webFaqAnswer8": "The blue bar that appeared when you hit level 10 and chose a Class is your Mana bar. As you continue to level up, you will unlock special Skills that cost Mana to use. Each Class has different Skills, which appear after level 11 in the action bar at the bottom of the screen. Unlike your Health bar, your Mana bar does not reset when you gain a level. Instead, Mana is gained when you complete good Habits, Dailies, and To-Dos, and lost when you indulge bad Habits. You'll also regain some Mana overnight -- the more Dailies you completed, the more you will gain.", + "iosFaqAnswer8": "Синя смужка, яка з'явиться, коли ви отримаєте рівень 10 і виберете клас, - це ваша смужка Мани. Коли ви продовжуєте отримувати нові рівні, ви розблокуєте спеціальні навички, для використання яких потрібна Мана. Кожен клас має різні навички, які з'являються після рівня 11 в Меню > Навички. На відміну від смужки здоров'я, смужка Мани не скидається, коли ви отримуєте рівень. Замість цього, Мана отримується, коли ви виконуєте Добрі звички, Щоденні Завдання та Задачі, і втрачаєте, коли зловживаєте поганими звичками. Ви також отримаєте Ману за ніч - чим більше Щоденних Завдань ви завершите, тим більше ви отримаєте.", + "androidFaqAnswer8": "Синя смужка, яка з'явиться, коли ви отримаєте рівень 10 і виберете клас, - це ваша смужка Мани. Коли ви продовжуєте отримувати нові рівні, ви розблокуєте спеціальні навички, для використання яких потрібна Мана. Кожен клас має різні навички, які з'являються після рівня 11 в Меню > Навички. На відміну від смужки здоров'я, смужка Мани не скидається, коли ви отримуєте рівень. Замість цього, Мана отримується, коли ви виконуєте Добрі звички, Щоденні Завдання та Задачі, і втрачаєте, коли зловживаєте поганими звичками. Ви також отримаєте Ману за ніч - чим більше Щоденних Завдань ви завершите, тим більше ви отримаєте.", + "webFaqAnswer8": "Синя смужка, яка з'явиться, коли ви отримаєте рівень 10 і виберете клас, - це ваша смужка Мани. Коли ви продовжуєте отримувати нові рівні, ви розблокуєте спеціальні навички, для використання яких потрібна Мана. Кожен клас має різні навички, які з'являються після рівня 11 у активній панель знизу екрану. На відміну від смужки здоров'я, смужка Мани не скидається, коли ви отримуєте рівень. Замість цього, Мана отримується, коли ви виконуєте Добрі звички, Щоденні Завдання та Задачі, і втрачаєте, коли зловживаєте поганими звичками. Ви також отримаєте Ману за ніч - чим більше Щоденних Завдань ви завершите, тим більше ви отримаєте.", "faqQuestion9": "Як боротися з монстрами та приймати участь в квестах?", "iosFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", "androidFaqAnswer9": "First, you need to join or start a Party (see above). Although you can battle monsters alone, we recommend playing in a group, because this will make Quests much easier. Plus, having a friend to cheer you on as you accomplish your tasks is very motivating!\n\n Next, you need a Quest Scroll, which are stored under Menu > Items. There are three ways to get a scroll:\n\n - At level 15, you get a Quest-line, aka three linked quests. More Quest-lines unlock at levels 30, 40, and 60 respectively. \n - When you invite people to your Party, you'll be rewarded with the Basi-List Scroll!\n - You can buy Quests from the Quests Shop for Gold and Gems.\n\n To battle the Boss or collect items for a Collection Quest, simply complete your tasks normally, and they will be tallied into damage overnight. (Reloading by pulling down on the screen may be required to see the Boss's health bar go down.) If you are fighting a Boss and you missed any Dailies, the Boss will damage your Party at the same time that you damage the Boss. \n\n After level 11 Mages and Warriors will gain Skills that allow them to deal additional damage to the Boss, so these are excellent classes to choose at level 10 if you want to be a heavy hitter.", @@ -45,7 +45,7 @@ "androidFaqAnswer10": "Gems are purchased with real money by tapping on the Gem icon in the header. When people buy Gems, they are helping us to keep the site running. We're very grateful for their support!\n\n In addition to buying Gems directly, there are three other ways players can gain Gems:\n\n * Win a Challenge that has been set up by another player. Go to Social > Challenges to join some.\n * Subscribe and unlock the ability to buy a certain number of Gems per month.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica).\n\n Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the app without them!", "webFaqAnswer10": "Gems are purchased with real money, although [subscribers](https://habitica.com/user/settings/subscription) can purchase them with Gold. When people subscribe or buy Gems, they are helping us to keep the site running. We're very grateful for their support! In addition to buying Gems directly or becoming a subscriber, there are two other ways players can gain Gems:\n* Win a Challenge that has been set up by another player. Go to Challenges > Discover Challenges to join some.\n * Contribute your skills to the Habitica project. See this wiki page for more details: [Contributing to Habitica](http://habitica.wikia.com/wiki/Contributing_to_Habitica). Keep in mind that items purchased with Gems do not offer any statistical advantages, so players can still make use of the site without them!", "faqQuestion11": "Як повідомити про помилку чи запропонувати нову функцію?", - "iosFaqAnswer11": "You can report a bug, request a feature, or send feedback under Menu > About > Report a Bug and Menu > About > Send Feedback! We'll do everything we can to assist you.", + "iosFaqAnswer11": "Ви можете повідомити про помилку,запросити нову функцію або надіслати відгук у Меню\"> Про проект> \"Повідомити про помилку\" та Меню > Про проект> Надіслати відгук! Ми зробимо все можливе, щоб допомогти вам.", "androidFaqAnswer11": "You can report a bug, request a feature, or send feedback under About > Report a Bug and About > Send us Feedback! We'll do everything we can to assist you.", "webFaqAnswer11": "To report a bug, go to [Help > Report a Bug](https://habitica.com/groups/guild/a29da26b-37de-4a71-b0c6-48e72a900dac) and read the points above the chat box. If you're unable to log in to Habitica, send your login details (not your password!) to [<%= techAssistanceEmail %>](<%= wikiTechAssistanceEmail %>). Don't worry, we'll get you fixed up soon! Feature requests are collected on Trello. Go to [Help > Request a Feature](https://trello.com/c/odmhIqyW/440-read-first-table-of-contents) and follow the instructions. Ta-da!", "faqQuestion12": "Як боротися зі світовими босами?", diff --git a/website/common/locales/uk/groups.json b/website/common/locales/uk/groups.json index 9ffb4ceecc..7b27a019b7 100644 --- a/website/common/locales/uk/groups.json +++ b/website/common/locales/uk/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "Мої ґільдії", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/uk/npc.json b/website/common/locales/uk/npc.json index 368da290d0..cd0fb8b57f 100644 --- a/website/common/locales/uk/npc.json +++ b/website/common/locales/uk/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", diff --git a/website/common/locales/zh/challenge.json b/website/common/locales/zh/challenge.json index 4953bb2d5a..a69a79abea 100644 --- a/website/common/locales/zh/challenge.json +++ b/website/common/locales/zh/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "赢得了以下挑战", "challenges": "挑战", "challengesLink": "挑戰", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "还没有挑战,在", "toCreate": "这里建立一个。", "selectWinner": "选择一位赢家然后结束挑战:", @@ -23,7 +25,9 @@ "filter": "过滤器", "groups": "小组", "noNone": "全不选", + "category": "Category", "membership": "参与状态", + "ownership": "Ownership", "participating": "正在参与", "notParticipating": "未参与", "either": "都显示", diff --git a/website/common/locales/zh/communityguidelines.json b/website/common/locales/zh/communityguidelines.json index 721a439258..15d4c5f6e6 100644 --- a/website/common/locales/zh/communityguidelines.json +++ b/website/common/locales/zh/communityguidelines.json @@ -34,15 +34,15 @@ "commGuideHeadingPublicGuilds": "公共公会", "commGuidePara029": "公开的公会就像酒馆,只是除了一般讨论外,他们有一个关注的主题 。公会聊天应该聚焦在这个主题上。例如 语言大师公会 如果突然专注起园艺而不是写作,这个公会就会被取消;或者 龙的发烧友公会 对解密古老卢恩文字就不会有兴趣。一些公会对这样要求比较宽松,但整体而言,尽量不要跑题 !", "commGuidePara031": "一些公开的公会可能包含敏感话题,比如关于抑郁、宗教或政治的话题。只要不违反条款与条件,以及公共空间准则,并将讨论限制在话题范围内,这些讨论是不被限制的。", - "commGuidePara033": "Public Guilds may NOT contain 18+ content. If they plan to regularly discuss sensitive content, they should say so in the Guild description. This is to keep Habitica safe and comfortable for everyone.", - "commGuidePara035": "If the Guild in question has different kinds of sensitive issues, it is respectful to your fellow Habiticans to place your comment behind a warning (ex. \"Warning: references self-harm\"). These may be characterized as trigger warnings and/or content notes, and Guilds may have their own rules in addition to those given here. If possible, please use markdown to hide the potentially sensitive content below line breaks so that those who may wish to avoid reading it can scroll past it without seeing the content. Habitica staff and moderators may still remove this material at their discretion.", - "commGuidePara036": "Additionally, the sensitive material should be topical -- bringing up self-harm in a Guild focused on fighting depression may make sense, but is probably less appropriate in a music Guild. If you see someone who is repeatedly violating this guideline, especially after several requests, please flag the posts and notify the moderators via the Moderator Contact Form.", - "commGuidePara037": "No Guilds, Public or Private, should be created for the purpose of attacking any group or individual. Creating such a Guild is grounds for an instant ban. Fight bad habits, not your fellow adventurers!", - "commGuidePara038": "All Tavern Challenges and Public Guild Challenges must comply with these rules as well.", + "commGuidePara033": " 公开公会不能含有18禁内容。如果打算在里面定期地讨论这些敏感内容,应该在公会名称上标明。 这条规定是为了让所有玩家安全舒适的进行游戏。", + "commGuidePara035": " 如果一个可疑的公会里包含了不同种类的敏感议题,请尊重你的小伙伴,在警告后面加以注明(例如\"警告:里面含有自残内容\")。这些将会被定性为触发警告或是有备注的内容,除了既定的规则之外管理者可以定制自己的规则。如果可以的话,请使用 Markdown语法 来隐藏换行符下的潜在敏感内容,以便那些希望避免阅读该内容的人不会在滚动阅读时看见该内容。Habitica工作人员和管理员可以自行决定保留或移除这些内容。", + "commGuidePara036": "另外,敏感成份必须和主题有关——在对抗抑郁症的公会里谈到自残是可理解的,但在音乐公会里谈就不适当了。如果你看到有人一直违反社区准则,屡劝不听的话,请举报该帖子并且通过 管理员联系表格 通知管理员。", + "commGuidePara037": " 不应该建立任何用于攻击任何团体或个人的公会,不论是公开或是私人。建立这样的公会将会被立刻封禁。对抗坏习惯,而不是你的冒险者小伙伴!", + "commGuidePara038": " 所有的酒馆挑战和公共公会的挑战也必须遵守这些规则 。", "commGuideHeadingInfractionsEtc": "违规,后果和恢复", "commGuideHeadingInfractions": "违规", "commGuidePara050": "Habiticans 互相帮助互相尊重,并努力让整个社区更有趣更友好。然而在极少数情况下,Habiticans 的所作所为可能违反以上的准则。当这种情况发生时,管理员将采取一切必要行动来保持 Habitica 的可靠和舒适。", - "commGuidePara051": "There are a variety of infractions, and they are dealt with depending on their severity. These are not comprehensive lists, and the Mods can make decisions on topics not covered here at their own discretion. The Mods will take context into account when evaluating infractions.", + "commGuidePara051": "违规形式各种各样,我们将根据其严重性进行处理。这些并不是全面的列表,管理员们可以根据自己的判断对这里未涉及的主题做出决定。 他们在评估违规时会考虑到上下文。", "commGuideHeadingSevereInfractions": "严重违规", "commGuidePara052": "严重违规极大的伤害Habitica社区和用户的安全,因此会导致严重后果。", "commGuidePara053": "下面是一些严重违规的例子。这并非一个全面的列表。", @@ -56,16 +56,16 @@ "commGuideHeadingModerateInfractions": "中度违规", "commGuidePara054": "中度违规不会威胁社区的安全,但是会让人感到不愉快。这些违规将产生中等影响。当多次违规行为加一起,后果会愈发严重。", "commGuidePara055": "以下是一些中度违规的例子。这并非一个完整列表。", - "commGuideList06A": "Ignoring, disrespecting or arguing with a Mod. This includes publicly complaining about moderators or other users, publicly glorifying or defending banned users, or debating whether or not a moderator action was appropriate. If you are concerned about one of the rules or the behaviour of the Mods, please contact the staff via email (admin@habitica.com).", - "commGuideList06B": "Backseat Modding. To quickly clarify a relevant point: A friendly mention of the rules is fine. Backseat modding consists of telling, demanding, and/or strongly implying that someone must take an action that you describe to correct a mistake. You can alert someone to the fact that they have committed a transgression, but please do not demand an action -- for example, saying, \"Just so you know, profanity is discouraged in the Tavern, so you may want to delete that,\" would be better than saying, \"I'm going to have to ask you to delete that post.\"", - "commGuideList06C": "Intentionally flagging innocent posts.", - "commGuideList06D": "Repeatedly Violating Public Space Guidelines", - "commGuideList06E": "Repeatedly Committing Minor Infractions", + "commGuideList06A": "忽视,不尊重或与管理员争吵。包括公开抱怨管理员或者其他用户、公开美化被禁用户或为其辩护,或者争论一位管理员的行为是否合适。如果你对某条规则或者管理员的行为感到顾虑,请通过邮件联系工作人员 ( admin@habitica.com )。", + "commGuideList06B": "不要越俎代庖。为了快速澄清有关问题:友情地提示规则是很好的做法。越俎代庖的行为包括告知,要求和/或强烈暗示某人必须采取您描述的措施来纠正错误。你可以警告某人TA已经违规,但是请勿要求TA做什么——例如,对违规的人说:“正如你所知道的,脏话在酒馆很令人泄气,所以请你删掉它。”会比说:“我要求你必须删掉那个帖子。”好得多。", + "commGuideList06C": "恶意举报非违规帖子", + "commGuideList06D": "多次违反公共空间准则", + "commGuideList06E": "多次轻度违规", "commGuideHeadingMinorInfractions": "轻微违规", "commGuidePara056": "一旦轻度违规,违规者会受到警告,而且会受到轻微的惩罚。屡教不改,继续违规则会导致更加严重的后果。", "commGuidePara057": "以下是一些轻度违规的例子。这并非一个完整的列表。", "commGuideList07A": "初次违反公共空间准则", - "commGuideList07B": "Any statements or actions that trigger a \"Please Don't\". When a Mod has to say \"Please don't do this\" to a user, it can count as a very minor infraction for that user. An example might be \"Please don't keep arguing in favor of this feature idea after we've told you several times that it isn't feasible.\" In many cases, the Please Don't will be the minor consequence as well, but if Mods have to say \"Please Don't\" to the same user enough times, the triggering Minor Infractions will start to count as Moderate Infractions.", + "commGuideList07B": "任何触发了“请不要”的声明和行动。当管理员不得不对玩家说“请不要这样做”时,这就算作玩家一次非常小的违规。一个例子可能是“在我们多次告诉你这个功能不可行之后,请不要继续争论这个功能。”在许多例子中,“请不要”也会带来轻微的影响,但是如果管理员不得不对同一个玩家多次说\"请不要\"时,引发的轻度违规将算作中度违规。", "commGuidePara057A": "Some posts may be hidden because they contain sensitive information or might give people the wrong idea. Typically this does not count as an infraction, particularly not the first time it happens!", "commGuideHeadingConsequences": "后果", "commGuidePara058": "在Habitica——与现实生活一样——每一个行为都有一个结果,无论是一直跑步的你会变得健康,还是吃太多糖的你会蛀牙,还是一直学习的你会通过考试。", diff --git a/website/common/locales/zh/generic.json b/website/common/locales/zh/generic.json index a77289f830..1f5d762a5d 100644 --- a/website/common/locales/zh/generic.json +++ b/website/common/locales/zh/generic.json @@ -287,5 +287,5 @@ "selected": "已选择", "howManyToBuy": "你想买多少呢?", "habiticaHasUpdated": "有一個新的Habitica更新。刷新以獲取最新版本!", - "contactForm": "联系版主小组" + "contactForm": "联系管理员小组" } \ No newline at end of file diff --git a/website/common/locales/zh/groups.json b/website/common/locales/zh/groups.json index 8d35a014f2..55c1d288d1 100644 --- a/website/common/locales/zh/groups.json +++ b/website/common/locales/zh/groups.json @@ -64,7 +64,7 @@ "partyLoading3": "你的队伍正在聚集中。请稍等...", "partyLoading4": "你的队伍正在成形中。请稍等...", "systemMessage": "系统消息", - "newMsgGuild": "有<%= name %>条新消息", + "newMsgGuild": "<%= name %> 有新消息", "newMsgParty": "您的队伍 <%= name %> 有新消息", "chat": "聊天", "sendChat": "发送", @@ -316,7 +316,7 @@ "approvalsTitle": "等待被审批的任务", "upgradeTitle": "升级", "blankApprovalsDescription": "当你的小组完成了需要你审批的任务时,它们会出现在这里!在任务编辑中调整审批要求设置。", - "userIsClamingTask": "`<%= username %> 发布了 \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "同意请求", "refreshApprovals": "更新审批请求", "refreshGroupTasks": "更新组内任务", @@ -366,9 +366,11 @@ "recentActivity": "近期活动", "myGuilds": "我的公会", "guildsDiscovery": "发现公会", + "role": "Role", "guildOrPartyLeader": "会长", "guildLeader": "公会会长", "member": "成员", + "guildSize": "Guild Size", "goldTier": "金奖", "silverTier": "银奖", "bronzeTier": "铜奖", @@ -446,7 +448,7 @@ "letsMakeAccount": "首先,来注册一个账号", "nameYourGroup": "然后,给你的队伍命名", "exampleGroupName": "例如:复仇者联盟", - "exampleGroupDesc": "For those selected to join the training academy for The Avengers Superhero Initiative", + "exampleGroupDesc": "对于那些被选中加入复仇者联盟的超级英雄行动培训学院的人", "thisGroupInviteOnly": "这个队伍仅限邀请加入。", "gettingStarted": "现在加入我们", "congratsOnGroupPlan": "恭喜您创建您的新队伍! 以下是一些常见问题的答案。", diff --git a/website/common/locales/zh/npc.json b/website/common/locales/zh/npc.json index 852a7b4dd7..6a8c3d03ca 100644 --- a/website/common/locales/zh/npc.json +++ b/website/common/locales/zh/npc.json @@ -23,7 +23,7 @@ "sleepBullet4": "结算前这里会预测你对boss造成的伤害以及收集到的物品数量", "pauseDailies": "进入酒馆", "unpauseDailies": "离开酒馆", - "staffAndModerators": "工作人员和版主", + "staffAndModerators": "工作人员和管理员", "communityGuidelinesIntro": "Habitica尝试为所有年龄和背景的用户创造一个温馨的环境,特别是像在酒馆这样的公共场所。 如果您有任何问题,请咨询我们的“社区准则”", "acceptCommunityGuidelines": "我同意遵守社区指南", "daniel": "Daniel", @@ -48,6 +48,7 @@ "featuredItems": "特色商品!", "hideLocked": "隐藏未解锁的物品", "hidePinned": "隐藏固定的物品", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %>经验值", "amountGold": "<%= amount %>金币", "namedHatchingPotion": "<%= type %>瓶孵化药水", diff --git a/website/common/locales/zh/quests.json b/website/common/locales/zh/quests.json index 389589c386..a15d5a4e29 100644 --- a/website/common/locales/zh/quests.json +++ b/website/common/locales/zh/quests.json @@ -79,7 +79,7 @@ "mustLvlQuest": "你需要达到第<%= level %>级才能买这个任务!", "mustInviteFriend": "要完成这个任务,你需要邀请一个朋友加入你的队伍。现在就发出邀请吗?", "unlockByQuesting": "为了解锁这个任务,请先完成<%= title %>。", - "questConfirm": "你肯定吗?<%= questmembers %>个队伍成员中只有<%= totalmembers %>个参加了这个探索任务!当所有的成员都参加或拒绝了探索任务,探索任务将会自动开启。", + "questConfirm": "你肯定吗?你的 <%= totalmembers %> 个队伍成员中只有<%= questmembers %>个参加了这个探索任务!当所有的成员都参加或拒绝了探索任务,探索任务将会自动开启。", "sureCancel": "你是否确定要放弃这个探索任务?这将会失去所有已接受的邀请。探索任务拥有者将拿回探索任务卷轴。", "sureAbort": "你是否确定要放弃这个任务?这样做会让你的所有队员都退出这个任务,并且消除所有进度。任务卷轴将会回到任务拥有者手上。", "doubleSureAbort": "你真的真的要这样做吗?要确保他们不会讨厌你一辈子哟!", diff --git a/website/common/locales/zh_TW/challenge.json b/website/common/locales/zh_TW/challenge.json index 289f45795f..5991dd96a4 100644 --- a/website/common/locales/zh_TW/challenge.json +++ b/website/common/locales/zh_TW/challenge.json @@ -13,6 +13,8 @@ "challengeWinner": "贏得了以下挑戰", "challenges": "挑戰", "challengesLink": "挑戰", + "challengePrize": "Challenge Prize", + "endDate": "Ends", "noChallenges": "還沒有挑戰,探訪", "toCreate": "去建立一個。", "selectWinner": "選一位贏家然後結束挑戰:", @@ -23,7 +25,9 @@ "filter": "篩選", "groups": "群組", "noNone": "全不選", + "category": "Category", "membership": "參與狀態", + "ownership": "Ownership", "participating": "參與中", "notParticipating": "未參與", "either": "都顯示", diff --git a/website/common/locales/zh_TW/groups.json b/website/common/locales/zh_TW/groups.json index c6c620b8a6..50a3c213a8 100644 --- a/website/common/locales/zh_TW/groups.json +++ b/website/common/locales/zh_TW/groups.json @@ -316,7 +316,7 @@ "approvalsTitle": "Tasks Awaiting Approval", "upgradeTitle": "Upgrade", "blankApprovalsDescription": "When your group completes tasks that need your approval, they'll appear here! Adjust approval requirement settings under task editing.", - "userIsClamingTask": "`<%= username %> has claimed \"<%= task %>\"`", + "userIsClamingTask": "`<%= username %> has claimed:` <%= task %>", "approvalRequested": "Approval Requested", "refreshApprovals": "Refresh Approvals", "refreshGroupTasks": "Refresh Group Tasks", @@ -366,9 +366,11 @@ "recentActivity": "Recent Activity", "myGuilds": "My Guilds", "guildsDiscovery": "Discover Guilds", + "role": "Role", "guildOrPartyLeader": "Leader", "guildLeader": "Guild Leader", "member": "Member", + "guildSize": "Guild Size", "goldTier": "Gold Tier", "silverTier": "Silver Tier", "bronzeTier": "Bronze Tier", diff --git a/website/common/locales/zh_TW/npc.json b/website/common/locales/zh_TW/npc.json index 7497a1c8b6..3ebe138d55 100644 --- a/website/common/locales/zh_TW/npc.json +++ b/website/common/locales/zh_TW/npc.json @@ -48,6 +48,7 @@ "featuredItems": "Featured Items!", "hideLocked": "Hide locked", "hidePinned": "Hide pinned", + "hideMissing": "Hide Missing", "amountExperience": "<%= amount %> Experience", "amountGold": "<%= amount %> Gold", "namedHatchingPotion": "<%= type %> Hatching Potion", From b2edd1d932d455cbf61633abf828476ce3a86e17 Mon Sep 17 00:00:00 2001 From: Sabe Jones Date: Thu, 17 May 2018 20:58:16 +0000 Subject: [PATCH 60/76] 4.42.5 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 81dda5d3cd..77cb7b4c00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "habitica", - "version": "4.42.4", + "version": "4.42.5", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index e193e23a6a..c8c0310352 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "habitica", "description": "A habit tracker app which treats your goals like a Role Playing Game.", - "version": "4.42.4", + "version": "4.42.5", "main": "./website/server/index.js", "dependencies": { "@slack/client": "^3.8.1", From a0c51ee4ca5bb68ffacb3b35d3d1584030f37a8e Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 18 May 2018 13:42:44 +0200 Subject: [PATCH 61/76] fix(loading bar): always above other elements --- website/client/app.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/client/app.vue b/website/client/app.vue index 3f9031a071..5c87315d0e 100644 --- a/website/client/app.vue +++ b/website/client/app.vue @@ -118,7 +118,7 @@ div /* Push progress bar above modals */ #nprogress .bar { - z-index: 1043 !important; /* Must stay above nav bar */ + z-index: 1090 !important; /* Must stay above nav bar */ } .restingInn { From 3d39718048c14703c6fe6418c08b9f587ecc4a41 Mon Sep 17 00:00:00 2001 From: negue Date: Fri, 18 May 2018 17:00:39 +0200 Subject: [PATCH 62/76] Purchase API Refactoring: Spells [Gold] (#10305) * convert buySpell operation * remove purchaseWithSpell - change purchaseType 'special' to 'spells' - fix lint * fix tests * rollback 'spells' to 'special' --- .../buy/{buySpecialSpell.js => buySpell.js} | 7 ++- website/client/store/actions/shops.js | 3 +- website/common/script/ops/buy/buy.js | 9 ++-- website/common/script/ops/buy/buyQuest.js | 13 ++--- .../common/script/ops/buy/buySpecialSpell.js | 48 ------------------- website/common/script/ops/buy/buySpell.js | 47 ++++++++++++++++++ .../script/ops/buy/purchaseWithSpell.js | 12 ----- 7 files changed, 64 insertions(+), 75 deletions(-) rename test/common/ops/buy/{buySpecialSpell.js => buySpell.js} (90%) delete mode 100644 website/common/script/ops/buy/buySpecialSpell.js create mode 100644 website/common/script/ops/buy/buySpell.js delete mode 100644 website/common/script/ops/buy/purchaseWithSpell.js diff --git a/test/common/ops/buy/buySpecialSpell.js b/test/common/ops/buy/buySpell.js similarity index 90% rename from test/common/ops/buy/buySpecialSpell.js rename to test/common/ops/buy/buySpell.js index bd4b0cf22c..02d0bda6a4 100644 --- a/test/common/ops/buy/buySpecialSpell.js +++ b/test/common/ops/buy/buySpell.js @@ -1,4 +1,4 @@ -import buySpecialSpell from '../../../../website/common/script/ops/buy/buySpecialSpell'; +import {BuySpellOperation} from '../../../../website/common/script/ops/buy/buySpell'; import { BadRequest, NotFound, @@ -15,6 +15,11 @@ describe('shared.ops.buySpecialSpell', () => { let user; let analytics = {track () {}}; + function buySpecialSpell (_user, _req, _analytics) { + const buyOp = new BuySpellOperation(_user, _req, _analytics); + + return buyOp.purchase(); + } beforeEach(() => { user = generateUser(); sinon.stub(analytics, 'track'); diff --git a/website/client/store/actions/shops.js b/website/client/store/actions/shops.js index 56bbf4ac9b..1900533e1a 100644 --- a/website/client/store/actions/shops.js +++ b/website/client/store/actions/shops.js @@ -1,7 +1,6 @@ import axios from 'axios'; import buyOp from 'common/script/ops/buy/buy'; import content from 'common/script/content/index'; -import purchaseOp from 'common/script/ops/buy/purchaseWithSpell'; import hourglassPurchaseOp from 'common/script/ops/buy/hourglassPurchase'; import sellOp from 'common/script/ops/sell'; import unlockOp from 'common/script/ops/unlock'; @@ -91,7 +90,7 @@ async function buyArmoire (store, params) { export function purchase (store, params) { const quantity = params.quantity || 1; const user = store.state.user.data; - let opResult = purchaseOp(user, {params, quantity}); + let opResult = buyOp(user, {params, quantity}); return { result: opResult, diff --git a/website/common/script/ops/buy/buy.js b/website/common/script/ops/buy/buy.js index e3cb62bdca..9bcee0706e 100644 --- a/website/common/script/ops/buy/buy.js +++ b/website/common/script/ops/buy/buy.js @@ -7,7 +7,7 @@ import {BuyHealthPotionOperation} from './buyHealthPotion'; import {BuyMarketGearOperation} from './buyMarketGear'; import buyMysterySet from './buyMysterySet'; import {BuyQuestWithGoldOperation} from './buyQuest'; -import buySpecialSpell from './buySpecialSpell'; +import {BuySpellOperation} from './buySpell'; import purchaseOp from './purchase'; import hourglassPurchase from './hourglassPurchase'; import errorMessage from '../../libs/errorMessage'; @@ -70,9 +70,12 @@ module.exports = function buy (user, req = {}, analytics) { buyRes = buyOp.purchase(); break; } - case 'special': - buyRes = buySpecialSpell(user, req, analytics); + case 'special': { + const buyOp = new BuySpellOperation(user, req, analytics); + + buyRes = buyOp.purchase(); break; + } default: { const buyOp = new BuyMarketGearOperation(user, req, analytics); diff --git a/website/common/script/ops/buy/buyQuest.js b/website/common/script/ops/buy/buyQuest.js index b7e9f783b9..1fd60949fd 100644 --- a/website/common/script/ops/buy/buyQuest.js +++ b/website/common/script/ops/buy/buyQuest.js @@ -25,6 +25,10 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { user.achievements.quests.taskwoodsTerror3; } + getItemKey () { + return this.key; + } + getItemValue (item) { return item.goldValue; } @@ -61,13 +65,4 @@ export class BuyQuestWithGoldOperation extends AbstractGoldItemOperation { }), ]; } - - analyticsData () { - return { - itemKey: this.key, - itemType: 'Market', - acquireMethod: 'Gold', - goldCost: this.getItemValue(this.item.goldValue), - }; - } } diff --git a/website/common/script/ops/buy/buySpecialSpell.js b/website/common/script/ops/buy/buySpecialSpell.js deleted file mode 100644 index d63638acfd..0000000000 --- a/website/common/script/ops/buy/buySpecialSpell.js +++ /dev/null @@ -1,48 +0,0 @@ -import i18n from '../../i18n'; -import content from '../../content/index'; -import get from 'lodash/get'; -import pick from 'lodash/pick'; -import splitWhitespace from '../../libs/splitWhitespace'; -import { - BadRequest, - NotAuthorized, - NotFound, -} from '../../libs/errors'; -import errorMessage from '../../libs/errorMessage'; - -module.exports = function buySpecialSpell (user, req = {}, analytics) { - let key = get(req, 'params.key'); - let quantity = req.quantity || 1; - - if (!key) throw new BadRequest(errorMessage('missingKeyParam')); - - let item = content.special[key]; - if (!item) throw new NotFound(errorMessage('spellNotFound', {spellId: key})); - - if (user.stats.gp < item.value * quantity) { - throw new NotAuthorized(i18n.t('messageNotEnoughGold', req.language)); - } - user.stats.gp -= item.value * quantity; - - user.items.special[key] += quantity; - - if (analytics) { - analytics.track('acquire item', { - uuid: user._id, - itemKey: item.key, - itemType: 'Market', - goldCost: item.goldValue, - quantityPurchased: quantity, - acquireMethod: 'Gold', - category: 'behavior', - headers: req.headers, - }); - } - - return [ - pick(user, splitWhitespace('items stats')), - i18n.t('messageBought', { - itemText: item.text(req.language), - }, req.language), - ]; -}; diff --git a/website/common/script/ops/buy/buySpell.js b/website/common/script/ops/buy/buySpell.js new file mode 100644 index 0000000000..2a26d0defb --- /dev/null +++ b/website/common/script/ops/buy/buySpell.js @@ -0,0 +1,47 @@ +import content from '../../content/index'; +import get from 'lodash/get'; +import pick from 'lodash/pick'; +import splitWhitespace from '../../libs/splitWhitespace'; +import { + BadRequest, + NotFound, +} from '../../libs/errors'; +import {AbstractGoldItemOperation} from './abstractBuyOperation'; +import errorMessage from '../../libs/errorMessage'; + +export class BuySpellOperation extends AbstractGoldItemOperation { + constructor (user, req, analytics) { + super(user, req, analytics); + } + + getItemKey () { + return this.key; + } + + multiplePurchaseAllowed () { + return true; + } + + extractAndValidateParams (user, req) { + let key = this.key = get(req, 'params.key'); + if (!key) throw new BadRequest(errorMessage('missingKeyParam')); + + let item = content.special[key]; + if (!item) throw new NotFound(errorMessage('spellNotFound', {spellId: key})); + + this.canUserPurchase(user, item); + } + + executeChanges (user, item, req) { + user.items.special[item.key] += this.quantity; + + this.subtractCurrency(user, item, this.quantity); + + return [ + pick(user, splitWhitespace('items stats')), + this.i18n('messageBought', { + itemText: item.text(req.language), + }), + ]; + } +} diff --git a/website/common/script/ops/buy/purchaseWithSpell.js b/website/common/script/ops/buy/purchaseWithSpell.js deleted file mode 100644 index 7f0a087190..0000000000 --- a/website/common/script/ops/buy/purchaseWithSpell.js +++ /dev/null @@ -1,12 +0,0 @@ -import buy from './buy'; -import get from 'lodash/get'; - -module.exports = function purchaseWithSpell (user, req = {}, analytics) { - const type = get(req.params, 'type'); - - if (type === 'spells') { - req.type = 'special'; - } - - return buy(user, req, analytics); -}; From de9883c3acee50d35bca30b06fabf441ae0cd270 Mon Sep 17 00:00:00 2001 From: negue Date: Fri, 18 May 2018 17:01:05 +0200 Subject: [PATCH 63/76] extract chat (#10362) * extract chatTextarea from group/tavern - extract staffList array * fix lint / rewrite condition * clean up - part 1 * rename chatTextarea to chat * refactor timestamp check --- website/client/components/groups/chat.vue | 222 +++++++++++++++ website/client/components/groups/group.vue | 113 +------- website/client/components/groups/tavern.vue | 282 ++------------------ website/client/libs/staffList.js | 97 +++++++ website/server/models/group.js | 8 +- 5 files changed, 349 insertions(+), 373 deletions(-) create mode 100644 website/client/components/groups/chat.vue create mode 100644 website/client/libs/staffList.js diff --git a/website/client/components/groups/chat.vue b/website/client/components/groups/chat.vue new file mode 100644 index 0000000000..2ba54afb4e --- /dev/null +++ b/website/client/components/groups/chat.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/website/client/components/groups/group.vue b/website/client/components/groups/group.vue index 3f61a5033f..28436ff084 100644 --- a/website/client/components/groups/group.vue +++ b/website/client/components/groups/group.vue @@ -27,25 +27,16 @@ .svg-icon.gem(v-html="icons.gem") span.number {{group.balance * 4}} div(v-once) {{ $t('guildBank') }} - .row.chat-row - .col-12 - h3(v-once) {{ $t('chat') }} - .row.new-message-row - textarea(:placeholder="!isParty ? $t('chatPlaceholder') : $t('partyChatPlaceholder')", v-model='newMessage', @keydown='updateCarretPosition', @keyup.ctrl.enter='sendMessageShortcut()', @paste='disableMessageSendShortcut()') - autocomplete(:text='newMessage', v-on:select="selectedAutocomplete", :coords='coords', :chat='group.chat') - .row.chat-actions - .col-6.chat-receive-actions - button.btn.btn-secondary.float-left.fetch(v-once, @click='fetchRecentMessages()') {{ $t('fetchRecentMessages') }} - button.btn.btn-secondary.float-left(v-once, @click='reverseChat()') {{ $t('reverseChat') }} - .col-6.chat-send-actions - button.btn.btn-secondary.send-chat.float-right(v-once, @click='sendMessage()') {{ $t('send') }} - community-guidelines + chat( + :label="$t('chat')", + :group="group", + :placeholder="!isParty ? $t('chatPlaceholder') : $t('partyChatPlaceholder')", + @fetchRecentMessages="fetchRecentMessages()" + ) + template(slot="additionRow") .row(v-if='showNoNotificationsMessage') .col-12.no-notifications | {{$t('groupNoNotifications')}} - .row - .col-12.hr - chat-message(:chat.sync='group.chat', :group-id='group._id', :group-name='group.name') .col-12.col-sm-4.sidebar .row(:class='{"guild-background": !isParty}') .col-12 @@ -260,7 +251,6 @@ diff --git a/website/client/libs/staffList.js b/website/client/libs/staffList.js new file mode 100644 index 0000000000..96eb262fc3 --- /dev/null +++ b/website/client/libs/staffList.js @@ -0,0 +1,97 @@ +export default [ + { + name: 'beffymaroo', + type: 'Staff', + uuid: '9fe7183a-4b79-4c15-9629-a1aee3873390', + }, + // { + // name: 'lefnire', + // type: 'Staff', + // uuid: '00000000-0000-4000-9000-000000000000', + // }, + { + name: 'Lemoness', + type: 'Staff', + uuid: '7bde7864-ebc5-4ee2-a4b7-1070d464cdb0', + }, + { + name: 'paglias', + type: 'Staff', + uuid: 'ed4c688c-6652-4a92-9d03-a5a79844174a', + }, + { + name: 'redphoenix', + type: 'Staff', + uuid: 'cb46ad54-8c78-4dbc-a8ed-4e3185b2b3ff', + }, + { + name: 'SabreCat', + type: 'Staff', + uuid: '7f14ed62-5408-4e1b-be83-ada62d504931', + }, + { + name: 'TheHollidayInn', + type: 'Staff', + uuid: '206039c6-24e4-4b9f-8a31-61cbb9aa3f66', + }, + { + name: 'viirus', + type: 'Staff', + uuid: 'a327d7e0-1c2e-41be-9193-7b30b484413f', + }, + { + name: 'It\'s Bailey', + type: 'Moderator', + uuid: '9da65443-ed43-4c21-804f-d260c1361596', + }, + { + name: 'Alys', + type: 'Moderator', + uuid: 'd904bd62-da08-416b-a816-ba797c9ee265', + }, + { + name: 'Blade', + type: 'Moderator', + uuid: '75f270e8-c5db-4722-a5e6-a83f1b23f76b', + }, + { + name: 'Breadstrings', + type: 'Moderator', + uuid: '3b675c0e-d7a6-440c-8687-bc67cd0bf4e9', + }, + { + name: 'Cantras', + type: 'Moderator', + uuid: '28771972-ca6d-4c03-8261-e1734aa7d21d', + }, + // { + // name: 'Daniel the Bard', + // type: 'Moderator', + // uuid: '1f7c4a74-03a3-4b2c-b015-112d0acbd593', + // }, + { + name: 'deilann 5.0.5b', + type: 'Moderator', + uuid: 'e7b5d1e2-3b6e-4192-b867-8bafdb03eeec', + }, + { + name: 'Dewines', + type: 'Moderator', + uuid: '262a7afb-6b57-4d81-88e0-80d2e9f6cbdc', + }, + { + name: 'Fox_town', + type: 'Moderator', + uuid: 'a05f0152-d66b-4ef1-93ac-4adb195d0031', + }, + { + name: 'Megan', + type: 'Moderator', + uuid: '73e5125c-2c87-4004-8ccd-972aeac4f17a', + }, + { + name: 'shanaqui', + type: 'Moderator', + uuid: 'bb089388-28ae-4e42-a8fa-f0c2bfb6f779', + }, +]; diff --git a/website/server/models/group.js b/website/server/models/group.js index 8d98a1b1e7..65b49aee45 100644 --- a/website/server/models/group.js +++ b/website/server/models/group.js @@ -346,7 +346,11 @@ schema.statics.toJSONCleanChat = async function groupToJSONCleanChat (group, use // Convert to timestamps because Android expects it toJSON.chat.forEach(chat => { - chat.timestamp = chat.timestamp ? chat.timestamp.getTime() : new Date().getTime(); + // old chats are saved with a numeric timestamp + // new chats use `Date` which then has to be converted to the numeric timestamp + if (chat.timestamp.getTime) { + chat.timestamp = chat.timestamp.getTime(); + } }); return toJSON; @@ -1537,4 +1541,4 @@ if (!nconf.get('IS_TEST')) { privacy: 'public', }).save(); }); -} \ No newline at end of file +} From d3a0348ac7d69b9ed0f09255ecf63b650f1e5aab Mon Sep 17 00:00:00 2001 From: aszlig Date: Fri, 18 May 2018 17:01:27 +0200 Subject: [PATCH 64/76] Avoid using media element with empty src attribute (#10364) Whenever the client starts up, the following is emitted in the Firefox console: Invalid URI. Load of media resource failed. All candidate resources failed to load. Media load paused. This happens because the tags are preinitialized with a src attribute of "". So what we're doing instead is initialize the