aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/App.scss14
-rw-r--r--src/boot/after_store.js1
-rw-r--r--src/components/checkbox/checkbox.vue9
-rw-r--r--src/components/emoji_input/emoji_input.js5
-rw-r--r--src/components/emoji_input/suggestor.js5
-rw-r--r--src/components/emoji_picker/emoji_picker.js8
-rw-r--r--src/components/emoji_reactions/emoji_reactions.vue38
-rw-r--r--src/components/font_control/font_control.vue5
-rw-r--r--src/components/navigation/navigation.js18
-rw-r--r--src/components/navigation/navigation_entry.js14
-rw-r--r--src/components/navigation/navigation_pins.js11
-rw-r--r--src/components/notification/notification.vue15
-rw-r--r--src/components/notifications/notifications.scss7
-rw-r--r--src/components/poll/poll.js3
-rw-r--r--src/components/poll/poll.vue92
-rw-r--r--src/components/post_status_form/post_status_form.vue2
-rw-r--r--src/components/range_input/range_input.vue8
-rw-r--r--src/components/react_button/react_button.js96
-rw-r--r--src/components/react_button/react_button.vue109
-rw-r--r--src/components/registration/registration.js4
-rw-r--r--src/components/registration/registration.vue1
-rw-r--r--src/components/screen_reader_notice/screen_reader_notice.vue13
-rw-r--r--src/components/settings_modal/helpers/float_setting.vue16
-rw-r--r--src/components/settings_modal/helpers/integer_setting.vue36
-rw-r--r--src/components/settings_modal/helpers/modified_indicator.vue2
-rw-r--r--src/components/settings_modal/helpers/number_setting.js (renamed from src/components/settings_modal/helpers/integer_setting.js)22
-rw-r--r--src/components/settings_modal/helpers/number_setting.vue27
-rw-r--r--src/components/settings_modal/tabs/general_tab.js2
-rw-r--r--src/components/settings_modal/tabs/general_tab.vue17
-rw-r--r--src/components/shadow_control/shadow_control.vue3
-rw-r--r--src/components/tab_switcher/tab_switcher.jsx8
-rw-r--r--src/i18n/en.json2
-rw-r--r--src/i18n/ja_easy.json588
-rw-r--r--src/i18n/uk.json8
-rw-r--r--src/i18n/zh.json246
-rw-r--r--src/i18n/zh_Hant.json46
-rw-r--r--src/modules/config.js5
-rw-r--r--src/modules/instance.js2
-rw-r--r--src/services/api/api.service.js4
-rw-r--r--src/services/entity_normalizer/entity_normalizer.service.js1
-rw-r--r--src/services/style_setter/style_setter.js4
41 files changed, 1163 insertions, 354 deletions
diff --git a/src/App.scss b/src/App.scss
index 1c4c8941..3f352e8d 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -580,8 +580,6 @@ textarea,
}
&[type="checkbox"] {
- display: none;
-
&:checked + label::before {
color: $fallback--text;
color: var(--inputText, $fallback--text);
@@ -887,3 +885,15 @@ option {
opacity: 0;
}
/* stylelint-enable no-descending-specificity */
+
+.visible-for-screenreader-only {
+ display: block;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ overflow: hidden;
+ visibility: visible;
+ clip: rect(0 0 0 0);
+ padding: 0;
+ position: absolute;
+}
diff --git a/src/boot/after_store.js b/src/boot/after_store.js
index d2e7f488..9c1f007b 100644
--- a/src/boot/after_store.js
+++ b/src/boot/after_store.js
@@ -253,6 +253,7 @@ const getNodeInfo = async ({ store }) => {
store.dispatch('setInstanceOption', { name: 'safeDM', value: features.includes('safe_dm_mentions') })
store.dispatch('setInstanceOption', { name: 'shoutAvailable', value: features.includes('chat') })
store.dispatch('setInstanceOption', { name: 'pleromaChatMessagesAvailable', value: features.includes('pleroma_chat_messages') })
+ store.dispatch('setInstanceOption', { name: 'pleromaCustomEmojiReactionsAvailable', value: features.includes('pleroma_custom_emoji_reactions') })
store.dispatch('setInstanceOption', { name: 'gopherAvailable', value: features.includes('gopher') })
store.dispatch('setInstanceOption', { name: 'pollsAvailable', value: features.includes('polls') })
store.dispatch('setInstanceOption', { name: 'editingAvailable', value: features.includes('editing') })
diff --git a/src/components/checkbox/checkbox.vue b/src/components/checkbox/checkbox.vue
index 7139d4fc..42f89be9 100644
--- a/src/components/checkbox/checkbox.vue
+++ b/src/components/checkbox/checkbox.vue
@@ -5,12 +5,16 @@
>
<input
type="checkbox"
+ class="visible-for-screenreader-only"
:disabled="disabled"
:checked="modelValue"
:indeterminate="indeterminate"
@change="$emit('update:modelValue', $event.target.checked)"
>
- <i class="checkbox-indicator" />
+ <i
+ class="checkbox-indicator"
+ :aria-hidden="true"
+ />
<span
v-if="!!$slots.default"
class="label"
@@ -33,6 +37,7 @@ export default {
<style lang="scss">
@import "../../variables";
+@import "../../mixins";
.checkbox {
position: relative;
@@ -81,8 +86,6 @@ export default {
}
input[type="checkbox"] {
- display: none;
-
&:checked + .checkbox-indicator::before {
color: $fallback--text;
color: var(--inputText, $fallback--text);
diff --git a/src/components/emoji_input/emoji_input.js b/src/components/emoji_input/emoji_input.js
index 8a8d098d..68654f69 100644
--- a/src/components/emoji_input/emoji_input.js
+++ b/src/components/emoji_input/emoji_input.js
@@ -134,6 +134,9 @@ const EmojiInput = {
padEmoji () {
return this.$store.getters.mergedConfig.padEmoji
},
+ defaultCandidateIndex () {
+ return this.$store.getters.mergedConfig.autocompleteSelect ? 0 : -1
+ },
preText () {
return this.modelValue.slice(0, this.caret)
},
@@ -287,7 +290,7 @@ const EmojiInput = {
...rest,
img: imageUrl || ''
}))
- this.highlighted = -1
+ this.highlighted = this.defaultCandidateIndex
this.$refs.screenReaderNotice.announce(
this.$tc('tool_tip.autocomplete_available',
this.suggestions.length,
diff --git a/src/components/emoji_input/suggestor.js b/src/components/emoji_input/suggestor.js
index adaa879e..e746dcd7 100644
--- a/src/components/emoji_input/suggestor.js
+++ b/src/components/emoji_input/suggestor.js
@@ -94,8 +94,9 @@ export const suggestUsers = ({ dispatch, state }) => {
const newSuggestions = state.users.users.filter(
user =>
- user.screen_name.toLowerCase().startsWith(noPrefix) ||
- user.name.toLowerCase().startsWith(noPrefix)
+ user.screen_name && user.name && (
+ user.screen_name.toLowerCase().startsWith(noPrefix) ||
+ user.name.toLowerCase().startsWith(noPrefix))
).slice(0, 20).sort((a, b) => {
let aScore = 0
let bScore = 0
diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js
index 0d7ca812..349b043d 100644
--- a/src/components/emoji_picker/emoji_picker.js
+++ b/src/components/emoji_picker/emoji_picker.js
@@ -98,6 +98,11 @@ const EmojiPicker = {
required: false,
type: Boolean,
default: false
+ },
+ hideCustomEmoji: {
+ required: false,
+ type: Boolean,
+ default: false
}
},
data () {
@@ -280,6 +285,9 @@ const EmojiPicker = {
return 0
},
allCustomGroups () {
+ if (this.hideCustomEmoji) {
+ return {}
+ }
const emojis = this.$store.getters.groupedCustomEmojis
if (emojis.unpacked) {
emojis.unpacked.text = this.$t('emoji.unpacked')
diff --git a/src/components/emoji_reactions/emoji_reactions.vue b/src/components/emoji_reactions/emoji_reactions.vue
index a63daa97..eb46018e 100644
--- a/src/components/emoji_reactions/emoji_reactions.vue
+++ b/src/components/emoji_reactions/emoji_reactions.vue
@@ -2,7 +2,7 @@
<div class="EmojiReactions">
<UserListPopover
v-for="(reaction) in emojiReactions"
- :key="reaction.name"
+ :key="reaction.url || reaction.name"
:users="accountsForEmoji[reaction.name]"
>
<button
@@ -11,7 +11,21 @@
@click="emojiOnClick(reaction.name, $event)"
@mouseenter="fetchEmojiReactionsByIfMissing()"
>
- <span class="reaction-emoji">{{ reaction.name }}</span>
+ <span
+ class="reaction-emoji"
+ >
+ <img
+ v-if="reaction.url"
+ :src="reaction.url"
+ :title="reaction.name"
+ class="reaction-emoji-content"
+ width="1em"
+ >
+ <span
+ v-else
+ class="reaction-emoji reaction-emoji-content"
+ >{{ reaction.name }}</span>
+ </span>
<span>{{ reaction.count }}</span>
</button>
</UserListPopover>
@@ -35,6 +49,8 @@
margin-top: 0.25em;
flex-wrap: wrap;
+ --emoji-size: calc(1.25em * var(--emojiReactionsScale, 1));
+
.emoji-reaction {
padding: 0 0.5em;
margin-right: 0.5em;
@@ -45,8 +61,24 @@
box-sizing: border-box;
.reaction-emoji {
- width: 1.25em;
+ width: var(--emoji-size);
+ height: var(--emoji-size);
margin-right: 0.25em;
+ line-height: var(--emoji-size);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+
+ .reaction-emoji-content {
+ max-width: 100%;
+ max-height: 100%;
+ width: auto;
+ height: auto;
+ line-height: inherit;
+ overflow: hidden;
+ font-size: calc(var(--emoji-size) * 0.8);
+ margin: 0;
}
&:focus {
diff --git a/src/components/font_control/font_control.vue b/src/components/font_control/font_control.vue
index bb7e64bc..e2ba74d1 100644
--- a/src/components/font_control/font_control.vue
+++ b/src/components/font_control/font_control.vue
@@ -4,6 +4,7 @@
:class="{ custom: isCustom }"
>
<label
+ :id="name + '-label'"
:for="preset === 'custom' ? name : name + '-font-switcher'"
class="label"
>
@@ -12,7 +13,8 @@
<input
v-if="typeof fallback !== 'undefined'"
:id="name + '-o'"
- class="opt exlcude-disabled"
+ :aria-labelledby="name + '-label'"
+ class="opt exlcude-disabled visible-for-screenreader-only"
type="checkbox"
:checked="present"
@change="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)"
@@ -21,6 +23,7 @@
v-if="typeof fallback !== 'undefined'"
class="opt-l"
:for="name + '-o'"
+ :aria-hidden="true"
/>
{{ ' ' }}
<Select
diff --git a/src/components/navigation/navigation.js b/src/components/navigation/navigation.js
index 7f096316..face430e 100644
--- a/src/components/navigation/navigation.js
+++ b/src/components/navigation/navigation.js
@@ -80,3 +80,21 @@ export const ROOT_ITEMS = {
criteria: ['announcements']
}
}
+
+export function routeTo (item, currentUser) {
+ if (!item.route && !item.routeObject) return null
+
+ let route
+
+ if (item.routeObject) {
+ route = item.routeObject
+ } else {
+ route = { name: (item.anon || currentUser) ? item.route : item.anonRoute }
+ }
+
+ if (USERNAME_ROUTES.has(route.name)) {
+ route.params = { username: currentUser.screen_name, name: currentUser.screen_name }
+ }
+
+ return route
+}
diff --git a/src/components/navigation/navigation_entry.js b/src/components/navigation/navigation_entry.js
index 81cc936a..22ed77d9 100644
--- a/src/components/navigation/navigation_entry.js
+++ b/src/components/navigation/navigation_entry.js
@@ -1,5 +1,5 @@
import { mapState } from 'vuex'
-import { USERNAME_ROUTES } from 'src/components/navigation/navigation.js'
+import { routeTo } from 'src/components/navigation/navigation.js'
import OptionalRouterLink from 'src/components/optional_router_link/optional_router_link.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import { faThumbtack } from '@fortawesome/free-solid-svg-icons'
@@ -26,17 +26,7 @@ const NavigationEntry = {
},
computed: {
routeTo () {
- if (!this.item.route && !this.item.routeObject) return null
- let route
- if (this.item.routeObject) {
- route = this.item.routeObject
- } else {
- route = { name: (this.item.anon || this.currentUser) ? this.item.route : this.item.anonRoute }
- }
- if (USERNAME_ROUTES.has(route.name)) {
- route.params = { username: this.currentUser.screen_name, name: this.currentUser.screen_name }
- }
- return route
+ return routeTo(this.item, this.currentUser)
},
getters () {
return this.$store.getters
diff --git a/src/components/navigation/navigation_pins.js b/src/components/navigation/navigation_pins.js
index 9dd795aa..ef78e44c 100644
--- a/src/components/navigation/navigation_pins.js
+++ b/src/components/navigation/navigation_pins.js
@@ -1,5 +1,5 @@
import { mapState } from 'vuex'
-import { TIMELINES, ROOT_ITEMS, USERNAME_ROUTES } from 'src/components/navigation/navigation.js'
+import { TIMELINES, ROOT_ITEMS, routeTo } from 'src/components/navigation/navigation.js'
import { getListEntries, filterNavigation } from 'src/components/navigation/filter.js'
import { library } from '@fortawesome/fontawesome-svg-core'
@@ -31,14 +31,7 @@ const NavPanel = {
props: ['limit'],
methods: {
getRouteTo (item) {
- if (item.routeObject) {
- return item.routeObject
- }
- const route = { name: (item.anon || this.currentUser) ? item.route : item.anonRoute }
- if (USERNAME_ROUTES.has(route.name)) {
- route.params = { username: this.currentUser.screen_name }
- }
- return route
+ return routeTo(item, this.currentUser)
}
},
computed: {
diff --git a/src/components/notification/notification.vue b/src/components/notification/notification.vue
index e1ea42ad..4d801c5e 100644
--- a/src/components/notification/notification.vue
+++ b/src/components/notification/notification.vue
@@ -121,7 +121,16 @@
scope="global"
keypath="notifications.reacted_with"
>
- <span class="emoji-reaction-emoji">{{ notification.emoji }}</span>
+ <img
+ v-if="notification.emoji_url"
+ class="emoji-reaction-emoji emoji-reaction-emoji-image"
+ :src="notification.emoji_url"
+ :name="notification.emoji"
+ >
+ <span
+ v-else
+ class="emoji-reaction-emoji"
+ >{{ notification.emoji }}</span>
</i18n-t>
</small>
</span>
@@ -153,9 +162,9 @@
</router-link>
<button
class="button-unstyled expand-icon"
- @click.prevent="toggleStatusExpanded"
- :title="$t('tool_tip.toggle_expand')"
:aria-expanded="statusExpanded"
+ :title="$t('tool_tip.toggle_expand')"
+ @click.prevent="toggleStatusExpanded"
>
<FAIcon
class="fa-scale-110"
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 41cfcef0..61f7317e 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -129,6 +129,13 @@
.emoji-reaction-emoji {
font-size: 1.3em;
+ max-width: 1.25em;
+ height: 1.25em;
+ width: auto;
+ }
+
+ .emoji-reaction-emoji-image {
+ vertical-align: middle;
}
.notification-details {
diff --git a/src/components/poll/poll.js b/src/components/poll/poll.js
index eda1733a..e4d6869a 100644
--- a/src/components/poll/poll.js
+++ b/src/components/poll/poll.js
@@ -12,7 +12,8 @@ export default {
data () {
return {
loading: false,
- choices: []
+ choices: [],
+ randomSeed: `${Math.random()}`.replace('.', '-')
}
},
created () {
diff --git a/src/components/poll/poll.vue b/src/components/poll/poll.vue
index cacc3298..b3a74c49 100644
--- a/src/components/poll/poll.vue
+++ b/src/components/poll/poll.vue
@@ -4,53 +4,63 @@
:class="containerClass"
>
<div
- v-for="(option, index) in options"
- :key="index"
- class="poll-option"
+ :role="showResults ? 'section' : (poll.multiple ? 'group' : 'radiogroup')"
>
<div
- v-if="showResults"
- :title="resultTitle(option)"
- class="option-result"
+ v-for="(option, index) in options"
+ :key="index"
+ class="poll-option"
>
- <div class="option-result-label">
- <span class="result-percentage">
- {{ percentageForOption(option.votes_count) }}%
- </span>
- <RichContent
- :html="option.title_html"
- :handle-links="false"
- :emoji="emoji"
+ <div
+ v-if="showResults"
+ :title="resultTitle(option)"
+ class="option-result"
+ >
+ <div class="option-result-label">
+ <span class="result-percentage">
+ {{ percentageForOption(option.votes_count) }}%
+ </span>
+ <RichContent
+ :html="option.title_html"
+ :handle-links="false"
+ :emoji="emoji"
+ />
+ </div>
+ <div
+ class="result-fill"
+ :style="{ 'width': `${percentageForOption(option.votes_count)}%` }"
/>
</div>
<div
- class="result-fill"
- :style="{ 'width': `${percentageForOption(option.votes_count)}%` }"
- />
- </div>
- <div
- v-else
- @click="activateOption(index)"
- >
- <input
- v-if="poll.multiple"
- type="checkbox"
- :disabled="loading"
- :value="index"
- >
- <input
v-else
- type="radio"
- :disabled="loading"
- :value="index"
+ tabindex="0"
+ :role="poll.multiple ? 'checkbox' : 'radio'"
+ :aria-labelledby="`option-vote-${randomSeed}-${index}`"
+ :aria-checked="choices[index]"
+ @click="activateOption(index)"
>
- <label class="option-vote">
- <RichContent
- :html="option.title_html"
- :handle-links="false"
- :emoji="emoji"
- />
- </label>
+ <input
+ v-if="poll.multiple"
+ type="checkbox"
+ class="poll-checkbox"
+ :disabled="loading"
+ :value="index"
+ >
+ <input
+ v-else
+ type="radio"
+ :disabled="loading"
+ :value="index"
+ >
+ <label class="option-vote">
+ <RichContent
+ :id="`option-vote-${randomSeed}-${index}`"
+ :html="option.title_html"
+ :handle-links="false"
+ :emoji="emoji"
+ />
+ </label>
+ </div>
</div>
</div>
<div class="footer faint">
@@ -161,5 +171,9 @@
padding: 0 0.5em;
margin-right: 0.5em;
}
+
+ .poll-checkbox {
+ display: none;
+ }
}
</style>
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index 64a8887c..86c1f907 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -281,12 +281,10 @@
>
{{ $t('post_status.post') }}
</button>
- <!-- touchstart is used to keep the OSK at the same position after a message send -->
<button
v-else
:disabled="uploadingFiles || disableSubmit"
class="btn button-default"
- @touchstart.stop.prevent="postStatus($event, newStatus)"
@click.stop.prevent="postStatus($event, newStatus)"
>
{{ $t('post_status.post') }}
diff --git a/src/components/range_input/range_input.vue b/src/components/range_input/range_input.vue
index 1e7e42d5..1e720105 100644
--- a/src/components/range_input/range_input.vue
+++ b/src/components/range_input/range_input.vue
@@ -4,6 +4,7 @@
:class="{ disabled: !present || disabled }"
>
<label
+ :id="name + '-label'"
:for="name"
class="label"
>
@@ -12,7 +13,8 @@
<input
v-if="typeof fallback !== 'undefined'"
:id="name + '-o'"
- class="opt"
+ :aria-labelledby="name + '-label'"
+ class="opt visible-for-screenreader-only"
type="checkbox"
:checked="present"
@change="$emit('update:modelValue', !present ? fallback : undefined)"
@@ -21,6 +23,7 @@
v-if="typeof fallback !== 'undefined'"
class="opt-l"
:for="name + '-o'"
+ :aria-hidden="true"
/>
<input
:id="name"
@@ -34,9 +37,10 @@
@input="$emit('update:modelValue', $event.target.value)"
>
<input
- :id="name"
+ :id="name + '-numeric'"
class="input-number"
type="number"
+ :aria-labelledby="name + '-label'"
:value="modelValue || fallback"
:disabled="!present || disabled"
:max="hardMax"
diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js
index 47a48623..8eed4b60 100644
--- a/src/components/react_button/react_button.js
+++ b/src/components/react_button/react_button.js
@@ -1,9 +1,8 @@
import Popover from '../popover/popover.vue'
-import { ensureFinalFallback } from '../../i18n/languages.js'
+import EmojiPicker from '../emoji_picker/emoji_picker.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import { faPlus, faTimes } from '@fortawesome/free-solid-svg-icons'
import { faSmileBeam } from '@fortawesome/free-regular-svg-icons'
-import { trim } from 'lodash'
library.add(
faPlus,
@@ -20,105 +19,34 @@ const ReactButton = {
}
},
components: {
- Popover
+ Popover,
+ EmojiPicker
},
methods: {
- addReaction (event, emoji, close) {
+ addReaction (event) {
+ const emoji = event.insertion
const existingReaction = this.status.emoji_reactions.find(r => r.name === emoji)
if (existingReaction && existingReaction.me) {
this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })
} else {
this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })
}
- close()
+ },
+ show () {
+ if (!this.expanded) {
+ this.$refs.picker.showPicker()
+ }
},
onShow () {
this.expanded = true
- this.focusInput()
},
onClose () {
this.expanded = false
- },
- focusInput () {
- this.$nextTick(() => {
- const input = document.querySelector('.reaction-picker-filter > input')
- if (input) input.focus()
- })
- },
- // Vaguely adjusted copypaste from emoji_input and emoji_picker!
- maybeLocalizedEmojiNamesAndKeywords (emoji) {
- const names = [emoji.displayText]
- const keywords = []
-
- if (emoji.displayTextI18n) {
- names.push(this.$t(emoji.displayTextI18n.key, emoji.displayTextI18n.args))
- }
-
- if (emoji.annotations) {
- this.languages.forEach(lang => {
- names.push(emoji.annotations[lang]?.name)
-
- keywords.push(...(emoji.annotations[lang]?.keywords || []))
- })
- }
-
- return {
- names: names.filter(k => k),
- keywords: keywords.filter(k => k)
- }
- },
- maybeLocalizedEmojiName (emoji) {
- if (!emoji.annotations) {
- return emoji.displayText
- }
-
- if (emoji.displayTextI18n) {
- return this.$t(emoji.displayTextI18n.key, emoji.displayTextI18n.args)
- }
-
- for (const lang of this.languages) {
- if (emoji.annotations[lang]?.name) {
- return emoji.annotations[lang].name
- }
- }
-
- return emoji.displayText
}
},
computed: {
- commonEmojis () {
- const hardcodedSet = new Set(['👍', '😠', '👀', '😂', '🔥'])
- return this.$store.getters.standardEmojiList.filter(emoji => hardcodedSet.has(emoji.replacement))
- },
- languages () {
- return ensureFinalFallback(this.$store.getters.mergedConfig.interfaceLanguage)
- },
- emojis () {
- if (this.filterWord !== '') {
- const keywordLowercase = trim(this.filterWord.toLowerCase())
-
- const orderedEmojiList = []
- for (const emoji of this.$store.getters.standardEmojiList) {
- const indices = this.maybeLocalizedEmojiNamesAndKeywords(emoji)
- .keywords
- .map(k => k.toLowerCase().indexOf(keywordLowercase))
- .filter(k => k > -1)
-
- const indexOfKeyword = indices.length ? Math.min(...indices) : -1
-
- if (indexOfKeyword > -1) {
- if (!Array.isArray(orderedEmojiList[indexOfKeyword])) {
- orderedEmojiList[indexOfKeyword] = []
- }
- orderedEmojiList[indexOfKeyword].push(emoji)
- }
- }
- return orderedEmojiList.flat()
- }
- return this.$store.getters.standardEmojiList || []
- },
- mergedConfig () {
- return this.$store.getters.mergedConfig
+ hideCustomEmoji () {
+ return !this.$store.state.instance.pleromaChatMessagesAvailable
}
}
}
diff --git a/src/components/react_button/react_button.vue b/src/components/react_button/react_button.vue
index a813b6fd..947536a1 100644
--- a/src/components/react_button/react_button.vue
+++ b/src/components/react_button/react_button.vue
@@ -1,73 +1,39 @@
<template>
- <Popover
- trigger="click"
- class="ReactButton"
- placement="top"
- :offset="{ y: 5 }"
- :bound-to="{ x: 'container' }"
- remove-padding
- popover-class="ReactButton popover-default"
- @show="onShow"
- @close="onClose"
- >
- <template #content="{close}">
- <div class="reaction-picker-filter">
- <input
- v-model="filterWord"
- size="1"
- :placeholder="$t('emoji.search_emoji')"
- @input="$event.target.composing = false"
- >
- </div>
- <div class="reaction-picker">
- <span
- v-for="emoji in commonEmojis"
- :key="emoji.replacement"
- class="emoji-button"
- :title="maybeLocalizedEmojiName(emoji)"
- @click="addReaction($event, emoji.replacement, close)"
- >
- {{ emoji.replacement }}
- </span>
- <div class="reaction-picker-divider" />
- <span
- v-for="(emoji, key) in emojis"
- :key="key"
- class="emoji-button"
- :title="maybeLocalizedEmojiName(emoji)"
- @click="addReaction($event, emoji.replacement, close)"
- >
- {{ emoji.replacement }}
- </span>
- <div class="reaction-bottom-fader" />
- </div>
- </template>
- <template #trigger>
- <span
- class="button-unstyled popover-trigger"
- :title="$t('tool_tip.add_reaction')"
- >
- <FALayers>
- <FAIcon
- class="fa-scale-110 fa-old-padding"
- :icon="['far', 'smile-beam']"
- />
- <FAIcon
- v-show="!expanded"
- class="focus-marker"
- transform="shrink-6 up-9 right-17"
- icon="plus"
- />
- <FAIcon
- v-show="expanded"
- class="focus-marker"
- transform="shrink-6 up-9 right-17"
- icon="times"
- />
- </FALayers>
- </span>
- </template>
- </Popover>
+ <span class="ReactButton">
+ <EmojiPicker
+ ref="picker"
+ :enable-sticker-picker="enableStickerPicker"
+ :hide-custom-emoji="hideCustomEmoji"
+ class="emoji-picker-panel"
+ @emoji="addReaction"
+ @show="onShow"
+ @close="onClose"
+ />
+ <span
+ class="button-unstyled popover-trigger"
+ :title="$t('tool_tip.add_reaction')"
+ @click.stop.prevent="show"
+ >
+ <FALayers>
+ <FAIcon
+ class="fa-scale-110 fa-old-padding"
+ :icon="['far', 'smile-beam']"
+ />
+ <FAIcon
+ v-show="!expanded"
+ class="focus-marker"
+ transform="shrink-6 up-9 right-17"
+ icon="plus"
+ />
+ <FAIcon
+ v-show="expanded"
+ class="focus-marker"
+ transform="shrink-6 up-9 right-17"
+ icon="times"
+ />
+ </FALayers>
+ </span>
+ </span>
</template>
<script src="./react_button.js"></script>
@@ -135,11 +101,6 @@
color: $fallback--text;
color: var(--text, $fallback--text);
}
- }
-
- .popover-trigger-button {
- /* override of popover internal stuff */
- width: auto;
@include unfocused-style {
.focus-marker {
diff --git a/src/components/registration/registration.js b/src/components/registration/registration.js
index 22ca6ad6..b88bdeec 100644
--- a/src/components/registration/registration.js
+++ b/src/components/registration/registration.js
@@ -16,7 +16,7 @@ const registration = {
confirm: '',
birthday: '',
reason: '',
- language: ''
+ language: ['']
},
captcha: {}
}),
@@ -100,7 +100,7 @@ const registration = {
this.user.captcha_token = this.captcha.token
this.user.captcha_answer_data = this.captcha.answer_data
if (this.user.language) {
- this.user.language = localeService.internalToBackendLocale(this.user.language)
+ this.user.language = localeService.internalToBackendLocaleMulti(this.user.language.filter(k => k))
}
this.v$.$touch()
diff --git a/src/components/registration/registration.vue b/src/components/registration/registration.vue
index 5701b05e..7438a5f4 100644
--- a/src/components/registration/registration.vue
+++ b/src/components/registration/registration.vue
@@ -210,6 +210,7 @@
:prompt-text="$t('registration.email_language')"
:language="v$.user.language.$model"
:set-language="val => v$.user.language.$model = val"
+ @click.stop.prevent
/>
</div>
diff --git a/src/components/screen_reader_notice/screen_reader_notice.vue b/src/components/screen_reader_notice/screen_reader_notice.vue
index 5098b94f..8384ae6b 100644
--- a/src/components/screen_reader_notice/screen_reader_notice.vue
+++ b/src/components/screen_reader_notice/screen_reader_notice.vue
@@ -1,6 +1,6 @@
<template>
<div
- class="screen-reader-text"
+ class="visible-for-screenreader-only"
:aria-live="ariaLive"
>
{{ currentText }}
@@ -8,14 +8,3 @@
</template>
<script src="./screen_reader_notice.js"></script>
-
-<style lang="scss">
-.screen-reader-text {
- display: block;
- width: 1px;
- height: 1px;
- margin: -1px;
- overflow: hidden;
- visibility: visible;
-}
-</style>
diff --git a/src/components/settings_modal/helpers/float_setting.vue b/src/components/settings_modal/helpers/float_setting.vue
new file mode 100644
index 00000000..15edb3c3
--- /dev/null
+++ b/src/components/settings_modal/helpers/float_setting.vue
@@ -0,0 +1,16 @@
+<template>
+ <NumberSetting
+ v-bind="$attrs"
+ >
+ <slot />
+ </NumberSetting>
+</template>
+
+<script>
+import NumberSetting from './number_setting.vue'
+export default {
+ components: {
+ NumberSetting
+ }
+}
+</script>
diff --git a/src/components/settings_modal/helpers/integer_setting.vue b/src/components/settings_modal/helpers/integer_setting.vue
index 695e2673..43fa7e1a 100644
--- a/src/components/settings_modal/helpers/integer_setting.vue
+++ b/src/components/settings_modal/helpers/integer_setting.vue
@@ -1,27 +1,17 @@
<template>
- <span
- v-if="matchesExpertLevel"
- class="IntegerSetting"
+ <NumberSetting
+ v-bind="$attrs"
+ truncate="1"
>
- <label :for="path">
- <slot />
- </label>
- <input
- :id="path"
- class="number-input"
- type="number"
- step="1"
- :disabled="disabled"
- :min="min || 0"
- :value="state"
- @change="update"
- >
- {{ ' ' }}
- <ModifiedIndicator
- :changed="isChanged"
- :onclick="reset"
- />
- </span>
+ <slot />
+ </NumberSetting>
</template>
-<script src="./integer_setting.js"></script>
+<script>
+import NumberSetting from './number_setting.vue'
+export default {
+ components: {
+ NumberSetting
+ }
+}
+</script>
diff --git a/src/components/settings_modal/helpers/modified_indicator.vue b/src/components/settings_modal/helpers/modified_indicator.vue
index 8311533a..45db3fc2 100644
--- a/src/components/settings_modal/helpers/modified_indicator.vue
+++ b/src/components/settings_modal/helpers/modified_indicator.vue
@@ -5,12 +5,12 @@
>
<Popover
trigger="hover"
+ :trigger-attrs="{ 'aria-label': $t('settings.setting_changed') }"
>
<template #trigger>
&nbsp;
<FAIcon
icon="wrench"
- :aria-label="$t('settings.setting_changed')"
/>
</template>
<template #content>
diff --git a/src/components/settings_modal/helpers/integer_setting.js b/src/components/settings_modal/helpers/number_setting.js
index e64d0cee..73c39948 100644
--- a/src/components/settings_modal/helpers/integer_setting.js
+++ b/src/components/settings_modal/helpers/number_setting.js
@@ -8,6 +8,8 @@ export default {
path: String,
disabled: Boolean,
min: Number,
+ step: Number,
+ truncate: Number,
expert: [Number, String]
},
computed: {
@@ -15,8 +17,11 @@ export default {
const [firstSegment, ...rest] = this.path.split('.')
return [firstSegment + 'DefaultValue', ...rest].join('.')
},
+ parent () {
+ return this.$parent.$parent
+ },
state () {
- const value = get(this.$parent, this.path)
+ const value = get(this.parent, this.path)
if (value === undefined) {
return this.defaultState
} else {
@@ -24,21 +29,28 @@ export default {
}
},
defaultState () {
- return get(this.$parent, this.pathDefault)
+ return get(this.parent, this.pathDefault)
},
isChanged () {
return this.state !== this.defaultState
},
matchesExpertLevel () {
- return (this.expert || 0) <= this.$parent.expertLevel
+ return (this.expert || 0) <= this.parent.expertLevel
}
},
methods: {
+ truncateValue (value) {
+ if (!this.truncate) {
+ return value
+ }
+
+ return Math.trunc(value / this.truncate) * this.truncate
+ },
update (e) {
- set(this.$parent, this.path, parseInt(e.target.value))
+ set(this.parent, this.path, this.truncateValue(parseFloat(e.target.value)))
},
reset () {
- set(this.$parent, this.path, this.defaultState)
+ set(this.parent, this.path, this.defaultState)
}
}
}
diff --git a/src/components/settings_modal/helpers/number_setting.vue b/src/components/settings_modal/helpers/number_setting.vue
new file mode 100644
index 00000000..3eab5178
--- /dev/null
+++ b/src/components/settings_modal/helpers/number_setting.vue
@@ -0,0 +1,27 @@
+<template>
+ <span
+ v-if="matchesExpertLevel"
+ class="NumberSetting"
+ >
+ <label :for="path">
+ <slot />
+ </label>
+ <input
+ :id="path"
+ class="number-input"
+ type="number"
+ :step="step || 1"
+ :disabled="disabled"
+ :min="min || 0"
+ :value="state"
+ @change="update"
+ >
+ {{ ' ' }}
+ <ModifiedIndicator
+ :changed="isChanged"
+ :onclick="reset"
+ />
+ </span>
+</template>
+
+<script src="./number_setting.js"></script>
diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js
index ea24d6ad..be97710f 100644
--- a/src/components/settings_modal/tabs/general_tab.js
+++ b/src/components/settings_modal/tabs/general_tab.js
@@ -2,6 +2,7 @@ import BooleanSetting from '../helpers/boolean_setting.vue'
import ChoiceSetting from '../helpers/choice_setting.vue'
import ScopeSelector from 'src/components/scope_selector/scope_selector.vue'
import IntegerSetting from '../helpers/integer_setting.vue'
+import FloatSetting from '../helpers/float_setting.vue'
import SizeSetting, { defaultHorizontalUnits } from '../helpers/size_setting.vue'
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
@@ -62,6 +63,7 @@ const GeneralTab = {
BooleanSetting,
ChoiceSetting,
IntegerSetting,
+ FloatSetting,
SizeSetting,
InterfaceLanguageSwitcher,
ScopeSelector,
diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue
index 703e94a0..21e2d855 100644
--- a/src/components/settings_modal/tabs/general_tab.vue
+++ b/src/components/settings_modal/tabs/general_tab.vue
@@ -271,6 +271,15 @@
{{ $t('settings.no_rich_text_description') }}
</BooleanSetting>
</li>
+ <li>
+ <FloatSetting
+ v-if="user"
+ path="emojiReactionsScale"
+ expert="1"
+ >
+ {{ $t('settings.emoji_reactions_scale') }}
+ </FloatSetting>
+ </li>
<h3>{{ $t('settings.attachments') }}</h3>
<li>
<BooleanSetting
@@ -501,6 +510,14 @@
{{ $t('settings.pad_emoji') }}
</BooleanSetting>
</li>
+ <li>
+ <BooleanSetting
+ path="autocompleteSelect"
+ expert="1"
+ >
+ {{ $t('settings.autocomplete_select_first') }}
+ </BooleanSetting>
+ </li>
</ul>
</div>
</div>
diff --git a/src/components/shadow_control/shadow_control.vue b/src/components/shadow_control/shadow_control.vue
index 7546535d..1f3c26aa 100644
--- a/src/components/shadow_control/shadow_control.vue
+++ b/src/components/shadow_control/shadow_control.vue
@@ -129,12 +129,13 @@
v-model="selected.inset"
:disabled="!present"
name="inset"
- class="input-inset"
+ class="input-inset visible-for-screenreader-only"
type="checkbox"
>
<label
class="checkbox-label"
for="inset"
+ :aria-hidden="true"
/>
</div>
<div
diff --git a/src/components/tab_switcher/tab_switcher.jsx b/src/components/tab_switcher/tab_switcher.jsx
index c8d390bc..a7ef8560 100644
--- a/src/components/tab_switcher/tab_switcher.jsx
+++ b/src/components/tab_switcher/tab_switcher.jsx
@@ -117,6 +117,7 @@ export default {
onClick={this.clickTab(index)}
class={classesTab.join(' ')}
type="button"
+ role="tab"
>
<img src={props.image} title={props['image-tooltip']}/>
{props.label ? '' : props.label}
@@ -131,6 +132,7 @@ export default {
onClick={this.clickTab(index)}
class={classesTab.join(' ')}
type="button"
+ role="tab"
>
{!props.icon ? '' : (<FAIcon class="tab-icon" size="2x" fixed-width icon={props.icon}/>)}
<span class="text">
@@ -167,11 +169,15 @@ export default {
return (
<div class={'tab-switcher ' + (this.sideTabBar ? 'side-tabs' : 'top-tabs')}>
- <div class="tabs">
+ <div
+ class="tabs"
+ role="tablist"
+ >
{tabs}
</div>
<div
ref="contents"
+ role="tabpanel"
class={'contents' + (this.scrollableTabs ? ' scrollable-tabs' : '')}
v-body-scroll-lock={this.bodyScrollLock}
>
diff --git a/src/i18n/en.json b/src/i18n/en.json
index dba8a13f..10ba2ef8 100644
--- a/src/i18n/en.json
+++ b/src/i18n/en.json
@@ -465,7 +465,9 @@
"domain_mutes": "Domains",
"avatar_size_instruction": "The recommended minimum size for avatar images is 150x150 pixels.",
"pad_emoji": "Pad emoji with spaces when adding from picker",
+ "autocomplete_select_first": "Automatically select the first candidate when autocomplete results are available",
"emoji_reactions_on_timeline": "Show emoji reactions on timeline",
+ "emoji_reactions_scale": "Reactions scale factor",
"export_theme": "Save preset",
"filtering": "Filtering",
"wordfilter": "Wordfilter",
diff --git a/src/i18n/ja_easy.json b/src/i18n/ja_easy.json
index abca262b..21b27d12 100644
--- a/src/i18n/ja_easy.json
+++ b/src/i18n/ja_easy.json
@@ -17,7 +17,17 @@
"media_removal": "メディアをのぞく",
"media_removal_desc": "このむンスタンスは、これらのむンスタンスからおくられおきたメディアを、ずりのぞきたす:",
"media_nsfw": "メディアをすべおセンシティブにする",
- "media_nsfw_desc": "このむンスタンスは、これらのむンスタンスからおくられおきたメディアを、すべお、センシティブにマヌクしたす:"
+ "media_nsfw_desc": "このむンスタンスは、これらのむンスタンスからおくられおきたメディアを、すべお、センシティブにマヌクしたす:",
+ "reason": "りゆう",
+ "instance": "むンスタンス",
+ "not_applicable": "なし"
+ },
+ "keyword": {
+ "keyword_policies": "キヌワヌドポリシヌ",
+ "reject": "おこずわり",
+ "replace": "おきかえ",
+ "ftl_removal": "「぀ながっおいるすべおのネットワヌク」タむムラむンからのぞく",
+ "is_replaced_by": "→"
}
},
"staff": "スタッフ"
@@ -36,7 +46,10 @@
"scope_options": "こうかいはんいせんたく",
"text_limit": "もじのかず",
"title": "ゆうこうなきのう",
- "who_to_follow": "おすすめナヌザヌ"
+ "who_to_follow": "おすすめナヌザヌ",
+ "pleroma_chat_messages": "Pleroma チャット",
+ "upload_limit": "アップロヌドできるファむルのおおきさ",
+ "shout": "Shoutbox"
},
"finder": {
"error_fetching_user": "ナヌザヌけんさくが゚ラヌになりたした",
@@ -54,7 +67,34 @@
"disable": "なし",
"enable": "あり",
"confirm": "たしかめる",
- "verify": "たしかめる"
+ "verify": "たしかめる",
+ "retry": "もういちど、ためしおください",
+ "loading": "よみこんでいたす ",
+ "undo": "もずにもどす",
+ "yes": "はい",
+ "no": "いいえ",
+ "unpin": "ピンどめするのをやめる",
+ "scroll_to_top": "いちばんうえにもどる",
+ "role": {
+ "moderator": "モデレヌタヌ",
+ "admin": "かんりするひず"
+ },
+ "flash_security": "Flash コンテンツはどんなコヌドでもじっこうできるので、あぶないかもしれたせん。",
+ "flash_fail": "Flash コンテンツをよみこむこずに、しっぱいしたした。コン゜ヌルで、くわしいないようを、よむこずができたす。",
+ "scope_in_timeline": {
+ "private": "フォロワヌげんおい",
+ "public": "パブリック",
+ "unlisted": "アンリステッド",
+ "direct": "ダむレクト"
+ },
+ "pin": "ピンどめする",
+ "flash_content": "Flash コンテンツを、 Ruffle を぀かっおひょうじする (うごかないかもしれたせん)。",
+ "generic_error_message": "゚ラヌになりたした: {0}",
+ "error_retry": "もういちど、ためしおください",
+ "never_show_again": "にどずひょうじしない",
+ "close": "ずじる",
+ "dismiss": "むしする",
+ "peek": "かくす"
},
"image_cropper": {
"crop_picture": "がぞうをきりぬく",
@@ -83,11 +123,17 @@
"heading": {
"totp": "2-ファクタヌにんしょう",
"recovery": "2-ファクタヌリカバリヌ"
- }
+ },
+ "logout_confirm_title": "ログアりトのかくにん",
+ "logout_confirm": "ほんずうに、ログアりトしたすか",
+ "logout_confirm_accept_button": "ログアりトする",
+ "logout_confirm_cancel_button": "ログアりトしない"
},
"media_modal": {
"previous": "たえ",
- "next": "぀ぎ"
+ "next": "぀ぎ",
+ "counter": "{current} / {total}",
+ "hide": "メディアビュヌアヌをずじる"
},
"nav": {
"about": "これはなに",
@@ -104,7 +150,20 @@
"user_search": "ナヌザヌをさがす",
"search": "さがす",
"who_to_follow": "おすすめナヌザヌ",
- "preferences": "せっおい"
+ "preferences": "せっおい",
+ "home_timeline": "ホヌムタむムラむン",
+ "bookmarks": "ブックマヌク",
+ "timelines": "タむムラむン",
+ "chats": "チャット",
+ "lists": "リスト",
+ "mobile_notifications": "぀うちをひらく (よんでないものがありたす)",
+ "mobile_notifications_close": "぀うちをずじる",
+ "announcements": "おしらせ",
+ "edit_pinned": "ピンどめをぞんしゅう",
+ "search_close": "けんさくバヌをずじる",
+ "edit_nav_mobile": "ナビゲヌションバヌのせっおいをかえる",
+ "mobile_sidebar": "モバむルのサむドバヌをきりかえる",
+ "edit_finish": "ぞんしゅうをおわりにする"
},
"notifications": {
"broken_favorite": "ステヌタスがみ぀かりたせん。さがしおいたす ",
@@ -114,21 +173,29 @@
"notifications": "぀うち",
"read": "よんだ",
"repeated_you": "あなたのステヌタスがリピヌトされたした",
- "no_more_notifications": "぀うちはありたせん"
+ "no_more_notifications": "぀うちはありたせん",
+ "error": "぀うちをずりにいくこずに、しっぱいしたした: {0}",
+ "follow_request": "あなたをフォロヌしたいです",
+ "migrated_to": "むンスタンスを、ひっこしたした",
+ "reacted_with": "{0} でリアクションしたした",
+ "poll_ended": "ずうひょうが、おわりたした",
+ "submitted_report": "぀うほうしたした"
},
"polls": {
- "add_poll": "いれふだをはじめる",
+ "add_poll": "ずうひょうをはじめる",
"add_option": "オプションをふやす",
"option": "オプション",
- "votes": "いれふだ",
- "vote": "ふだをいれる",
- "type": "いれふだのかた",
+ "votes": "ひょう",
+ "vote": "ずうひょうする",
+ "type": "ずうひょうのけいしき",
"single_choice": "ひず぀えらぶ",
"multiple_choices": "いく぀でもえらべる",
- "expiry": "いれふだのながさ",
- "expires_in": "いれふだは {0} で、おわりたす",
- "expired": "いれふだは {0} たえに、おわりたした",
- "not_enough_options": "ナニヌクなオプションが、たりたせん"
+ "expiry": "ずうひょうのながさ",
+ "expires_in": "ずうひょうは {0} で、おわりたす",
+ "expired": "ずうひょうは {0} たえに、おわりたした",
+ "not_enough_options": "ナニヌクなオプションが、たりたせん",
+ "people_voted_count": "{count} にんが、ずうひょうしたした",
+ "votes_count": "{count} ひょう"
},
"emoji": {
"stickers": "ステッカヌ",
@@ -139,7 +206,19 @@
"custom": "カスタムえもじ",
"unicode": "ナニコヌドえもじ",
"load_all_hint": "はじめの {saneAmount} このえもじだけがロヌドされおいたす。すべおのえもじをロヌドするず、パフォヌマンスがわるくなるかもしれたせん。",
- "load_all": "すべおのえもじをロヌド ({emojiAmount} こありたす)"
+ "load_all": "すべおのえもじをロヌド ({emojiAmount} こありたす)",
+ "unicode_groups": {
+ "flags": "はた",
+ "activities": "か぀どう",
+ "animals-and-nature": "どうぶ぀・しぜん",
+ "food-and-drink": "たべもの・のみもの",
+ "objects": "もの",
+ "people-and-body": "ひず・からだ",
+ "smileys-and-emotion": "えがお・きもち",
+ "symbols": "きごう",
+ "travel-and-places": "りょこう・ばしょ"
+ },
+ "regional_indicator": "ばしょをしめすきごう {letter}"
},
"stickers": {
"add_sticker": "ステッカヌをふやす"
@@ -147,7 +226,10 @@
"interactions": {
"favs_repeats": "リピヌトずおきにいり",
"follows": "あたらしいフォロヌ",
- "load_older": "ふるいやりずりをみる"
+ "load_older": "ふるいやりずりをみる",
+ "emoji_reactions": "えもじリアクション",
+ "moves": "ナヌザヌのひっこし",
+ "reports": "぀うほう"
},
"post_status": {
"new_status": "ずうこうする",
@@ -176,7 +258,18 @@
"private": "フォロワヌげんおい: フォロワヌのみにずどきたす",
"public": "パブリック: パブリックタむムラむンにずどきたす",
"unlisted": "アンリステッド: パブリックタむムラむンにずどきたせん"
- }
+ },
+ "media_description_error": "メディアのアップロヌドにしっぱいしたした。もういちどためしおください",
+ "edit_status": "ステヌタスをぞんしゅうする",
+ "media_description": "メディアのせ぀めい",
+ "content_type_selection": "ずうこうのけいしき",
+ "edit_remote_warning": "ほかのリモヌトむンスタンスは、ぞんしゅうをサポヌトしおいないかもしれたせん。そしお、ぞんしゅうされたずうこうをうけずるこずができないかもしれたせん。",
+ "post": "ずうこう",
+ "edit_unsupported_warning": "Pleroma は、メンションやずうひょうのぞんしゅうを、サポヌトしおいたせん。",
+ "preview": "プレビュヌ",
+ "preview_empty": "なにもありたせん",
+ "empty_status_error": "ずうこうないようを、にゅうりょくしおください",
+ "scope_notice_dismiss": "この぀うちをずじる"
},
"registration": {
"bio": "プロフィヌル",
@@ -196,8 +289,18 @@
"email_required": "なにかかいおください",
"password_required": "なにかかいおください",
"password_confirmation_required": "なにかかいおください",
- "password_confirmation_match": "パスワヌドがちがいたす"
- }
+ "password_confirmation_match": "パスワヌドがちがいたす",
+ "birthday_required": "なにかかいおください",
+ "birthday_min_age": "{date} か、それよりたえにしおください"
+ },
+ "reason_placeholder": "このむンスタンスでは、ひずがかくにんしお、ずうろくをうけいれおいたす。\nなぜあなたがずうろくしたいのかを、かんりしおいるひずに、おしえおください。",
+ "bio_optional": "プロフィヌル (かかなくおもよい)",
+ "reason": "ずうろくするりゆう",
+ "email_optional": "Eメヌル (かかなくおもよい)",
+ "register": "ずうろくする",
+ "email_language": "サヌバヌからのメヌルは、なにご(どのこずば)がいいですか",
+ "birthday": "たんじょうび:",
+ "birthday_optional": "たんじょうび (かかなくおもよい):"
},
"remote_user_resolver": {
"remote_user_resolver": "リモヌトナヌザヌリゟルバヌ",
@@ -393,7 +496,24 @@
"save_load_hint": "「のこす」オプションをONにするず、テヌマをえらんだずきずロヌドしたずき、いたのせっおいをのこしたす。たた、テヌマを゚クスポヌトするずき、これらのオプションをストアしたす。すべおのチェックボックスをOFFにするず、テヌマを゚クスポヌトしたずき、すべおのせっおいをセヌブしたす。",
"reset": "リセット",
"clear_all": "すべおクリア",
- "clear_opacity": "ずうめいどをクリア"
+ "clear_opacity": "ずうめいどをクリア",
+ "help": {
+ "older_version_imported": "ふるいバヌゞョンのフロント゚ンドで぀くられたファむルをむンポヌトしたした。",
+ "snapshot_missing": "ファむルにはテヌマのスナップショットがありたせん。おもっおいたみためず、ちがうかもしれたせん。",
+ "migration_snapshot_ok": "あんぜんのため、テヌマのスナップショットがよみこたれたした。テヌマのデヌタをよみこむこずができたす。",
+ "snapshot_source_mismatch": "バヌゞョンがただしくないです。フロント゚ンドのバヌゞョンをもずにもどしたあず、あたらしくしたこずが、りゆうかもしれたせん。ふるいフロント゚ンドでテヌマをぞんこうしおいたばあい、ふるいバヌゞョンを぀かうのがいいです。そうでないばあい、あたらしいバヌゞョンを぀かっおください。",
+ "snapshot_present": "テヌマのスナップショットをよみこみたした。せっおいはうわがきされたした。かわりに、テヌマのじっさいのデヌタをよみこむこずができたす。",
+ "fe_upgraded": "フロント゚ンドずいっしょに、テヌマ゚ンゞンもあたらしくなりたした。",
+ "fe_downgraded": "フロント゚ンドが、たえのバヌゞョンにもどりたした。",
+ "migration_napshot_gone": "スナップショットがありたせん。おがえおいるみためず、ちがうかもしれたせん。",
+ "upgraded_from_v2": "PleromaFEがあたらしくなったので、いたたでのみためずすこしちがうかもしれたせん。",
+ "v2_imported": "ふるいフロント゚ンドのためのファむルをむンポヌトしたした。せっおいしたのずは、すこしちがうかもしれたせん。",
+ "future_version_imported": "あたらしいフロント゚ンドで぀くられたファむルをむンポヌトしたした。"
+ },
+ "load_theme": "テヌマをよみこむ",
+ "keep_as_is": "そのたたにする",
+ "use_snapshot": "ふるいバヌゞョン",
+ "use_source": "あたらしいバヌゞョン"
},
"common": {
"color": "いろ",
@@ -429,7 +549,26 @@
"borders": "さかいめ",
"buttons": "ボタン",
"inputs": "むンプットフィヌルド",
- "faint_text": "うすいテキスト"
+ "faint_text": "うすいテキスト",
+ "post": "ずうこう / プロフィヌル",
+ "wallpaper": "かべがみ",
+ "icons": "アむコン",
+ "highlight": "よくみえるようにした、ようそ",
+ "pressed": "おしたずき",
+ "chat": {
+ "border": "さかいめ",
+ "incoming": "うけずったもの",
+ "outgoing": "おくったもの"
+ },
+ "underlay": "アンダヌレむ",
+ "alert_neutral": "それいがい",
+ "popover": "ツヌルチップ、メニュヌ、ポップオヌバヌ",
+ "poll": "ずうひょうのグラフ",
+ "selectedPost": "えらんだずうこう",
+ "selectedMenu": "えらんだメニュヌアむテム",
+ "disabled": "぀かえないずき",
+ "toggled": "きりかえたずき",
+ "tabs": "タブ"
},
"radii": {
"_tab_label": "たるさ"
@@ -462,7 +601,8 @@
"buttonPressed": "ボタン (おされおいるずき)",
"buttonPressedHover": "ボタン (ホバヌ、か぀、おされおいるずき)",
"input": "むンプットフィヌルド"
- }
+ },
+ "hintV3": "かげのばあいは、 {0} ずいうかきかたを぀かうこずができたす。そうするず、ほかのいろのスロットを぀かうこずができたす。"
},
"fonts": {
"_tab_label": "フォント",
@@ -497,7 +637,167 @@
"title": "バヌゞョン",
"backend_version": "バック゚ンドのバヌゞョン",
"frontend_version": "フロント゚ンドのバヌゞョン"
- }
+ },
+ "notification_visibility_polls": "あなたがさんかしたずうひょうが、おわりたした",
+ "setting_server_side": "このせっおいは、あなたのプロフィヌルに぀いおのものです。ぞんこうするず、すべおのセッションずクラむアントにえいきょうしたす",
+ "mute_import_error": "ミュヌトのむンポヌトが、゚ラヌになりたした",
+ "account_backup_description": "あなたのアカりントじょうほうや、ずうこうのアヌカむブを、ダりンロヌドするこずができたす。しかし、 Pleroma アカりントにむンポヌトするこずはただできたせん。",
+ "list_backups_error": "バックアップリストをずりにいくこずが、゚ラヌになりたした: {error}",
+ "list_aliases_error": "゚むリアスをずりにいくずきに、゚ラヌになりたした: {error}",
+ "added_alias": "゚むリアスを぀くりたした。",
+ "move_account_notes": "もしあなたがアカりントをほかのむンスタンスにひっこしたいのなら、ひっこすさきのアカりントからここぞの゚むリアスを぀くっおください。",
+ "file_export_import": {
+ "backup_settings_theme": "せっおいずテヌマをファむルにバックアップする",
+ "restore_settings": "ファむルからせっおいをもずにもどす",
+ "errors": {
+ "file_too_new": "メゞャヌバヌゞョン({fileMajor})がちがいたす。この PleromaFE (せっおいのバヌゞョン {feMajor}) はふるいので、぀かうこずができたせん",
+ "file_slightly_new": "ファむルのマむナヌバヌゞョンがちがっおいたす。いく぀かのせっおいは、よみこたれないかもしれたせん",
+ "invalid_file": "これは Pleroma のせっおいをバックアップしたファむルではありたせん。",
+ "file_too_old": "メゞャヌバヌゞョン({fileMajor})がちがいたす。ファむルのバヌゞョンが叀いので、䜿うこずができたせん(バヌゞョン {feMajor} いじょうのせっおいバヌゞョンを぀かっおください)"
+ },
+ "backup_settings": "せっおいをファむルにバックアップする",
+ "backup_restore": "せっおいのバックアップ"
+ },
+ "hide_wallpaper": "このむンスタンスのバックグラりンドをかくす",
+ "reply_visibility_following_short": "わたしのフォロヌしおいるひずにあおられたリプラむをみる",
+ "reply_visibility_self_short": "じぶんにあおられたリプラむだけをみる",
+ "save": "ぞんこうをほぞんする",
+ "reset_banner_confirm": "ほんずうに、バナヌをリセットしたすか",
+ "tree_advanced": "ツリヌビュヌで、ナビゲヌションをもっずじゅうなんにする",
+ "third_column_mode": "じゅうぶんなくうかんがあれば、3ばんめのれ぀をひょうじする",
+ "conversation_other_replies_button": "「ほかのリプラむ」ボタンをひょうじするばしょ",
+ "user_popover_avatar_action_open": "プロフィヌルをひらく",
+ "notification_setting_filters": "フィルタヌ",
+ "notification_setting_hide_notification_contents": "おくったひずず、ないようを、プッシュ぀うちにひょうじしない",
+ "backup_running": "バックアップしおいたす。{number}このデヌタをしょりしたした。",
+ "word_filter_and_more": "こずばのフィルタヌず、そのほか ",
+ "account_privacy": "プラむバシヌ",
+ "posts": "ずうこう",
+ "move_account": "アカりントをひっこす",
+ "move_account_target": "ひっこしさきのアカりント (れい: {example})",
+ "mute_bot_posts": "Bot のずうこうをミュヌトする",
+ "hide_bot_indication": "Bot によるずうこうであるこずを、ずうこうにひょうじしない",
+ "hide_all_muted_posts": "ミュヌトしたずうこうをかくす",
+ "hide_shoutbox": "Shoutbox をかくす",
+ "conversation_display_tree": "ツリヌけいしき",
+ "mention_link_display_full_for_remote": "リモヌトナヌザヌだけ、ながいなたえでひょうじする (れい: {'@'}hoge{'@'}example.org)",
+ "mention_link_bolden_you": "あなたがメンションされたずき、あなたぞのメンションを、よくみえるようにする",
+ "user_popover_avatar_action": "ポップオヌバヌのアバタヌをクリックしたずき",
+ "user_popover_avatar_action_zoom": "アバタヌをおおきくする",
+ "user_popover_avatar_action_close": "ポップオヌバヌをずじる",
+ "always_show_post_button": "ずうこうボタンをい぀もひょうじする",
+ "auto_update": "あたらしいずうこうを、じどうおきにみせる",
+ "user_mutes": "ナヌザヌ",
+ "useStreamingApi": "ずうこうず぀うちを、リアルタむムにうけずる",
+ "use_websockets": "Websockets を぀かう (リアルタむムアップデヌト)",
+ "mutes_and_blocks": "ミュヌトずブロック",
+ "emoji_reactions_on_timeline": "えもじリアクションをタむムラむンにひょうじする",
+ "accent": "アクセント",
+ "domain_mutes": "ドメむン",
+ "import_mutes_from_a_csv_file": "CSVファむルからミュヌトをむンポヌトする",
+ "reset_avatar": "アバタヌをリセットする",
+ "remove_language": "ずりのぞく",
+ "primary_language": "いちばんわかるこずば:",
+ "add_language": "よびずしお぀かうこずばを、぀いかする",
+ "fallback_language": "よびずしお぀かうこずば {index}:",
+ "lists_navigation": "ナビゲヌションにリストをひょうじする",
+ "account_alias": "アカりントの゚むリアス",
+ "mention_link_display_full": "い぀も、ながいなたえをひょうじする (れい: {'@'}hoge{'@'}example.org)",
+ "setting_changed": "せっおいは、デフォルトずちがっおいたす",
+ "email_language": "サヌバヌからうけずるEメヌルのこずば",
+ "mute_export": "ミュヌトの゚クスポヌト",
+ "mute_export_button": "あなたのミュヌトを、 CSV ファむルに゚クスポヌトしたす",
+ "mute_import": "ミュヌトのむンポヌト",
+ "mutes_imported": "ミュヌトをむンポヌトしたしたすこしじかんがかかるかもしれたせん。",
+ "account_backup": "アカりントのバックアップ",
+ "account_backup_table_head": "バックアップ",
+ "download_backup": "ダりンロヌド",
+ "backup_not_ready": "バックアップのじゅんびが、ただできおいたせん。",
+ "backup_failed": "バックアップにしっぱいしたした。",
+ "remove_backup": "ずりのぞく",
+ "add_backup": "あたらしいバックアップを぀くる",
+ "added_backup": "あたらしいバックアップを぀くりたした。",
+ "add_backup_error": "あたらしいバックアップを぀くるずきに、゚ラヌになりたした: {error}",
+ "bot": "これは bot アカりントです",
+ "account_alias_table_head": "゚むリアス",
+ "hide_list_aliases_error_action": "ずじる",
+ "remove_alias": "この゚むリアスをけす",
+ "add_alias_error": "゚むリアスを぀くるずきに、゚ラヌになりたした: {error}",
+ "new_alias_target": "あたらしい゚むリアスを぀くる (れい: {example})",
+ "moved_account": "アカりントをひっこしたした。",
+ "move_account_error": "アカりントをひっこしおいるずきに、゚ラヌになりたした: {error}",
+ "wordfilter": "こずばのフィルタヌ",
+ "hide_media_previews": "メディアのプレビュヌをかくす",
+ "right_sidebar": "サむドバヌをみぎにひょうじする",
+ "hide_wordfiltered_statuses": "こずばのフィルタヌでフィルタヌされたステヌタスをかくす",
+ "hide_muted_threads": "ミュヌトされたスレッドをかくす",
+ "navbar_column_stretch": "ナビゲヌションバヌをれ぀のはばたでのばす",
+ "birthday": {
+ "label": "たんじょうび",
+ "show_birthday": "たんじょうびを、ひょうじする"
+ },
+ "profile_fields": {
+ "label": "プロフィヌルのメタデヌタ",
+ "add_field": "フィヌルドをふやす",
+ "name": "ラベル",
+ "value": "ないよう"
+ },
+ "user_profiles": "ナヌザヌプロフィヌル",
+ "notification_visibility_moves": "ナヌザヌのひっこし",
+ "notification_visibility_emoji_reactions": "リアクション",
+ "hide_favorites_description": "おきにいりのリストをみせない (぀うちはおくられたす)",
+ "reset_profile_background": "プロフィヌルバックグラりンドをリセットする",
+ "reset_profile_banner": "プロフィヌルバナヌをリセットする",
+ "reset_avatar_confirm": "ほんずうに、アバタヌをリセットしたすか",
+ "reset_background_confirm": "ほんずうに、バックグラりンドをリセットしたすか",
+ "column_sizes_sidebar": "サむドバヌ",
+ "column_sizes_notifs": "぀うち",
+ "columns": "れ぀",
+ "column_sizes": "れ぀のおおきさ",
+ "column_sizes_content": "コンテンツ",
+ "conversation_display": "スレッドのひょうじけいしき",
+ "conversation_display_linear": "リニアけいしき",
+ "conversation_display_linear_quick": "リニアビュヌ",
+ "show_scrollbars": "よこのれ぀にスクロヌルバヌをひょうじする",
+ "third_column_mode_none": "3ばんめのれ぀をひょうじしない",
+ "third_column_mode_postform": "ずうこうフォヌムずナビゲヌション",
+ "third_column_mode_notifications": "぀うちのれ぀をひょうじする",
+ "tree_fade_ancestors": "げんざいのステヌタスのおやを、うすいいろのもじでひょうじする",
+ "conversation_other_replies_button_below": "ステヌタスのした",
+ "conversation_other_replies_button_inside": "ステヌタスのなか",
+ "max_depth_in_thread": "デフォルトでひょうじするスレッドのふかさ",
+ "sensitive_by_default": "デフォルトで、ずうこうをNSFWにする",
+ "type_domains_to_mute": "ミュヌトしたいドメむンを、ここでけんさくできたす",
+ "mention_link_use_tooltip": "メンションのリンクをクリックしたずき、ナヌザヌカヌドをみせる",
+ "mention_link_show_avatar": "ナヌザヌのアバタヌをリンクのよこにひょうじする",
+ "mention_link_show_avatar_quick": "ナヌザヌのアバタヌをメンションのずなりにひょうじする",
+ "mention_link_fade_domain": "ドメむン(れい: {'@'}hoge{'@'}example.org のなかの {'@'}example.org)を、うすいいろにする",
+ "user_popover_avatar_overlay": "ナヌザヌのポップオヌバヌを、ナヌザヌのアバタヌのうえにひょうじする",
+ "show_yous": "(あなた)をひょうじする",
+ "notification_setting_block_from_strangers": "フォロヌしおいないナヌザヌからの぀うちをブロックする",
+ "notification_setting_privacy": "プラむバシヌ",
+ "more_settings": "そのたのせっおい",
+ "expert_mode": "くわしいせっおいを、ひょうじする",
+ "mention_links": "メンションのリンク",
+ "post_look_feel": "ずうこうのみためずかんかく",
+ "allow_following_move": "フォロヌしおいるアカりントがむンスタンスをひっこしたばあい、じどうでフォロヌしおもよい",
+ "chatMessageRadius": "チャットメッセヌゞ",
+ "confirm_dialogs": "぀ぎのばあいに、かくにんをする",
+ "confirm_dialogs_repeat": "ステヌタスをリピヌトするずき",
+ "confirm_dialogs_unfollow": "ナヌザヌのフォロヌをはずすずき",
+ "confirm_dialogs_block": "ナヌザヌをブロックするずき",
+ "confirm_dialogs_mute": "ナヌザヌをミュヌトするずき",
+ "confirm_dialogs_delete": "ステヌタスをけすずき",
+ "confirm_dialogs_logout": "ログアりトするずき",
+ "confirm_dialogs_approve_follow": "フォロヌをうけいれるずき",
+ "confirm_dialogs_deny_follow": "フォロヌをこずわるずき",
+ "confirm_dialogs_remove_follower": "フォロワヌをずりのぞくずき",
+ "conversation_display_tree_quick": "ツリヌビュヌ",
+ "disable_sticky_headers": "れ぀のヘッダヌを、がめんのいちばんうえにこおいしない",
+ "virtual_scrolling": "タむムラむンのレンダリングをよくする",
+ "use_at_icon": "{'@'} きごうを、もじのかわりに、アむコンでひょうじする",
+ "mention_link_display_short": "い぀も、みじかいなたえにする (れい: {'@'}hoge)",
+ "mention_link_display": "メンションのリンクをひょうじするけいしき"
},
"time": {
"day": "{0}日",
@@ -531,7 +831,23 @@
"year": "{0}幎",
"years": "{0}幎",
"year_short": "{0}幎",
- "years_short": "{0}幎"
+ "years_short": "{0}幎",
+ "unit": {
+ "minutes": "{0}ふん",
+ "seconds_short": "{0}びょう",
+ "weeks": "{0}しゅうかん",
+ "weeks_short": "{0}しゅう",
+ "years": "{0}ねん",
+ "years_short": "{0}ねん",
+ "days": "{0}にち",
+ "days_short": "{0}にち",
+ "hours": "{0}じかん",
+ "hours_short": "{0}じかん",
+ "minutes_short": "{0}ふん",
+ "months": "{0}かげ぀",
+ "months_short": "{0}かげ぀",
+ "seconds": "{0}びょう"
+ }
},
"timeline": {
"collapse": "たたむ",
@@ -543,7 +859,11 @@
"show_new": "よみこみ",
"up_to_date": "さいしん",
"no_more_statuses": "これでおわりです",
- "no_statuses": "ありたせん"
+ "no_statuses": "ありたせん",
+ "socket_broke": "コヌド{0}により、リアルタむムで぀ながるこずがなくなりたした",
+ "socket_reconnected": "リアルタむムで぀ながるこずを、぀くりたした",
+ "reload": "もういちど、よみこむ",
+ "error": "タむムラむンをずりにいくずきに、゚ラヌになりたした: {0}"
},
"status": {
"favorites": "おきにいり",
@@ -556,7 +876,57 @@
"reply_to": "ぞんしん:",
"replies_list": "ぞんしん:",
"mute_conversation": "スレッドをミュヌトする",
- "unmute_conversation": "スレッドをミュヌトするのをやめる"
+ "unmute_conversation": "スレッドをミュヌトするのをやめる",
+ "repeat_confirm_title": "リピヌトのかくにん",
+ "mentions": "メンション",
+ "thread_muted": "ミュヌトされたスレッド",
+ "collapse_attachments": "ファむルをかくす",
+ "remove_attachment": "ファむルをずりのぞく",
+ "thread_show_full": "このスレッドのすべおのずうこうをみる (ぜんぶで{numStatus}このステヌタス、ふかさ{depth})",
+ "show_all_attachments": "すべおのファむルをみる",
+ "hide_full_subject": "かくす",
+ "nsfw": "NSFW",
+ "hide_content": "かくす",
+ "status_deleted": "このずうこうは、けされたした",
+ "you": "(あなた)",
+ "expand": "ひろげる",
+ "repeat_confirm_accept_button": "リピヌトする",
+ "repeat_confirm_cancel_button": "リピヌトしない",
+ "edited_at": "({time} たえにぞんしゅう)",
+ "delete_confirm_title": "けすこずのかくにん",
+ "delete_confirm_accept_button": "けす",
+ "delete_confirm_cancel_button": "のこす",
+ "edit": "ステヌタスをぞんしゅうする",
+ "bookmark": "ブックマヌクする",
+ "unbookmark": "ブックマヌクをはずす",
+ "replies_list_with_others": "ぞんしん (ほかに +{numReplies}こ):",
+ "status_unavailable": "ステヌタスがありたせん",
+ "copy_link": "リンクをコピヌ",
+ "external_source": "そずにある゜ヌス",
+ "thread_muted_and_words": "぀ぎのこずばをふくむので:",
+ "show_content": "みる",
+ "plus_more": "あず {number}こ",
+ "many_attachments": "ずうこうには、{number}このファむルが぀いおいたす",
+ "show_attachment_in_modal": "メディアモヌダルでみる",
+ "show_attachment_description": "せ぀めいのプレビュヌ (ぜんぶみるには、ファむルをひらいおください)",
+ "hide_attachment": "ファむルをかくす",
+ "attachment_stop_flash": "Flash プレヌダヌをずめる",
+ "move_up": "ファむルをひだりにうごかす",
+ "move_down": "ファむルをみぎにうごかす",
+ "open_gallery": "ギャラリヌをひらく",
+ "thread_hide": "スレッドをかくす",
+ "thread_show": "スレッドをみる",
+ "show_full_subject": "すべおをみる",
+ "repeat_confirm": "ほんずうに、このステヌタスをリピヌトしたすか",
+ "show_all_conversation": "このスレッドをぜんぶみる (あず {numStatus}このステヌタス)",
+ "show_only_conversation_under_this": "このステヌタスぞのぞんしんだけをみる",
+ "status_history": "ステヌタスのれきし",
+ "thread_show_full_with_icon": "{icon} {text}",
+ "thread_follow": "のこりのずうこうをみる (ぜんぶで {numStatus}このステヌタス)",
+ "thread_follow_with_icon": "{icon} {text}",
+ "ancestor_follow": "このステヌタスよりしたの、{numReplies}このぞんしんをみる",
+ "ancestor_follow_with_icon": "{icon} {text}",
+ "show_all_conversation_with_icon": "{icon} {text}"
},
"user_card": {
"approve": "うけいれ",
@@ -577,7 +947,7 @@
"media": "メディア",
"mention": "メンション",
"mute": "ミュヌト",
- "muted": "ミュヌトしおいたす",
+ "muted": "ミュヌトしおいたす",
"per_day": "/日",
"remote_follow": "リモヌトフォロヌ",
"report": "぀うほう",
@@ -608,8 +978,52 @@
"disable_remote_subscription": "ほかのむンスタンスからフォロヌされないようにする",
"disable_any_subscription": "フォロヌされないようにする",
"quarantine": "ほかのむンスタンスのナヌザヌのずうこうをずめる",
- "delete_user": "ナヌザヌをけす"
- }
+ "delete_user": "ナヌザヌをけす",
+ "delete_user_data_and_deactivate_confirmation": "これをするず、このアカりントのデヌタがきえお、にどず぀かえなくなりたす。ほんずうに、しおいいですか"
+ },
+ "mute_confirm_accept_button": "ミュヌトする",
+ "unfollow_confirm_title": "フォロヌをやめるこずのかくにん",
+ "mute_confirm": "ほんずうに、 {user} をミュヌトしたすか",
+ "mute_duration_prompt": "このナヌザヌを぀ぎのじかんだけミュヌトする (0にするず、おわりがありたせん):",
+ "edit_note_apply": "おきよう",
+ "block_confirm": "ほんずうに、 {user} をブロックしたすか",
+ "deactivated": "぀かえない",
+ "remove_follower": "フォロワヌをずりのぞく",
+ "highlight": {
+ "solid": "バッググラりンドをひず぀のいろにする",
+ "striped": "したもようのバックグラりンドにする",
+ "side": "はじにせんを぀ける",
+ "disabled": "めだたせない"
+ },
+ "mute_confirm_cancel_button": "ミュヌトしない",
+ "unfollow_confirm_accept_button": "フォロヌをやめる",
+ "unfollow_confirm": "ほんずうに、 {user} のフォロヌをやめたすか",
+ "unfollow_confirm_cancel_button": "フォロヌしたたたにする",
+ "mute_confirm_title": "ミュヌトのかくにん",
+ "block_confirm_accept_button": "ブロックする",
+ "block_confirm_cancel_button": "ブロックしない",
+ "deny_confirm_title": "おこずわりのかくにん",
+ "deny_confirm_accept_button": "こずわる",
+ "deny_confirm_cancel_button": "こずわらない",
+ "deny_confirm": "{user} のフォロヌリク゚ストをこずわりたすか",
+ "follow_cancel": "リク゚ストをキャンセル",
+ "birthday": "{birthday} に、うたれたした",
+ "remove_follower_confirm_title": "フォロワヌをずりのぞくこずのかくにん",
+ "remove_follower_confirm_accept_button": "ずりのぞく",
+ "remove_follower_confirm_cancel_button": "のこす",
+ "remove_follower_confirm": "ほんずうに、 {user} をあなたのフォロワヌからずりのぞきたすか",
+ "edit_note": "メモをぞんしゅうする",
+ "edit_note_cancel": "キャンセル",
+ "message": "メッセヌゞ",
+ "bot": "bot",
+ "approve_confirm_title": "うけいれのかくにん",
+ "approve_confirm_accept_button": "うけいれる",
+ "approve_confirm_cancel_button": "うけいれない",
+ "approve_confirm": "{user} のフォロヌリク゚ストをうけいれたすか",
+ "edit_profile": "プロフィヌルをぞんしゅう",
+ "block_confirm_title": "ブロックのかくにん",
+ "note_blank": "(なし)",
+ "note": "メモ"
},
"user_profile": {
"timeline_title": "ナヌザヌタむムラむン",
@@ -634,13 +1048,21 @@
"repeat": "リピヌト",
"reply": "リプラむ",
"favorite": "おきにいり",
- "user_settings": "ナヌザヌせっおい"
+ "user_settings": "ナヌザヌせっおい",
+ "accept_follow_request": "フォロヌのおねがいを、うけいれる",
+ "toggle_mute": "ミュヌトされたないようをみるために、぀うちをひらくか、ずじる",
+ "autocomplete_available": "{number}このけっかが、ありたす。うえずしたのキヌを぀かっお、けっかをみるこずができたす。",
+ "add_reaction": "リアクションを぀ける",
+ "reject_follow_request": "フォロヌのおねがいを、こずわる",
+ "bookmark": "ブックマヌク",
+ "toggle_expand": "ずうこうをすべおみるために、぀うちをひらくか、ずじる"
},
"upload": {
"error": {
"base": "アップロヌドにしっぱいしたした。",
"file_too_big": "ファむルがおおきすぎたす [{filesize} {filesizeunit} / {allowedsize} {allowedsizeunit}]",
- "default": "しばらくしおから、ためしおください"
+ "default": "しばらくしおから、ためしおください",
+ "message": "アップロヌドにしっぱいしたした: {0}"
},
"file_size_units": {
"B": "B",
@@ -655,7 +1077,9 @@
"hashtags": "ハッシュタグ",
"person_talking": "{count} にんが、はなしおいたす",
"people_talking": "{count} にんが、はなしおいたす",
- "no_results": "み぀かりたせんでした"
+ "no_results": "み぀かりたせんでした",
+ "no_more_results": "これでおわりです",
+ "load_more": "もっずみる"
},
"password_reset": {
"forgot_password": "パスワヌドを、わすれたしたか",
@@ -668,5 +1092,103 @@
"password_reset_disabled": "このむンスタンスでは、パスワヌドリセットは、できたせん。むンスタンスのアドミニストレヌタヌに、おずいあわせください。",
"password_reset_required": "ログむンするには、パスワヌドをリセットしおください。",
"password_reset_required_but_mailer_is_disabled": "あなたはパスワヌドのリセットがひ぀ようです。しかし、たずいこずに、このむンスタンスでは、パスワヌドのリセットができなくなっおいたす。このむンスタンスのアドミニストレヌタヌに、おずいあわせください。"
+ },
+ "announcements": {
+ "post_placeholder": "おしらせのないようを、にゅうりょくしおください。",
+ "end_time_prompt": "おわるじかん: ",
+ "inactive_message": "このおしらせは、぀かわれおいたせん",
+ "page_header": "おしらせ",
+ "title": "おしらせ",
+ "post_action": "ずうこう",
+ "post_form_header": "おしらせをずうこう",
+ "mark_as_read_action": "よんだこずにする",
+ "post_error": "゚ラヌ: {error}",
+ "close_error": "ずじる",
+ "delete_action": "けす",
+ "start_time_display": "{time}にはじたりたす",
+ "end_time_display": "{time}におわりたす",
+ "edit_action": "ぞんしゅう",
+ "start_time_prompt": "はじたるじかん: ",
+ "all_day_prompt": "このむベントはいちにちじゅうやりたす",
+ "published_time_display": "{time}にこうかいされたした",
+ "submit_edit_action": "そうしん",
+ "cancel_edit_action": "キャンセル"
+ },
+ "report": {
+ "reported_statuses": "぀うほうされたステヌタス:",
+ "reporter": "぀うほうしたひず:",
+ "state_closed": "クロヌズ",
+ "state_resolved": "かいけ぀したした",
+ "reported_user": "぀うほうされたナヌザヌ:",
+ "notes": "メモ:",
+ "state": "じょうたい:",
+ "state_open": "オヌプン"
+ },
+ "update": {
+ "update_bugs": "もんだいや、バグがあれば、 {pleromaGitlab} でおしえおください。ちゃんずテストはしおいるのですが、たくさんのこずをかえおいるので、そしおかいは぀バヌゞョンを぀かっおいるので、もんだいやバグに、きづかないこずがありたす。あなたがきづいたもんだいに぀いおの、フィヌドバックやおいあんを、たっおいたす。 Pleroma や Pleroma-FE をよくするやりかたに぀いおも、おしえおください。",
+ "update_changelog_here": "すべおのかわったこずのきろく",
+ "art_by": "{linkToArtist}によるさくひん",
+ "big_update_title": "すこし、たっおください",
+ "big_update_content": "しばらくリリヌスがありたせんでした。おもっおいたみためず、ちがうかもしれたせん。",
+ "update_bugs_gitlab": "Pleroma GitLab",
+ "update_changelog": "かわったこずをすべおみるには、{theFullChangelog}をみおください。"
+ },
+ "chats": {
+ "new": "あたらしいチャット",
+ "chats": "チャット",
+ "you": "あなた:",
+ "message_user": "{nickname} にメッセヌゞ",
+ "delete": "けす",
+ "empty_message_error": "なにかかいおください",
+ "more": "もっずみる",
+ "delete_confirm": "ほんずうに、このメッセヌゞをけしたすか",
+ "error_loading_chat": "チャットをよみこむこずに、しっぱいしたした。",
+ "error_sending_message": "メッセヌゞをおくるこずに、しっぱいしたした。",
+ "empty_chat_list_placeholder": "チャットがありたせん。あたらしいチャットボタンをおしお、はじめおください"
+ },
+ "shoutbox": {
+ "title": "Shoutbox"
+ },
+ "errors": {
+ "storage_unavailable": "Pleroma はブラりザヌのストレヌゞにアクセスするこずができたせん。あなたがログむンしたこずず、あなたのロヌカルのせっおいは、ほぞんされたせん。ほかにももんだいがおきるかもしれたせん。 Cookie をゆうこうにしおください。"
+ },
+ "lists": {
+ "lists": "リスト",
+ "new": "あたらしいリスト",
+ "search": "ナヌザヌをさがす",
+ "title": "リストのなたえ",
+ "create": "぀くる",
+ "save": "ぞんこうをほぞんする",
+ "delete": "リストをけす",
+ "following_only": "フォロヌしおいるひずげんおいにする",
+ "manage_lists": "リストをかんりする",
+ "manage_members": "リストにふくたれるひずを、かんりする",
+ "add_members": "もっずナヌザヌをさがす",
+ "remove_from_list": "リストからずりのぞく",
+ "add_to_list": "リストにいれる",
+ "editing_list": "リスト {listTitle} をぞんしゅうしおいたす",
+ "creating_list": "あたらしいリストを぀くっおいたす",
+ "update_title": "なたえをほぞんする",
+ "really_delete": "ほんずうに、リストをけしたすか",
+ "is_in_list": "すでにリストのなかにありたす",
+ "error": "リストをぞんしゅうするずきに、゚ラヌになりたした: {0}"
+ },
+ "file_type": {
+ "audio": "オヌディオ",
+ "video": "ビデオ",
+ "image": "がぞう",
+ "file": "ファむル"
+ },
+ "display_date": {
+ "today": "きょう"
+ },
+ "unicode_domain_indicator": {
+ "tooltip": "このドメむンは、ASCIIいがいのもじをふくんでいたす。"
+ },
+ "domain_mute_card": {
+ "mute": "ミュヌト",
+ "mute_progress": "ミュヌトしおいたす ",
+ "unmute": "ミュヌトをやめる",
+ "unmute_progress": "ミュヌトをやめおいたす "
}
}
diff --git a/src/i18n/uk.json b/src/i18n/uk.json
index c781b1f6..cbb1a21f 100644
--- a/src/i18n/uk.json
+++ b/src/i18n/uk.json
@@ -118,7 +118,10 @@
"totp": "ДвПфактПрМа автеМтОфікація"
},
"enter_two_factor_code": "ВвеЎіть ЎвПфактПрМОй кПЎ автеМтОфікації",
- "placeholder": "Мапр. stepan"
+ "placeholder": "Мапр. stepan",
+ "logout_confirm": "ВО ЎійсМП хПчете вОйтО?",
+ "logout_confirm_accept_button": "ВОйтО",
+ "logout_confirm_cancel_button": "Ні, хПчу МазаЎ!"
},
"importer": {
"error": "ПіЎ час іЌпПртуваММя файлу сталася пПЌОлка.",
@@ -189,7 +192,8 @@
"mobile_notifications": "ВіЎкрОтО спПвіщеММя (є МепрПчОтаМі)",
"mobile_notifications_close": "ЗакрОтО спПвіщеММя",
"edit_nav_mobile": "РеЎагуватО паМель Мавігації",
- "announcements": "АМПМсО"
+ "announcements": "АМПМсО",
+ "search_close": "ЗакрОтО паМель пПшуку"
},
"media_modal": {
"next": "НаступМа",
diff --git a/src/i18n/zh.json b/src/i18n/zh.json
index 8f0b04bd..8ea4c1e0 100644
--- a/src/i18n/zh.json
+++ b/src/i18n/zh.json
@@ -59,7 +59,9 @@
"never_show_again": "䞍再星瀺",
"undo": "撀销",
"yes": "是",
- "no": "吊"
+ "no": "吊",
+ "unpin": "取消固定该项",
+ "pin": "固定该项"
},
"image_cropper": {
"crop_picture": "裁剪囟片",
@@ -88,7 +90,11 @@
"heading": {
"totp": "双重因玠验证",
"recovery": "双重因玠恢倍"
- }
+ },
+ "logout_confirm_cancel_button": "䞍芁登出",
+ "logout_confirm_title": "确讀登出",
+ "logout_confirm_accept_button": "登出",
+ "logout_confirm": "悚确定芁登出吗"
},
"media_modal": {
"previous": "埀前",
@@ -120,7 +126,11 @@
"edit_finish": "完成猖蟑",
"mobile_notifications": "打匀通知有未读的",
"mobile_notifications_close": "关闭通知",
- "announcements": "公告"
+ "announcements": "公告",
+ "edit_nav_mobile": "自定义富航栏",
+ "edit_pinned": "猖蟑固定的项目",
+ "mobile_sidebar": "切换移劚讟倇䟧栏",
+ "search_close": "关闭搜玢栏"
},
"notifications": {
"broken_favorite": "未知的状态正圚搜玢䞭 ",
@@ -135,7 +145,8 @@
"migrated_to": "迁移到了",
"follow_request": "想芁关泚䜠",
"error": "取埗通知时发生错误{0}",
- "poll_ended": "投祚结束了"
+ "poll_ended": "投祚结束了",
+ "submitted_report": "提亀䞟报"
},
"polls": {
"add_poll": "增加投祚",
@@ -160,7 +171,9 @@
"favs_repeats": "蜬发和喜欢",
"follows": "新的关泚者",
"load_older": "加蜜曎早的互劚",
- "moves": "甚户迁移"
+ "moves": "甚户迁移",
+ "reports": "䞟报",
+ "emoji_reactions": "衚情回应"
},
"post_status": {
"new_status": "发垃新状态",
@@ -194,7 +207,12 @@
"media_description": "媒䜓描述",
"media_description_error": "曎新媒䜓倱莥请重试",
"empty_status_error": "䞍胜发垃没有内容、没有附件的发文",
- "post": "发送"
+ "post": "发送",
+ "edit_remote_warning": "其它远皋实䟋可胜䞍支持猖蟑并䞔无法接收悚的垖子的最新版本。",
+ "edit_unsupported_warning": "Pleroma 䞍支持对提及或投祚进行猖蟑。",
+ "edit_status": "猖蟑状态",
+ "content_type_selection": "发垖栌匏",
+ "scope_notice_dismiss": "关闭歀提瀺"
},
"registration": {
"bio": "简介",
@@ -214,12 +232,18 @@
"email_required": "䞍胜留空",
"password_required": "䞍胜留空",
"password_confirmation_required": "䞍胜留空",
- "password_confirmation_match": "密码䞍䞀臎"
+ "password_confirmation_match": "密码䞍䞀臎",
+ "birthday_required": "䞍胜䞺空",
+ "birthday_min_age": "必须圚 {date} 或之前"
},
"reason_placeholder": "歀实䟋的泚册需芁手劚批准。\n请让管理员知道悚䞺什么想芁泚册。",
"reason": "泚册理由",
"register": "泚册",
- "email_language": "䜠想从服务噚收到什么语蚀的邮件"
+ "email_language": "䜠想从服务噚收到什么语蚀的邮件",
+ "bio_optional": "介绍可选",
+ "email_optional": "电子邮件可选",
+ "birthday": "生日",
+ "birthday_optional": "生日可选"
},
"selectable_list": {
"select_all": "选择党郚"
@@ -271,7 +295,7 @@
"change_password_error": "修改密码的时候出了点问题。",
"changed_password": "成功修改了密码",
"collapse_subject": "折叠垊䞻题的内容",
- "composing": "写䜜",
+ "composing": "撰写",
"confirm_new_password": "确讀新密码",
"current_avatar": "圓前倎像",
"current_password": "圓前密码",
@@ -610,7 +634,7 @@
"backup_settings": "倇仜讟眮到文件",
"backup_restore": "讟眮倇仜"
},
- "right_sidebar": "圚右䟧星瀺䟧蟹栏",
+ "right_sidebar": "反蜬分栏的顺序",
"hide_shoutbox": "隐藏实䟋留蚀板",
"expert_mode": "星瀺高级",
"download_backup": "䞋蜜",
@@ -642,7 +666,79 @@
"move_account_notes": "劂果䜠想把莊号移劚到别的地方䜠必须去目标莊号然后加䞀䞪指向这里的别名。",
"wordfilter": "词语过滀噚",
"user_profiles": "甚户资料",
- "third_column_mode_notifications": "消息栏"
+ "third_column_mode_notifications": "通知栏",
+ "backup_running": "歀倇仜正圚进行已倄理 {number} 条记圕。 |歀倇仜正圚进行已倄理 {number} 条记圕。",
+ "lists_navigation": "圚富航䞭星瀺列衚",
+ "word_filter_and_more": "词过滀噚及其它...",
+ "backup_failed": "歀倇仜已倱莥。",
+ "birthday": {
+ "label": "生日",
+ "show_birthday": "展瀺我的生日"
+ },
+ "hide_favorites_description": "䞍星瀺我的喜欢列衚人们仍然䌚收到通知",
+ "third_column_mode": "圓有足借的空闎时星瀺第䞉栏包含",
+ "third_column_mode_postform": "䞻芁的发文圢匏和富航",
+ "columns": "分栏",
+ "user_popover_avatar_overlay": "圚甚户倎像䞊星瀺甚户匹出窗口",
+ "navbar_column_stretch": "延䌞富航栏至分栏宜床",
+ "posts": "垖子",
+ "conversation_display_linear_quick": "线性视囟",
+ "conversation_other_replies_button": "星瀺 “其它回倍” 按钮",
+ "confirm_dialogs_delete": "删陀状态",
+ "confirm_dialogs_mute": "隐藏甚户",
+ "column_sizes": "分栏倧小",
+ "column_sizes_sidebar": "䟧栏",
+ "column_sizes_content": "內容",
+ "column_sizes_notifs": "通知",
+ "conversation_other_replies_button_below": "圚状态䞋方",
+ "conversation_other_replies_button_inside": "圚状态䞭",
+ "auto_update": "自劚星瀺新的垖子",
+ "use_websockets": "䜿甚 websockets实时曎新",
+ "max_depth_in_thread": "默讀星瀺同䞻题垖子䞭的最倧层数",
+ "hide_wordfiltered_statuses": "隐藏经过词语过滀的状态",
+ "hide_muted_threads": "䞍星瀺已隐藏的同䞻题垖子",
+ "notification_visibility_polls": "䜠所投的投祚的结束于",
+ "tree_advanced": "允讞圚树状视囟䞭进行曎灵掻的富航",
+ "tree_fade_ancestors": "以暡糊的文字星瀺圓前状态的原型",
+ "conversation_display_linear": "线性样匏",
+ "mention_link_fade_domain": "淡化域名䟋劂{'@'}example.org 侭的 {'@'}foo{'@'}example.org",
+ "mention_link_bolden_you": "圓䜠被提及时突出星瀺提及䜠",
+ "user_popover_avatar_action": "匹出匏倎像点击劚䜜",
+ "user_popover_avatar_action_zoom": "猩攟倎像",
+ "user_popover_avatar_action_close": "关闭匹出窗口",
+ "show_yous": "星瀺 (You)s",
+ "add_language": "添加倇甚语蚀",
+ "remove_language": "移陀",
+ "primary_language": "䞻芁语蚀",
+ "fallback_language": "倇甚语蚀 {index}",
+ "account_privacy": "隐私",
+ "conversation_display": "对话星瀺样匏",
+ "conversation_display_tree": "树状样匏",
+ "conversation_display_tree_quick": "树状视囟",
+ "disable_sticky_headers": "䞍芁把分栏的顶栏固定圚屏幕的顶郚",
+ "confirm_dialogs": "请求确讀于",
+ "confirm_dialogs_logout": "登出",
+ "confirm_dialogs_deny_follow": "拒绝关泚请求",
+ "confirm_dialogs_approve_follow": "批准关泚请求",
+ "confirm_dialogs_block": "屏蔜甚户",
+ "confirm_dialogs_unfollow": "取消关泚甚户",
+ "confirm_dialogs_repeat": "蜬发状态",
+ "confirm_dialogs_remove_follower": "移陀关泚者",
+ "mute_bot_posts": "隐藏机噚人的垖子",
+ "hide_bot_indication": "隐藏垖子䞭的机噚人提瀺",
+ "always_show_post_button": "始终星瀺浮劚的新垖子按钮",
+ "show_scrollbars": "星瀺䟧栏的滚劚条",
+ "third_column_mode_none": "完党䞍星瀺第䞉栏",
+ "use_at_icon": "将 {'@'} 笊号星瀺䞺囟标而䞍是文本",
+ "mention_link_display": "星瀺提及铟接",
+ "mention_link_display_short": "始终以简称的圢匏出现䟋劂{'@'}foo",
+ "mention_link_display_full_for_remote": "仅远皋实䟋甚户以党名的圢匏出现䟋劂{'@'}foo{'@'}example.org",
+ "mention_link_display_full": "始终以党名的圢匏出现䟋劂{'@'}foo{'@'}example.org",
+ "mention_link_use_tooltip": "点击提及铟接时星瀺甚户卡片",
+ "mention_link_show_avatar": "圚铟接旁蟹星瀺甚户倎像",
+ "mention_link_show_avatar_quick": "圚提及内容旁蟹星瀺甚户倎像",
+ "user_popover_avatar_action_open": "打匀䞪人资料",
+ "autocomplete_select_first": "圓有自劚完成的结果时自劚选择第䞀䞪候选项"
},
"time": {
"day": "{0} 倩",
@@ -708,7 +804,9 @@
"reload": "重新蜜入",
"error": "取埗时闎蜎时发生错误{0}",
"socket_broke": "䞢倱实时连接CloseEvent code {0}",
- "socket_reconnected": "已建立实时连接"
+ "socket_reconnected": "已建立实时连接",
+ "quick_view_settings": "快速视囟讟眮",
+ "quick_filter_settings": "快速过滀讟眮"
},
"status": {
"favorites": "喜欢",
@@ -717,7 +815,7 @@
"pin": "圚䞪人资料眮顶",
"unpin": "取消圚䞪人资料眮顶",
"pinned": "眮顶",
- "delete_confirm": "䜠真的想芁删陀这条状态吗",
+ "delete_confirm": "悚确定芁删陀这条状态吗",
"reply_to": "回倍",
"replies_list": "回倍",
"mute_conversation": "隐藏对话",
@@ -726,7 +824,7 @@
"show_content": "星瀺内容",
"hide_full_subject": "隐藏歀郚分标题",
"show_full_subject": "星瀺党郚标题",
- "thread_muted": "歀系列消息已被隐藏",
+ "thread_muted": "同䞻题垖子已被隐藏",
"copy_link": "倍制状态铟接",
"status_unavailable": "状态䞍可取埗",
"unbookmark": "取消乊筟",
@@ -747,10 +845,10 @@
"attachment_stop_flash": "停止 Flash 播攟噚",
"move_up": "把附件巊移",
"open_gallery": "打匀囟库",
- "thread_hide": "隐藏这䞪线玢",
- "thread_show": "星瀺这䞪线玢",
+ "thread_hide": "隐藏这䞪同䞻题垖子",
+ "thread_show": "星瀺这䞪同䞻题垖子",
"thread_show_full_with_icon": "{icon} {text}",
- "thread_follow": "查看这䞪线玢的剩䜙郚分䞀共有 {numStatus} 䞪状态",
+ "thread_follow": "查看这䞪同䞻题垖子的剩䜙郚分䞀共有 {numStatus} 䞪状态",
"thread_follow_with_icon": "{icon} {text}",
"ancestor_follow": "查看这䞪状态䞋的别的 {numReplies} 䞪回倍",
"ancestor_follow_with_icon": "{icon} {text}",
@@ -759,8 +857,19 @@
"mentions": "提及",
"replies_list_with_others": "回倍及倖 +{numReplies} 䞪",
"move_down": "把附件右移",
- "thread_show_full": "星瀺这䞪线玢䞋的所有䞜西䞀共有 {numStatus} 䞪状态最倧深床 {depth}",
- "show_only_conversation_under_this": "只星瀺这䞪状态的回倍"
+ "thread_show_full": "星瀺这䞪同䞻题垖子䞋的所有䞜西䞀共有 {numStatus} 䞪状态最倧深床 {depth}",
+ "show_only_conversation_under_this": "只星瀺这䞪状态的回倍",
+ "repeat_confirm": "悚确定芁蜬发这条状态吗",
+ "repeat_confirm_title": "确讀蜬发",
+ "repeat_confirm_accept_button": "蜬发",
+ "repeat_confirm_cancel_button": "䞍芁蜬发",
+ "edit": "猖蟑状态",
+ "edited_at": "最后猖蟑于 {time}",
+ "delete_confirm_title": "确讀删陀",
+ "delete_confirm_accept_button": "删陀",
+ "delete_confirm_cancel_button": "保留",
+ "show_attachment_in_modal": "圚媒䜓暡匏䞭星瀺",
+ "status_history": "状态历史"
},
"user_card": {
"approve": "栞准",
@@ -808,7 +917,8 @@
"disable_remote_subscription": "犁止从远皋实䟋关泚甚户",
"disable_any_subscription": "完党犁止关泚甚户",
"quarantine": "从联合实䟋䞭犁止甚户垖子",
- "delete_user": "删陀甚户"
+ "delete_user": "删陀甚户",
+ "delete_user_data_and_deactivate_confirmation": "这将氞久删陀该莊户的数据并停甚该莊户。䜠完党确定吗"
},
"hidden": "已隐藏",
"show_repeats": "星瀺蜬发",
@@ -822,7 +932,41 @@
"solid": "单䞀颜色背景",
"disabled": "䞍突出星瀺"
},
- "edit_profile": "猖蟑䞪人资料"
+ "edit_profile": "猖蟑䞪人资料",
+ "approve_confirm_title": "确讀批准",
+ "approve_confirm_accept_button": "批准",
+ "block_confirm_accept_button": "屏蔜",
+ "block_confirm_cancel_button": "䞍芁屏蔜",
+ "deactivated": "已停甚",
+ "deny_confirm_title": "确讀拒绝",
+ "deny_confirm_accept_button": "拒绝",
+ "deny_confirm_cancel_button": "䞍芁拒绝",
+ "deny_confirm": "悚是吊芁拒绝 {user} 的关泚请求",
+ "follow_cancel": "取消请求",
+ "unfollow_confirm_title": "确讀取消关泚",
+ "unfollow_confirm": "悚确定芁取消关泚 {user} 吗",
+ "unfollow_confirm_accept_button": "取消关泚",
+ "unfollow_confirm_cancel_button": "䞍芁取消关泚",
+ "mute_confirm_title": "确讀隐藏",
+ "mute_confirm_accept_button": "隐藏",
+ "mute_confirm_cancel_button": "䞍芁隐藏",
+ "mute_duration_prompt": "让这䞪甚户隐藏0衚瀺无限期",
+ "remove_follower": "移陀关泚者",
+ "remove_follower_confirm_title": "确讀移陀关泚者",
+ "remove_follower_confirm_cancel_button": "保留",
+ "remove_follower_confirm": "悚确定芁将 {user} 从悚的关泚者里移陀吗",
+ "birthday": "生于 {birthday}",
+ "note": "倇泚",
+ "approve_confirm_cancel_button": "䞍芁批准",
+ "approve_confirm": "悚是吊芁批准 {user} 的关泚请求",
+ "block_confirm_title": "确讀屏蔜",
+ "block_confirm": "悚确定芁屏蔜 {user} 吗",
+ "mute_confirm": "悚确定芁隐藏 {user} 吗",
+ "remove_follower_confirm_accept_button": "移陀",
+ "note_blank": "空",
+ "edit_note": "猖蟑倇泚",
+ "edit_note_apply": "应甚",
+ "edit_note_cancel": "取消"
},
"user_profile": {
"timeline_title": "甚户时闎线",
@@ -851,7 +995,10 @@
"reject_follow_request": "拒绝关泚请求",
"add_reaction": "添加互劚",
"bookmark": "乊筟",
- "accept_follow_request": "接受关泚请求"
+ "accept_follow_request": "接受关泚请求",
+ "toggle_expand": "展匀或折叠通知以星瀺垖子党文",
+ "toggle_mute": "展匀或折叠通知以星瀺已隐藏的内容",
+ "autocomplete_available": "共有 {number} 䞪结果可甚。䜿甚向䞊和向䞋键浏览它们。"
},
"upload": {
"error": {
@@ -873,7 +1020,9 @@
"hashtags": "话题标筟",
"person_talking": "{count} 人正圚讚论",
"people_talking": "{count} 人正圚讚论",
- "no_results": "没有搜玢结果"
+ "no_results": "没有搜玢结果",
+ "no_more_results": "没有曎倚结果",
+ "load_more": "加蜜曎倚结果"
},
"password_reset": {
"forgot_password": "忘记密码了",
@@ -910,9 +1059,11 @@
"symbols": "笊号",
"travel-and-places": "旅行和地点",
"activities": "掻劚",
- "animals-and-nature": "劚物和自然"
+ "animals-and-nature": "劚物和自然",
+ "smileys-and-emotion": "衚情䞎情感"
},
- "regional_indicator": "地区指瀺笊 {letter}"
+ "regional_indicator": "地区指瀺笊 {letter}",
+ "unpacked": "拆分的衚情笊号"
},
"about": {
"mrf": {
@@ -972,7 +1123,7 @@
"empty_chat_list_placeholder": "悚还没有任䜕聊倩记圕。匀始聊倩吧",
"error_sending_message": "发送消息时出了点问题。",
"error_loading_chat": "加蜜聊倩时出了点问题。",
- "delete_confirm": "悚确实芁删陀歀消息吗",
+ "delete_confirm": "悚确定芁删陀歀消息吗",
"more": "曎倚",
"empty_message_error": "无法发垃空消息",
"new": "新聊倩",
@@ -1001,5 +1152,48 @@
"submit_edit_action": "提亀",
"cancel_edit_action": "取消",
"inactive_message": "这䞪公告䞍掻跃"
+ },
+ "report": {
+ "reported_user": "被䞟报者",
+ "state_closed": "已关闭",
+ "state_resolved": "已解决",
+ "reporter": "䞟报者",
+ "state_open": "匀启",
+ "reported_statuses": "已䞟报的状态",
+ "notes": "倇泚",
+ "state": "状态"
+ },
+ "unicode_domain_indicator": {
+ "tooltip": "歀域名包含非 ascii 字笊。"
+ },
+ "update": {
+ "update_bugs_gitlab": "Pleroma GitLab",
+ "update_changelog": "关于变化的曎倚细节请参见 {theFullChangelog} 。",
+ "update_changelog_here": "完敎的曎新日志",
+ "big_update_title": "请忍耐䞀䞋",
+ "big_update_content": "我们已经有䞀段时闎没有发垃发行版所以事情的倖观和感觉可胜䞎䜠习惯的䞍䞀样。",
+ "update_bugs": "请圚 {pleromaGitlab} 䞊报告任䜕问题和bug因䞺我们已经改变了埈倚虜然我们进行了圻底的测试并䞔自己䜿甚了匀发版本䜆我们可胜错过了䞀些䞜西。我们欢迎䜠对䜠可胜遇到的问题或劂䜕改进Pleroma和Pleroma-FE提出反銈和建议。",
+ "art_by": "Art by {linkToArtist}"
+ },
+ "lists": {
+ "search": "搜玢甚户",
+ "create": "创建",
+ "save": "保存曎改",
+ "delete": "删陀列衚",
+ "following_only": "限制于正圚关泚",
+ "manage_lists": "管理列衚",
+ "manage_members": "管理列衚成员",
+ "add_members": "搜玢曎倚甚户",
+ "remove_from_list": "从列衚䞭移陀",
+ "add_to_list": "添加到列衚",
+ "is_in_list": "已圚列衚䞭",
+ "editing_list": "正圚猖蟑列衚 {listTitle}",
+ "creating_list": "正圚创建新的列衚",
+ "update_title": "保存标题",
+ "really_delete": "真的芁删陀列衚吗",
+ "error": "操䜜列衚时出错{0}",
+ "lists": "列衚",
+ "new": "新的列衚",
+ "title": "列衚标题"
}
}
diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json
index 6f0f63b5..96c75215 100644
--- a/src/i18n/zh_Hant.json
+++ b/src/i18n/zh_Hant.json
@@ -113,12 +113,23 @@
"submit": "提亀",
"apply": "應甚",
"role": {
- "moderator": "䞻持人",
+ "moderator": "審查者",
"admin": "管理員"
},
"flash_content": "點擊以䜿甚 Ruffle 顯瀺 Flash 內容寊驗性可胜無效。",
"flash_security": "請泚意這可胜有朜圚的危險因為Flash內容仍然是歊斷的皋匏碌。",
- "flash_fail": "無法加茉flash內容請參閱控制台瞭解詳现資蚊。"
+ "flash_fail": "無法加茉flash內容請參閱控制台瞭解詳现資蚊。",
+ "no": "吊",
+ "generic_error_message": "癌生了䞀個錯誀 {0}",
+ "never_show_again": "䞍再顯瀺",
+ "yes": "是",
+ "undo": "埩原",
+ "scroll_to_top": "滟動至頂郚",
+ "pin": "眮頂",
+ "scope_in_timeline": {
+ "private": "僅關泚者"
+ },
+ "unpin": "停止眮頂"
},
"finder": {
"find_user": "尋扟甚戶",
@@ -133,7 +144,8 @@
"pleroma_chat_messages": "Pleroma 聊倩",
"chat": "聊倩",
"gopher": "Gopher",
- "upload_limit": "䞊傳限制"
+ "upload_limit": "䞊傳限制",
+ "shout": "留蚀板"
},
"exporter": {
"processing": "正圚處理皍埌會提瀺悚䞋茉文件",
@@ -164,11 +176,14 @@
"reject": "拒絕",
"accept_desc": "本寊䟋只接收䟆自䞋列寊䟋的消息",
"simple_policies": "站芏",
- "accept": "接受"
+ "accept": "接受",
+ "instance": "寊䟋",
+ "reason": "原因",
+ "not_applicable": "N/A"
},
"mrf_policies_desc": "MRF 策略會圱響本寊䟋的互通行為。以䞋策略已啟甚",
"keyword": {
- "ftl_removal": "埞“党郚已知網絡”時間線䞊移陀",
+ "ftl_removal": "埞「党郚已知網絡」時間線䞊移陀",
"replace": "取代",
"reject": "拒絕",
"is_replaced_by": "→",
@@ -865,5 +880,26 @@
"password_reset_disabled": "密碌重眮已經被犁甚。請聯繫䜠的寊䟋管理員。",
"password_reset_required": "悚必須重眮密碌才胜登陞。",
"password_reset_required_but_mailer_is_disabled": "悚必須重眮密碌䜆是密碌重眮被犁甚了。請聯繫悚所圚寊䟋的管理員。"
+ },
+ "announcements": {
+ "post_error": "錯誀 {error}",
+ "close_error": "關閉",
+ "delete_action": "刪陀",
+ "start_time_prompt": "開始時間 ",
+ "end_time_prompt": "結束時間 ",
+ "all_day_prompt": "這是党日掻動",
+ "start_time_display": "{time} 開始",
+ "end_time_display": "{time} 結束",
+ "published_time_display": "{time} 癌垃",
+ "edit_action": "線茯",
+ "submit_edit_action": "送出",
+ "cancel_edit_action": "取消",
+ "inactive_message": "歀公告無效",
+ "page_header": "公告",
+ "title": "公告",
+ "mark_as_read_action": "暙瀺為以閱讀",
+ "post_placeholder": "圚歀茞入悚的公告內容  ",
+ "post_form_header": "癌垃公告",
+ "post_action": "癌垃"
}
}
diff --git a/src/modules/config.js b/src/modules/config.js
index eb33f95f..7597886e 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -97,6 +97,7 @@ export const defaultState = {
sidebarColumnWidth: '25rem',
contentColumnWidth: '45rem',
notifsColumnWidth: '25rem',
+ emojiReactionsScale: 1.0,
navbarColumnStretch: false,
greentext: undefined, // instance default
useAtIcon: undefined, // instance default
@@ -115,7 +116,8 @@ export const defaultState = {
conversationTreeAdvanced: undefined, // instance default
conversationOtherRepliesButton: undefined, // instance default
conversationTreeFadeAncestors: undefined, // instance default
- maxDepthInThread: undefined // instance default
+ maxDepthInThread: undefined, // instance default
+ autocompleteSelect: undefined // instance default
}
// caching the instance default properties
@@ -184,6 +186,7 @@ const config = {
case 'sidebarColumnWidth':
case 'contentColumnWidth':
case 'notifsColumnWidth':
+ case 'emojiReactionsScale':
applyConfig(state)
break
case 'customTheme':
diff --git a/src/modules/instance.js b/src/modules/instance.js
index 16f72583..bb0292da 100644
--- a/src/modules/instance.js
+++ b/src/modules/instance.js
@@ -104,6 +104,7 @@ const defaultState = {
conversationOtherRepliesButton: 'below',
conversationTreeFadeAncestors: false,
maxDepthInThread: 6,
+ autocompleteSelect: false,
// Nasty stuff
customEmoji: [],
@@ -122,6 +123,7 @@ const defaultState = {
// Feature-set, apparently, not everything here is reported...
shoutAvailable: false,
pleromaChatMessagesAvailable: false,
+ pleromaCustomEmojiReactionsAvailable: false,
gopherAvailable: false,
mediaProxyAvailable: false,
suggestionsEnabled: false,
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index b8c10b21..259e5b30 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -840,7 +840,7 @@ const postStatus = ({
})
if (pollOptions.some(option => option !== '')) {
const normalizedPoll = {
- expires_in: poll.expiresIn,
+ expires_in: parseInt(poll.expiresIn, 10),
multiple: poll.multiple
}
Object.keys(normalizedPoll).forEach(key => {
@@ -897,7 +897,7 @@ const editStatus = ({
if (pollOptions.some(option => option !== '')) {
const normalizedPoll = {
- expires_in: poll.expiresIn,
+ expires_in: parseInt(poll.expiresIn, 10),
multiple: poll.multiple
}
Object.keys(normalizedPoll).forEach(key => {
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 53c3108c..adefc5a5 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -441,6 +441,7 @@ export const parseNotification = (data) => {
: parseUser(data.target)
output.from_profile = parseUser(data.account)
output.emoji = data.emoji
+ output.emoji_url = data.emoji_url
if (data.report) {
output.report = data.report
output.report.content = data.report.content
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index d6e973a1..43fe3c73 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -21,8 +21,8 @@ export const applyTheme = (input) => {
body.classList.remove('hidden')
}
-const configColumns = ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth }) =>
- ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth })
+const configColumns = ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth, emojiReactionsScale }) =>
+ ({ sidebarColumnWidth, contentColumnWidth, notifsColumnWidth, emojiReactionsScale })
const defaultConfigColumns = configColumns(defaultState)