diff options
Diffstat (limited to 'src')
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> <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) |
