forked from AkkomaGang/akkoma-fe
Compare commits
36 commits
paginate-f
...
develop
Author | SHA1 | Date | |
---|---|---|---|
|
1f943ce8a5 | ||
c540764408 | |||
|
a4dfdc0853 | ||
ddea499a36 | |||
|
db33fe8ee2 | ||
|
f1bf22436d | ||
|
459c73ec02 | ||
|
2acf1e5c59 | ||
|
33c4459744 | ||
|
b00487e51f | ||
|
1e1cab643c | ||
|
8d3219a6d2 | ||
|
ec9753758f | ||
|
97ff4a7241 | ||
14cedc5ed1 | |||
5911777aa2 | |||
47fc082fb9 | |||
7e1b1e79f4 | |||
b92b2f74a4 | |||
7361f4e77e | |||
9f7f9e2798 | |||
42ab3eada4 | |||
6fdef479d0 | |||
fe08691f05 | |||
6a9764951f | |||
0f33b1cd79 | |||
999c38594e | |||
626c880038 | |||
6d7761c7e5 | |||
996ce3dde3 | |||
|
2c007f06e3 | ||
|
00704bd88c | ||
6a9d169e24 | |||
581c53a15e | |||
9e04e4fd80 | |||
88d5149db5 |
52 changed files with 2203 additions and 764 deletions
|
@ -4,8 +4,6 @@
|
|||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
|
||||
<title>Akkoma</title>
|
||||
<link rel="stylesheet" href="/static/font/css/fontello.css">
|
||||
<link rel="stylesheet" href="/static/font/css/animation.css">
|
||||
<link rel="stylesheet" href="/static/font/tiresias.css">
|
||||
<link rel="stylesheet" href="/static/font/css/lato.css">
|
||||
<link rel="stylesheet" href="/static/mfm.css">
|
||||
|
|
|
@ -322,6 +322,9 @@ const getNodeInfo = async ({ store }) => {
|
|||
: federation.enabled
|
||||
})
|
||||
|
||||
store.dispatch('setInstanceOption', { name: 'publicTimelineVisibility', value: metadata.publicTimelineVisibility })
|
||||
store.dispatch('setInstanceOption', { name: 'federatedTimelineAvailable', value: metadata.federatedTimelineAvailable })
|
||||
|
||||
const accountActivationRequired = metadata.accountActivationRequired
|
||||
store.dispatch('setInstanceOption', { name: 'accountActivationRequired', value: accountActivationRequired })
|
||||
|
||||
|
@ -396,9 +399,6 @@ const afterStoreSetup = async ({ store, i18n }) => {
|
|||
])
|
||||
|
||||
// Start fetching things that don't need to block the UI
|
||||
store.dispatch('fetchMutes')
|
||||
store.dispatch('startFetchingAnnouncements')
|
||||
store.dispatch('startFetchingReports')
|
||||
getTOS({ store })
|
||||
getStickers({ store })
|
||||
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
import SearchBar from 'components/search_bar/search_bar.vue'
|
||||
import ConfirmModal from '../confirm_modal/confirm_modal.vue'
|
||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||
import {
|
||||
publicTimelineVisible,
|
||||
federatedTimelineVisible,
|
||||
bubbleTimelineVisible,
|
||||
} from '../../lib/timeline_visibility'
|
||||
import {
|
||||
faSignInAlt,
|
||||
faSignOutAlt,
|
||||
|
@ -19,6 +24,7 @@ import {
|
|||
faInfoCircle,
|
||||
faUserTie
|
||||
} from '@fortawesome/free-solid-svg-icons'
|
||||
import { mapState } from 'vuex'
|
||||
|
||||
library.add(
|
||||
faSignInAlt,
|
||||
|
@ -103,7 +109,12 @@ export default {
|
|||
},
|
||||
showBubbleTimeline () {
|
||||
return this.$store.state.instance.localBubbleInstances.length > 0
|
||||
}
|
||||
},
|
||||
...mapState({
|
||||
publicTimelineVisible,
|
||||
federatedTimelineVisible,
|
||||
bubbleTimelineVisible,
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
scrollToTop () {
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
<router-link
|
||||
:to="{ name: 'public-timeline' }"
|
||||
class="nav-icon"
|
||||
v-if="publicTimelineVisible"
|
||||
>
|
||||
<FAIcon
|
||||
fixed-width
|
||||
|
@ -55,7 +56,7 @@
|
|||
/>
|
||||
</router-link>
|
||||
<router-link
|
||||
v-if="currentUser && showBubbleTimeline"
|
||||
v-if="bubbleTimelineVisible"
|
||||
:to="{ name: 'bubble-timeline' }"
|
||||
class="nav-icon"
|
||||
>
|
||||
|
@ -69,6 +70,7 @@
|
|||
<router-link
|
||||
:to="{ name: 'public-external-timeline' }"
|
||||
class="nav-icon"
|
||||
v-if="federatedTimelineVisible"
|
||||
>
|
||||
<FAIcon
|
||||
fixed-width
|
||||
|
|
133
src/components/emoji_grid/emoji_grid.js
Normal file
133
src/components/emoji_grid/emoji_grid.js
Normal file
|
@ -0,0 +1,133 @@
|
|||
const EMOJI_SIZE = 32 + 8
|
||||
const GROUP_TITLE_HEIGHT = 24
|
||||
const BUFFER_SIZE = 3 * EMOJI_SIZE
|
||||
|
||||
const EmojiGrid = {
|
||||
props: {
|
||||
groups: {
|
||||
required: true,
|
||||
type: Array
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
containerWidth: 0,
|
||||
containerHeight: 0,
|
||||
scrollPos: 0,
|
||||
resizeObserver: null
|
||||
}
|
||||
},
|
||||
mounted () {
|
||||
const rect = this.$refs.container.getBoundingClientRect()
|
||||
this.containerWidth = rect.width
|
||||
this.containerHeight = rect.height
|
||||
this.resizeObserver = new ResizeObserver((entries) => {
|
||||
for (const entry of entries) {
|
||||
this.containerWidth = entry.contentRect.width
|
||||
this.containerHeight = entry.contentRect.height
|
||||
}
|
||||
})
|
||||
this.resizeObserver.observe(this.$refs.container)
|
||||
},
|
||||
beforeUnmount () {
|
||||
this.resizeObserver.disconnect()
|
||||
this.resizeObserver = null
|
||||
},
|
||||
watch: {
|
||||
groups () {
|
||||
// Scroll to top when grid content changes
|
||||
if (this.$refs.container) {
|
||||
this.$refs.container.scrollTo(0, 0)
|
||||
}
|
||||
},
|
||||
activeGroup (group) {
|
||||
this.$emit('activeGroup', group)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onScroll () {
|
||||
this.scrollPos = this.$refs.container.scrollTop
|
||||
},
|
||||
onEmoji (emoji) {
|
||||
this.$emit('emoji', emoji)
|
||||
},
|
||||
scrollToItem (itemId) {
|
||||
const container = this.$refs.container
|
||||
if (!container) return
|
||||
|
||||
for (const item of this.itemList) {
|
||||
if (item.id === itemId) {
|
||||
container.scrollTo(0, item.position.y)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// Total height of scroller content
|
||||
gridHeight () {
|
||||
if (this.itemList.length === 0) return 0
|
||||
const lastItem = this.itemList[this.itemList.length - 1]
|
||||
return (
|
||||
lastItem.position.y +
|
||||
('title' in lastItem ? GROUP_TITLE_HEIGHT : EMOJI_SIZE)
|
||||
)
|
||||
},
|
||||
activeGroup () {
|
||||
const items = this.itemList
|
||||
for (let i = items.length - 1; i >= 0; i--) {
|
||||
const item = items[i]
|
||||
if ('title' in item && item.position.y <= this.scrollPos) {
|
||||
return item.id
|
||||
}
|
||||
}
|
||||
return null
|
||||
},
|
||||
itemList () {
|
||||
const items = []
|
||||
let x = 0
|
||||
let y = 0
|
||||
for (const group of this.groups) {
|
||||
items.push({ position: { x, y }, id: group.id, title: group.text })
|
||||
if (group.text.length) {
|
||||
y += GROUP_TITLE_HEIGHT
|
||||
}
|
||||
for (const emoji of group.emojis) {
|
||||
items.push({
|
||||
position: { x, y },
|
||||
id: `${group.id}-${emoji.displayText}`,
|
||||
emoji
|
||||
})
|
||||
x += EMOJI_SIZE
|
||||
if (x + EMOJI_SIZE > this.containerWidth) {
|
||||
y += EMOJI_SIZE
|
||||
x = 0
|
||||
}
|
||||
}
|
||||
if (x > 0) {
|
||||
y += EMOJI_SIZE
|
||||
x = 0
|
||||
}
|
||||
}
|
||||
return items
|
||||
},
|
||||
visibleItems () {
|
||||
const startPos = this.scrollPos - BUFFER_SIZE
|
||||
const endPos = this.scrollPos + this.containerHeight + BUFFER_SIZE
|
||||
return this.itemList.filter((i) => {
|
||||
return i.position.y >= startPos && i.position.y < endPos
|
||||
})
|
||||
},
|
||||
scrolledClass () {
|
||||
if (this.scrollPos <= 5) {
|
||||
return 'scrolled-top'
|
||||
} else if (this.scrollPos >= this.gridHeight - this.containerHeight - 5) {
|
||||
return 'scrolled-bottom'
|
||||
} else {
|
||||
return 'scrolled-middle'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default EmojiGrid
|
60
src/components/emoji_grid/emoji_grid.scss
Normal file
60
src/components/emoji_grid/emoji_grid.scss
Normal file
|
@ -0,0 +1,60 @@
|
|||
.emoji {
|
||||
&-grid {
|
||||
flex: 1 1 1px;
|
||||
position: relative;
|
||||
overflow: auto;
|
||||
user-select: none;
|
||||
mask: linear-gradient(to top, white 0, transparent 100%) bottom no-repeat,
|
||||
linear-gradient(to bottom, white 0, transparent 100%) top no-repeat,
|
||||
linear-gradient(to top, white, white);
|
||||
transition: mask-size 150ms;
|
||||
mask-size: 100% 20px, 100% 20px, auto;
|
||||
// Autoprefixed seem to ignore this one, and also syntax is different
|
||||
-webkit-mask-composite: xor;
|
||||
mask-composite: exclude;
|
||||
&.scrolled {
|
||||
&-top {
|
||||
mask-size: 100% 20px, 100% 0, auto;
|
||||
}
|
||||
&-bottom {
|
||||
mask-size: 100% 0, 100% 20px, auto;
|
||||
}
|
||||
}
|
||||
margin-left: 5px;
|
||||
min-height: 200px;
|
||||
}
|
||||
|
||||
&-group-title {
|
||||
position: absolute;
|
||||
font-size: 0.85em;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: end;
|
||||
|
||||
&.disabled {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
&-item {
|
||||
position: absolute;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
font-size: 32px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin: 4px;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
img {
|
||||
object-fit: contain;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
48
src/components/emoji_grid/emoji_grid.vue
Normal file
48
src/components/emoji_grid/emoji_grid.vue
Normal file
|
@ -0,0 +1,48 @@
|
|||
<template>
|
||||
<div
|
||||
ref="container"
|
||||
class="emoji-grid"
|
||||
:class="scrolledClass"
|
||||
@scroll.passive="onScroll"
|
||||
>
|
||||
<div
|
||||
:style="{
|
||||
height: `${gridHeight}px`,
|
||||
}"
|
||||
>
|
||||
<template v-for="item in visibleItems">
|
||||
<h6
|
||||
v-if="'title' in item && item.title.length"
|
||||
:key="'title-' + item.id"
|
||||
class="emoji-group-title"
|
||||
:style="{
|
||||
top: item.position.y + 'px',
|
||||
left: item.position.x + 'px'
|
||||
}"
|
||||
>
|
||||
{{ item.title }}
|
||||
</h6>
|
||||
<span
|
||||
v-else-if="'emoji' in item"
|
||||
:key="'emoji-' + item.id"
|
||||
class="emoji-item"
|
||||
:title="item.emoji.displayText"
|
||||
:style="{
|
||||
top: item.position.y + 'px',
|
||||
left: item.position.x + 'px'
|
||||
}"
|
||||
@click.stop.prevent="onEmoji(item.emoji)"
|
||||
>
|
||||
<span v-if="!item.emoji.imageUrl">{{ item.emoji.replacement }}</span>
|
||||
<img
|
||||
v-else
|
||||
:src="item.emoji.imageUrl"
|
||||
>
|
||||
</span>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script src="./emoji_grid.js"></script>
|
||||
<style lang="scss" src="./emoji_grid.scss"></style>
|
|
@ -205,7 +205,6 @@ const EmojiInput = {
|
|||
},
|
||||
triggerShowPicker () {
|
||||
this.showPicker = true
|
||||
this.$refs.picker.startEmojiLoad()
|
||||
this.$nextTick(() => {
|
||||
this.scrollIntoView()
|
||||
this.focusPickerInput()
|
||||
|
@ -223,7 +222,6 @@ const EmojiInput = {
|
|||
this.showPicker = !this.showPicker
|
||||
if (this.showPicker) {
|
||||
this.scrollIntoView()
|
||||
this.$refs.picker.startEmojiLoad()
|
||||
this.$nextTick(this.focusPickerInput)
|
||||
}
|
||||
},
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import { defineAsyncComponent } from 'vue'
|
||||
import Checkbox from '../checkbox/checkbox.vue'
|
||||
import EmojiGrid from '../emoji_grid/emoji_grid.vue'
|
||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||
import {
|
||||
faBoxOpen,
|
||||
|
@ -14,13 +15,6 @@ library.add(
|
|||
faSmileBeam
|
||||
)
|
||||
|
||||
// At widest, approximately 20 emoji are visible in a row,
|
||||
// loading 3 rows, could be overkill for narrow picker
|
||||
const LOAD_EMOJI_BY = 60
|
||||
|
||||
// When to start loading new batch emoji, in pixels
|
||||
const LOAD_EMOJI_MARGIN = 64
|
||||
|
||||
const EmojiPicker = {
|
||||
props: {
|
||||
enableStickerPicker: {
|
||||
|
@ -39,16 +33,13 @@ const EmojiPicker = {
|
|||
keyword: '',
|
||||
activeGroup: 'standard',
|
||||
showingStickers: false,
|
||||
groupsScrolledClass: 'scrolled-top',
|
||||
keepOpen: false,
|
||||
customEmojiBufferSlice: LOAD_EMOJI_BY,
|
||||
customEmojiTimeout: null,
|
||||
customEmojiLoadAllConfirmed: false
|
||||
keepOpen: false
|
||||
}
|
||||
},
|
||||
components: {
|
||||
StickerPicker: defineAsyncComponent(() => import('../sticker_picker/sticker_picker.vue')),
|
||||
Checkbox
|
||||
Checkbox,
|
||||
EmojiGrid
|
||||
},
|
||||
methods: {
|
||||
onStickerUploaded (e) {
|
||||
|
@ -60,12 +51,7 @@ const EmojiPicker = {
|
|||
onEmoji (emoji) {
|
||||
const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement
|
||||
this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen })
|
||||
},
|
||||
onScroll (e) {
|
||||
const target = (e && e.target) || this.$refs['emoji-groups']
|
||||
this.updateScrolledClass(target)
|
||||
this.scrolledGroup(target)
|
||||
this.triggerLoadMore(target)
|
||||
this.$store.commit('emojiUsed', emoji)
|
||||
},
|
||||
onWheel (e) {
|
||||
e.preventDefault()
|
||||
|
@ -74,68 +60,12 @@ const EmojiPicker = {
|
|||
highlight (key) {
|
||||
this.setShowStickers(false)
|
||||
this.activeGroup = key
|
||||
},
|
||||
updateScrolledClass (target) {
|
||||
if (target.scrollTop <= 5) {
|
||||
this.groupsScrolledClass = 'scrolled-top'
|
||||
} else if (target.scrollTop >= target.scrollTopMax - 5) {
|
||||
this.groupsScrolledClass = 'scrolled-bottom'
|
||||
} else {
|
||||
this.groupsScrolledClass = 'scrolled-middle'
|
||||
if (this.keyword.length) {
|
||||
this.$refs.emojiGrid.scrollToItem(key)
|
||||
}
|
||||
},
|
||||
triggerLoadMore (target) {
|
||||
const ref = this.$refs['group-end-custom']
|
||||
if (!ref) return
|
||||
const bottom = ref.offsetTop + ref.offsetHeight
|
||||
|
||||
const scrollerBottom = target.scrollTop + target.clientHeight
|
||||
const scrollerTop = target.scrollTop
|
||||
const scrollerMax = target.scrollHeight
|
||||
|
||||
// Loads more emoji when they come into view
|
||||
const approachingBottom = bottom - scrollerBottom < LOAD_EMOJI_MARGIN
|
||||
// Always load when at the very top in case there's no scroll space yet
|
||||
const atTop = scrollerTop < 5
|
||||
// Don't load when looking at unicode category or at the very bottom
|
||||
const bottomAboveViewport = bottom < scrollerTop || scrollerBottom === scrollerMax
|
||||
if (!bottomAboveViewport && (approachingBottom || atTop)) {
|
||||
this.loadEmoji()
|
||||
}
|
||||
},
|
||||
scrolledGroup (target) {
|
||||
const top = target.scrollTop + 5
|
||||
this.$nextTick(() => {
|
||||
this.emojisView.forEach(group => {
|
||||
const ref = this.$refs['group-' + group.id]
|
||||
if (ref.offsetTop <= top) {
|
||||
this.activeGroup = group.id
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
loadEmoji () {
|
||||
const allLoaded = this.customEmojiBuffer.length === this.filteredEmoji.length
|
||||
|
||||
if (allLoaded) {
|
||||
return
|
||||
}
|
||||
|
||||
this.customEmojiBufferSlice += LOAD_EMOJI_BY
|
||||
},
|
||||
startEmojiLoad (forceUpdate = false) {
|
||||
if (!forceUpdate) {
|
||||
this.keyword = ''
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
this.$refs['emoji-groups'].scrollTop = 0
|
||||
})
|
||||
const bufferSize = this.customEmojiBuffer.length
|
||||
const bufferPrefilledAll = bufferSize === this.filteredEmoji.length
|
||||
if (bufferPrefilledAll && !forceUpdate) {
|
||||
return
|
||||
}
|
||||
this.customEmojiBufferSlice = LOAD_EMOJI_BY
|
||||
onActiveGroup (group) {
|
||||
this.activeGroup = group
|
||||
},
|
||||
toggleStickers () {
|
||||
this.showingStickers = !this.showingStickers
|
||||
|
@ -151,13 +81,6 @@ const EmojiPicker = {
|
|||
})
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
keyword () {
|
||||
this.customEmojiLoadAllConfirmed = false
|
||||
this.onScroll()
|
||||
this.startEmojiLoad(true)
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
activeGroupView () {
|
||||
return this.showingStickers ? '' : this.activeGroup
|
||||
|
@ -173,10 +96,8 @@ const EmojiPicker = {
|
|||
this.$store.state.instance.customEmoji || []
|
||||
)
|
||||
},
|
||||
customEmojiBuffer () {
|
||||
return this.filteredEmoji.slice(0, this.customEmojiBufferSlice)
|
||||
},
|
||||
emojis () {
|
||||
const recentEmojis = this.$store.getters.recentEmojis
|
||||
const standardEmojis = this.$store.state.instance.emoji || []
|
||||
const customEmojis = this.sortedEmoji
|
||||
const emojiPacks = []
|
||||
|
@ -189,6 +110,15 @@ const EmojiPicker = {
|
|||
})
|
||||
})
|
||||
return [
|
||||
{
|
||||
id: 'recent',
|
||||
text: this.$t('emoji.recent'),
|
||||
first: {
|
||||
imageUrl: '',
|
||||
replacement: '🕒',
|
||||
},
|
||||
emojis: this.filterByKeyword(recentEmojis)
|
||||
},
|
||||
{
|
||||
id: 'standard',
|
||||
text: this.$t('emoji.unicode'),
|
||||
|
|
|
@ -85,10 +85,6 @@
|
|||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.emoji-groups {
|
||||
min-height: 200px;
|
||||
}
|
||||
|
||||
.additional-tabs {
|
||||
border-left: 1px solid;
|
||||
border-left-color: $fallback--icon;
|
||||
|
@ -167,76 +163,12 @@
|
|||
}
|
||||
}
|
||||
|
||||
.emoji {
|
||||
&-search {
|
||||
padding: 5px;
|
||||
flex: 0 0 auto;
|
||||
.emoji-search {
|
||||
padding: 5px;
|
||||
flex: 0 0 auto;
|
||||
|
||||
input {
|
||||
width: 100%;
|
||||
}
|
||||
input {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&-groups {
|
||||
flex: 1 1 1px;
|
||||
position: relative;
|
||||
overflow: auto;
|
||||
user-select: none;
|
||||
mask: linear-gradient(to top, white 0, transparent 100%) bottom no-repeat,
|
||||
linear-gradient(to bottom, white 0, transparent 100%) top no-repeat,
|
||||
linear-gradient(to top, white, white);
|
||||
transition: mask-size 150ms;
|
||||
mask-size: 100% 20px, 100% 20px, auto;
|
||||
// Autoprefixed seem to ignore this one, and also syntax is different
|
||||
-webkit-mask-composite: xor;
|
||||
mask-composite: exclude;
|
||||
&.scrolled {
|
||||
&-top {
|
||||
mask-size: 100% 20px, 100% 0, auto;
|
||||
}
|
||||
&-bottom {
|
||||
mask-size: 100% 0, 100% 20px, auto;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
padding-left: 5px;
|
||||
justify-content: left;
|
||||
|
||||
&-title {
|
||||
font-size: 0.85em;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
|
||||
&.disabled {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&-item {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
font-size: 32px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
margin: 4px;
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
img {
|
||||
object-fit: contain;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
<div class="emoji-picker panel panel-default panel-body">
|
||||
<div class="heading">
|
||||
<span
|
||||
ref="emoji-tabs"
|
||||
class="emoji-tabs"
|
||||
@wheel="onWheel"
|
||||
ref="emoji-tabs"
|
||||
>
|
||||
<span
|
||||
v-for="group in emojis"
|
||||
|
@ -51,39 +51,12 @@
|
|||
@input="$event.target.composing = false"
|
||||
>
|
||||
</div>
|
||||
<div
|
||||
ref="emoji-groups"
|
||||
class="emoji-groups"
|
||||
:class="groupsScrolledClass"
|
||||
@scroll="onScroll"
|
||||
>
|
||||
<div
|
||||
v-for="group in emojisView"
|
||||
:key="group.id"
|
||||
class="emoji-group"
|
||||
>
|
||||
<h6
|
||||
:ref="'group-' + group.id"
|
||||
class="emoji-group-title"
|
||||
>
|
||||
{{ group.text }}
|
||||
</h6>
|
||||
<span
|
||||
v-for="emoji in group.emojis"
|
||||
:key="group.id + emoji.displayText"
|
||||
:title="emoji.displayText"
|
||||
class="emoji-item"
|
||||
@click.stop.prevent="onEmoji(emoji)"
|
||||
>
|
||||
<span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span>
|
||||
<img
|
||||
v-else
|
||||
:src="emoji.imageUrl"
|
||||
>
|
||||
</span>
|
||||
<span :ref="'group-end-' + group.id" />
|
||||
</div>
|
||||
</div>
|
||||
<EmojiGrid
|
||||
ref="emojiGrid"
|
||||
:groups="emojisView"
|
||||
@emoji="onEmoji"
|
||||
@active-group="onActiveGroup"
|
||||
/>
|
||||
<div
|
||||
v-if="showKeepOpen"
|
||||
class="keep-open"
|
||||
|
|
|
@ -3,6 +3,11 @@ import UserListPopover from '../user_list_popover/user_list_popover.vue'
|
|||
|
||||
const EMOJI_REACTION_COUNT_CUTOFF = 12
|
||||
|
||||
const findEmojiByReplacement = (state, replacement) => {
|
||||
const allEmojis = state.instance.emoji.concat(state.instance.customEmoji)
|
||||
return allEmojis.find(emoji => emoji.replacement === replacement)
|
||||
}
|
||||
|
||||
const EmojiReactions = {
|
||||
name: 'EmojiReactions',
|
||||
components: {
|
||||
|
@ -54,6 +59,8 @@ const EmojiReactions = {
|
|||
},
|
||||
reactWith (emoji) {
|
||||
this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })
|
||||
const emojiObject = findEmojiByReplacement(this.$store.state, emoji)
|
||||
this.$store.commit('emojiUsed', emojiObject)
|
||||
},
|
||||
unreact (emoji) {
|
||||
this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
:src="reaction.url"
|
||||
:title="reaction.name"
|
||||
class="reaction-emoji"
|
||||
width="2.55em"
|
||||
height="2.55em"
|
||||
>
|
||||
{{ reaction.count }}
|
||||
</span>
|
||||
|
@ -49,6 +49,7 @@
|
|||
display: flex;
|
||||
margin-top: 0.25em;
|
||||
flex-wrap: wrap;
|
||||
container-type: inline-size;
|
||||
}
|
||||
|
||||
.unicode-emoji {
|
||||
|
@ -64,7 +65,9 @@
|
|||
justify-content: center;
|
||||
box-sizing: border-box;
|
||||
.reaction-emoji {
|
||||
width: 2.55em !important;
|
||||
width: auto;
|
||||
max-width: 96cqw;
|
||||
height: 2.55em !important;
|
||||
margin-right: 0.25em;
|
||||
}
|
||||
&:focus {
|
||||
|
|
|
@ -15,6 +15,7 @@ import {
|
|||
faBookmark as faBookmarkReg,
|
||||
faFlag
|
||||
} from '@fortawesome/free-regular-svg-icons'
|
||||
import { mapState } from 'vuex'
|
||||
|
||||
library.add(
|
||||
faEllipsisH,
|
||||
|
@ -191,7 +192,7 @@ const ExtraButtons = {
|
|||
isEdited () {
|
||||
return this.status.edited_at !== null
|
||||
},
|
||||
editingAvailable () { return this.$store.state.instance.editingAvailable }
|
||||
editingAvailable () { return this.$store.state.instance.editingAvailable },
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ const FollowRequestCard = {
|
|||
doApprove () {
|
||||
this.$store.state.api.backendInteractor.approveUser({ id: this.user.id })
|
||||
this.$store.dispatch('removeFollowRequest', this.user)
|
||||
this.$store.dispatch('decrementFollowRequestsCount')
|
||||
|
||||
const notifId = this.findFollowRequestNotificationId()
|
||||
this.$store.dispatch('markSingleNotificationAsSeen', { id: notifId })
|
||||
|
@ -66,6 +67,7 @@ const FollowRequestCard = {
|
|||
this.$store.state.api.backendInteractor.denyUser({ id: this.user.id })
|
||||
.then(() => {
|
||||
this.$store.dispatch('dismissNotificationLocal', { id: notifId })
|
||||
this.$store.dispatch('decrementFollowRequestsCount')
|
||||
this.$store.dispatch('removeFollowRequest', this.user)
|
||||
})
|
||||
this.hideDenyConfirmDialog()
|
||||
|
@ -80,6 +82,11 @@ const FollowRequestCard = {
|
|||
},
|
||||
shouldConfirmDeny () {
|
||||
return this.mergedConfig.modalOnDenyFollow
|
||||
},
|
||||
show () {
|
||||
const notifId = this.$store.state.api.followRequests.find(req => req.id === this.user.id)
|
||||
|
||||
return notifId !== undefined
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<basic-user-card :user="user">
|
||||
<basic-user-card :user="user" v-if="show">
|
||||
<div class="follow-request-card-content-container">
|
||||
<button
|
||||
class="btn button-default"
|
||||
|
|
|
@ -1,10 +1,26 @@
|
|||
import FollowRequestCard from '../follow_request_card/follow_request_card.vue'
|
||||
import withLoadMore from '../../hocs/with_load_more/with_load_more'
|
||||
import List from '../list/list.vue'
|
||||
import get from 'lodash/get'
|
||||
|
||||
const FollowRequestList = withLoadMore({
|
||||
fetch: (props, $store) => $store.dispatch('fetchFollowRequests'),
|
||||
select: (props, $store) => get($store.state.api, 'followRequests', []).map(req => $store.getters.findUser(req.id)),
|
||||
destroy: (props, $store) => $store.dispatch('clearFollowRequests'),
|
||||
childPropName: 'items',
|
||||
additionalPropNames: ['userId']
|
||||
})(List);
|
||||
|
||||
|
||||
const FollowRequests = {
|
||||
components: {
|
||||
FollowRequestCard
|
||||
FollowRequestCard,
|
||||
FollowRequestList
|
||||
},
|
||||
computed: {
|
||||
userId () {
|
||||
return this.$store.state.users.currentUser.id
|
||||
},
|
||||
requests () {
|
||||
return this.$store.state.api.followRequests
|
||||
}
|
||||
|
|
|
@ -6,12 +6,11 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<FollowRequestCard
|
||||
v-for="request in requests"
|
||||
:key="request.id"
|
||||
:user="request"
|
||||
class="list-item"
|
||||
/>
|
||||
<FollowRequestList :user-id="userId">
|
||||
<template #item="{item}">
|
||||
<FollowRequestCard :user="item" />
|
||||
</template>
|
||||
</FollowRequestList>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -33,11 +33,6 @@ library.add(
|
|||
)
|
||||
|
||||
const NavPanel = {
|
||||
created () {
|
||||
if (this.currentUser && this.currentUser.locked) {
|
||||
this.$store.dispatch('startFetchingFollowRequests')
|
||||
}
|
||||
},
|
||||
components: {
|
||||
TimelineMenuContent
|
||||
},
|
||||
|
@ -54,11 +49,13 @@ const NavPanel = {
|
|||
computed: {
|
||||
...mapState({
|
||||
currentUser: state => state.users.currentUser,
|
||||
followRequestCount: state => state.api.followRequests.length,
|
||||
privateMode: state => state.instance.private,
|
||||
federating: state => state.instance.federating
|
||||
federating: state => state.instance.federating,
|
||||
}),
|
||||
...mapGetters(['unreadAnnouncementCount'])
|
||||
...mapGetters(['unreadAnnouncementCount']),
|
||||
followRequestCount () {
|
||||
return this.$store.state.users.currentUser.follow_requests_count
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -103,9 +103,9 @@ export default {
|
|||
convertExpiryFromUnit (unit, amount) {
|
||||
// Note: we want seconds and not milliseconds
|
||||
switch (unit) {
|
||||
case 'minutes': return 0.001 * amount * DateUtils.MINUTE
|
||||
case 'hours': return 0.001 * amount * DateUtils.HOUR
|
||||
case 'days': return 0.001 * amount * DateUtils.DAY
|
||||
case 'minutes': return amount * DateUtils.MINUTE / 1000
|
||||
case 'hours': return amount * DateUtils.HOUR / 1000
|
||||
case 'days': return amount * DateUtils.DAY / 1000
|
||||
}
|
||||
},
|
||||
expiryAmountChange () {
|
||||
|
|
|
@ -54,6 +54,14 @@ const pxStringToNumber = (str) => {
|
|||
return Number(str.substring(0, str.length - 2))
|
||||
}
|
||||
|
||||
const deleteDraft = (draftKey) => {
|
||||
const draftData = JSON.parse(localStorage.getItem('drafts') || '{}');
|
||||
|
||||
delete draftData[draftKey];
|
||||
|
||||
localStorage.setItem('drafts', JSON.stringify(draftData));
|
||||
}
|
||||
|
||||
const PostStatusForm = {
|
||||
props: [
|
||||
'statusId',
|
||||
|
@ -161,6 +169,36 @@ const PostStatusForm = {
|
|||
}
|
||||
}
|
||||
|
||||
if (!this.statusId) {
|
||||
let draftKey = 'status';
|
||||
if (this.replyTo) {
|
||||
draftKey = 'reply:' + this.replyTo;
|
||||
} else if (this.quoteId) {
|
||||
draftKey = 'quote:' + this.quoteId;
|
||||
}
|
||||
|
||||
const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[draftKey];
|
||||
|
||||
if (draft) {
|
||||
statusParams = {
|
||||
spoilerText: draft.data.spoilerText,
|
||||
status: draft.data.status,
|
||||
sensitiveIfSubject,
|
||||
nsfw: draft.data.nsfw,
|
||||
files: draft.data.files,
|
||||
poll: draft.data.poll,
|
||||
mediaDescriptions: draft.data.mediaDescriptions,
|
||||
visibility: draft.data.visibility,
|
||||
language: draft.data.language,
|
||||
contentType: draft.data.contentType
|
||||
}
|
||||
|
||||
if (draft.data.poll) {
|
||||
this.togglePollForm();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
dropFiles: [],
|
||||
uploadingFiles: false,
|
||||
|
@ -280,6 +318,7 @@ const PostStatusForm = {
|
|||
statusChanged () {
|
||||
this.autoPreview()
|
||||
this.updateIdempotencyKey()
|
||||
this.saveDraft()
|
||||
},
|
||||
clearStatus () {
|
||||
const newStatus = this.newStatus
|
||||
|
@ -401,8 +440,38 @@ const PostStatusForm = {
|
|||
}).finally(() => {
|
||||
this.previewLoading = false
|
||||
})
|
||||
|
||||
let draftKey = 'status';
|
||||
if (this.replyTo) {
|
||||
draftKey = 'reply:' + this.replyTo;
|
||||
} else if (this.quoteId) {
|
||||
draftKey = 'quote:' + this.quoteId;
|
||||
}
|
||||
deleteDraft(draftKey)
|
||||
},
|
||||
debouncePreviewStatus: debounce(function () { this.previewStatus() }, 500),
|
||||
saveDraft() {
|
||||
const draftData = JSON.parse(localStorage.getItem('drafts') || '{}');
|
||||
|
||||
let draftKey = 'status';
|
||||
if (this.replyTo) {
|
||||
draftKey = 'reply:' + this.replyTo;
|
||||
} else if (this.quoteId) {
|
||||
draftKey = 'quote:' + this.quoteId;
|
||||
}
|
||||
|
||||
if (this.newStatus.status || this.newStatus.spoilerText || this.newStatus.files.length > 0 || this.newStatus.poll.length > 0) {
|
||||
draftData[draftKey] = {
|
||||
updatedAt: new Date(),
|
||||
data: this.newStatus,
|
||||
};
|
||||
|
||||
localStorage.setItem('drafts', JSON.stringify(draftData));
|
||||
|
||||
} else {
|
||||
deleteDraft(draftKey);
|
||||
}
|
||||
},
|
||||
autoPreview () {
|
||||
if (!this.preview) return
|
||||
this.previewLoading = true
|
||||
|
|
|
@ -188,7 +188,7 @@ export default {
|
|||
break
|
||||
}
|
||||
case 'span':
|
||||
if (this.handleLinks && attrs['class'] && attrs['class'].includes('h-card')) {
|
||||
if (this.handleLinks && attrs?.['class']?.includes?.('h-card')) {
|
||||
return ['', children.map(processItem), '']
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,6 @@
|
|||
|
||||
.emoji {
|
||||
display: inline-block;
|
||||
width: var(--emoji-size, 32px);
|
||||
height: var(--emoji-size, 32px);
|
||||
}
|
||||
|
||||
|
|
|
@ -22,21 +22,18 @@
|
|||
|
||||
._mfm_x2_ {
|
||||
.emoji {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
._mfm_x3_ {
|
||||
.emoji {
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
._mfm_x4_ {
|
||||
.emoji {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@
|
|||
|
||||
img, video {
|
||||
&.emoji {
|
||||
width: 50px;
|
||||
max-width: 100%;
|
||||
height: 50px;
|
||||
}
|
||||
}
|
||||
|
@ -89,7 +89,6 @@
|
|||
animation: none !important;
|
||||
}
|
||||
.emoji {
|
||||
width: 32px !important;
|
||||
height: 32px !important;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@ import {
|
|||
faHome,
|
||||
faCircle
|
||||
} from '@fortawesome/free-solid-svg-icons'
|
||||
import { federatedTimelineVisible, publicTimelineVisible, bubbleTimelineVisible } from '../../lib/timeline_visibility'
|
||||
|
||||
library.add(
|
||||
faUsers,
|
||||
|
@ -24,7 +25,9 @@ const TimelineMenuContent = {
|
|||
currentUser: state => state.users.currentUser,
|
||||
privateMode: state => state.instance.private,
|
||||
federating: state => state.instance.federating,
|
||||
showBubbleTimeline: state => (state.instance.localBubbleInstances.length > 0)
|
||||
publicTimelineVisible,
|
||||
federatedTimelineVisible,
|
||||
bubbleTimelineVisible,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
>{{ $t("nav.home_timeline") }}</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li v-if="currentUser && showBubbleTimeline">
|
||||
<li v-if="bubbleTimelineVisible">
|
||||
<router-link
|
||||
class="menu-item"
|
||||
:to="{ name: 'bubble-timeline' }"
|
||||
|
@ -32,7 +32,7 @@
|
|||
>{{ $t("nav.bubble_timeline") }}</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li v-if="currentUser || !privateMode">
|
||||
<li v-if="publicTimelineVisible">
|
||||
<router-link
|
||||
class="menu-item"
|
||||
:to="{ name: 'public-timeline' }"
|
||||
|
@ -48,7 +48,7 @@
|
|||
>{{ $t("nav.public_tl") }}</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li v-if="federating && (currentUser || !privateMode)">
|
||||
<li v-if="federatedTimelineVisible">
|
||||
<router-link
|
||||
class="menu-item"
|
||||
:to="{ name: 'public-external-timeline' }"
|
||||
|
@ -62,6 +62,7 @@
|
|||
:title="$t('nav.twkn_timeline_description')"
|
||||
:aria-label="$t('nav.twkn_timeline_description')"
|
||||
>{{ $t("nav.twkn") }}</span>
|
||||
|
||||
</router-link>
|
||||
</li>
|
||||
<li v-if="currentUser">
|
||||
|
|
|
@ -8,6 +8,7 @@ import {
|
|||
faHome
|
||||
} from '@fortawesome/free-solid-svg-icons'
|
||||
import { faCircle } from '@fortawesome/free-regular-svg-icons'
|
||||
import { federatedTimelineVisible, publicTimelineVisible, bubbleTimelineVisible } from '../../lib/timeline_visibility'
|
||||
library.add(
|
||||
faUsers,
|
||||
faGlobe,
|
||||
|
@ -22,7 +23,10 @@ const TimelineMenuContent = {
|
|||
...mapState({
|
||||
currentUser: state => state.users.currentUser,
|
||||
privateMode: state => state.instance.private,
|
||||
federating: state => state.instance.federating
|
||||
federating: state => state.instance.federating,
|
||||
publicTimelineVisible,
|
||||
federatedTimelineVisible,
|
||||
bubbleTimelineVisible,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
>{{ $t("nav.home_timeline") }}</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li v-if="currentUser">
|
||||
<li v-if="bubbleTimelineVisible">
|
||||
<router-link
|
||||
class="menu-item"
|
||||
:to="{ name: 'bubble-timeline' }"
|
||||
|
@ -32,7 +32,7 @@
|
|||
>{{ $t("nav.bubble_timeline") }}</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li v-if="currentUser || !privateMode">
|
||||
<li v-if="publicTimelineVisible">
|
||||
<router-link
|
||||
class="menu-item"
|
||||
:to="{ name: 'public-timeline' }"
|
||||
|
@ -48,7 +48,7 @@
|
|||
>{{ $t("nav.public_tl") }}</span>
|
||||
</router-link>
|
||||
</li>
|
||||
<li v-if="federating && (currentUser || !privateMode)">
|
||||
<li v-if="federatedTimelineVisible">
|
||||
<router-link
|
||||
class="menu-item"
|
||||
:to="{ name: 'public-external-timeline' }"
|
||||
|
|
|
@ -4,6 +4,12 @@ import { library } from '@fortawesome/fontawesome-svg-core'
|
|||
import {
|
||||
faChevronDown
|
||||
} from '@fortawesome/free-solid-svg-icons'
|
||||
import { mapState } from 'vuex'
|
||||
import {
|
||||
publicTimelineVisible,
|
||||
federatedTimelineVisible,
|
||||
bubbleTimelineVisible,
|
||||
} from '../../lib/timeline_visibility'
|
||||
|
||||
library.add(faChevronDown)
|
||||
|
||||
|
@ -36,12 +42,15 @@ const TimelineMenuTabs = {
|
|||
}
|
||||
},
|
||||
computed: {
|
||||
currentUser () {
|
||||
return this.$store.state.users.currentUser
|
||||
},
|
||||
privateMode () {
|
||||
return this.$store.state.instance.private
|
||||
}
|
||||
},
|
||||
...mapState({
|
||||
currentUser: state => state.users.currentUser,
|
||||
publicTimelineVisible,
|
||||
federatedTimelineVisible,
|
||||
bubbleTimelineVisible,
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
timelineName () {
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
<router-link
|
||||
:to="{ name: 'public-timeline' }"
|
||||
class="nav-icon"
|
||||
v-if="publicTimelineVisible"
|
||||
>
|
||||
<FAIcon
|
||||
fixed-width
|
||||
|
@ -27,7 +28,7 @@
|
|||
/>
|
||||
</router-link>
|
||||
<router-link
|
||||
v-if="currentUser"
|
||||
v-if="bubbleTimelineVisible"
|
||||
:to="{ name: 'bubble-timeline' }"
|
||||
class="nav-icon"
|
||||
>
|
||||
|
@ -41,6 +42,7 @@
|
|||
<router-link
|
||||
:to="{ name: 'public-external-timeline' }"
|
||||
class="nav-icon"
|
||||
v-if="federatedTimelineVisible"
|
||||
>
|
||||
<FAIcon
|
||||
fixed-width
|
||||
|
|
|
@ -224,7 +224,7 @@ const UserProfile = {
|
|||
TabSwitcher,
|
||||
Conversation,
|
||||
RichContent,
|
||||
FollowedTagList,
|
||||
FollowedTagList
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -252,6 +252,10 @@
|
|||
"hint": "Anmelden um an der Diskussion teilzunehmen",
|
||||
"login": "Anmelden",
|
||||
"logout": "Abmelden",
|
||||
"logout_confirm": "Willst du dich wirklich abmelden?",
|
||||
"logout_confirm_accept_button": "Abmelden",
|
||||
"logout_confirm_cancel_button": "Abbrechen",
|
||||
"logout_confirm_title": "Abmelden",
|
||||
"password": "Passwort",
|
||||
"placeholder": "meinbenutzername",
|
||||
"recovery_code": "Wiederherstellungscode",
|
||||
|
@ -264,6 +268,32 @@
|
|||
"next": "Weiter",
|
||||
"previous": "Zurück"
|
||||
},
|
||||
"moderation": {
|
||||
"moderation": "Moderation",
|
||||
"reports": {
|
||||
"add_note": "Notiz hinzufügen",
|
||||
"close": "Schließen",
|
||||
"delete_note": "Löschen",
|
||||
"delete_note_accept": "Ja, löschen",
|
||||
"delete_note_cancel": "Nein, behalten",
|
||||
"delete_note_confirm": "Soll diese Notiz wirklich gelöscht werden?",
|
||||
"delete_note_title": "Löschen bestätigen",
|
||||
"no_content": "Keine Beschreibung angegeben",
|
||||
"no_reports": "Keine Meldungen verfügbar",
|
||||
"note_placeholder": "Hinterlasse eine Notiz",
|
||||
"notes": "{ count } Notiz | { count } Notizen",
|
||||
"reopen": "Wieder öffnen",
|
||||
"report": "Meldung über",
|
||||
"reports": "Meldungen",
|
||||
"resolve": "Lösen",
|
||||
"show_closed": "Geschlossene anzeigen",
|
||||
"statuses": "{ count } Post| { count } Posts",
|
||||
"tag_policy_notice": "Schalte die TagPolicy-MRF ein, um Post-Beschränkungen einzustellen",
|
||||
"tags": "Post-Einschränkungen einstellen"
|
||||
},
|
||||
"statuses": "Posts",
|
||||
"users": "Benutzer"
|
||||
},
|
||||
"nav": {
|
||||
"about": "Über",
|
||||
"administration": "Administration",
|
||||
|
@ -278,6 +308,7 @@
|
|||
"interactions": "Interaktionen",
|
||||
"lists": "Listen",
|
||||
"mentions": "Erwähnungen",
|
||||
"moderation": "Moderation",
|
||||
"preferences": "Voreinstellungen",
|
||||
"public_timeline_description": "Öffentliche Beiträge von dieser Instanz",
|
||||
"public_tl": "Öffentliche Zeitleiste",
|
||||
|
@ -374,6 +405,8 @@
|
|||
}
|
||||
},
|
||||
"registration": {
|
||||
"awaiting_email_confirmation": "Dein Account wurde registriert und eine E-Mail wurde an deine Adresse gesendet. Bitte lies die E-Mail, um die Registrierung abzuschließen.",
|
||||
"awaiting_email_confirmation_title": "Warte auf E-Mail-Bestätigung",
|
||||
"bio": "Bio",
|
||||
"bio_placeholder": "z. B.\nHallo! Willkommen auf meinem Profil.\nIch mag Anime und Spiele. Hoffentlich können wir Freunde sein!",
|
||||
"captcha": "CAPTCHA",
|
||||
|
@ -387,6 +420,8 @@
|
|||
"reason_placeholder": "Diese Instanz bestätigt Registrierungen manuell. \nLass die Admins wissen warum du dich registrieren willst.",
|
||||
"register": "Registrierung",
|
||||
"registration": "Registrierung",
|
||||
"request_sent": "Deine Bitte zur Registrierung wurde weitergeleitet. Du erhälst eine E-Mail, wenn deiner Registrierung zugestimmt wurde.",
|
||||
"request_sent_title": "Bitte zur Registrierung gesendet",
|
||||
"token": "Einladungsschlüssel",
|
||||
"username_placeholder": "z. B. akko",
|
||||
"validations": {
|
||||
|
@ -496,6 +531,8 @@
|
|||
"enable_web_push_notifications": "Web-Pushbenachrichtigungen aktivieren",
|
||||
"enter_current_password_to_confirm": "Gib dein aktuelles Passwort ein, um deine Identität zu bestätigen",
|
||||
"expert_mode": "Erweiterte Einstellungen anzeigen",
|
||||
"expire_posts_enabled": "Posts löschen, die älter als eine Anzahl an Tagen sind",
|
||||
"expire_posts_input_placeholder": "Anzahl an Tagen",
|
||||
"export_theme": "Farbschema speichern",
|
||||
"file_export_import": {
|
||||
"backup_restore": "Einstellungen backuppen",
|
||||
|
@ -688,6 +725,19 @@
|
|||
"setting_changed": "Einstellungen weichen von den Standardeinstellungen ab",
|
||||
"setting_server_side": "Diese Einstellung hängt an deinem Profil und gilt für alle Sitzungen und Clients",
|
||||
"settings": "Einstellungen",
|
||||
"settings_profile": "Einstellungs-Profile",
|
||||
"settings_profile_creation": "Neues Profil erstellen",
|
||||
"settings_profile_creation_new_name_label": "Name",
|
||||
"settings_profile_creation_submit": "Erstellen",
|
||||
"settings_profile_currently": "Benutze Profil {name} (version: {version})",
|
||||
"settings_profile_delete": "Löschen",
|
||||
"settings_profile_delete_confirm": "Dieses Profil wirklich löschen?",
|
||||
"settings_profile_force_sync": "Synchronisieren",
|
||||
"settings_profile_in_use": "In Benutzung",
|
||||
"settings_profile_use": "Verwenden",
|
||||
"settings_profiles_refresh": "Einstellungs-Profile neu laden",
|
||||
"settings_profiles_show": "Alle Einstellungs-Profile anzeigen",
|
||||
"settings_profiles_unshow": "Alle Einstellungs-Profile verbergen",
|
||||
"show_admin_badge": "Zeige Admin-Abzeichen auf meinem Profil",
|
||||
"show_moderator_badge": "Zeige Moderator-Abzeichen auf meinem Profil",
|
||||
"show_nav_shortcuts": "Zusätzliche Schnellnavigation im Top-Panel anzeigen",
|
||||
|
@ -867,6 +917,7 @@
|
|||
"useStreamingApi": "Empfange Posts und Benachrichtigungen in Echtzeit",
|
||||
"useStreamingApiWarning": "(Nicht empfohlen, experimentell, bekannt dafür, Posts zu überspringen)",
|
||||
"use_at_icon": "{'@'}-Symbol als Icon und nicht als Text anzeigen",
|
||||
"use_blurhash": "Blurhash für NSFW-Vorschauen verwenden",
|
||||
"use_contain_fit": "Vorschaubilder nicht zuschneiden",
|
||||
"use_one_click_nsfw": "Heikle Anhänge mit nur einem Klick öffnen",
|
||||
"user_mutes": "User",
|
||||
|
@ -887,6 +938,12 @@
|
|||
"word_filter": "Wortfilter",
|
||||
"wordfilter": "Wortfilter"
|
||||
},
|
||||
"settings_profile": {
|
||||
"creating": "Erstelle ein neues Einstellungs-Profil \"{profile}\"...",
|
||||
"synchronization_error": "Konnte Einstellungen nicht synchronisieren: {err}",
|
||||
"synchronized": "Einstellungen synchronisiert!",
|
||||
"synchronizing": "Synchronisiere Einstellungs-Profil \"{profile}\"..."
|
||||
},
|
||||
"status": {
|
||||
"ancestor_follow": "Zeige {numReplies} andere Antwort unter dieser Nachricht | Zeige {numReplies} andere Antworten unter dieser Nachricht",
|
||||
"ancestor_follow_with_icon": "{icon} {text}",
|
||||
|
@ -920,6 +977,11 @@
|
|||
"pin": "An Profil anheften",
|
||||
"pinned": "Angeheftet",
|
||||
"plus_more": "+{number} mehr",
|
||||
"redraft": "Löschen & neu erstellen",
|
||||
"redraft_confirm": "Diesen Post wirklich löschen und neu erstellen? Interaktionen des ursprünglichen Posts werden nicht erhalten.",
|
||||
"redraft_confirm_accept_button": "Ja, löschen und neu erstellen",
|
||||
"redraft_confirm_cancel_button": "Nein, das Original behalten",
|
||||
"redraft_confirm_title": "Löschen und neu erstellen bestätigen",
|
||||
"remove_attachment": "Anhang entfernen",
|
||||
"repeat_confirm": "Nachricht wirklich wiederholen?",
|
||||
"repeat_confirm_accept_button": "Ja, wiederholen",
|
||||
|
@ -948,6 +1010,7 @@
|
|||
"thread_show_full": "Zeige {numStatus} Antwort | Zeige {numStatus} Antworten",
|
||||
"thread_show_full_with_icon": "{icon} {text}",
|
||||
"translate": "Übersetzen",
|
||||
"translated_from": "Übersetzt von {language}",
|
||||
"unbookmark": "Lesezeichen entfernen",
|
||||
"unmute_conversation": "Konversation nicht mehr stummstellen",
|
||||
"unpin": "Nicht mehr an Profil anheften",
|
||||
|
@ -979,6 +1042,7 @@
|
|||
"collapse": "Einklappen",
|
||||
"conversation": "Unterhaltung",
|
||||
"error": "Fehler beim Lesen der Timeline: {0}",
|
||||
"follow_tag": "Hashtag folgen",
|
||||
"load_older": "Lade ältere Nachrichten",
|
||||
"no_more_statuses": "Keine weiteren Nachrichten",
|
||||
"no_retweet_hint": "Die Nachricht ist als nur-für-Follower oder Direktnachricht markiert und kann nicht wiederholt oder zitiert werden",
|
||||
|
@ -988,8 +1052,12 @@
|
|||
"show_new": "Zeige Neuere",
|
||||
"socket_broke": "Netzverbindung verloren: CloseEvent code {0}",
|
||||
"socket_reconnected": "Netzverbindung hergestellt",
|
||||
"unfollow_tag": "Hashtag entfolgen",
|
||||
"up_to_date": "Aktuell"
|
||||
},
|
||||
"toast": {
|
||||
"no_translation_target_set": "Keine Zielsprache für Übersetzungen eingestellt - das könnte schiefgehen. Bitte stell eine Zielsprache in deinen Einstellungen ein."
|
||||
},
|
||||
"tool_tip": {
|
||||
"accept_follow_request": "Folgeanfrage annehmen",
|
||||
"add_reaction": "Emoji-Reaktion hinzufügen",
|
||||
|
@ -1049,6 +1117,7 @@
|
|||
"block_confirm_title": "Benutzer blockieren",
|
||||
"block_progress": "Blocken…",
|
||||
"blocked": "Blockiert!",
|
||||
"blocks_you": "Blockt dich!",
|
||||
"bot": "Bot",
|
||||
"deactivated": "Deaktiviert",
|
||||
"deny": "Ablehnen",
|
||||
|
@ -1063,7 +1132,10 @@
|
|||
"follow_cancel": "Anfrage ablehnen",
|
||||
"follow_progress": "Anfragen…",
|
||||
"follow_sent": "Anfrage gesendet!",
|
||||
"follow_tag": "Hashtag folgen",
|
||||
"follow_unfollow": "Folgen beenden",
|
||||
"followed_tags": "Gefolgte Hashtags",
|
||||
"followed_users": "Gefolgte Benutzer",
|
||||
"followees": "Folgt",
|
||||
"followers": "Folgende",
|
||||
"following": "Folgst du!",
|
||||
|
@ -1088,11 +1160,14 @@
|
|||
"mute_domain": "Domain blockieren",
|
||||
"mute_progress": "Stummschalten erfolgt…",
|
||||
"muted": "Stummgeschaltet",
|
||||
"not_following_any_hashtags": "Du folgst keinen Hashtags",
|
||||
"note": "Private Notiz",
|
||||
"per_day": "pro Tag",
|
||||
"remote_follow": "Folgen",
|
||||
"remove_follower": "Nicht mehr folgen",
|
||||
"replies": "Mit Antworten",
|
||||
"report": "Melden",
|
||||
"requested_by": "Möchte dir gern folgen",
|
||||
"show_repeats": "Geteilte Beiträge anzeigen",
|
||||
"statuses": "Nachrichten",
|
||||
"subscribe": "Folgen",
|
||||
|
@ -1102,11 +1177,13 @@
|
|||
"unfollow_confirm_accept_button": "Ja, nicht mehr folgen",
|
||||
"unfollow_confirm_cancel_button": "Nein, weiter folgen",
|
||||
"unfollow_confirm_title": "Benutzer nicht mehr folgen",
|
||||
"unfollow_tag": "Hashtag nicht mehr folgen",
|
||||
"unmute": "Stummschalten aufheben",
|
||||
"unmute_progress": "Aufhebung erfolgt…",
|
||||
"unsubscribe": "Entfolgen"
|
||||
},
|
||||
"user_profile": {
|
||||
"field_validated": "Link verifiziert",
|
||||
"profile_does_not_exist": "Profil nicht vorhanden.",
|
||||
"profile_loading_error": "Beim Laden dieses Profils ist ein Fehler aufgetreten.",
|
||||
"timeline_title": "Beiträge"
|
||||
|
|
|
@ -86,7 +86,8 @@
|
|||
"load_all_hint": "Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",
|
||||
"search_emoji": "Search for an emoji",
|
||||
"stickers": "Stickers",
|
||||
"unicode": "Unicode emoji"
|
||||
"unicode": "Unicode emoji",
|
||||
"recent": "Recently used"
|
||||
},
|
||||
"errors": {
|
||||
"storage_unavailable": "Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies."
|
||||
|
|
|
@ -282,18 +282,18 @@
|
|||
"delete_note_title": "Confirma la eliminación",
|
||||
"no_content": "Sin descripción dada",
|
||||
"no_reports": "No hay informes que mostrar",
|
||||
"note_placeholder": "Dejar una nota...",
|
||||
"note_placeholder": "Dejar una nota",
|
||||
"notes": "{ count } nota | { count } notas",
|
||||
"reopen": "Reabrir",
|
||||
"report": "Reportar",
|
||||
"reports": "Reportes",
|
||||
"resolve": "Resolver",
|
||||
"show_closed": "Mostrar cerrados",
|
||||
"statuses": "{ count } estado | { count } estados",
|
||||
"statuses": "{ count } publicación | { count } publicaciones",
|
||||
"tag_policy_notice": "Habilitar TagPolicy MRF para establecer restricciones de publicación",
|
||||
"tags": "Establecer restricciones de publicación"
|
||||
},
|
||||
"statuses": "Estados",
|
||||
"statuses": "Publicaciones",
|
||||
"users": "Usuarios"
|
||||
},
|
||||
"nav": {
|
||||
|
@ -535,6 +535,8 @@
|
|||
"enable_web_push_notifications": "Habilitar las notificiaciones en el navegador",
|
||||
"enter_current_password_to_confirm": "Introduce la contraseña actual para confirmar tu identidad",
|
||||
"expert_mode": "Mostrar avanzados",
|
||||
"expire_posts_enabled": "Eliminar publicaciones después de una cantidad determinada de días",
|
||||
"expire_posts_input_placeholder": "Número de días",
|
||||
"export_theme": "Exportar tema",
|
||||
"file_export_import": {
|
||||
"backup_restore": "Copia de seguridad de la configuración",
|
||||
|
@ -696,6 +698,7 @@
|
|||
"remove_alias": "Eliminar este alias",
|
||||
"remove_backup": "Eliminar",
|
||||
"render_mfm": "Renderizar Markdown de Misskey",
|
||||
"render_mfm_on_hover": "Pausa las animaciones MFM hasta que se desplace el mensaje",
|
||||
"replies_in_timeline": "Réplicas en la línea temporal",
|
||||
"reply_visibility_all": "Mostrar todas las réplicas",
|
||||
"reply_visibility_following": "Solo mostrar réplicas para mí o usuarios a los que sigo",
|
||||
|
@ -719,6 +722,7 @@
|
|||
"security": "Seguridad",
|
||||
"security_tab": "Seguridad",
|
||||
"sensitive_by_default": "Identificar las publicaciones como sensibles de forma predeterminada",
|
||||
"sensitive_if_subject": "Marcar automáticamente las imágenes como confidenciales si se especifica una advertencia de contenido",
|
||||
"set_new_avatar": "Cambiar avatar",
|
||||
"set_new_mascot": "Fijar nueva mascota",
|
||||
"set_new_profile_background": "Cambiar el fondo del perfil",
|
||||
|
@ -736,10 +740,16 @@
|
|||
"settings_profile_force_sync": "Sincronizar",
|
||||
"settings_profile_in_use": "En uso",
|
||||
"settings_profile_use": "Usar",
|
||||
"settings_profiles_refresh": "Recargar perfiles de configuración",
|
||||
"settings_profiles_show": "Mostrar todos los perfiles de configuración",
|
||||
"settings_profiles_unshow": "Ocultar todos los perfiles de configuración",
|
||||
"show_admin_badge": "Mostrar la insignia de \"Administrador/a\" en mi perfil",
|
||||
"show_moderator_badge": "Mostrar la insignia de \"Moderador/a\" en mi perfil",
|
||||
"show_nav_shortcuts": "Mostrar accesos directos de navegación adicionales en el panel superior",
|
||||
"show_panel_nav_shortcuts": "Mostrar accesos directos de navegación de la línea de tiempo en la parte superior del panel",
|
||||
"show_scrollbars": "Mostrar las barras de desplazamiento de la columna lateral",
|
||||
"show_wider_shortcuts": "Mostrar una brecha más amplia entre los accesos directos del panel superior",
|
||||
"show_yous": "Mostrar (Tú)s",
|
||||
"stop_gifs": "Iniciar GIFs al pasar el ratón",
|
||||
"streaming": "Habilitar la transmisión automática de nuevas publicaciones cuando se desplaza hacia la parte superior",
|
||||
"style": {
|
||||
|
@ -888,9 +898,9 @@
|
|||
"use_source": "Nueva versión"
|
||||
}
|
||||
},
|
||||
"subject_input_always_show": "Mostrar siempre el campo del tema",
|
||||
"subject_line_behavior": "Copiar el tema en las respuestas",
|
||||
"subject_line_email": "Como email: \"re: tema\"",
|
||||
"subject_input_always_show": "Mostrar siempre el campo de advertencia de contenido",
|
||||
"subject_line_behavior": "Copiar el campo de advertencia en las respuestas",
|
||||
"subject_line_email": "Como email: \"re: advertencia\"",
|
||||
"subject_line_mastodon": "Como mastodon: copiar como es",
|
||||
"subject_line_noop": "No copiar",
|
||||
"text": "Texto",
|
||||
|
@ -898,8 +908,13 @@
|
|||
"theme_help": "Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.",
|
||||
"theme_help_v2_1": "También puede invalidar los colores y la opacidad de ciertos componentes si activa la casilla de verificación. Use el botón \"Borrar todo\" para deshacer los cambios.",
|
||||
"theme_help_v2_2": "Los iconos debajo de algunas publicaciones son indicadores de contraste de fondo/texto, desplace el ratón por encima para obtener información más detallada. Tenga en cuenta que cuando se utilizan indicadores de contraste de transparencia se muestra el peor caso posible.",
|
||||
"third_column_mode": "Cuando haya suficiente espacio, muestre la tercera columna",
|
||||
"third_column_mode_none": "No mostrar la tercera columna en absoluto",
|
||||
"third_column_mode_notifications": "Columna de notificaciones",
|
||||
"third_column_mode_postform": "Formulario principal de publicación y navegación",
|
||||
"token": "Token",
|
||||
"tooltipRadius": "Información/alertas",
|
||||
"translation_language": "Idioma de traducción automática",
|
||||
"type_domains_to_mute": "Buscar dominios para silenciar",
|
||||
"upload_a_photo": "Subir una foto",
|
||||
"useStreamingApi": "Recibir publicaciones y notificaciones en tiempo real",
|
||||
|
|
|
@ -84,6 +84,7 @@
|
|||
"keep_open": "Garder ouvert",
|
||||
"load_all": "Charger tout les {emojiAmount} émojis",
|
||||
"load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.",
|
||||
"recent": "Utilisé récemment",
|
||||
"search_emoji": "Rechercher un émoji",
|
||||
"stickers": "Stickers",
|
||||
"unicode": "émoji unicode"
|
||||
|
@ -254,6 +255,10 @@
|
|||
"hint": "Connectez-vous pour rejoindre la discussion",
|
||||
"login": "Connexion",
|
||||
"logout": "Déconnexion",
|
||||
"logout_confirm": "Voulez-vous vraiment vous déconnecter ?",
|
||||
"logout_confirm_accept_button": "Déconnexion",
|
||||
"logout_confirm_cancel_button": "Annuler",
|
||||
"logout_confirm_title": "Déconnexion",
|
||||
"password": "Mot de passe",
|
||||
"placeholder": "mon nom d'utilisateur",
|
||||
"recovery_code": "Code de récupération",
|
||||
|
@ -266,6 +271,32 @@
|
|||
"next": "Suivant",
|
||||
"previous": "Précédent"
|
||||
},
|
||||
"moderation": {
|
||||
"moderation": "Modération",
|
||||
"reports": {
|
||||
"add_note": "Ajouter une note",
|
||||
"close": "Fermer",
|
||||
"delete_note": "Supprimer",
|
||||
"delete_note_accept": "Oui, supprimer",
|
||||
"delete_note_cancel": "Non, abandonner",
|
||||
"delete_note_confirm": "Voulez-vous vraiment supprimer cette note ?",
|
||||
"delete_note_title": "Confirmer la suppression",
|
||||
"no_content": "Description vide",
|
||||
"no_reports": "Aucun rapport",
|
||||
"note_placeholder": "Laisser une note",
|
||||
"notes": "{ count } note | { count } notes",
|
||||
"reopen": "Rouvrir",
|
||||
"report": "Signaler",
|
||||
"reports": "Rapports",
|
||||
"resolve": "Résoudre",
|
||||
"show_closed": "Afficher les rapports classés",
|
||||
"statuses": "{ count } statut| { count } statuts",
|
||||
"tag_policy_notice": "Activer la politique MRF pour établir les restrictions de publication",
|
||||
"tags": "Établir les restrictions de publication"
|
||||
},
|
||||
"statuses": "Statuts",
|
||||
"users": "Utilisateurs"
|
||||
},
|
||||
"nav": {
|
||||
"about": "À propos",
|
||||
"administration": "Administration",
|
||||
|
@ -282,6 +313,7 @@
|
|||
"interactions": "Interactions",
|
||||
"lists": "Listes",
|
||||
"mentions": "Mentions",
|
||||
"moderation": "Moderation",
|
||||
"preferences": "Préférences",
|
||||
"public_timeline_description": "Tous les statuts publics de cette instance",
|
||||
"public_tl": "Flux publique",
|
||||
|
@ -378,6 +410,8 @@
|
|||
}
|
||||
},
|
||||
"registration": {
|
||||
"awaiting_email_confirmation": "Votre compte a été enregistré et un courriel envoyé à votre adresse. Veuillez consulter votre boîte mail pour terminer la registration.",
|
||||
"awaiting_email_confirmation_title": "En attente de confirmation par courriel",
|
||||
"bio": "Biographie",
|
||||
"bio_placeholder": "ex :\nSalut, je me présente ici !\nJ’adore les animés et les jeux vidéos. J’espère qu'on peut être amis⋅ies !",
|
||||
"captcha": "CAPTCHA",
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
"reject": "Tolak"
|
||||
},
|
||||
"mrf_policies": "Kebijakan MRF yang diaktifkan",
|
||||
"mrf_policies_desc": "Kebijakan MRF memanipulasi federasi yang terjadi pada instansi ini. Kebijakan berikut adalah yang aktif:",
|
||||
"simple": {
|
||||
"accept": "Terima",
|
||||
"accept_desc": "Instansi ini hanya menerima pesan dari instansi-instansi berikut:",
|
||||
|
@ -181,15 +182,44 @@
|
|||
"lv": "Latvia",
|
||||
"nl": "Belanda",
|
||||
"pl": "Polandia",
|
||||
"pt": "Portugal",
|
||||
"pt": "Portugis",
|
||||
"ru": "Rusia",
|
||||
"sk": "Slovakia",
|
||||
"sv": "Swedia",
|
||||
"tr": "Turki",
|
||||
"translated_from": {
|
||||
"ar": "Diterjemahkan dari @:languages.ar",
|
||||
"bg": "Diterjemahkan dari @:languages.bg",
|
||||
"en": "Diterjemahkan dari @:languages.en"
|
||||
"ar": "Diterjemahkan dari bahasa @:languages.ar",
|
||||
"az": "Diterjemahkan dari bahasa @:languages.az",
|
||||
"bg": "Diterjemahkan dari bahasa @:languages.bg",
|
||||
"cs": "Diterjemahkan dari bahasa @:languages.cs",
|
||||
"da": "Diterjemahkan dari bahasa @:languages.da",
|
||||
"de": "Diterjemahkan dari bahasa @:languages.de",
|
||||
"el": "Diterjemahkan dari bahasa @:languages.el",
|
||||
"en": "Diterjemahkan dari bahasa @:languages.en",
|
||||
"eo": "Diterjemahkan dari bahasa @:languages.eo",
|
||||
"es": "Diterjemahkan dari bahasa @:languages.es",
|
||||
"fa": "Diterjemahkan dari bahasa @:languages.fa",
|
||||
"fi": "Diterjemahkan dari bahasa @:languages.fi",
|
||||
"fr": "Diterjemahkan dari bahasa @:languages.fr",
|
||||
"ga": "Diterjemahkan dari bahasa @:languages.ga",
|
||||
"he": "Diterjemahkan dari bahasa @:languages.he",
|
||||
"hi": "Diterjemahkan dari bahasa @:languages.hi",
|
||||
"hu": "Diterjemahkan dari bahasa @:languages.hu",
|
||||
"id": "Diterjemahkan dari bahasa @:languages.id",
|
||||
"it": "Diterjemahkan dari bahasa @:languages.it",
|
||||
"ja": "Diterjemahkan dari bahasa @:languages.ja",
|
||||
"ko": "Diterjemahkan dari bahasa @:languages.ko",
|
||||
"lt": "Diterjemahkan dari bahasa @:languages.lt",
|
||||
"lv": "Diterjemahkan dari bahasa @:languages.lv",
|
||||
"nl": "Diterjemahkan dari bahasa @:languages.nl",
|
||||
"pl": "Diterjemahkan dari bahasa @:languages.pl",
|
||||
"pt": "Diterjemahkan dari bahasa @:languages.pt",
|
||||
"ru": "Diterjemahkan dari bahasa @:languages.ru",
|
||||
"sk": "Diterjemahkan dari bahasa @:languages.sk",
|
||||
"sv": "Diterjemahkan dari bahasa @:languages.sv",
|
||||
"tr": "Diterjemahkan dari bahasa @:languages.tr",
|
||||
"uk": "Diterjemahkan dari bahasa @:languages.uk",
|
||||
"zh": "Diterjemahkan dari bahasa @:languages.zh"
|
||||
},
|
||||
"uk": "Ukraina",
|
||||
"zh": "Tionghoa"
|
||||
|
@ -243,13 +273,17 @@
|
|||
"delete_note_title": "Konfirmasi penghapusan",
|
||||
"no_content": "Tak diberikan keterangan",
|
||||
"no_reports": "Tak ada laporan",
|
||||
"note_placeholder": "Tinggalkan catatan...",
|
||||
"note_placeholder": "Tinggalkan catatan",
|
||||
"notes": "{ count } catatan",
|
||||
"reopen": "Buka kembali",
|
||||
"reports": "Laporan",
|
||||
"resolve": "Selesaikan",
|
||||
"show_closed": "Tampilkan yang telah ditutup"
|
||||
"show_closed": "Tampilkan yang telah ditutup",
|
||||
"statuses": "{ count } postingan",
|
||||
"tag_policy_notice": "Aktifkan MRF TagPolicy untuk mengatur pembatasan postingan",
|
||||
"tags": "Atur pembatasan postingan"
|
||||
},
|
||||
"statuses": "Status",
|
||||
"statuses": "Postingan",
|
||||
"users": "Pengguna"
|
||||
},
|
||||
"nav": {
|
||||
|
@ -310,10 +344,11 @@
|
|||
"expired": "Japat berakhir {0} yang lalu",
|
||||
"expires_in": "Japat berakhir dalam {0}",
|
||||
"expiry": "Usia japat",
|
||||
"multiple_choices": "Lebih dari satu opsi dapat dipilih",
|
||||
"not_enough_options": "Terlalu sedikit opsi yang unik pada japat",
|
||||
"option": "Opsi",
|
||||
"people_voted_count": "{count} orang memilih | {count} orang memilih",
|
||||
"single_choice": "",
|
||||
"single_choice": "Hanya satu opsi dapat dipilih",
|
||||
"type": "Jenis japat",
|
||||
"vote": "Pilih",
|
||||
"votes": "suara",
|
||||
|
@ -406,6 +441,7 @@
|
|||
"account_backup_description": "Ini memungkinkan kamu untuk mengunduh arsip yang berisi informasi tentang akun dan postingan kamu, namun belum bisa diimpor ke akun Pleroma.",
|
||||
"account_privacy": "Privasi",
|
||||
"add_backup": "Buat cadangan baru",
|
||||
"add_backup_error": "Gagal menambahkan cadangan baru: {error}",
|
||||
"added_backup": "Cadangan baru ditambahkan.",
|
||||
"allow_following_move": "Ikuti otomatis apabila akun yang diikuti pindah",
|
||||
"app_name": "Nama aplikasi",
|
||||
|
@ -448,7 +484,11 @@
|
|||
"confirm_dialogs_repeat": "Mengulangi postingan",
|
||||
"confirm_dialogs_unfollow": "Berhenti mengikuti seseorang",
|
||||
"confirm_new_password": "Konfirmasi kata sandi baru",
|
||||
"conversation_display": "Gaya tampilan obrolan",
|
||||
"conversation_display": "Gaya tampilan percakapan",
|
||||
"conversation_display_tree": "Bercabang",
|
||||
"conversation_other_replies_button_below": "Di bawah postingan",
|
||||
"conversation_other_replies_button_inside": "Di postingan",
|
||||
"current_avatar": "Avatarmu saat ini",
|
||||
"current_password": "Kata sandi saat ini",
|
||||
"data_import_export_tab": "Impor / ekspor data",
|
||||
"delete_account": "Hapus akun",
|
||||
|
@ -462,6 +502,7 @@
|
|||
"emoji_reactions_on_timeline": "Tampilkan reaksi emoji pada linimasa",
|
||||
"enable_web_push_notifications": "Aktifkan notifikasi push web",
|
||||
"enter_current_password_to_confirm": "Masukkan kata sandi kamu saat ini untuk mengonfirmasi identitas kamu",
|
||||
"expert_mode": "Tampilkan pengaturan lanjutan",
|
||||
"expire_posts_enabled": "Hapus postingan setelah jumlah hari yang ditentukan",
|
||||
"expire_posts_input_placeholder": "Jumlah hari",
|
||||
"file_export_import": {
|
||||
|
@ -469,17 +510,28 @@
|
|||
"backup_settings": "Cadangkan pengaturan ke berkas",
|
||||
"backup_settings_theme": "Cadangkan pengaturan dan tema ke berkas",
|
||||
"errors": {
|
||||
"file_slightly_new": "Versi minor berkas berbeda, beberapa pengaturan mungkin tidak termuat"
|
||||
}
|
||||
"file_slightly_new": "Versi minor berkas berbeda, beberapa pengaturan mungkin tidak termuat",
|
||||
"file_too_new": "Versi major tidak kompatibel: {fileMajor}, PleromaFE ini (versi {feMajor}) terlalu lama untuk menanganinya",
|
||||
"file_too_old": "Versi major tidak kompatibel: {fileMajor}, versi berkas terlalu lama dan tidak lagi didukung (min. versi {feMajor})",
|
||||
"invalid_file": "Berkas yang dipilih bukan cadangan pengaturan Pleroma yang didukung. Tidak dibuat perubahan."
|
||||
},
|
||||
"restore_settings": "Pulihkan pengaturan dari berkas"
|
||||
},
|
||||
"filtering": "Penyaringan",
|
||||
"filtering_explanation": "Semua postingan yang mengandung kata-kata ini akan dibisukan, satu kata per baris",
|
||||
"follow_import_error": "Terjadi kesalahan ketika mengimpor pengikut",
|
||||
"fun": "Seru",
|
||||
"general": "Umum",
|
||||
"greentext": "Panah meme",
|
||||
"hide_all_muted_posts": "Sembunyikan postingan yang dibisukan",
|
||||
"hide_attachments_in_convo": "Sembunyikan lampiran pada percakapan",
|
||||
"hide_attachments_in_tl": "Sembunyikan lampiran di linimasa",
|
||||
"hide_bot_indication": "Sembunyikan tanda bot pada postingan",
|
||||
"hide_filtered_statuses": "Sembunyikan semua postingan yang tersaring",
|
||||
"hide_followers_count_description": "Jangan tampilkan jumlah pengikut",
|
||||
"hide_followers_description": "Jangan tampilkan siapa yang mengikuti saya",
|
||||
"hide_followers_description": "Jangan tampilkan siapa yang mengikutiku",
|
||||
"hide_follows_count_description": "Jangan tampilkan jumlah mengikuti",
|
||||
"hide_follows_description": "Jangan tampilkan siapa yang saya ikuti",
|
||||
"hide_follows_description": "Jangan tampilkan siapa yang aku ikuti",
|
||||
"hide_muted_posts": "Sembunyikan postingan-postingan dari pengguna yang dibisukan",
|
||||
"hide_post_stats": "Sembunyikan statistik postingan (seperti jumlah favorit)",
|
||||
"hide_shoutbox": "Sembunyikan kotak suara instansi",
|
||||
|
@ -493,9 +545,16 @@
|
|||
"invalid_theme_imported": "Berkas yang dipilih bukan sebuah tema yang didukung Pleroma. Tidak ada perubahan yang dibuat pada tema kamu.",
|
||||
"limited_availability": "Tidak tersedia di browser kamu",
|
||||
"links": "Tautan",
|
||||
"lock_account_description": "Batasi akunmu kepada pengikut yang sudah disetujui saja",
|
||||
"loop_video": "Ulang-ulang video",
|
||||
"loop_video_silent_only": "Ulang-ulang video tanpa suara (seperti \"gif\" Mastodon)",
|
||||
"max_thumbnails": "Jumlah thumbnail maksimum per postingan",
|
||||
"max_thumbnails": "Jumlah thumbnail maksimum per postingan (kosong = tidak terbatas)",
|
||||
"mention_link_bolden_you": "Sorot sebutan kamu apabila kamu disebut",
|
||||
"mention_link_display": "Tampilkan tautan sebutan",
|
||||
"mention_link_display_full": "selalu sebagai nama lengkap (cth. {'@'}foo{'@'}example.org)",
|
||||
"mention_link_display_full_for_remote": "sebagai nama lengkap hanya untuk pengguna di instansi lain (cth. {'@'}foo{'@'}example.org)",
|
||||
"mention_link_display_short": "selalu sebagai nama pendek (cth. {'@'}foo)",
|
||||
"mention_link_show_avatar": "Tampilkan avatar pengguna di samping tautan",
|
||||
"mfa": {
|
||||
"authentication_methods": "Metode otentikasi",
|
||||
"confirm_and_enable": "Konfirmasi & aktifkan OTP",
|
||||
|
@ -541,9 +600,9 @@
|
|||
},
|
||||
"profile_tab": "Profil",
|
||||
"reply_visibility_all": "Tampilkan semua balasan",
|
||||
"reply_visibility_following": "Hanya tampilkan balasan yang ditujukan kepada saya atau orang yang saya ikuti",
|
||||
"reply_visibility_following_short": "Tampilkan balasan ke orang yang saya ikuti",
|
||||
"reply_visibility_self": "Hanya tampilkan balasan yang ditujukan kepada saya",
|
||||
"reply_visibility_following": "Hanya tampilkan balasan yang ditujukan kepadaku atau orang yang aku ikuti",
|
||||
"reply_visibility_following_short": "Tampilkan balasan ke orang yang aku ikuti",
|
||||
"reply_visibility_self": "Hanya tampilkan balasan yang ditujukan kepadaku",
|
||||
"save": "Simpan perubahan",
|
||||
"saving_err": "Terjadi kesalahan ketika menyimpan pengaturan",
|
||||
"saving_ok": "Pengaturan disimpan",
|
||||
|
@ -554,8 +613,8 @@
|
|||
"set_new_avatar": "Tetapkan avatar baru",
|
||||
"set_new_profile_background": "Tetapkan latar belakang profil baru",
|
||||
"settings": "Pengaturan",
|
||||
"show_admin_badge": "Tampilkan lencana \"Admin\" di profil saya",
|
||||
"show_moderator_badge": "Tampilkan lencana \"Moderator\" di profil saya",
|
||||
"show_admin_badge": "Tampilkan lencana \"Admin\" di profilku",
|
||||
"show_moderator_badge": "Tampilkan lencana \"Moderator\" di profilku",
|
||||
"style": {
|
||||
"advanced_colors": {
|
||||
"_tab_label": "Lanjutan",
|
||||
|
@ -598,7 +657,7 @@
|
|||
},
|
||||
"preview": {
|
||||
"button": "Tombol",
|
||||
"checkbox": "Saya telah membaca sekilas syarat dan ketentuan",
|
||||
"checkbox": "Aku telah membaca sekilas syarat dan ketentuan",
|
||||
"error": "Contoh kesalahan",
|
||||
"faint_link": "manual berguna",
|
||||
"fine_print": "Baca {0} kami untuk belajar sesuatu yang tak ada gunanya!",
|
||||
|
|
|
@ -1,20 +1,29 @@
|
|||
{
|
||||
"about": {
|
||||
"bubble_instances": "ローカルバブルインスタンス",
|
||||
"mrf": {
|
||||
"federation": "フェデレーション",
|
||||
"keyword": {
|
||||
"keyword_policies": "キーワードポリシー",
|
||||
"reject": "おことわり",
|
||||
"replace": "おきかえ"
|
||||
},
|
||||
"mrf_policies": "ゆうこうなMRFポリシー",
|
||||
"mrf_policies_desc": "MRFポリシーは、このインスタンスのフェデレーションのふるまいを、いじります。これらのMRFポリシーがゆうこうになっています:",
|
||||
"simple": {
|
||||
"accept": "うけいれ",
|
||||
"accept_desc": "このインスンスは、これらのインスタンスからのメッセージのみをうけいれます:",
|
||||
"ftl_removal": "「つながっているすべてのネットワーク」タイムラインからのぞく",
|
||||
"ftl_removal_desc": "このインスタンスは、つながっているすべてのネットワーク」タイムラインから、これらのインスタンスを、とりのぞきます:",
|
||||
"ftl_removal_desc": "このインスタンスは、「つながっているすべてのネットワーク」タイムラインから、これらのインスタンスを、とりのぞきます:",
|
||||
"instance": "インスタンス",
|
||||
"media_nsfw": "メディアをすべてセンシティブにする",
|
||||
"media_nsfw_desc": "このインスタンスは、これらのインスタンスからおくられてきたメディアを、すべて、センシティブにマークします:",
|
||||
"media_removal": "メディアをのぞく",
|
||||
"media_removal_desc": "このインスタンスは、これらのインスタンスからおくられてきたメディアを、とりのぞきます:",
|
||||
"not_applicable": "なし",
|
||||
"quarantine": "けんえき",
|
||||
"quarantine_desc": "このインスタンスは、これらのインスタンスに、パブリックなとうこうのみを、おくります:",
|
||||
"quarantine_desc": "このインスタンスは、これらのインスタンスに、とうこうをおくりません:",
|
||||
"reason": "りゆう",
|
||||
"reject": "おことわり",
|
||||
"reject_desc": "このインスタンスは、これらのインスタンスからのメッセージをうけいれません:",
|
||||
"simple_policies": "インスタンスのポリシー"
|
||||
|
@ -22,6 +31,49 @@
|
|||
},
|
||||
"staff": "スタッフ"
|
||||
},
|
||||
"announcements": {
|
||||
"all_day_prompt": "いちにちじゅう",
|
||||
"cancel_edit_action": "キャンセル",
|
||||
"close_error": "とじる",
|
||||
"delete_action": "けす",
|
||||
"edit_action": "へんしゅう",
|
||||
"end_time_display": "{time} におわります",
|
||||
"end_time_prompt": "おわるじかん: ",
|
||||
"inactive_message": "このおしらせは、アクティブではありません",
|
||||
"mark_as_read_action": "よんだ!",
|
||||
"page_header": "おしらせ",
|
||||
"post_action": "とうこう",
|
||||
"post_error": "エラーになりました: {error}",
|
||||
"post_form_header": "おしらせする",
|
||||
"post_placeholder": "おしらせのほんぶん",
|
||||
"published_time_display": "{time} に、おしらせされました",
|
||||
"start_time_display": "{time} から、はじまります",
|
||||
"start_time_prompt": "はじまるじかん: ",
|
||||
"submit_edit_action": "そうしん",
|
||||
"title": "おしらせ"
|
||||
},
|
||||
"chats": {
|
||||
"chats": "チャット",
|
||||
"delete": "けす",
|
||||
"delete_confirm": "ほんとうに、このメッセージを、けしてもいいですか?",
|
||||
"empty_chat_list_placeholder": "チャットはありません。あたらしく、チャットをはじみてみましょう!",
|
||||
"empty_message_error": "からっぽのメッセージは、おくれません",
|
||||
"error_loading_chat": "チャットをよみこむことが、できなかったかもしれません。",
|
||||
"error_sending_message": "メッセージをおくることが、できなかったかもしれません。",
|
||||
"message_user": "{nickname} にメッセージ",
|
||||
"more": "つづき",
|
||||
"new": "あたらしいチャット",
|
||||
"you": "あなた:"
|
||||
},
|
||||
"display_date": {
|
||||
"today": "きょう"
|
||||
},
|
||||
"domain_mute_card": {
|
||||
"mute": "ミュート",
|
||||
"mute_progress": "ミュートしています…",
|
||||
"unmute": "ミュートをやめる",
|
||||
"unmute_progress": "ミュートをとりけしています…"
|
||||
},
|
||||
"emoji": {
|
||||
"add_emoji": "えもじをうちこむ",
|
||||
"custom": "カスタムえもじ",
|
||||
|
@ -29,6 +81,7 @@
|
|||
"keep_open": "ピッカーをあけたままにする",
|
||||
"load_all": "すべてのえもじをロード ({emojiAmount} こあります)",
|
||||
"load_all_hint": "はじめの {saneAmount} このえもじだけがロードされています。すべてのえもじをロードすると、パフォーマンスがわるくなるかもしれません。",
|
||||
"recent": "さいきんつかった",
|
||||
"search_emoji": "えもじをさがす",
|
||||
"stickers": "ステッカー",
|
||||
"unicode": "ユニコードえもじ"
|
||||
|
@ -42,8 +95,15 @@
|
|||
"scope_options": "こうかいはんいせんたく",
|
||||
"text_limit": "もじのかず",
|
||||
"title": "ゆうこうなきのう",
|
||||
"upload_limit": "ファイルのおおきさのじょうげん",
|
||||
"who_to_follow": "おすすめユーザー"
|
||||
},
|
||||
"file_type": {
|
||||
"audio": "おんせい",
|
||||
"file": "ファイル",
|
||||
"image": "がぞう",
|
||||
"video": "ビデオ"
|
||||
},
|
||||
"finder": {
|
||||
"error_fetching_user": "ユーザーけんさくがエラーになりました",
|
||||
"find_user": "ユーザーをさがす"
|
||||
|
@ -51,12 +111,32 @@
|
|||
"general": {
|
||||
"apply": "てきよう",
|
||||
"cancel": "キャンセル",
|
||||
"close": "とじる",
|
||||
"confirm": "たしかめる",
|
||||
"disable": "なし",
|
||||
"dismiss": "わすれる",
|
||||
"enable": "あり",
|
||||
"error_retry": "もういちど、ためしてください",
|
||||
"flash_content": "クリックすると、Ruffle をつかって、フラッシュさくひんをひょうじします。(うまくうごかないかもしれません)",
|
||||
"flash_fail": "フラッシュさくひんのロードに、しっぱいしました。コンソールに、くわしいことがかかれています。",
|
||||
"flash_security": "フラッシュさくひんは、あぶないことをしてくるかもしれないので、ちゅういしてください。",
|
||||
"generic_error": "エラーになりました",
|
||||
"loading": "ロードしています…",
|
||||
"more": "つづき",
|
||||
"optional": "かかなくてもよい",
|
||||
"peek": "かくす",
|
||||
"retry": "もういちど、ためしてください",
|
||||
"role": {
|
||||
"admin": "アドミン",
|
||||
"moderator": "モデレーター"
|
||||
},
|
||||
"scope_in_timeline": {
|
||||
"direct": "ダイレクト",
|
||||
"local": "ローカル: このとうこうは、このインスタンスのユーザーだけが、みることができます",
|
||||
"private": "フォロワーげんてい",
|
||||
"public": "パブリック",
|
||||
"unlisted": "アンリステッド"
|
||||
},
|
||||
"show_less": "たたむ",
|
||||
"show_more": "つづきをみる",
|
||||
"submit": "そうしん",
|
||||
|
@ -76,7 +156,86 @@
|
|||
"interactions": {
|
||||
"favs_repeats": "リピートとおきにいり",
|
||||
"follows": "あたらしいフォロー",
|
||||
"load_older": "ふるいやりとりをみる"
|
||||
"load_older": "ふるいやりとりをみる",
|
||||
"moves": "ユーザーをひっこしする"
|
||||
},
|
||||
"languages": {
|
||||
"ar": "アラビアご",
|
||||
"az": "アゼルバイジャンご",
|
||||
"bg": "ブルガリアご",
|
||||
"cs": "チェコご",
|
||||
"da": "デンマークご",
|
||||
"de": "ドイツご",
|
||||
"el": "ギリシャご",
|
||||
"en": "えいご",
|
||||
"eo": "エスご",
|
||||
"es": "スペインご",
|
||||
"fa": "ペルシャご",
|
||||
"fi": "フィンランドご",
|
||||
"fr": "フランスご",
|
||||
"ga": "アイルランドご",
|
||||
"he": "ヘブライご",
|
||||
"hi": "ヒンディーご",
|
||||
"hu": "ハンガリーご",
|
||||
"id": "インドネシアご",
|
||||
"it": "イタリアご",
|
||||
"ja": "にほんご",
|
||||
"ko": "かんこくご",
|
||||
"lt": "リトアニアご",
|
||||
"lv": "ラトビアご",
|
||||
"nl": "オランダご",
|
||||
"pl": "ポーランドご",
|
||||
"pt": "ポルトガルご",
|
||||
"ru": "ロシアご",
|
||||
"sk": "スロバキアご",
|
||||
"sv": "スウェーデンご",
|
||||
"tr": "トルコご",
|
||||
"translated_from": {
|
||||
"ar": "@:languages.ar から、ほんやくされました",
|
||||
"az": "@:languages.az から、ほんやくされました",
|
||||
"bg": "@:languages.bg から、ほんやくされました",
|
||||
"cs": "@:languages.cs から、ほんやくされました",
|
||||
"da": "@:languages.da から、ほんやくされました",
|
||||
"de": "@:languages.de から、ほんやくされました",
|
||||
"el": "@:languages.el から、ほんやくされました",
|
||||
"en": "@:languages.en から、ほんやくされました",
|
||||
"eo": "@:languages.eo から、ほんやくされました",
|
||||
"es": "@:languages.es から、ほんやくされました",
|
||||
"fa": "@:languages.fa から、ほんやくされました",
|
||||
"fi": "@:languages.fi から、ほんやくされました",
|
||||
"fr": "@:languages.fr から、ほんやくされました",
|
||||
"ga": "@:languages.ga から、ほんやくされました",
|
||||
"he": "@:languages.he から、ほんやくされました",
|
||||
"hi": "@:languages.hi から、ほんやくされました",
|
||||
"hu": "@:languages.hu から、ほんやくされました",
|
||||
"id": "@:languages.id から、ほんやくされました",
|
||||
"it": "@:languages.it から、ほんやくされました",
|
||||
"ja": "@:languages.ja から、ほんやくされました",
|
||||
"ko": "@:languages.ko から、ほんやくされました",
|
||||
"lt": "@:languages.lt から、ほんやくされました",
|
||||
"lv": "@:languages.lv から、ほんやくされました",
|
||||
"nl": "@:languages.nl から、ほんやくされました",
|
||||
"pl": "@:languages.pl から、ほんやくされました",
|
||||
"pt": "@:languages.pt から、ほんやくされました",
|
||||
"ru": "@:languages.ru から、ほんやくされました",
|
||||
"sk": "@:languages.sk から、ほんやくされました",
|
||||
"sv": "@:languages.sv から、ほんやくされました",
|
||||
"tr": "@:languages.tr から、ほんやくされました",
|
||||
"uk": "@:languages.uk から、ほんやくされました",
|
||||
"zh": "@:languages.zh から、ほんやくされました"
|
||||
},
|
||||
"uk": "ウクライナご",
|
||||
"zh": "ちゅうごくご"
|
||||
},
|
||||
"lists": {
|
||||
"create": "つくる",
|
||||
"delete": "けす",
|
||||
"following_only": "フォローしているユーザーのみ",
|
||||
"lists": "リスト",
|
||||
"new": "リストをつくる",
|
||||
"save": "セーブ",
|
||||
"search": "ユーザーをさがす",
|
||||
"title": "リストのなまえ"
|
||||
},
|
||||
"login": {
|
||||
"authentication_code": "にんしょうコード",
|
||||
|
@ -90,41 +249,90 @@
|
|||
"hint": "はなしあいにくわわるには、ログインしてください",
|
||||
"login": "ログイン",
|
||||
"logout": "ログアウト",
|
||||
"logout_confirm": "ほんとうに、ログアウトしてもいいですか?",
|
||||
"logout_confirm_accept_button": "ログアウト",
|
||||
"logout_confirm_cancel_button": "キャンセル",
|
||||
"logout_confirm_title": "ログアウト",
|
||||
"password": "パスワード",
|
||||
"placeholder": "れい: lain",
|
||||
"placeholder": "ユーザーめい",
|
||||
"recovery_code": "リカバリーコード",
|
||||
"register": "はじめる",
|
||||
"username": "ユーザーめい"
|
||||
},
|
||||
"media_modal": {
|
||||
"counter": "{current} / {total}",
|
||||
"hide": "とじる",
|
||||
"next": "つぎ",
|
||||
"previous": "まえ"
|
||||
},
|
||||
"moderation": {
|
||||
"moderation": "モデレーション",
|
||||
"reports": {
|
||||
"add_note": "メモする",
|
||||
"close": "とじる",
|
||||
"delete_note": "けす",
|
||||
"delete_note_accept": "けす",
|
||||
"delete_note_cancel": "キャンセル",
|
||||
"delete_note_confirm": "ほんとうに、このメモをけしてもいいですか?",
|
||||
"delete_note_title": "かくにんしてください",
|
||||
"no_content": "せつめいはありません",
|
||||
"no_reports": "つうほうはありません",
|
||||
"note_placeholder": "メモする",
|
||||
"notes": "{ count }こ",
|
||||
"reopen": "ひらきなおす",
|
||||
"report": "つうほう:",
|
||||
"reports": "つうほう",
|
||||
"resolve": "かいけつ",
|
||||
"show_closed": "かいけつしたつうほうをみる",
|
||||
"statuses": "{ count } こ",
|
||||
"tag_policy_notice": "とうこうをせいげんするには、TagPolicy MRF をゆうこうにしてください",
|
||||
"tags": "とうこうをせいげんする"
|
||||
},
|
||||
"statuses": "とうこう",
|
||||
"users": "ユーザー"
|
||||
},
|
||||
"nav": {
|
||||
"about": "これはなに?",
|
||||
"administration": "アドミニストレーション",
|
||||
"announcements": "おしらせ",
|
||||
"back": "もどる",
|
||||
"bookmarks": "ブックマーク",
|
||||
"bubble_timeline": "バブルタイムライン",
|
||||
"bubble_timeline_description": "アドミンがおすすめするインスタンスからのとうこう",
|
||||
"chats": "チャット",
|
||||
"dms": "ダイレクトメッセージ",
|
||||
"friend_requests": "フォローリクエスト",
|
||||
"home_timeline": "ホームタイムライン",
|
||||
"home_timeline_description": "フォローしているユーザーのとうこう",
|
||||
"interactions": "やりとり",
|
||||
"lists": "リスト",
|
||||
"mentions": "メンション",
|
||||
"moderation": "モデレーション",
|
||||
"preferences": "せってい",
|
||||
"public_timeline_description": "このインスタンスからの、パブリックなとうこう",
|
||||
"public_tl": "パブリックタイムライン",
|
||||
"search": "さがす",
|
||||
"timeline": "タイムライン",
|
||||
"timelines": "タイムライン",
|
||||
"twkn": "つながっているすべてのネットワーク",
|
||||
"twkn_timeline_description": "つながっているすべてのネットワークからのとうこう",
|
||||
"user_search": "ユーザーをさがす",
|
||||
"who_to_follow": "おすすめユーザー"
|
||||
},
|
||||
"notifications": {
|
||||
"broken_favorite": "ステータスがみつかりません。さがしています…",
|
||||
"favorited_you": "あなたのステータスがおきにいりされました",
|
||||
"broken_favorite": "とうこうがみつかりません。さがしています…",
|
||||
"error": "つうちのしゅとくがエラーになりました: {0}",
|
||||
"favorited_you": "あなたのとうこうが、おきにいりされました",
|
||||
"follow_request": "フォローリクエストされました",
|
||||
"followed_you": "フォローされました",
|
||||
"load_older": "ふるいつうちをみる",
|
||||
"migrated_to": "インスタンスをひっこしました",
|
||||
"no_more_notifications": "つうちはありません",
|
||||
"notifications": "つうち",
|
||||
"poll_ended": "いれふだがおわりました",
|
||||
"reacted_with": "{0} でリアクションされました",
|
||||
"read": "よんだ!",
|
||||
"repeated_you": "あなたのステータスがリピートされました"
|
||||
"repeated_you": "あなたのとうこうが、リピートされました"
|
||||
},
|
||||
"password_reset": {
|
||||
"check_email": "パスワードをリセットするためのリンクがかかれたメールが、とどいているかどうか、みてください。",
|
||||
|
@ -147,49 +355,72 @@
|
|||
"multiple_choices": "いくつでもえらべる",
|
||||
"not_enough_options": "ユニークなオプションが、たりません",
|
||||
"option": "オプション",
|
||||
"people_voted_count": "{count} にんが、ふだをいれています",
|
||||
"single_choice": "ひとつえらぶ",
|
||||
"type": "いれふだのかた",
|
||||
"vote": "ふだをいれる",
|
||||
"votes": "いれふだ"
|
||||
"votes": "いれふだ",
|
||||
"votes_count": "{count} ふだ"
|
||||
},
|
||||
"post_status": {
|
||||
"account_not_locked_warning": "あなたのアカウントは {0} ではありません。あなたをフォローすれば、だれでも、フォロワーげんていのステータスをよむことができます。",
|
||||
"account_not_locked_warning": "あなたのアカウントは {0} ではありません。あなたをフォローすれば、だれでも、フォロワーげんていのとうこうをよむことができます。",
|
||||
"account_not_locked_warning_link": "ロックされたアカウント",
|
||||
"attachments_sensitive": "ファイルをNSFWにする",
|
||||
"content_type": {
|
||||
"text/bbcode": "BBCode",
|
||||
"text/html": "HTML",
|
||||
"text/markdown": "Markdown",
|
||||
"text/plain": "プレーンテキスト"
|
||||
"text/plain": "プレーンテキスト",
|
||||
"text/x.misskeymarkdown": "MFM"
|
||||
},
|
||||
"content_warning": "せつめい (かかなくてもよい)",
|
||||
"content_warning": "ちゅういがき (かかなくてもよい)",
|
||||
"default": "はねだくうこうに、つきました。",
|
||||
"direct_warning_to_all": "このとうこうは、メンションされたすべてのユーザーが、みることができます。",
|
||||
"direct_warning_to_first_only": "このとうこうは、メッセージのはじめでメンションされたユーザーだけが、みることができます。",
|
||||
"edit_remote_warning": "へんしゅうしたとうこうは、ほかのインスタンスに、はんえいされないことがあります!",
|
||||
"edit_status": "へんしゅう",
|
||||
"edit_unsupported_warning": "いれふだとメンションは、へんしゅうでかえることができません。",
|
||||
"empty_status_error": "からっぽのとうこうは、おくることができません",
|
||||
"media_description": "メディアのせつめい",
|
||||
"media_description_error": "メディアのアップデートにしっぱいしました。もういちど、ためしてください",
|
||||
"media_not_sensitive_warning": "ちゅういがきがついていますが、NSFWはついていません!",
|
||||
"new_status": "とうこうする",
|
||||
"post": "とうこう",
|
||||
"posting": "とうこう",
|
||||
"preview": "プレビュー",
|
||||
"preview_empty": "からっぽです",
|
||||
"scope": {
|
||||
"direct": "ダイレクト: メンションされたユーザーのみにとどきます",
|
||||
"local": "ローカル: パブリックタイムラインにとどきますが、ほかのインスタンスにはとどきません",
|
||||
"private": "フォロワーげんてい: フォロワーのみにとどきます",
|
||||
"public": "パブリック: パブリックタイムラインにとどきます",
|
||||
"unlisted": "アンリステッド: パブリックタイムラインにとどきません"
|
||||
},
|
||||
"scope_notice": {
|
||||
"local": "このとうこうは、このインスタンスのユーザーだけが、みることができます",
|
||||
"private": "このとうこうは、あなたのフォロワーだけが、みることができます",
|
||||
"public": "このとうこうは、だれでもみることができます",
|
||||
"unlisted": "このとうこうは、パブリックタイムラインと、つながっているすべてのネットワークでは、みることができません"
|
||||
}
|
||||
},
|
||||
"registration": {
|
||||
"awaiting_email_confirmation": "あなたのメールアドレスに、メールをおくりました。メールをかくにんして、とうろくをかんりょうさせてください。",
|
||||
"awaiting_email_confirmation_title": "メールをかくにんするのをまっています",
|
||||
"bio": "プロフィール",
|
||||
"bio_placeholder": "れい:\nごきげんよう。わたしはれいん。\nわたしはアニメのおんなのこで、にほんのベッドタウンにすんでいます。ワイヤードで、わたしにあったことが、あるかもしれませんね。",
|
||||
"captcha": "CAPTCHA",
|
||||
"email": "Eメール",
|
||||
"email_language": "サーバーからのメールは、どのことばで、かいてほしいですか?",
|
||||
"fullname": "スクリーンネーム",
|
||||
"fullname_placeholder": "れい: いわくら れいん",
|
||||
"new_captcha": "もじがよめないときは、がぞうをクリックすると、あたらしいがぞうになります",
|
||||
"password_confirm": "パスワードのかくにん",
|
||||
"reason": "とうろくしたいりゆう",
|
||||
"reason_placeholder": "このインスタンスは、しゅどうで、とうろくをうけつけています。\nとうろくしたいりゆうを、アドミニストレーターにおしえてください。",
|
||||
"register": "はじめる",
|
||||
"registration": "はじめる",
|
||||
"request_sent": "とうろくリクエストをおくりました。とうろくがうけいれられると、メールがとどきます。",
|
||||
"request_sent_title": "とうろくリクエストをおくりました",
|
||||
"token": "しょうたいトークン",
|
||||
"username_placeholder": "れい: lain",
|
||||
"validations": {
|
||||
|
@ -217,6 +448,20 @@
|
|||
"select_all": "すべてえらぶ"
|
||||
},
|
||||
"settings": {
|
||||
"accent": "アクセント",
|
||||
"account_alias": "アカウントのエイリアス",
|
||||
"account_alias_table_head": "エイリアス",
|
||||
"account_backup": "アカウントのバックアップ",
|
||||
"account_backup_description": "あなたのアカウントのじょうほうと、とうこうの、アーカイブをダウンロードできます。しかし、いまのところは、バックアップを Pleromaのアカウントにインポートすることはできません。",
|
||||
"account_backup_table_head": "バックアップ",
|
||||
"account_privacy": "プライバシー",
|
||||
"add_alias_error": "エイリアスのついかがエラーになりました: {error}",
|
||||
"add_backup": "あたらしいバックアップをつくる",
|
||||
"add_backup_error": "バックアップのついかがエラーになりました: {error}",
|
||||
"added_alias": "エイリアスをついかしました。",
|
||||
"added_backup": "バックアップをつくりました。",
|
||||
"allow_following_move": "フォローしているアカウントがひっこしたときに、じどうでフォローしてもよい",
|
||||
"always_show_post_button": "みぎしたのとうこうボタンをいつでもひょうじする",
|
||||
"app_name": "アプリのなまえ",
|
||||
"attachmentRadius": "ファイル",
|
||||
"attachments": "ファイル",
|
||||
|
@ -226,6 +471,7 @@
|
|||
"avatarRadius": "アバター",
|
||||
"avatar_size_instruction": "アバターのおおきさは、150×150ピクセルか、それよりもおおきくするといいです。",
|
||||
"background": "バックグラウンド",
|
||||
"backup_not_ready": "このバックアップは、まだ、かんせいしていません。",
|
||||
"bio": "プロフィール",
|
||||
"block_export": "ブロックのエクスポート",
|
||||
"block_export_button": "ブロックをCSVファイルにエクスポート",
|
||||
|
@ -233,6 +479,7 @@
|
|||
"block_import_error": "ブロックのインポートがエラーになりました",
|
||||
"blocks_imported": "ブロックをインポートしました! じっさいにブロックするまでには、もうしばらくかかります。",
|
||||
"blocks_tab": "ブロック",
|
||||
"bot": "これは bot アカウントです",
|
||||
"btnRadius": "ボタン",
|
||||
"cBlue": "リプライとフォロー",
|
||||
"cGreen": "リピート",
|
||||
|
@ -244,11 +491,29 @@
|
|||
"change_password_error": "パスワードをかえることが、できなかったかもしれません。",
|
||||
"changed_email": "メールアドレスをかえることができました!",
|
||||
"changed_password": "パスワードが、かわりました!",
|
||||
"chatMessageRadius": "チャットメッセージ",
|
||||
"checkboxRadius": "チェックボックス",
|
||||
"collapse_subject": "せつめいのあるとうこうをたたむ",
|
||||
"collapse_subject": "ちゅういがきのあるとうこうをたたむ",
|
||||
"columns": "カラム",
|
||||
"composing": "とうこう",
|
||||
"confirm_dialogs": "いつ、かくにんがめんをひょうじしますか:",
|
||||
"confirm_dialogs_approve_follow": "フォローリクエストをうけいれるとき",
|
||||
"confirm_dialogs_block": "だれかをブロックするとき",
|
||||
"confirm_dialogs_delete": "とうこうをけすとき",
|
||||
"confirm_dialogs_deny_follow": "フォローリクエストをおことわりするとき",
|
||||
"confirm_dialogs_mute": "だれかをミュートするとき",
|
||||
"confirm_dialogs_repeat": "とうこうをリピートするとき",
|
||||
"confirm_dialogs_unfollow": "だれかのフォローをやめるとき",
|
||||
"confirm_new_password": "あたらしいパスワードのかくにん",
|
||||
"confirmation_dialogs": "かくにんがめんのせってい",
|
||||
"conversation_display": "スレッドのみため",
|
||||
"conversation_display_linear": "リニア",
|
||||
"conversation_display_tree": "ツリー",
|
||||
"conversation_other_replies_button": "「ほかのへんしん」ボタンをひょうじするばしょ",
|
||||
"conversation_other_replies_button_below": "とうこうのした",
|
||||
"conversation_other_replies_button_inside": "とうこうのうちがわ",
|
||||
"current_avatar": "いまのアバター",
|
||||
"current_mascot": "いまのマスコット",
|
||||
"current_password": "いまのパスワード",
|
||||
"data_import_export_tab": "インポートとエクスポート",
|
||||
"default_vis": "デフォルトのこうかいはんい",
|
||||
|
@ -256,9 +521,15 @@
|
|||
"delete_account_description": "あなたのアカウントとメッセージが、きえます。",
|
||||
"delete_account_error": "アカウントをけすことが、できなかったかもしれません。インスタンスのアドミニストレーターに、おといあわせください。",
|
||||
"delete_account_instructions": "ほんとうにアカウントをけしてもいいなら、パスワードをかいてください。",
|
||||
"disable_sticky_headers": "カラムヘッダーを、がめんのいちばんうえにくっつけない",
|
||||
"discoverable": "けんさくなどのサービスで、このアカウントをみつけてもよい",
|
||||
"domain_mutes": "ドメイン",
|
||||
"download_backup": "ダウンロード",
|
||||
"email_language": "メールのことば",
|
||||
"emoji_reactions_on_timeline": "えもじのリアクションをタイムラインにひょうじする",
|
||||
"enable_web_push_notifications": "ウェブプッシュつうちをゆるす",
|
||||
"enter_current_password_to_confirm": "あなたのアイデンティティをたしかめるため、あなたのいまのパスワードをかいてください",
|
||||
"expert_mode": "こまかいせっていをひょうじ",
|
||||
"export_theme": "セーブ",
|
||||
"filtering": "フィルタリング",
|
||||
"filtering_explanation": "これらのことばをふくむすべてのものがミュートされます。1ぎょうに1つのことばをかいてください",
|
||||
|
@ -329,6 +600,7 @@
|
|||
"no_rich_text_description": "リッチテキストをつかわない",
|
||||
"notification_blocks": "ブロックしているユーザーからのつうちは、すべてとまります。",
|
||||
"notification_mutes": "あるユーザーからのつうちをとめるには、ミュートしてください。",
|
||||
"notification_setting_hide_if_cw": "ちゅういがきがあるとうこうのないようを、つうちからみえないようにする",
|
||||
"notification_visibility": "ひょうじするつうち",
|
||||
"notification_visibility_follows": "フォロー",
|
||||
"notification_visibility_likes": "おきにいり",
|
||||
|
@ -361,6 +633,7 @@
|
|||
"search_user_to_mute": "ミュートしたいひとを、ここでけんさくできます",
|
||||
"security": "セキュリティ",
|
||||
"security_tab": "セキュリティ",
|
||||
"sensitive_if_subject": "ちゅういがきを、つけたときに、がぞうをじどうてきにNSFWにする",
|
||||
"set_new_avatar": "あたらしいアバターをせっていする",
|
||||
"set_new_profile_background": "あたらしいプロフィールのバックグラウンドをせっていする",
|
||||
"set_new_profile_banner": "あたらしいプロフィールバナーを設定する",
|
||||
|
@ -478,8 +751,8 @@
|
|||
"save_load_hint": "「のこす」オプションをONにすると、テーマをえらんだときとロードしたとき、いまのせっていをのこします。また、テーマをエクスポートするとき、これらのオプションをストアします。すべてのチェックボックスをOFFにすると、テーマをエクスポートしたとき、すべてのせっていをセーブします。"
|
||||
}
|
||||
},
|
||||
"subject_input_always_show": "サブジェクトフィールドをいつでもひょうじする",
|
||||
"subject_line_behavior": "リプライするときサブジェクトをコピーする",
|
||||
"subject_input_always_show": "ちゅういがきフィールドをいつでもひょうじする",
|
||||
"subject_line_behavior": "リプライするとき、ちゅういがきをコピーする",
|
||||
"subject_line_email": "メールふう: \"re: サブジェクト\"",
|
||||
"subject_line_mastodon": "マストドンふう: そのままコピー",
|
||||
"subject_line_noop": "コピーしない",
|
||||
|
@ -506,8 +779,8 @@
|
|||
}
|
||||
},
|
||||
"status": {
|
||||
"delete": "ステータスをけす",
|
||||
"delete_confirm": "ほんとうに、このステータスを、けしてもいいですか?",
|
||||
"delete": "とうこうをけす",
|
||||
"delete_confirm": "ほんとうに、このとうこうを、けしてもいいですか?",
|
||||
"favorites": "おきにいり",
|
||||
"mute_conversation": "スレッドをミュートする",
|
||||
"pin": "プロフィールにピンどめする",
|
||||
|
@ -515,6 +788,8 @@
|
|||
"repeats": "リピート",
|
||||
"replies_list": "へんしん:",
|
||||
"reply_to": "へんしん:",
|
||||
"translate": "ほんやく",
|
||||
"translated_from": "{language} から、ほんやくされました",
|
||||
"unmute_conversation": "スレッドをミュートするのをやめる",
|
||||
"unpin": "プロフィールにピンどめするのをやめる"
|
||||
},
|
||||
|
@ -543,7 +818,7 @@
|
|||
"timeline": {
|
||||
"collapse": "たたむ",
|
||||
"conversation": "スレッド",
|
||||
"load_older": "ふるいステータス",
|
||||
"load_older": "ふるいとうこう",
|
||||
"no_more_statuses": "これでおわりです",
|
||||
"no_retweet_hint": "とうこうを「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります",
|
||||
"no_statuses": "ありません",
|
||||
|
@ -617,7 +892,7 @@
|
|||
"remote_follow": "リモートフォロー",
|
||||
"report": "つうほう",
|
||||
"show_repeats": "リピートをみる",
|
||||
"statuses": "ステータス",
|
||||
"statuses": "とうこう",
|
||||
"subscribe": "サブスクライブ",
|
||||
"unblock": "ブロックをやめる",
|
||||
"unblock_progress": "ブロックをとりけしています…",
|
||||
|
|
|
@ -254,6 +254,10 @@
|
|||
"hint": "Log in om deel te nemen aan de discussie",
|
||||
"login": "Inloggen",
|
||||
"logout": "Uitloggen",
|
||||
"logout_confirm": "Weet je zeker dat je wilt uitloggen?",
|
||||
"logout_confirm_accept_button": "Uitloggen",
|
||||
"logout_confirm_cancel_button": "Annuleren",
|
||||
"logout_confirm_title": "Uitloggen",
|
||||
"password": "Wachtwoord",
|
||||
"placeholder": "mijngebruikersnaam",
|
||||
"recovery_code": "Herstelcode",
|
||||
|
@ -266,6 +270,30 @@
|
|||
"next": "Volgende",
|
||||
"previous": "Vorige"
|
||||
},
|
||||
"moderation": {
|
||||
"moderation": "Moderatie",
|
||||
"reports": {
|
||||
"add_note": "Notitie toevoegen",
|
||||
"close": "Sluiten",
|
||||
"delete_note": "Verwijderen",
|
||||
"delete_note_accept": "Ja, verwijderen",
|
||||
"delete_note_cancel": "Nee, behouden",
|
||||
"delete_note_confirm": "Weet je zeker dat je deze notitie wilt verwijderen?",
|
||||
"delete_note_title": "Verwijderen bevestigen",
|
||||
"no_content": "Geen omschrijving beschikbaar",
|
||||
"no_reports": "Geen rapporten beschikbaar",
|
||||
"notes": "{ count } notitie | { count } notities",
|
||||
"reopen": "Heropenen",
|
||||
"reports": "Rapporten",
|
||||
"resolve": "Oplossen",
|
||||
"show_closed": "Afgesloten tonen",
|
||||
"statuses": "{ count } bericht| { count } berichten",
|
||||
"tag_policy_notice": "Activeer de TagPolicy MRF om bericht-beperkingen in te stellen",
|
||||
"tags": "Bericht-beperkingen instellen"
|
||||
},
|
||||
"statuses": "Berichten",
|
||||
"users": "Gebruikers"
|
||||
},
|
||||
"nav": {
|
||||
"about": "Over ons",
|
||||
"administration": "Beheer",
|
||||
|
@ -282,6 +310,7 @@
|
|||
"interactions": "Interacties",
|
||||
"lists": "Lijsten",
|
||||
"mentions": "Vermeldingen",
|
||||
"moderation": "Moderatie",
|
||||
"preferences": "Voorkeuren",
|
||||
"public_timeline_description": "Openbare berichten van deze instantie",
|
||||
"public_tl": "Openbare tijdlijn",
|
||||
|
@ -378,6 +407,8 @@
|
|||
}
|
||||
},
|
||||
"registration": {
|
||||
"awaiting_email_confirmation": "Je account is geregistreerd en een e-mail verzonden naar je e-mailadres ter bevestiging. Controleer je e-mail inbox om de registratie af te ronden.",
|
||||
"awaiting_email_confirmation_title": "In afwachting van e-mail bevestiging",
|
||||
"bio": "Bio",
|
||||
"bio_placeholder": "Bijv.\nHallo! Welkom op mijn bio.\nIk vind anime en games leuk. Hopelijk kunnen we vrienden zijn!",
|
||||
"captcha": "CAPTCHA",
|
||||
|
@ -391,6 +422,8 @@
|
|||
"reason_placeholder": "Deze instantie keurt registraties handmatig goed.\nLaat de beheerder weten waarom je je wilt registreren.",
|
||||
"register": "Registreren",
|
||||
"registration": "Registratie",
|
||||
"request_sent": "Je registratieverzoek zal worden beoordeeld. Indien je account wordt goed gekeurd, zul je een e-mail ontvangen.",
|
||||
"request_sent_title": "Registratieverzoek verzonden",
|
||||
"token": "Uitnodigingstoken",
|
||||
"username_placeholder": "bijv. akko",
|
||||
"validations": {
|
||||
|
@ -500,6 +533,8 @@
|
|||
"enable_web_push_notifications": "Web push meldingen inschakelen",
|
||||
"enter_current_password_to_confirm": "Voer je huidige wachtwoord in om je identiteit te bevestigen",
|
||||
"expert_mode": "Geavanceerde opties tonen",
|
||||
"expire_posts_enabled": "Berichten ouder dan een ingesteld aantal dagen verwijderen",
|
||||
"expire_posts_input_placeholder": "Aantal dagen",
|
||||
"export_theme": "Preset opslaan",
|
||||
"file_export_import": {
|
||||
"backup_restore": "Instellingen back-up",
|
||||
|
@ -693,6 +728,18 @@
|
|||
"setting_changed": "Instelling verschilt van standaard waarde",
|
||||
"setting_server_side": "Deze instelling is gebonden aan je profiel en beïnvloed alle sessies en clients",
|
||||
"settings": "Instellingen",
|
||||
"settings_profile": "Instellingsprofielen",
|
||||
"settings_profile_creation": "Nieuw profiel aanmaken",
|
||||
"settings_profile_creation_new_name_label": "Naam",
|
||||
"settings_profile_creation_submit": "Aanmaken",
|
||||
"settings_profile_delete": "Verwijderen",
|
||||
"settings_profile_delete_confirm": "Weet je zeker dat je dit profiel wilt verwijderen?",
|
||||
"settings_profile_force_sync": "Synchroniseren",
|
||||
"settings_profile_in_use": "In gebruik",
|
||||
"settings_profile_use": "Gebruiken",
|
||||
"settings_profiles_refresh": "Instellingsprofielen verversen",
|
||||
"settings_profiles_show": "Alle instellingsprofielen tonen",
|
||||
"settings_profiles_unshow": "Alle instellingsprofielen verbergen",
|
||||
"show_admin_badge": "\"Beheerder\" badge in mijn profiel tonen",
|
||||
"show_moderator_badge": "\"Moderator\" badge in mijn profiel tonen",
|
||||
"show_nav_shortcuts": "Extra navigatie snelkoppelingen tonen in top paneel",
|
||||
|
@ -872,6 +919,7 @@
|
|||
"useStreamingApi": "Berichten en meldingen in real-time ontvangen",
|
||||
"useStreamingApiWarning": "Iets experimenteels met berichten streamen uwu miss kun je beter uit laten ofzo?",
|
||||
"use_at_icon": "{'@'} symbool als icoon tonen in plaats van tekst",
|
||||
"use_blurhash": "Waas tonen over NSFW-miniaturen",
|
||||
"use_contain_fit": "Bijlage in miniaturen niet bijsnijden",
|
||||
"use_one_click_nsfw": "Gevoelige bijlagen met slechts één klik openen",
|
||||
"user_mutes": "Gebruikers",
|
||||
|
@ -892,6 +940,12 @@
|
|||
"word_filter": "Woord filter",
|
||||
"wordfilter": "Woordfilter"
|
||||
},
|
||||
"settings_profile": {
|
||||
"creating": "Bezig met nieuw profiel \"{profile}\" aan te maken...",
|
||||
"synchronization_error": "Instellingen konden niet gesynchroniseerd worden: {err}",
|
||||
"synchronized": "Instellingen gesynchroniseerd!",
|
||||
"synchronizing": "Bezig met profiel \"{profile}\" te synchroniseren..."
|
||||
},
|
||||
"status": {
|
||||
"ancestor_follow": "{numReplies} ander antwoord onder dit bericht tonen | {numReplies} andere antwoorden onder dit bericht tonen",
|
||||
"ancestor_follow_with_icon": "{icon} {text}",
|
||||
|
@ -925,6 +979,11 @@
|
|||
"pin": "Aan profiel vastmaken",
|
||||
"pinned": "Vastgezet",
|
||||
"plus_more": "+{number} meer",
|
||||
"redraft": "Verwijderen & opnieuw opstellen",
|
||||
"redraft_confirm": "Weet je zeker at je dit bericht wilt verwijderen en opnieuw opstellen? Interacties met het originele bericht zullen vervallen.",
|
||||
"redraft_confirm_accept_button": "Ja, verwijderen en opnieuw opstellen",
|
||||
"redraft_confirm_cancel_button": "Nee, origineel bericht behouden",
|
||||
"redraft_confirm_title": "Verwijderen & opnieuw opstellen bevestigen",
|
||||
"remove_attachment": "Bijlage verwijderen",
|
||||
"repeat_confirm": "Weet je zeker dat je dit bericht wilt herhalen?",
|
||||
"repeat_confirm_accept_button": "Ja, herhalen",
|
||||
|
@ -985,6 +1044,7 @@
|
|||
"collapse": "Invouwen",
|
||||
"conversation": "Gesprek",
|
||||
"error": "Fout bij het ophalen van tijdlijn: {0}",
|
||||
"follow_tag": "Hashtag volgen",
|
||||
"load_older": "Oudere berichten laden",
|
||||
"no_more_statuses": "Geen verdere berichten",
|
||||
"no_retweet_hint": "Bericht is gemarkeerd als enkel-volgers of privé en kan niet worden herhaald of geciteerd",
|
||||
|
@ -994,6 +1054,7 @@
|
|||
"show_new": "Nieuwe tonen",
|
||||
"socket_broke": "Realtime verbinding verloren: CloseEvent code {0}",
|
||||
"socket_reconnected": "Realtime verbinding opgezet",
|
||||
"unfollow_tag": "Hashtag ontvolgen",
|
||||
"up_to_date": "Up-to-date"
|
||||
},
|
||||
"toast": {
|
||||
|
@ -1058,6 +1119,7 @@
|
|||
"block_confirm_title": "Gebruiker blokkeren",
|
||||
"block_progress": "Blokkeren…",
|
||||
"blocked": "Geblokkeerd!",
|
||||
"blocks_you": "Blokkeert jou!",
|
||||
"bot": "Bot",
|
||||
"deactivated": "Gedeactiveerd",
|
||||
"deny": "Weigeren",
|
||||
|
@ -1072,7 +1134,10 @@
|
|||
"follow_cancel": "Verzoek annuleren",
|
||||
"follow_progress": "Aanvragen…",
|
||||
"follow_sent": "Verzoek verzonden!",
|
||||
"follow_tag": "Hashtag volgen",
|
||||
"follow_unfollow": "Ontvolgen",
|
||||
"followed_tags": "Gevolgde hashtags",
|
||||
"followed_users": "Gevolgde gebruikers",
|
||||
"followees": "Volgen",
|
||||
"followers": "Volgers",
|
||||
"following": "Gevolgd!",
|
||||
|
@ -1097,11 +1162,14 @@
|
|||
"mute_domain": "Domein blokkeren",
|
||||
"mute_progress": "Negeren…",
|
||||
"muted": "Genegeerd",
|
||||
"not_following_any_hashtags": "Je volgt momenteel geen hashtags",
|
||||
"note": "Privé notitie",
|
||||
"per_day": "per dag",
|
||||
"remote_follow": "Van afstand volgen",
|
||||
"remove_follower": "Volger verwijderen",
|
||||
"replies": "Met Antwoorden",
|
||||
"report": "Rapporteren",
|
||||
"requested_by": "Heeft verzocht je te volgen",
|
||||
"show_repeats": "Herhalingen tonen",
|
||||
"statuses": "Berichten",
|
||||
"subscribe": "Abonneren",
|
||||
|
@ -1111,11 +1179,13 @@
|
|||
"unfollow_confirm_accept_button": "Ja, ontvolgen",
|
||||
"unfollow_confirm_cancel_button": "Nee, niet ontvolgen",
|
||||
"unfollow_confirm_title": "Gebruiker ontvolgen",
|
||||
"unfollow_tag": "Hashtag ontvolgen",
|
||||
"unmute": "Negeren opheffen",
|
||||
"unmute_progress": "Negeren opheffen…",
|
||||
"unsubscribe": "Abonnement opzeggen"
|
||||
},
|
||||
"user_profile": {
|
||||
"field_validated": "Link geverifieerd",
|
||||
"profile_does_not_exist": "Sorry, dit profiel bestaat niet.",
|
||||
"profile_loading_error": "Sorry, er is een fout opgetreden bij het laden van dit profiel.",
|
||||
"timeline_title": "Gebruikerstijdlijn"
|
||||
|
|
|
@ -16,12 +16,15 @@
|
|||
"accept_desc": "Este domínio aceita apenas mensagens dos seguintes domínios:",
|
||||
"ftl_removal": "Remoção da cronologia da \"Rede conhecida por todos\"",
|
||||
"ftl_removal_desc": "Este domínio remove os seguintes domínios da cronologia \"Rede conhecida por todos\":",
|
||||
"instance": "Domínio",
|
||||
"media_nsfw": "Forçar definição de multimédia como Sensível",
|
||||
"media_nsfw_desc": "Este domínio força a multimédia a ser marcada como sensível nos seguintes domínios:",
|
||||
"media_removal": "Remoção de multimédia",
|
||||
"media_removal_desc": "Este domínio remove multimédia das publicações dos seguintes domínios:",
|
||||
"not_applicable": "N/A",
|
||||
"quarantine": "Quarentena",
|
||||
"quarantine_desc": "Este domínio apenas irá publicar nos seguintes domínios:",
|
||||
"reason": "Razão",
|
||||
"reject": "Rejeitar",
|
||||
"reject_desc": "Este domínio não aceitará mensagens dos seguintes domínios:",
|
||||
"simple_policies": "Políticas especificas do domínio"
|
||||
|
@ -29,6 +32,26 @@
|
|||
},
|
||||
"staff": "Staff"
|
||||
},
|
||||
"announcements": {
|
||||
"all_day_prompt": "Este evento dura o dia inteiro",
|
||||
"cancel_edit_action": "Cancelar",
|
||||
"close_error": "Fechar",
|
||||
"delete_action": "Apagar",
|
||||
"edit_action": "Editar",
|
||||
"end_time_display": "Termina às {time}",
|
||||
"inactive_message": "Este anúncio está inativo",
|
||||
"mark_as_read_action": "Marcar como lido",
|
||||
"page_header": "Anúncios",
|
||||
"post_action": "Publicar",
|
||||
"post_error": "Erro: {error}",
|
||||
"post_form_header": "Publicar anúncio",
|
||||
"post_placeholder": "Conteúdo do anúncio",
|
||||
"published_time_display": "Publicado às {time}",
|
||||
"start_time_display": "Começa às {time}",
|
||||
"start_time_prompt": "Hora de início: ",
|
||||
"submit_edit_action": "Enviar",
|
||||
"title": "Anúncio"
|
||||
},
|
||||
"chats": {
|
||||
"chats": "Chats",
|
||||
"delete": "Apagar",
|
||||
|
@ -58,6 +81,7 @@
|
|||
"keep_open": "Manter o seletor aberto",
|
||||
"load_all": "A carregar todos os {emojiAmount} emojis",
|
||||
"load_all_hint": "Carregado o primeiro emoji {saneAmount}, carregar todos os emojis pode causar problemas de desempenho.",
|
||||
"recent": "Usado recentemente",
|
||||
"search_emoji": "Pesquisar por um emoji",
|
||||
"stickers": "Autocolantes",
|
||||
"unicode": "Emoji Unicode"
|
||||
|
|
645
src/i18n/uk.json
645
src/i18n/uk.json
File diff suppressed because it is too large
Load diff
756
src/i18n/zh.json
756
src/i18n/zh.json
File diff suppressed because it is too large
Load diff
|
@ -19,7 +19,8 @@ const saveImmedeatelyActions = [
|
|||
'setOption',
|
||||
'setClientData',
|
||||
'setToken',
|
||||
'clearToken'
|
||||
'clearToken',
|
||||
'emojiUsed',
|
||||
]
|
||||
|
||||
const defaultStorage = (() => {
|
||||
|
|
23
src/lib/timeline_visibility.js
Normal file
23
src/lib/timeline_visibility.js
Normal file
|
@ -0,0 +1,23 @@
|
|||
const timelineVisibleUnauthenticated = (state, timeline) => (
|
||||
state.instance.publicTimelineVisibility[timeline] ?? false
|
||||
);
|
||||
|
||||
const currentUser = (state) => state.users.currentUser;
|
||||
|
||||
const currentUserOrTimelineVisibleUnauthenticated = (state, timeline) => (
|
||||
currentUser(state) || timelineVisibleUnauthenticated(state, timeline)
|
||||
);
|
||||
|
||||
const federatedTimelineAvailable = (state) => state.instance.federatedTimelineAvailable;
|
||||
|
||||
export const federatedTimelineVisible = (state) => (
|
||||
federatedTimelineAvailable(state) && currentUserOrTimelineVisibleUnauthenticated(state, 'federated')
|
||||
);
|
||||
|
||||
export const publicTimelineVisible = (state) => (
|
||||
currentUserOrTimelineVisibleUnauthenticated(state, 'local')
|
||||
);
|
||||
|
||||
export const bubbleTimelineVisible = (state) => (
|
||||
state.instance.localBubbleInstances.length > 0 && currentUserOrTimelineVisibleUnauthenticated(state, 'bubble')
|
||||
);
|
|
@ -22,6 +22,7 @@ import announcementsModule from './modules/announcements.js'
|
|||
import editStatusModule from './modules/editStatus.js'
|
||||
import statusHistoryModule from './modules/statusHistory.js'
|
||||
import tagModule from './modules/tags.js'
|
||||
import recentEmojisModule from './modules/recentEmojis.js'
|
||||
|
||||
import { createI18n } from 'vue-i18n'
|
||||
|
||||
|
@ -47,7 +48,8 @@ const persistedStateOptions = {
|
|||
paths: [
|
||||
'config',
|
||||
'users.lastLoginName',
|
||||
'oauth'
|
||||
'oauth',
|
||||
'recentEmojis.emojis',
|
||||
]
|
||||
};
|
||||
|
||||
|
@ -98,7 +100,8 @@ const persistedStateOptions = {
|
|||
announcements: announcementsModule,
|
||||
editStatus: editStatusModule,
|
||||
statusHistory: statusHistoryModule,
|
||||
tags: tagModule
|
||||
tags: tagModule,
|
||||
recentEmojis: recentEmojisModule,
|
||||
},
|
||||
plugins,
|
||||
strict: false // Socket modifies itself, let's ignore this for now.
|
||||
|
|
|
@ -1,18 +1,29 @@
|
|||
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
|
||||
import { WSConnectionStatus } from '../services/api/api.service.js'
|
||||
import { map } from 'lodash'
|
||||
|
||||
const retryTimeout = (multiplier) => 1000 * multiplier
|
||||
|
||||
const isVisible = (store, message, visibility) => {
|
||||
if (visibility === 'all') {
|
||||
if (visibility == 'all') {
|
||||
return true
|
||||
} else if (visibility === 'following') {
|
||||
return store.getters.relationship(message.in_reply_to_user_id).following
|
||||
} else if (visibility === 'self') {
|
||||
}
|
||||
|
||||
if (visibility == 'following') {
|
||||
if (message.in_reply_to_user_id === null) {
|
||||
return true
|
||||
} else {
|
||||
return store.getters.relationship(message.in_reply_to_user_id).following
|
||||
}
|
||||
}
|
||||
|
||||
if (visibility == 'self') {
|
||||
return message.in_reply_to_user_id === store.rootState.users.currentUser.id
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
const api = {
|
||||
state: {
|
||||
retryMultiplier: 1,
|
||||
|
@ -40,9 +51,6 @@ const api = {
|
|||
setSocket (state, socket) {
|
||||
state.socket = socket
|
||||
},
|
||||
setFollowRequests (state, value) {
|
||||
state.followRequests = value
|
||||
},
|
||||
setMastoUserSocketStatus (state, value) {
|
||||
state.mastoUserSocketStatus = value
|
||||
},
|
||||
|
@ -51,6 +59,15 @@ const api = {
|
|||
},
|
||||
resetRetryMultiplier (state) {
|
||||
state.retryMultiplier = 1
|
||||
},
|
||||
setFollowRequests (state, value) {
|
||||
state.followRequests = [...value]
|
||||
},
|
||||
saveFollowRequests (state, requests) {
|
||||
state.followRequests = [...state.followRequests, ...requests]
|
||||
},
|
||||
saveFollowRequestPagination (state, pagination) {
|
||||
state.followRequestsPagination = pagination
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
|
@ -240,24 +257,22 @@ const api = {
|
|||
...rest
|
||||
})
|
||||
},
|
||||
|
||||
// Follow requests
|
||||
startFetchingFollowRequests (store) {
|
||||
if (store.state.fetchers['followRequests']) return
|
||||
const fetcher = store.state.backendInteractor.startFetchingFollowRequests({ store })
|
||||
|
||||
store.commit('addFetcher', { fetcherName: 'followRequests', fetcher })
|
||||
},
|
||||
stopFetchingFollowRequests (store) {
|
||||
const fetcher = store.state.fetchers.followRequests
|
||||
if (!fetcher) return
|
||||
store.commit('removeFetcher', { fetcherName: 'followRequests', fetcher })
|
||||
},
|
||||
removeFollowRequest (store, request) {
|
||||
let requests = store.state.followRequests.filter((it) => it !== request)
|
||||
let requests = [...store.state.followRequests].filter((it) => it.id !== request.id)
|
||||
store.commit('setFollowRequests', requests)
|
||||
},
|
||||
|
||||
fetchFollowRequests ({ rootState, commit }) {
|
||||
const pagination = rootState.api.followRequestsPagination
|
||||
return rootState.api.backendInteractor.getFollowRequests({ pagination })
|
||||
.then((requests) => {
|
||||
if (requests.data.length > 0) {
|
||||
commit('addNewUsers', requests.data)
|
||||
commit('saveFollowRequests', requests.data)
|
||||
commit('saveFollowRequestPagination', requests.pagination)
|
||||
}
|
||||
return requests
|
||||
})
|
||||
},
|
||||
// Lists
|
||||
startFetchingLists (store) {
|
||||
if (store.state.fetchers['lists']) return
|
||||
|
|
50
src/modules/recentEmojis.js
Normal file
50
src/modules/recentEmojis.js
Normal file
|
@ -0,0 +1,50 @@
|
|||
// each row is 7 emojis, 6 rows chosen arbitrarily. i don't think more than
|
||||
// that are going to be useful.
|
||||
const RECENT_MAX = 7 * 6
|
||||
|
||||
const defaultState = {
|
||||
emojis: [],
|
||||
}
|
||||
|
||||
const recentEmojis = {
|
||||
state: defaultState,
|
||||
|
||||
mutations: {
|
||||
emojiUsed ({ emojis }, emoji) {
|
||||
if (emoji.displayText === undefined || emoji.displayText === null) {
|
||||
console.error('emojiUsed was called with a bad emoji object: ', emoji)
|
||||
return
|
||||
} else if (emoji.displayText.includes('@')) {
|
||||
console.error('emojiUsed was called with a remote emoji: ', emoji)
|
||||
return
|
||||
}
|
||||
|
||||
const i = emojis.indexOf(emoji.displayText)
|
||||
|
||||
if (i === -1) {
|
||||
// not in `emojis` yet, insert and truncate if necessary
|
||||
const newLength = emojis.unshift(emoji.displayText)
|
||||
if (newLength > RECENT_MAX) {
|
||||
emojis.pop()
|
||||
}
|
||||
} else if (i !== 0) {
|
||||
// emoji is already in `emojis` but needs to be bumped to the top
|
||||
emojis.splice(i, 1)
|
||||
emojis.unshift(emoji.displayText)
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
getters: {
|
||||
recentEmojis: (state, getters, rootState) => state.emojis.reduce((objects, displayText) => {
|
||||
const allEmojis = rootState.instance.emoji.concat(rootState.instance.customEmoji)
|
||||
let emojiObject = allEmojis.find(emoji => emoji.displayText === displayText)
|
||||
if (emojiObject !== undefined) {
|
||||
objects.push(emojiObject)
|
||||
}
|
||||
return objects
|
||||
}, []),
|
||||
},
|
||||
}
|
||||
|
||||
export default recentEmojis
|
|
@ -265,6 +265,12 @@ export const mutations = {
|
|||
signUpFailure (state, errors) {
|
||||
state.signUpPending = false
|
||||
state.signUpErrors = errors
|
||||
},
|
||||
decrementFollowRequestsCount (store) {
|
||||
store.currentUser.follow_requests_count--
|
||||
},
|
||||
incrementFollowRequestsCount (store) {
|
||||
store.currentUser.follow_requests_count++
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -504,6 +510,12 @@ const users = {
|
|||
store.commit('setUserForNotification', notification)
|
||||
})
|
||||
},
|
||||
decrementFollowRequestsCount (store) {
|
||||
store.commit('decrementFollowRequestsCount')
|
||||
},
|
||||
incrementFollowRequestsCount (store) {
|
||||
store.commit('incrementFollowRequestsCount')
|
||||
},
|
||||
searchUsers ({ rootState, commit }, { query }) {
|
||||
return rootState.api.backendInteractor.searchUsers({ query })
|
||||
.then((users) => {
|
||||
|
@ -567,7 +579,6 @@ const users = {
|
|||
store.dispatch('stopFetchingTimeline', 'friends')
|
||||
store.commit('setBackendInteractor', backendInteractorService(store.getters.getToken()))
|
||||
store.dispatch('stopFetchingNotifications')
|
||||
store.dispatch('stopFetchingFollowRequests')
|
||||
store.dispatch('stopFetchingConfig')
|
||||
store.commit('clearNotifications')
|
||||
store.commit('resetStatuses')
|
||||
|
@ -626,13 +637,16 @@ const users = {
|
|||
|
||||
// Get user mutes
|
||||
store.dispatch('fetchMutes')
|
||||
|
||||
store.dispatch('setLayoutWidth', windowWidth())
|
||||
store.dispatch('setLayoutHeight', windowHeight())
|
||||
store.dispatch('getSupportedTranslationlanguages')
|
||||
store.dispatch('getSettingsProfile')
|
||||
store.dispatch('listSettingsProfiles')
|
||||
store.dispatch('startFetchingConfig')
|
||||
store.dispatch('startFetchingAnnouncements')
|
||||
if (user.role === 'admin' || user.role === 'moderator') {
|
||||
store.dispatch('startFetchingReports')
|
||||
}
|
||||
|
||||
// Fetch our friends
|
||||
store.rootState.api.backendInteractor.fetchFriends({ id: user.id })
|
||||
|
|
|
@ -406,14 +406,6 @@ const fetchFollowers = ({ id, maxId, sinceId, limit = 20, credentials }) => {
|
|||
.then((data) => data.json())
|
||||
.then((data) => data.map(parseUser))
|
||||
}
|
||||
|
||||
const fetchFollowRequests = ({ credentials }) => {
|
||||
const url = MASTODON_FOLLOW_REQUESTS_URL
|
||||
return fetch(url, { headers: authHeaders(credentials) })
|
||||
.then((data) => data.json())
|
||||
.then((data) => data.map(parseUser))
|
||||
}
|
||||
|
||||
const fetchLists = ({ credentials }) => {
|
||||
const url = MASTODON_LISTS_URL
|
||||
return fetch(url, { headers: authHeaders(credentials) })
|
||||
|
@ -1601,6 +1593,26 @@ const getFollowedHashtags = ({ credentials, pagination: savedPagination }) => {
|
|||
});
|
||||
}
|
||||
|
||||
const getFollowRequests = ({ credentials, pagination: savedPagination }) => {
|
||||
const queryParams = new URLSearchParams()
|
||||
if (savedPagination?.maxId) {
|
||||
queryParams.append('max_id', savedPagination.maxId)
|
||||
}
|
||||
const url = `${MASTODON_FOLLOW_REQUESTS_URL}?${queryParams.toString()}`
|
||||
let pagination = {};
|
||||
return fetch(url, {
|
||||
credentials
|
||||
}).then((data) => {
|
||||
pagination = parseLinkHeaderPagination(data.headers.get('Link'), { flakeId: true });
|
||||
return data.json()
|
||||
}).then((data) => {
|
||||
return {
|
||||
pagination,
|
||||
data: data.map(parseUser)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => {
|
||||
return Object.entries({
|
||||
...(credentials
|
||||
|
@ -1790,7 +1802,6 @@ const apiService = {
|
|||
mfaConfirmOTP,
|
||||
addBackup,
|
||||
listBackups,
|
||||
fetchFollowRequests,
|
||||
fetchLists,
|
||||
createList,
|
||||
getList,
|
||||
|
@ -1841,6 +1852,7 @@ const apiService = {
|
|||
followHashtag,
|
||||
unfollowHashtag,
|
||||
getFollowedHashtags,
|
||||
getFollowRequests
|
||||
}
|
||||
|
||||
export default apiService
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import apiService, { getMastodonSocketURI, ProcessedWS } from '../api/api.service.js'
|
||||
import timelineFetcher from '../timeline_fetcher/timeline_fetcher.service.js'
|
||||
import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js'
|
||||
import followRequestFetcher from '../../services/follow_request_fetcher/follow_request_fetcher.service'
|
||||
import listsFetcher from '../../services/lists_fetcher/lists_fetcher.service.js'
|
||||
import announcementsFetcher from '../../services/announcements_fetcher/announcements_fetcher.service.js'
|
||||
import configFetcher from '../config_fetcher/config_fetcher.service.js'
|
||||
|
@ -28,10 +27,6 @@ const backendInteractorService = credentials => ({
|
|||
return notificationsFetcher.fetchAndUpdate({ ...args, credentials })
|
||||
},
|
||||
|
||||
startFetchingFollowRequests ({ store }) {
|
||||
return followRequestFetcher.startFetching({ store, credentials })
|
||||
},
|
||||
|
||||
startFetchingLists ({ store }) {
|
||||
return listsFetcher.startFetching({ store, credentials })
|
||||
},
|
||||
|
|
|
@ -90,6 +90,7 @@ export const parseUser = (data) => {
|
|||
output.friends_count = data.following_count
|
||||
|
||||
output.bot = data.bot
|
||||
output.follow_requests_count = data.follow_requests_count
|
||||
if (data.akkoma) {
|
||||
output.instance = data.akkoma.instance
|
||||
output.status_ttl_days = data.akkoma.status_ttl_days
|
||||
|
|
|
@ -1,23 +0,0 @@
|
|||
import apiService from '../api/api.service.js'
|
||||
import { promiseInterval } from '../promise_interval/promise_interval.js'
|
||||
|
||||
const fetchAndUpdate = ({ store, credentials }) => {
|
||||
return apiService.fetchFollowRequests({ credentials })
|
||||
.then((requests) => {
|
||||
store.commit('setFollowRequests', requests)
|
||||
store.commit('addNewUsers', requests)
|
||||
}, () => {})
|
||||
.catch(() => {})
|
||||
}
|
||||
|
||||
const startFetching = ({ credentials, store }) => {
|
||||
const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store })
|
||||
boundFetchAndUpdate()
|
||||
return promiseInterval(boundFetchAndUpdate, 240000)
|
||||
}
|
||||
|
||||
const followRequestFetcher = {
|
||||
startFetching
|
||||
}
|
||||
|
||||
export default followRequestFetcher
|
Loading…
Reference in a new issue