From 50bb8865c57d098a66aafedf9c64878d8e39dba0 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Wed, 18 Dec 2019 21:17:06 +0300 Subject: [PATCH 01/93] dd --- local.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 local.json diff --git a/local.json b/local.json new file mode 100644 index 00000000..e9f4df0b --- /dev/null +++ b/local.json @@ -0,0 +1,4 @@ +{ + "target": "https://aqueous-sea-10253.herokuapp.com/", + "staticConfigPreference": false +} From 2d914c331eea5f5b9036e10ef3d937628891b9e1 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 2 Sep 2020 20:40:47 +0300 Subject: [PATCH 02/93] replace setInterval for timelne, notifications and follow requests --- src/modules/api.js | 2 +- src/services/fetcher/fetcher.js | 23 +++++++++++++++++++ .../follow_request_fetcher.service.js | 4 ++-- .../notifications_fetcher.service.js | 7 +++--- .../timeline_fetcher.service.js | 7 +++--- 5 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 src/services/fetcher/fetcher.js diff --git a/src/modules/api.js b/src/modules/api.js index 5e213f0d..7ddd8dde 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -20,7 +20,7 @@ const api = { state.fetchers[fetcherName] = fetcher }, removeFetcher (state, { fetcherName, fetcher }) { - window.clearInterval(fetcher) + state.fetchers[fetcherName]() delete state.fetchers[fetcherName] }, setWsToken (state, token) { diff --git a/src/services/fetcher/fetcher.js b/src/services/fetcher/fetcher.js new file mode 100644 index 00000000..1d9239cc --- /dev/null +++ b/src/services/fetcher/fetcher.js @@ -0,0 +1,23 @@ + +export const makeFetcher = (call, interval) => { + let stopped = false + let timeout = null + let func = () => {} + + func = () => { + call().finally(() => { + console.log('callbacks') + if (stopped) return + timeout = window.setTimeout(func, interval) + }) + } + + const stopFetcher = () => { + stopped = true + window.cancelTimeout(timeout) + } + + func() + + return stopFetcher +} diff --git a/src/services/follow_request_fetcher/follow_request_fetcher.service.js b/src/services/follow_request_fetcher/follow_request_fetcher.service.js index 93fac9bc..8d1aba7b 100644 --- a/src/services/follow_request_fetcher/follow_request_fetcher.service.js +++ b/src/services/follow_request_fetcher/follow_request_fetcher.service.js @@ -1,4 +1,5 @@ import apiService from '../api/api.service.js' +import { makeFetcher } from '../fetcher/fetcher.js' const fetchAndUpdate = ({ store, credentials }) => { return apiService.fetchFollowRequests({ credentials }) @@ -10,9 +11,8 @@ const fetchAndUpdate = ({ store, credentials }) => { } const startFetching = ({ credentials, store }) => { - fetchAndUpdate({ credentials, store }) const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) - return setInterval(boundFetchAndUpdate, 10000) + return makeFetcher(boundFetchAndUpdate, 10000) } const followRequestFetcher = { diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js index 80be02ca..2a3a17be 100644 --- a/src/services/notifications_fetcher/notifications_fetcher.service.js +++ b/src/services/notifications_fetcher/notifications_fetcher.service.js @@ -1,4 +1,5 @@ import apiService from '../api/api.service.js' +import makeFetcher from '../fetcher/fetcher.js' const update = ({ store, notifications, older }) => { store.dispatch('setNotificationsError', { value: false }) @@ -39,6 +40,7 @@ const fetchAndUpdate = ({ store, credentials, older = false }) => { args['since'] = Math.max(...readNotifsIds) fetchNotifications({ store, args, older }) } + return result } } @@ -53,13 +55,12 @@ const fetchNotifications = ({ store, args, older }) => { } const startFetching = ({ credentials, store }) => { - fetchAndUpdate({ credentials, store }) - const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) // Initially there's set flag to silence all desktop notifications so // that there won't spam of them when user just opened up the FE we // reset that flag after a while to show new notifications once again. setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000) - return setInterval(boundFetchAndUpdate, 10000) + const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store, refetch: true }) + return makeFetcher(boundFetchAndUpdate, 10000) } const notificationsFetcher = { diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js index d0cddf84..8bbec2c7 100644 --- a/src/services/timeline_fetcher/timeline_fetcher.service.js +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -1,6 +1,7 @@ import { camelCase } from 'lodash' import apiService from '../api/api.service.js' +import { makeFetcher } from '../fetcher/fetcher.js' const update = ({ store, statuses, timeline, showImmediately, userId, pagination }) => { const ccTimeline = camelCase(timeline) @@ -70,9 +71,9 @@ const startFetching = ({ timeline = 'friends', credentials, store, userId = fals const timelineData = rootState.statuses.timelines[camelCase(timeline)] const showImmediately = timelineData.visibleStatuses.length === 0 timelineData.userId = userId - fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag }) - const boundFetchAndUpdate = () => fetchAndUpdate({ timeline, credentials, store, userId, tag }) - return setInterval(boundFetchAndUpdate, 10000) + const boundFetchAndUpdate = () => + fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag }) + return makeFetcher(boundFetchAndUpdate, 10000) } const timelineFetcher = { fetchAndUpdate, From 1b6eee049700f6fbb0c2e43877ead3ef4cf3041b Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 2 Sep 2020 21:01:31 +0300 Subject: [PATCH 03/93] change chats to use custom makeFetcher --- src/components/chat/chat.js | 5 +++-- src/modules/chats.js | 11 +++++------ src/services/fetcher/fetcher.js | 3 +-- .../notifications_fetcher.service.js | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/components/chat/chat.js b/src/components/chat/chat.js index 9c4e5b05..2062643d 100644 --- a/src/components/chat/chat.js +++ b/src/components/chat/chat.js @@ -5,6 +5,7 @@ import ChatMessage from '../chat_message/chat_message.vue' import PostStatusForm from '../post_status_form/post_status_form.vue' import ChatTitle from '../chat_title/chat_title.vue' import chatService from '../../services/chat_service/chat_service.js' +import { makeFetcher } from '../../services/fetcher/fetcher.js' import { getScrollPosition, getNewTopPosition, isBottomedOut, scrollableContainerHeight } from './chat_layout_utils.js' const BOTTOMED_OUT_OFFSET = 10 @@ -246,7 +247,7 @@ const Chat = { const fetchOlderMessages = !!maxId const sinceId = fetchLatest && chatMessageService.lastMessage && chatMessageService.lastMessage.id - this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId }) + return this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId }) .then((messages) => { // Clear the current chat in case we're recovering from a ws connection loss. if (isFirstFetch) { @@ -287,7 +288,7 @@ const Chat = { }, doStartFetching () { this.$store.dispatch('startFetchingCurrentChat', { - fetcher: () => setInterval(() => this.fetchChat({ fetchLatest: true }), 5000) + fetcher: () => makeFetcher(() => this.fetchChat({ fetchLatest: true }), 5000) }) this.fetchChat({ isFirstFetch: true }) }, diff --git a/src/modules/chats.js b/src/modules/chats.js index c7609018..45e4bdcc 100644 --- a/src/modules/chats.js +++ b/src/modules/chats.js @@ -3,6 +3,7 @@ import { find, omitBy, orderBy, sumBy } from 'lodash' import chatService from '../services/chat_service/chat_service.js' import { parseChat, parseChatMessage } from '../services/entity_normalizer/entity_normalizer.service.js' import { maybeShowChatNotification } from '../services/chat_utils/chat_utils.js' +import { makeFetcher } from '../services/fetcher/fetcher.js' const emptyChatList = () => ({ data: [], @@ -42,12 +43,10 @@ const chats = { actions: { // Chat list startFetchingChats ({ dispatch, commit }) { - const fetcher = () => { - dispatch('fetchChats', { latest: true }) - } + const fetcher = () => dispatch('fetchChats', { latest: true }) fetcher() commit('setChatListFetcher', { - fetcher: () => setInterval(() => { fetcher() }, 5000) + fetcher: () => makeFetcher(fetcher, 5000) }) }, stopFetchingChats ({ commit }) { @@ -113,14 +112,14 @@ const chats = { setChatListFetcher (state, { commit, fetcher }) { const prevFetcher = state.chatListFetcher if (prevFetcher) { - clearInterval(prevFetcher) + prevFetcher() } state.chatListFetcher = fetcher && fetcher() }, setCurrentChatFetcher (state, { fetcher }) { const prevFetcher = state.fetcher if (prevFetcher) { - clearInterval(prevFetcher) + prevFetcher() } state.fetcher = fetcher && fetcher() }, diff --git a/src/services/fetcher/fetcher.js b/src/services/fetcher/fetcher.js index 1d9239cc..95b8c9d3 100644 --- a/src/services/fetcher/fetcher.js +++ b/src/services/fetcher/fetcher.js @@ -6,7 +6,6 @@ export const makeFetcher = (call, interval) => { func = () => { call().finally(() => { - console.log('callbacks') if (stopped) return timeout = window.setTimeout(func, interval) }) @@ -14,7 +13,7 @@ export const makeFetcher = (call, interval) => { const stopFetcher = () => { stopped = true - window.cancelTimeout(timeout) + window.clearTimeout(timeout) } func() diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js index 2a3a17be..c69d5b17 100644 --- a/src/services/notifications_fetcher/notifications_fetcher.service.js +++ b/src/services/notifications_fetcher/notifications_fetcher.service.js @@ -1,5 +1,5 @@ import apiService from '../api/api.service.js' -import makeFetcher from '../fetcher/fetcher.js' +import { makeFetcher } from '../fetcher/fetcher.js' const update = ({ store, notifications, older }) => { store.dispatch('setNotificationsError', { value: false }) From d939f2ffbcb632361a0362f0f2049f99160dee64 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 2 Sep 2020 21:08:06 +0300 Subject: [PATCH 04/93] document makeFetcher a bit --- src/services/fetcher/fetcher.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/services/fetcher/fetcher.js b/src/services/fetcher/fetcher.js index 95b8c9d3..5a6ed4b8 100644 --- a/src/services/fetcher/fetcher.js +++ b/src/services/fetcher/fetcher.js @@ -1,11 +1,17 @@ -export const makeFetcher = (call, interval) => { +// makeFetcher - replacement for setInterval for fetching, starts counting +// the interval only after a request is done instead of immediately. +// promiseCall is a function that returns a promise, it's called when created +// and after every interval. +// interval is the interval delay in ms. + +export const makeFetcher = (promiseCall, interval) => { let stopped = false let timeout = null let func = () => {} func = () => { - call().finally(() => { + promiseCall().finally(() => { if (stopped) return timeout = window.setTimeout(func, interval) }) From 4d080a1654ff56e9875c49486457a1ac8e19297e Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 2 Sep 2020 21:26:02 +0300 Subject: [PATCH 05/93] add mention to changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 675c4b5b..e5521b83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed - Polls will be hidden with status content if "Collapse posts with subjects" is enabled and the post is collapsed. +### Fixed +- Network fetches don't pile up anymore but wait for previous ones to finish to reduce throttling. + ## [2.1.0] - 2020-08-28 ### Added - Autocomplete domains from list of known instances From 5b403ba7d13eaf851ae43e814c583ceb018e2d20 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 2 Sep 2020 22:12:50 +0300 Subject: [PATCH 06/93] fix timeline showimmediately being set wrongly --- src/services/fetcher/fetcher.js | 8 ++++---- .../follow_request_fetcher.service.js | 1 + .../notifications_fetcher.service.js | 3 ++- src/services/timeline_fetcher/timeline_fetcher.service.js | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/services/fetcher/fetcher.js b/src/services/fetcher/fetcher.js index 5a6ed4b8..aae1c2cc 100644 --- a/src/services/fetcher/fetcher.js +++ b/src/services/fetcher/fetcher.js @@ -1,9 +1,9 @@ // makeFetcher - replacement for setInterval for fetching, starts counting // the interval only after a request is done instead of immediately. -// promiseCall is a function that returns a promise, it's called when created -// and after every interval. -// interval is the interval delay in ms. +// - promiseCall is a function that returns a promise, it's called the first +// time after the first interval. +// - interval is the interval delay in ms. export const makeFetcher = (promiseCall, interval) => { let stopped = false @@ -22,7 +22,7 @@ export const makeFetcher = (promiseCall, interval) => { window.clearTimeout(timeout) } - func() + timeout = window.setTimeout(func, interval) return stopFetcher } diff --git a/src/services/follow_request_fetcher/follow_request_fetcher.service.js b/src/services/follow_request_fetcher/follow_request_fetcher.service.js index 8d1aba7b..bec434aa 100644 --- a/src/services/follow_request_fetcher/follow_request_fetcher.service.js +++ b/src/services/follow_request_fetcher/follow_request_fetcher.service.js @@ -12,6 +12,7 @@ const fetchAndUpdate = ({ store, credentials }) => { const startFetching = ({ credentials, store }) => { const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) + boundFetchAndUpdate() return makeFetcher(boundFetchAndUpdate, 10000) } diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js index c69d5b17..90988fc4 100644 --- a/src/services/notifications_fetcher/notifications_fetcher.service.js +++ b/src/services/notifications_fetcher/notifications_fetcher.service.js @@ -59,7 +59,8 @@ const startFetching = ({ credentials, store }) => { // that there won't spam of them when user just opened up the FE we // reset that flag after a while to show new notifications once again. setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000) - const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store, refetch: true }) + const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) + boundFetchAndUpdate() return makeFetcher(boundFetchAndUpdate, 10000) } diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js index 8bbec2c7..9f585f68 100644 --- a/src/services/timeline_fetcher/timeline_fetcher.service.js +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -71,8 +71,9 @@ const startFetching = ({ timeline = 'friends', credentials, store, userId = fals const timelineData = rootState.statuses.timelines[camelCase(timeline)] const showImmediately = timelineData.visibleStatuses.length === 0 timelineData.userId = userId + fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag }) const boundFetchAndUpdate = () => - fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag }) + fetchAndUpdate({ timeline, credentials, store, userId, tag }) return makeFetcher(boundFetchAndUpdate, 10000) } const timelineFetcher = { From 3fb35e8123d3a8cd151571b315b7ec4d7e0875c7 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Fri, 4 Sep 2020 11:19:53 +0300 Subject: [PATCH 07/93] rename to promiseInterval --- src/components/chat/chat.js | 4 ++-- src/modules/api.js | 2 +- src/modules/chats.js | 4 ++-- .../follow_request_fetcher.service.js | 4 ++-- .../notifications_fetcher.service.js | 4 ++-- .../fetcher.js => promise_interval/promise_interval.js} | 8 ++++---- src/services/timeline_fetcher/timeline_fetcher.service.js | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) rename src/services/{fetcher/fetcher.js => promise_interval/promise_interval.js} (68%) diff --git a/src/components/chat/chat.js b/src/components/chat/chat.js index 2062643d..15123885 100644 --- a/src/components/chat/chat.js +++ b/src/components/chat/chat.js @@ -5,7 +5,7 @@ import ChatMessage from '../chat_message/chat_message.vue' import PostStatusForm from '../post_status_form/post_status_form.vue' import ChatTitle from '../chat_title/chat_title.vue' import chatService from '../../services/chat_service/chat_service.js' -import { makeFetcher } from '../../services/fetcher/fetcher.js' +import { promiseInterval } from '../../services/promise_interval/promise_interval.js' import { getScrollPosition, getNewTopPosition, isBottomedOut, scrollableContainerHeight } from './chat_layout_utils.js' const BOTTOMED_OUT_OFFSET = 10 @@ -288,7 +288,7 @@ const Chat = { }, doStartFetching () { this.$store.dispatch('startFetchingCurrentChat', { - fetcher: () => makeFetcher(() => this.fetchChat({ fetchLatest: true }), 5000) + fetcher: () => promiseInterval(() => this.fetchChat({ fetchLatest: true }), 5000) }) this.fetchChat({ isFirstFetch: true }) }, diff --git a/src/modules/api.js b/src/modules/api.js index 7ddd8dde..73511442 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -20,7 +20,7 @@ const api = { state.fetchers[fetcherName] = fetcher }, removeFetcher (state, { fetcherName, fetcher }) { - state.fetchers[fetcherName]() + state.fetchers[fetcherName].stop() delete state.fetchers[fetcherName] }, setWsToken (state, token) { diff --git a/src/modules/chats.js b/src/modules/chats.js index 45e4bdcc..60273a44 100644 --- a/src/modules/chats.js +++ b/src/modules/chats.js @@ -3,7 +3,7 @@ import { find, omitBy, orderBy, sumBy } from 'lodash' import chatService from '../services/chat_service/chat_service.js' import { parseChat, parseChatMessage } from '../services/entity_normalizer/entity_normalizer.service.js' import { maybeShowChatNotification } from '../services/chat_utils/chat_utils.js' -import { makeFetcher } from '../services/fetcher/fetcher.js' +import { promiseInterval } from '../services/promise_interval/promise_interval.js' const emptyChatList = () => ({ data: [], @@ -46,7 +46,7 @@ const chats = { const fetcher = () => dispatch('fetchChats', { latest: true }) fetcher() commit('setChatListFetcher', { - fetcher: () => makeFetcher(fetcher, 5000) + fetcher: () => promiseInterval(fetcher, 5000) }) }, stopFetchingChats ({ commit }) { diff --git a/src/services/follow_request_fetcher/follow_request_fetcher.service.js b/src/services/follow_request_fetcher/follow_request_fetcher.service.js index bec434aa..74af4081 100644 --- a/src/services/follow_request_fetcher/follow_request_fetcher.service.js +++ b/src/services/follow_request_fetcher/follow_request_fetcher.service.js @@ -1,5 +1,5 @@ import apiService from '../api/api.service.js' -import { makeFetcher } from '../fetcher/fetcher.js' +import { promiseInterval } from '../promise_interval/promise_interval.js' const fetchAndUpdate = ({ store, credentials }) => { return apiService.fetchFollowRequests({ credentials }) @@ -13,7 +13,7 @@ const fetchAndUpdate = ({ store, credentials }) => { const startFetching = ({ credentials, store }) => { const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) boundFetchAndUpdate() - return makeFetcher(boundFetchAndUpdate, 10000) + return promiseInterval(boundFetchAndUpdate, 10000) } const followRequestFetcher = { diff --git a/src/services/notifications_fetcher/notifications_fetcher.service.js b/src/services/notifications_fetcher/notifications_fetcher.service.js index 90988fc4..c908b644 100644 --- a/src/services/notifications_fetcher/notifications_fetcher.service.js +++ b/src/services/notifications_fetcher/notifications_fetcher.service.js @@ -1,5 +1,5 @@ import apiService from '../api/api.service.js' -import { makeFetcher } from '../fetcher/fetcher.js' +import { promiseInterval } from '../promise_interval/promise_interval.js' const update = ({ store, notifications, older }) => { store.dispatch('setNotificationsError', { value: false }) @@ -61,7 +61,7 @@ const startFetching = ({ credentials, store }) => { setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000) const boundFetchAndUpdate = () => fetchAndUpdate({ credentials, store }) boundFetchAndUpdate() - return makeFetcher(boundFetchAndUpdate, 10000) + return promiseInterval(boundFetchAndUpdate, 10000) } const notificationsFetcher = { diff --git a/src/services/fetcher/fetcher.js b/src/services/promise_interval/promise_interval.js similarity index 68% rename from src/services/fetcher/fetcher.js rename to src/services/promise_interval/promise_interval.js index aae1c2cc..ee46a236 100644 --- a/src/services/fetcher/fetcher.js +++ b/src/services/promise_interval/promise_interval.js @@ -1,11 +1,11 @@ -// makeFetcher - replacement for setInterval for fetching, starts counting -// the interval only after a request is done instead of immediately. +// promiseInterval - replacement for setInterval for promises, starts counting +// the interval only after a promise is done instead of immediately. // - promiseCall is a function that returns a promise, it's called the first // time after the first interval. // - interval is the interval delay in ms. -export const makeFetcher = (promiseCall, interval) => { +export const promiseInterval = (promiseCall, interval) => { let stopped = false let timeout = null let func = () => {} @@ -24,5 +24,5 @@ export const makeFetcher = (promiseCall, interval) => { timeout = window.setTimeout(func, interval) - return stopFetcher + return { stop: stopFetcher } } diff --git a/src/services/timeline_fetcher/timeline_fetcher.service.js b/src/services/timeline_fetcher/timeline_fetcher.service.js index 9f585f68..72ea4890 100644 --- a/src/services/timeline_fetcher/timeline_fetcher.service.js +++ b/src/services/timeline_fetcher/timeline_fetcher.service.js @@ -1,7 +1,7 @@ import { camelCase } from 'lodash' import apiService from '../api/api.service.js' -import { makeFetcher } from '../fetcher/fetcher.js' +import { promiseInterval } from '../promise_interval/promise_interval.js' const update = ({ store, statuses, timeline, showImmediately, userId, pagination }) => { const ccTimeline = camelCase(timeline) @@ -74,7 +74,7 @@ const startFetching = ({ timeline = 'friends', credentials, store, userId = fals fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, tag }) const boundFetchAndUpdate = () => fetchAndUpdate({ timeline, credentials, store, userId, tag }) - return makeFetcher(boundFetchAndUpdate, 10000) + return promiseInterval(boundFetchAndUpdate, 10000) } const timelineFetcher = { fetchAndUpdate, From c89ac79140e059f89d4da88ce49c9bb24db4cc20 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Fri, 4 Sep 2020 11:22:14 +0300 Subject: [PATCH 08/93] fix chat fetcher stops, change fetcher code --- src/modules/chats.js | 4 ++-- src/services/promise_interval/promise_interval.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/modules/chats.js b/src/modules/chats.js index 60273a44..8e2fabb6 100644 --- a/src/modules/chats.js +++ b/src/modules/chats.js @@ -112,14 +112,14 @@ const chats = { setChatListFetcher (state, { commit, fetcher }) { const prevFetcher = state.chatListFetcher if (prevFetcher) { - prevFetcher() + prevFetcher.stop() } state.chatListFetcher = fetcher && fetcher() }, setCurrentChatFetcher (state, { fetcher }) { const prevFetcher = state.fetcher if (prevFetcher) { - prevFetcher() + prevFetcher.stop() } state.fetcher = fetcher && fetcher() }, diff --git a/src/services/promise_interval/promise_interval.js b/src/services/promise_interval/promise_interval.js index ee46a236..cf17970d 100644 --- a/src/services/promise_interval/promise_interval.js +++ b/src/services/promise_interval/promise_interval.js @@ -8,9 +8,8 @@ export const promiseInterval = (promiseCall, interval) => { let stopped = false let timeout = null - let func = () => {} - func = () => { + const func = () => { promiseCall().finally(() => { if (stopped) return timeout = window.setTimeout(func, interval) From 40ca0b394ea066dea95c672eb0a42a35c9e65317 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Sun, 6 Sep 2020 15:28:09 +0300 Subject: [PATCH 09/93] add basic deletes support that works with masto WS --- src/components/status/status.js | 2 +- src/components/status/status.scss | 11 +++++++++ src/components/status/status.vue | 26 ++++++++++++++++++++++ src/components/user_avatar/user_avatar.vue | 11 +++++++++ src/i18n/en.json | 3 ++- src/modules/api.js | 2 ++ src/modules/statuses.js | 4 ++++ 7 files changed, 57 insertions(+), 2 deletions(-) diff --git a/src/components/status/status.js b/src/components/status/status.js index d263da68..5a6110c1 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -157,7 +157,7 @@ const Status = { return this.mergedConfig.hideFilteredStatuses }, hideStatus () { - return this.deleted || (this.muted && this.hideFilteredStatuses) + return (this.muted && this.hideFilteredStatuses) }, isFocused () { // retweet or root of an expanded conversation diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 8d292d3f..02ce3ffa 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -25,6 +25,17 @@ $status-margin: 0.75em; --icon: var(--selectedPostIcon, $fallback--icon); } + .deleted { + padding: $status-margin; + color: $fallback--faint; + color: var(--faint, $fallback--faint); + display: flex; + .deleted-text { + margin: 0.5em 0; + align-items: center; + } + } + .status-container { display: flex; padding: $status-margin; diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 282ad37d..d7dfc0ab 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -95,6 +95,7 @@
+
+
+ +
+
+
+ {{ $t('status.status_deleted') }} +
+
+ +
+
+
+
@@ -42,5 +48,10 @@ border-radius: $fallback--avatarAltRadius; border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius); } + + &.-placeholder { + background-color: $fallback--fg; + background-color: var(--fg, $fallback--fg); + } } diff --git a/src/i18n/en.json b/src/i18n/en.json index 8540f551..850dc4cc 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -659,7 +659,8 @@ "show_full_subject": "Show full subject", "hide_full_subject": "Hide full subject", "show_content": "Show content", - "hide_content": "Hide content" + "hide_content": "Hide content", + "status_deleted": "The post was deleted" }, "user_card": { "approve": "Approve", diff --git a/src/modules/api.js b/src/modules/api.js index 5e213f0d..de415981 100644 --- a/src/modules/api.js +++ b/src/modules/api.js @@ -72,6 +72,8 @@ const api = { showImmediately: timelineData.visibleStatuses.length === 0, timeline: 'friends' }) + } else if (message.event === 'delete') { + dispatch('deleteStatusById', message.id) } else if (message.event === 'pleroma:chat_update') { dispatch('addChatMessages', { chatId: message.chatUpdate.id, diff --git a/src/modules/statuses.js b/src/modules/statuses.js index e108b2a7..d38684ba 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -608,6 +608,10 @@ const statuses = { commit('setDeleted', { status }) apiService.deleteStatus({ id: status.id, credentials: rootState.users.currentUser.credentials }) }, + deleteStatusById ({ rootState, commit }, id) { + const status = rootState.statuses.allStatusesObject[id] + commit('setDeleted', { status }) + }, markStatusesAsDeleted ({ commit }, condition) { commit('setManyDeleted', condition) }, From f9ac23b9a94dd35ba623814a59f4df83895acb42 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Mon, 7 Sep 2020 10:35:49 +0300 Subject: [PATCH 10/93] separate reply button to its own component, add changelog entry --- CHANGELOG.md | 3 ++ src/components/reply_button/reply_button.js | 12 +++++++ src/components/reply_button/reply_button.vue | 21 +++++++++++ src/components/status/status.js | 2 ++ src/components/status/status.vue | 37 ++++++-------------- 5 files changed, 48 insertions(+), 27 deletions(-) create mode 100644 src/components/reply_button/reply_button.js create mode 100644 src/components/reply_button/reply_button.vue diff --git a/CHANGELOG.md b/CHANGELOG.md index 18dafa8e..f07856df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ## [Unreleased patch] +### Added +- Proper handling of deletes when using websocket streaming + ### Changed - Polls will be hidden with status content if "Collapse posts with subjects" is enabled and the post is collapsed. diff --git a/src/components/reply_button/reply_button.js b/src/components/reply_button/reply_button.js new file mode 100644 index 00000000..22957650 --- /dev/null +++ b/src/components/reply_button/reply_button.js @@ -0,0 +1,12 @@ + +const ReplyButton = { + name: 'ReplyButton', + props: ['status', 'replying'], + computed: { + loggedIn () { + return !!this.$store.state.users.currentUser + } + } +} + +export default ReplyButton diff --git a/src/components/reply_button/reply_button.vue b/src/components/reply_button/reply_button.vue new file mode 100644 index 00000000..b2904b5c --- /dev/null +++ b/src/components/reply_button/reply_button.vue @@ -0,0 +1,21 @@ + + + diff --git a/src/components/status/status.js b/src/components/status/status.js index 5a6110c1..cb39fd6e 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -1,3 +1,4 @@ +import ReplyButton from '../reply_button/reply_button.vue' import FavoriteButton from '../favorite_button/favorite_button.vue' import ReactButton from '../react_button/react_button.vue' import RetweetButton from '../retweet_button/retweet_button.vue' @@ -20,6 +21,7 @@ import { mapGetters, mapState } from 'vuex' const Status = { name: 'Status', components: { + ReplyButton, FavoriteButton, ReactButton, RetweetButton, diff --git a/src/components/status/status.vue b/src/components/status/status.vue index d7dfc0ab..cb81b14e 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -321,21 +321,11 @@ v-if="!noHeading && !isPreview" class="status-actions" > -
- - - {{ status.replies_count }} -
+ {{ $t('status.status_deleted') }}
-
- -
+
Date: Mon, 7 Sep 2020 10:39:30 +0300 Subject: [PATCH 11/93] change i18n phrasing --- src/i18n/en.json | 2 +- src/i18n/fi.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/i18n/en.json b/src/i18n/en.json index 850dc4cc..adf171e8 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -660,7 +660,7 @@ "hide_full_subject": "Hide full subject", "show_content": "Show content", "hide_content": "Hide content", - "status_deleted": "The post was deleted" + "status_deleted": "This post was deleted" }, "user_card": { "approve": "Approve", diff --git a/src/i18n/fi.json b/src/i18n/fi.json index 3832dcaa..2524f278 100644 --- a/src/i18n/fi.json +++ b/src/i18n/fi.json @@ -578,7 +578,8 @@ "show_full_subject": "Näytä koko otsikko", "hide_full_subject": "Piilota koko otsikko", "show_content": "Näytä sisältö", - "hide_content": "Piilota sisältö" + "hide_content": "Piilota sisältö", + "status_deleted": "Poistettu viesti" }, "user_card": { "approve": "Hyväksy", From 1ec9cde9638b3fb285185072532547b4a4d32158 Mon Sep 17 00:00:00 2001 From: Shpuld Shpludson Date: Tue, 8 Sep 2020 06:31:02 +0000 Subject: [PATCH 12/93] Apply 1 suggestion(s) to 1 file(s) --- src/components/status/status.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 02ce3ffa..2717c0ba 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -30,6 +30,7 @@ $status-margin: 0.75em; color: $fallback--faint; color: var(--faint, $fallback--faint); display: flex; + .deleted-text { margin: 0.5em 0; align-items: center; From fa9176651952468ee996abe0e67d62d9a72d5a69 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Tue, 8 Sep 2020 09:32:43 +0300 Subject: [PATCH 13/93] rename to gravestone --- src/components/status/status.scss | 2 +- src/components/status/status.vue | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 2717c0ba..bd23157f 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -25,7 +25,7 @@ $status-margin: 0.75em; --icon: var(--selectedPostIcon, $fallback--icon); } - .deleted { + .gravestone { padding: $status-margin; color: $fallback--faint; color: var(--faint, $fallback--faint); diff --git a/src/components/status/status.vue b/src/components/status/status.vue index cb81b14e..75142250 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -349,7 +349,7 @@
@@ -359,6 +359,7 @@ {{ $t('status.status_deleted') }}
Date: Mon, 7 Sep 2020 14:27:37 +0300 Subject: [PATCH 14/93] added import/export mutes --- local.json | 4 --- .../tabs/data_import_export_tab.js | 28 ++++++++++++++----- .../tabs/data_import_export_tab.vue | 17 +++++++++++ src/i18n/en.json | 6 ++++ src/services/api/api.service.js | 13 +++++++++ 5 files changed, 57 insertions(+), 11 deletions(-) delete mode 100644 local.json diff --git a/local.json b/local.json deleted file mode 100644 index e9f4df0b..00000000 --- a/local.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "target": "https://aqueous-sea-10253.herokuapp.com/", - "staticConfigPreference": false -} diff --git a/src/components/settings_modal/tabs/data_import_export_tab.js b/src/components/settings_modal/tabs/data_import_export_tab.js index 168f89e1..f4b736d2 100644 --- a/src/components/settings_modal/tabs/data_import_export_tab.js +++ b/src/components/settings_modal/tabs/data_import_export_tab.js @@ -1,6 +1,7 @@ import Importer from 'src/components/importer/importer.vue' import Exporter from 'src/components/exporter/exporter.vue' import Checkbox from 'src/components/checkbox/checkbox.vue' +import { mapState } from 'vuex' const DataImportExportTab = { data () { @@ -18,21 +19,26 @@ const DataImportExportTab = { Checkbox }, computed: { - user () { - return this.$store.state.users.currentUser - } + ...mapState({ + backendInteractor: (state) => state.api.backendInteractor, + user: (state) => state.users.currentUser + }) }, methods: { getFollowsContent () { - return this.$store.state.api.backendInteractor.exportFriends({ id: this.$store.state.users.currentUser.id }) + return this.backendInteractor.exportFriends({ id: this.user.id }) .then(this.generateExportableUsersContent) }, getBlocksContent () { - return this.$store.state.api.backendInteractor.fetchBlocks() + return this.backendInteractor.fetchBlocks() + .then(this.generateExportableUsersContent) + }, + getMutesContent () { + return this.backendInteractor.fetchMutes() .then(this.generateExportableUsersContent) }, importFollows (file) { - return this.$store.state.api.backendInteractor.importFollows({ file }) + return this.backendInteractor.importFollows({ file }) .then((status) => { if (!status) { throw new Error('failed') @@ -40,7 +46,15 @@ const DataImportExportTab = { }) }, importBlocks (file) { - return this.$store.state.api.backendInteractor.importBlocks({ file }) + return this.backendInteractor.importBlocks({ file }) + .then((status) => { + if (!status) { + throw new Error('failed') + } + }) + }, + importMutes (file) { + return this.backendInteractor.importMutes({ file }) .then((status) => { if (!status) { throw new Error('failed') diff --git a/src/components/settings_modal/tabs/data_import_export_tab.vue b/src/components/settings_modal/tabs/data_import_export_tab.vue index b5d0f5ed..a406077d 100644 --- a/src/components/settings_modal/tabs/data_import_export_tab.vue +++ b/src/components/settings_modal/tabs/data_import_export_tab.vue @@ -36,6 +36,23 @@ :export-button-label="$t('settings.block_export_button')" />
+
+

{{ $t('settings.mute_import') }}

+

{{ $t('settings.import_mutes_from_a_csv_file') }}

+ +
+
+

{{ $t('settings.mute_export') }}

+ +
diff --git a/src/i18n/en.json b/src/i18n/en.json index 8540f551..cf0a7e7c 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -276,6 +276,12 @@ "block_import": "Block import", "block_import_error": "Error importing blocks", "blocks_imported": "Blocks imported! Processing them will take a while.", + "mute_export": "Mute export", + "mute_export_button": "Export your mutes to a csv file", + "mute_import": "Mute import", + "mute_import_error": "Error importing mutes", + "mutes_imported": "Mutes imported! Processing them will take a while.", + "import_mutes_from_a_csv_file": "Import mutes from a csv file", "blocks_tab": "Blocks", "bot": "This is a bot account", "btnRadius": "Buttons", diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index da519001..34f86f93 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -3,6 +3,7 @@ import { parseStatus, parseUser, parseNotification, parseAttachment, parseChat, import { RegistrationError, StatusCodeError } from '../errors/errors' /* eslint-env browser */ +const MUTES_IMPORT_URL = '/api/pleroma/mutes_import' const BLOCKS_IMPORT_URL = '/api/pleroma/blocks_import' const FOLLOW_IMPORT_URL = '/api/pleroma/follow_import' const DELETE_ACCOUNT_URL = '/api/pleroma/delete_account' @@ -710,6 +711,17 @@ const setMediaDescription = ({ id, description, credentials }) => { }).then((data) => parseAttachment(data)) } +const importMutes = ({ file, credentials }) => { + const formData = new FormData() + formData.append('list', file) + return fetch(MUTES_IMPORT_URL, { + body: formData, + method: 'POST', + headers: authHeaders(credentials) + }) + .then((response) => response.ok) +} + const importBlocks = ({ file, credentials }) => { const formData = new FormData() formData.append('list', file) @@ -1280,6 +1292,7 @@ const apiService = { getCaptcha, updateProfileImages, updateProfile, + importMutes, importBlocks, importFollows, deleteAccount, From 92caaa2d7f8cbc74fe14430f9659b3b9d9113b55 Mon Sep 17 00:00:00 2001 From: eugenijm Date: Wed, 16 Sep 2020 05:08:12 +0300 Subject: [PATCH 15/93] Fix the chat list order and last message timestamp updates --- src/modules/chats.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/chats.js b/src/modules/chats.js index c7609018..aef16322 100644 --- a/src/modules/chats.js +++ b/src/modules/chats.js @@ -143,6 +143,7 @@ const chats = { const isNewMessage = (chat.lastMessage && chat.lastMessage.id) !== (updatedChat.lastMessage && updatedChat.lastMessage.id) chat.lastMessage = updatedChat.lastMessage chat.unread = updatedChat.unread + chat.updated_at = updatedChat.updated_at if (isNewMessage && chat.unread) { newChatMessageSideEffects(updatedChat) } From 8c4514013d5a53218830a82a6ac46f5969edd69b Mon Sep 17 00:00:00 2001 From: eugenijm Date: Wed, 16 Sep 2020 02:34:19 +0300 Subject: [PATCH 16/93] Fix chat messages being missed when the streaming is disabled and the messages are sent by both participants simultaneously --- src/components/chat/chat.js | 12 +++++++---- src/modules/chats.js | 20 +++---------------- src/services/chat_service/chat_service.js | 17 +++++++++------- .../chat_service/chat_service.spec.js | 10 +++++----- 4 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/components/chat/chat.js b/src/components/chat/chat.js index 9c4e5b05..803abf69 100644 --- a/src/components/chat/chat.js +++ b/src/components/chat/chat.js @@ -204,9 +204,9 @@ const Chat = { } }, readChat () { - if (!(this.currentChatMessageService && this.currentChatMessageService.lastMessage)) { return } + if (!(this.currentChatMessageService && this.currentChatMessageService.maxId)) { return } if (document.hidden) { return } - const lastReadId = this.currentChatMessageService.lastMessage.id + const lastReadId = this.currentChatMessageService.maxId this.$store.dispatch('readChat', { id: this.currentChat.id, lastReadId }) }, bottomedOut (offset) { @@ -244,7 +244,7 @@ const Chat = { const chatId = chatMessageService.chatId const fetchOlderMessages = !!maxId - const sinceId = fetchLatest && chatMessageService.lastMessage && chatMessageService.lastMessage.id + const sinceId = fetchLatest && chatMessageService.maxId this.backendInteractor.chatMessages({ id: chatId, maxId, sinceId }) .then((messages) => { @@ -303,7 +303,11 @@ const Chat = { return this.backendInteractor.sendChatMessage(params) .then(data => { - this.$store.dispatch('addChatMessages', { chatId: this.currentChat.id, messages: [data] }).then(() => { + this.$store.dispatch('addChatMessages', { + chatId: this.currentChat.id, + messages: [data], + updateMaxId: false + }).then(() => { this.$nextTick(() => { this.handleResize() // When the posting form size changes because of a media attachment, we need an extra resize diff --git a/src/modules/chats.js b/src/modules/chats.js index c7609018..e752c6df 100644 --- a/src/modules/chats.js +++ b/src/modules/chats.js @@ -181,30 +181,16 @@ const chats = { setChatsLoading (state, { value }) { state.chats.loading = value }, - addChatMessages (state, { commit, chatId, messages }) { + addChatMessages (state, { chatId, messages, updateMaxId }) { const chatMessageService = state.openedChatMessageServices[chatId] if (chatMessageService) { - chatService.add(chatMessageService, { messages: messages.map(parseChatMessage) }) - commit('refreshLastMessage', { chatId }) + chatService.add(chatMessageService, { messages: messages.map(parseChatMessage), updateMaxId }) } }, - refreshLastMessage (state, { chatId }) { - const chatMessageService = state.openedChatMessageServices[chatId] - if (chatMessageService) { - const chat = getChatById(state, chatId) - if (chat) { - chat.lastMessage = chatMessageService.lastMessage - if (chatMessageService.lastMessage) { - chat.updated_at = chatMessageService.lastMessage.created_at - } - } - } - }, - deleteChatMessage (state, { commit, chatId, messageId }) { + deleteChatMessage (state, { chatId, messageId }) { const chatMessageService = state.openedChatMessageServices[chatId] if (chatMessageService) { chatService.deleteMessage(chatMessageService, messageId) - commit('refreshLastMessage', { chatId }) } }, resetChatNewMessageCount (state, _value) { diff --git a/src/services/chat_service/chat_service.js b/src/services/chat_service/chat_service.js index b60a889b..95c69482 100644 --- a/src/services/chat_service/chat_service.js +++ b/src/services/chat_service/chat_service.js @@ -8,7 +8,7 @@ const empty = (chatId) => { lastSeenTimestamp: 0, chatId: chatId, minId: undefined, - lastMessage: undefined + maxId: undefined } } @@ -18,7 +18,7 @@ const clear = (storage) => { storage.newMessageCount = 0 storage.lastSeenTimestamp = 0 storage.minId = undefined - storage.lastMessage = undefined + storage.maxId = undefined } const deleteMessage = (storage, messageId) => { @@ -26,8 +26,9 @@ const deleteMessage = (storage, messageId) => { storage.messages = storage.messages.filter(m => m.id !== messageId) delete storage.idIndex[messageId] - if (storage.lastMessage && (storage.lastMessage.id === messageId)) { - storage.lastMessage = _.maxBy(storage.messages, 'id') + if (storage.maxId === messageId) { + const lastMessage = _.maxBy(storage.messages, 'id') + storage.maxId = lastMessage.id } if (storage.minId === messageId) { @@ -36,7 +37,7 @@ const deleteMessage = (storage, messageId) => { } } -const add = (storage, { messages: newMessages }) => { +const add = (storage, { messages: newMessages, updateMaxId = true }) => { if (!storage) { return } for (let i = 0; i < newMessages.length; i++) { const message = newMessages[i] @@ -48,8 +49,10 @@ const add = (storage, { messages: newMessages }) => { storage.minId = message.id } - if (!storage.lastMessage || message.id > storage.lastMessage.id) { - storage.lastMessage = message + if (!storage.maxId || message.id > storage.maxId) { + if (updateMaxId) { + storage.maxId = message.id + } } if (!storage.idIndex[message.id]) { diff --git a/test/unit/specs/services/chat_service/chat_service.spec.js b/test/unit/specs/services/chat_service/chat_service.spec.js index 3ee9839d..2eb89a2d 100644 --- a/test/unit/specs/services/chat_service/chat_service.spec.js +++ b/test/unit/specs/services/chat_service/chat_service.spec.js @@ -33,12 +33,12 @@ describe('chatService', () => { const chat = chatService.empty() chatService.add(chat, { messages: [ message1 ] }) - expect(chat.lastMessage.id).to.eql(message1.id) + expect(chat.maxId).to.eql(message1.id) expect(chat.minId).to.eql(message1.id) expect(chat.newMessageCount).to.eql(1) chatService.add(chat, { messages: [ message2 ] }) - expect(chat.lastMessage.id).to.eql(message2.id) + expect(chat.maxId).to.eql(message2.id) expect(chat.minId).to.eql(message1.id) expect(chat.newMessageCount).to.eql(2) @@ -60,15 +60,15 @@ describe('chatService', () => { chatService.add(chat, { messages: [ message2 ] }) chatService.add(chat, { messages: [ message3 ] }) - expect(chat.lastMessage.id).to.eql(message3.id) + expect(chat.maxId).to.eql(message3.id) expect(chat.minId).to.eql(message1.id) chatService.deleteMessage(chat, message3.id) - expect(chat.lastMessage.id).to.eql(message2.id) + expect(chat.maxId).to.eql(message2.id) expect(chat.minId).to.eql(message1.id) chatService.deleteMessage(chat, message1.id) - expect(chat.lastMessage.id).to.eql(message2.id) + expect(chat.maxId).to.eql(message2.id) expect(chat.minId).to.eql(message2.id) }) }) From d6fe4f6a4fa4c8fb928bcd187e605c76f985d06d Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 16 Sep 2020 10:27:31 +0300 Subject: [PATCH 17/93] update changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18dafa8e..c56ac821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ## [Unreleased patch] +### Fixed +- Fixed chats list not updating its order when new messages come in +- Fixed chat messages sometimes getting lost when you receive a message at the same time + + +## [2.1.1] - 2020-09-08 ### Changed - Polls will be hidden with status content if "Collapse posts with subjects" is enabled and the post is collapsed. @@ -13,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Autocomplete won't stop at the second @, so it'll still work with "@lain@l" and not start over. - Fixed weird autocomplete behavior when you write ":custom_emoji: ?" + ## [2.1.0] - 2020-08-28 ### Added - Autocomplete domains from list of known instances From 1b811d8b931706927d8fa096435b2c272eb0d7ef Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 16 Sep 2020 11:29:10 +0300 Subject: [PATCH 18/93] change side drawer to use shoutbox name --- src/components/side_drawer/side_drawer.vue | 2 +- src/i18n/en.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue index 0587ee02..b17813c3 100644 --- a/src/components/side_drawer/side_drawer.vue +++ b/src/components/side_drawer/side_drawer.vue @@ -90,7 +90,7 @@ @click="toggleDrawer" > - {{ $t("nav.chat") }} + {{ $t("shoutbox.title") }} diff --git a/src/i18n/en.json b/src/i18n/en.json index 8540f551..027e99be 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -113,7 +113,6 @@ "about": "About", "administration": "Administration", "back": "Back", - "chat": "Local Chat", "friend_requests": "Follow Requests", "mentions": "Mentions", "interactions": "Interactions", From 20d33c2fbc1e3cf9cdbab94c26b138acd505d001 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Wed, 16 Sep 2020 11:53:54 +0300 Subject: [PATCH 19/93] change icon to a megaphone --- src/components/chat_panel/chat_panel.vue | 2 +- src/components/side_drawer/side_drawer.vue | 2 +- static/fontello.json | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/chat_panel/chat_panel.vue b/src/components/chat_panel/chat_panel.vue index ca529b5a..570435e7 100644 --- a/src/components/chat_panel/chat_panel.vue +++ b/src/components/chat_panel/chat_panel.vue @@ -63,7 +63,7 @@ @click.stop.prevent="togglePanel" >
- + {{ $t('shoutbox.title') }}
diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue index b17813c3..eda5a68c 100644 --- a/src/components/side_drawer/side_drawer.vue +++ b/src/components/side_drawer/side_drawer.vue @@ -90,7 +90,7 @@ @click="toggleDrawer" > - {{ $t("shoutbox.title") }} + {{ $t("shoutbox.title") }} diff --git a/static/fontello.json b/static/fontello.json index 706800cd..b0136fd9 100644 --- a/static/fontello.json +++ b/static/fontello.json @@ -405,6 +405,12 @@ "css": "block", "code": 59434, "src": "fontawesome" + }, + { + "uid": "3e674995cacc2b09692c096ea7eb6165", + "css": "megaphone", + "code": 59435, + "src": "fontawesome" } ] } \ No newline at end of file From 70a5619496db1620fcc6d0127449ffb498a3dae4 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Fri, 18 Sep 2020 11:07:38 +0200 Subject: [PATCH 20/93] [fix] case in/sensitive emoji search --- src/components/emoji_picker/emoji_picker.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 0f397b59..5c09f6ca 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -8,7 +8,10 @@ const LOAD_EMOJI_BY = 60 const LOAD_EMOJI_MARGIN = 64 const filterByKeyword = (list, keyword = '') => { - return list.filter(x => x.displayText.includes(keyword)) + const keywordLowercase = keyword.toLowerCase() + return list.filter(emoji => + emoji.displayText.toLowerCase().includes(keywordLowercase) + ) } const EmojiPicker = { From 5942001626d01f6438e53943f1b8a8a2448d1378 Mon Sep 17 00:00:00 2001 From: Maksim Pechnikov Date: Fri, 18 Sep 2020 22:09:05 +0300 Subject: [PATCH 21/93] updated changelog --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c56ac821..15aeb7cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Fixed - Fixed chats list not updating its order when new messages come in -- Fixed chat messages sometimes getting lost when you receive a message at the same time +- Fixed chat messages sometimes getting lost when you receive a message at the same time +### Added +- Import/export a muted users ## [2.1.1] - 2020-09-08 ### Changed From f9977dbb3c9b316521b6be40ddd1a34411f2d835 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Sat, 19 Sep 2020 21:28:03 +0200 Subject: [PATCH 22/93] fix excessive underline in sidebar --- src/App.scss | 1 + src/components/nav_panel/nav_panel.vue | 10 +++++----- src/components/timeline_menu/timeline_menu.vue | 6 +----- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/App.scss b/src/App.scss index e2e2d079..8b1bbd2d 100644 --- a/src/App.scss +++ b/src/App.scss @@ -809,6 +809,7 @@ nav { .button-icon { font-size: 1.2em; + margin-right: 0.5em; } @keyframes shakeError { diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue index f8459fd1..080e547f 100644 --- a/src/components/nav_panel/nav_panel.vue +++ b/src/components/nav_panel/nav_panel.vue @@ -7,12 +7,12 @@ :to="{ name: timelinesRoute }" :class="onTimelineRoute && 'router-link-active'" > - {{ $t("nav.timelines") }} + {{ $t("nav.timelines") }}
  • - {{ $t("nav.interactions") }} + {{ $t("nav.interactions") }}
  • @@ -23,12 +23,12 @@ > {{ unreadChatCount }} - {{ $t("nav.chats") }} + {{ $t("nav.chats") }}
  • - {{ $t("nav.friend_requests") }} + {{ $t("nav.friend_requests") }}
  • - {{ $t("nav.about") }} + {{ $t("nav.about") }}
  • diff --git a/src/components/timeline_menu/timeline_menu.vue b/src/components/timeline_menu/timeline_menu.vue index be512d60..3c029093 100644 --- a/src/components/timeline_menu/timeline_menu.vue +++ b/src/components/timeline_menu/timeline_menu.vue @@ -64,7 +64,7 @@ .timeline-menu-popover-wrap { overflow: hidden; // Match panel heading padding to line up menu with bottom of heading - margin-top: 0.6rem; + margin-top: 0.6rem 0.65em; padding: 0 15px 15px 15px; } .timeline-menu-popover { @@ -138,10 +138,6 @@ &:last-child { border: none; } - - i { - margin: 0 0.5em; - } } a { From 20362546d10287cbba8150424e5e073c39219757 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Sat, 19 Sep 2020 21:50:56 +0200 Subject: [PATCH 23/93] fix/overflow-for-chat-unread --- src/App.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/App.scss b/src/App.scss index e2e2d079..88e5df86 100644 --- a/src/App.scss +++ b/src/App.scss @@ -941,6 +941,9 @@ nav { min-height: 1.3rem; max-height: 1.3rem; line-height: 1.3rem; + max-width: 10em; + overflow: hidden; + text-overflow: ellipsis; } .chat-layout { From fee654f1eee276a1d30c8fcb2699e567fc281967 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Mon, 21 Sep 2020 17:29:36 +0200 Subject: [PATCH 24/93] feat/reorder-emojis-by-position-of-keyword --- src/components/emoji_picker/emoji_picker.js | 13 ++++++++++--- src/components/react_button/react_button.js | 11 ++++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 5c09f6ca..713ecd8b 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -8,10 +8,17 @@ const LOAD_EMOJI_BY = 60 const LOAD_EMOJI_MARGIN = 64 const filterByKeyword = (list, keyword = '') => { + if (keyword === '') return list + const keywordLowercase = keyword.toLowerCase() - return list.filter(emoji => - emoji.displayText.toLowerCase().includes(keywordLowercase) - ) + const orderedEmojiList = [] + for (const emoji of list) { + const indexOfKeyword = emoji.displayText.toLowerCase().indexOf( keywordLowercase ) + if ( indexOfKeyword > -1 ) { + orderedEmojiList.splice(indexOfKeyword, 0, emoji) + } + } + return orderedEmojiList } const EmojiPicker = { diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js index abcf0455..473a2506 100644 --- a/src/components/react_button/react_button.js +++ b/src/components/react_button/react_button.js @@ -29,9 +29,14 @@ const ReactButton = { emojis () { if (this.filterWord !== '') { const filterWordLowercase = this.filterWord.toLowerCase() - return this.$store.state.instance.emoji.filter(emoji => - emoji.displayText.toLowerCase().includes(filterWordLowercase) - ) + const orderedEmojiList = [] + for (const emoji of this.$store.state.instance.emoji) { + const indexOfFilterWord = emoji.displayText.toLowerCase().indexOf( filterWordLowercase ) + if ( indexOfFilterWord > -1 ) { + orderedEmojiList.splice(indexOfFilterWord, 0, emoji) + } + } + return orderedEmojiList } return this.$store.state.instance.emoji || [] }, From f1e1f20a8d89abf7920997c12d5c7b48cdb2d628 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Mon, 21 Sep 2020 17:42:17 +0200 Subject: [PATCH 25/93] fix 8x spaces inside this paren --- src/components/emoji_picker/emoji_picker.js | 4 ++-- src/components/react_button/react_button.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 713ecd8b..28ab0376 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -13,8 +13,8 @@ const filterByKeyword = (list, keyword = '') => { const keywordLowercase = keyword.toLowerCase() const orderedEmojiList = [] for (const emoji of list) { - const indexOfKeyword = emoji.displayText.toLowerCase().indexOf( keywordLowercase ) - if ( indexOfKeyword > -1 ) { + const indexOfKeyword = emoji.displayText.toLowerCase().indexOf(keywordLowercase) + if (indexOfKeyword > -1) { orderedEmojiList.splice(indexOfKeyword, 0, emoji) } } diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js index 473a2506..28ce884a 100644 --- a/src/components/react_button/react_button.js +++ b/src/components/react_button/react_button.js @@ -31,8 +31,8 @@ const ReactButton = { const filterWordLowercase = this.filterWord.toLowerCase() const orderedEmojiList = [] for (const emoji of this.$store.state.instance.emoji) { - const indexOfFilterWord = emoji.displayText.toLowerCase().indexOf( filterWordLowercase ) - if ( indexOfFilterWord > -1 ) { + const indexOfFilterWord = emoji.displayText.toLowerCase().indexOf(filterWordLowercase) + if (indexOfFilterWord > -1) { orderedEmojiList.splice(indexOfFilterWord, 0, emoji) } } From cff202241b6eff8f6b381866e00a0392080d05a2 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Mon, 21 Sep 2020 18:10:55 +0200 Subject: [PATCH 26/93] improved algorithm, possibly speed too --- src/components/emoji_picker/emoji_picker.js | 9 ++++++--- src/components/react_button/react_button.js | 9 ++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 28ab0376..29c559df 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -11,14 +11,17 @@ const filterByKeyword = (list, keyword = '') => { if (keyword === '') return list const keywordLowercase = keyword.toLowerCase() - const orderedEmojiList = [] + let orderedEmojiList = [] for (const emoji of list) { const indexOfKeyword = emoji.displayText.toLowerCase().indexOf(keywordLowercase) if (indexOfKeyword > -1) { - orderedEmojiList.splice(indexOfKeyword, 0, emoji) + if (!Array.isArray(orderedEmojiList[keywordLowercase])) { + orderedEmojiList[keywordLowercase] = [] + } + orderedEmojiList[keywordLowercase].push(emoji) } } - return orderedEmojiList + return orderedEmojiList.flat() } const EmojiPicker = { diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js index 28ce884a..16014405 100644 --- a/src/components/react_button/react_button.js +++ b/src/components/react_button/react_button.js @@ -29,14 +29,17 @@ const ReactButton = { emojis () { if (this.filterWord !== '') { const filterWordLowercase = this.filterWord.toLowerCase() - const orderedEmojiList = [] + let orderedEmojiList = [] for (const emoji of this.$store.state.instance.emoji) { const indexOfFilterWord = emoji.displayText.toLowerCase().indexOf(filterWordLowercase) if (indexOfFilterWord > -1) { - orderedEmojiList.splice(indexOfFilterWord, 0, emoji) + if (!Array.isArray(orderedEmojiList[indexOfFilterWord])) { + orderedEmojiList[indexOfFilterWord] = [] + } + orderedEmojiList[indexOfFilterWord].push(emoji) } } - return orderedEmojiList + return orderedEmojiList.flat() } return this.$store.state.instance.emoji || [] }, From bb59b8ee56f8c5c89720c9a42037a730caba4d11 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Mon, 21 Sep 2020 18:13:31 +0200 Subject: [PATCH 27/93] fixed copy-pasting leftovers --- src/components/emoji_picker/emoji_picker.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/emoji_picker/emoji_picker.js b/src/components/emoji_picker/emoji_picker.js index 29c559df..3ad80df3 100644 --- a/src/components/emoji_picker/emoji_picker.js +++ b/src/components/emoji_picker/emoji_picker.js @@ -15,10 +15,10 @@ const filterByKeyword = (list, keyword = '') => { for (const emoji of list) { const indexOfKeyword = emoji.displayText.toLowerCase().indexOf(keywordLowercase) if (indexOfKeyword > -1) { - if (!Array.isArray(orderedEmojiList[keywordLowercase])) { - orderedEmojiList[keywordLowercase] = [] + if (!Array.isArray(orderedEmojiList[indexOfKeyword])) { + orderedEmojiList[indexOfKeyword] = [] } - orderedEmojiList[keywordLowercase].push(emoji) + orderedEmojiList[indexOfKeyword].push(emoji) } } return orderedEmojiList.flat() From 3dacef944cf6980dc3a3c1843d5b3f94b851240a Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Thu, 24 Sep 2020 12:05:51 +0200 Subject: [PATCH 28/93] remove bio-table's max-width --- src/components/user_profile/user_profile.vue | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue index c7c67c0a..b26499b4 100644 --- a/src/components/user_profile/user_profile.vue +++ b/src/components/user_profile/user_profile.vue @@ -156,8 +156,7 @@ .user-profile-field { display: flex; - margin: 0.25em auto; - max-width: 32em; + margin: 0.25em; border: 1px solid var(--border, $fallback--border); border-radius: $fallback--inputRadius; border-radius: var(--inputRadius, $fallback--inputRadius); From f174f289a93e6bef1182a2face00bb809da49d18 Mon Sep 17 00:00:00 2001 From: Shpuld Shpludson Date: Tue, 29 Sep 2020 10:18:37 +0000 Subject: [PATCH 29/93] Timeline virtual scrolling --- CHANGELOG.md | 3 + src/components/attachment/attachment.vue | 4 ++ src/components/conversation/conversation.js | 20 +++++- src/components/conversation/conversation.vue | 11 +++- src/components/react_button/react_button.js | 5 +- .../retweet_button/retweet_button.js | 5 +- .../settings_modal/tabs/general_tab.vue | 5 ++ src/components/status/status.js | 31 +++++++-- src/components/status/status.scss | 5 ++ src/components/status/status.vue | 7 +- .../status_content/status_content.vue | 2 + src/components/still-image/still-image.js | 10 +-- src/components/timeline/timeline.js | 64 ++++++++++++++++++- src/components/timeline/timeline.vue | 6 +- .../video_attachment/video_attachment.js | 49 ++++++++++---- .../video_attachment/video_attachment.vue | 3 +- src/i18n/en.json | 1 + src/modules/config.js | 3 +- src/modules/instance.js | 1 + src/modules/statuses.js | 6 ++ src/services/api/api.service.js | 2 + 21 files changed, 204 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18dafa8e..eebc7115 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +### Added +- New option to optimize timeline rendering to make the site more responsive (enabled by default) + ## [Unreleased patch] ### Changed diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue index 63e0ceba..7fabc963 100644 --- a/src/components/attachment/attachment.vue +++ b/src/components/attachment/attachment.vue @@ -80,6 +80,8 @@ class="video" :attachment="attachment" :controls="allowPlay" + @play="$emit('play')" + @pause="$emit('pause')" />
    @@ -18,6 +20,7 @@
    +
    @@ -53,8 +60,8 @@ .conversation-status { border-color: $fallback--border; border-color: var(--border, $fallback--border); - border-left: 4px solid $fallback--cRed; - border-left: 4px solid var(--cRed, $fallback--cRed); + border-left-color: $fallback--cRed; + border-left-color: var(--cRed, $fallback--cRed); } .conversation-status:last-child { diff --git a/src/components/react_button/react_button.js b/src/components/react_button/react_button.js index abcf0455..11627e9c 100644 --- a/src/components/react_button/react_button.js +++ b/src/components/react_button/react_button.js @@ -1,5 +1,4 @@ import Popover from '../popover/popover.vue' -import { mapGetters } from 'vuex' const ReactButton = { props: ['status'], @@ -35,7 +34,9 @@ const ReactButton = { } return this.$store.state.instance.emoji || [] }, - ...mapGetters(['mergedConfig']) + mergedConfig () { + return this.$store.getters.mergedConfig + } } } diff --git a/src/components/retweet_button/retweet_button.js b/src/components/retweet_button/retweet_button.js index d9a0f92e..5a41f22d 100644 --- a/src/components/retweet_button/retweet_button.js +++ b/src/components/retweet_button/retweet_button.js @@ -1,4 +1,3 @@ -import { mapGetters } from 'vuex' const RetweetButton = { props: ['status', 'loggedIn', 'visibility'], @@ -28,7 +27,9 @@ const RetweetButton = { 'animate-spin': this.animated } }, - ...mapGetters(['mergedConfig']) + mergedConfig () { + return this.$store.getters.mergedConfig + } } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 7f06d0bd..13482de7 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -58,6 +58,11 @@ {{ $t('settings.emoji_reactions_on_timeline') }} +
  • + + {{ $t('settings.virtual_scrolling') }} + +
  • diff --git a/src/components/status/status.js b/src/components/status/status.js index d263da68..cd6e2f72 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -15,7 +15,6 @@ import generateProfileLink from 'src/services/user_profile_link_generator/user_p import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js' import { muteWordHits } from '../../services/status_parser/status_parser.js' import { unescape, uniqBy } from 'lodash' -import { mapGetters, mapState } from 'vuex' const Status = { name: 'Status', @@ -54,6 +53,8 @@ const Status = { replying: false, unmuted: false, userExpanded: false, + mediaPlaying: [], + suspendable: true, error: null } }, @@ -157,7 +158,7 @@ const Status = { return this.mergedConfig.hideFilteredStatuses }, hideStatus () { - return this.deleted || (this.muted && this.hideFilteredStatuses) + return this.deleted || (this.muted && this.hideFilteredStatuses) || this.virtualHidden }, isFocused () { // retweet or root of an expanded conversation @@ -207,11 +208,18 @@ const Status = { hidePostStats () { return this.mergedConfig.hidePostStats }, - ...mapGetters(['mergedConfig']), - ...mapState({ - betterShadow: state => state.interface.browserSupport.cssFilter, - currentUser: state => state.users.currentUser - }) + currentUser () { + return this.$store.state.users.currentUser + }, + betterShadow () { + return this.$store.state.interface.browserSupport.cssFilter + }, + mergedConfig () { + return this.$store.getters.mergedConfig + }, + isSuspendable () { + return !this.replying && this.mediaPlaying.length === 0 + } }, methods: { visibilityIcon (visibility) { @@ -251,6 +259,12 @@ const Status = { }, generateUserProfileLink (id, name) { return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames) + }, + addMediaPlaying (id) { + this.mediaPlaying.push(id) + }, + removeMediaPlaying (id) { + this.mediaPlaying = this.mediaPlaying.filter(mediaId => mediaId !== id) } }, watch: { @@ -280,6 +294,9 @@ const Status = { if (this.isFocused && this.statusFromGlobalRepository.favoritedBy && this.statusFromGlobalRepository.favoritedBy.length !== num) { this.$store.dispatch('fetchFavs', this.status.id) } + }, + 'isSuspendable': function (val) { + this.suspendable = val } }, filters: { diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 8d292d3f..c92d870b 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -25,6 +25,11 @@ $status-margin: 0.75em; --icon: var(--selectedPostIcon, $fallback--icon); } + &.-conversation { + border-left-width: 4px; + border-left-style: solid; + } + .status-container { display: flex; padding: $status-margin; diff --git a/src/components/status/status.vue b/src/components/status/status.vue index 282ad37d..aa67e433 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -16,7 +16,7 @@ />
    diff --git a/src/i18n/en.json b/src/i18n/en.json index 8540f551..8d831e3d 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -430,6 +430,7 @@ "false": "no", "true": "yes" }, + "virtual_scrolling": "Optimize timeline rendering", "fun": "Fun", "greentext": "Meme arrows", "notifications": "Notifications", diff --git a/src/modules/config.js b/src/modules/config.js index 409d77a4..444b8ec7 100644 --- a/src/modules/config.js +++ b/src/modules/config.js @@ -65,7 +65,8 @@ export const defaultState = { useContainFit: false, greentext: undefined, // instance default hidePostStats: undefined, // instance default - hideUserStats: undefined // instance default + hideUserStats: undefined, // instance default + virtualScrolling: undefined // instance default } // caching the instance default properties diff --git a/src/modules/instance.js b/src/modules/instance.js index 3fe3bbf3..b3cbffc6 100644 --- a/src/modules/instance.js +++ b/src/modules/instance.js @@ -41,6 +41,7 @@ const defaultState = { sidebarRight: false, subjectLineBehavior: 'email', theme: 'pleroma-dark', + virtualScrolling: true, // Nasty stuff customEmoji: [], diff --git a/src/modules/statuses.js b/src/modules/statuses.js index e108b2a7..155cc4b9 100644 --- a/src/modules/statuses.js +++ b/src/modules/statuses.js @@ -568,6 +568,9 @@ export const mutations = { updateStatusWithPoll (state, { id, poll }) { const status = state.allStatusesObject[id] status.poll = poll + }, + setVirtualHeight (state, { statusId, height }) { + state.allStatusesObject[statusId].virtualHeight = height } } @@ -753,6 +756,9 @@ const statuses = { store.commit('addNewStatuses', { statuses: data.statuses }) return data }) + }, + setVirtualHeight ({ commit }, { statusId, height }) { + commit('setVirtualHeight', { statusId, height }) } }, mutations diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js index da519001..d1842e17 100644 --- a/src/services/api/api.service.js +++ b/src/services/api/api.service.js @@ -539,8 +539,10 @@ const fetchTimeline = ({ const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&') url += `?${queryString}` + let status = '' let statusText = '' + let pagination = {} return fetch(url, { headers: authHeaders(credentials) }) .then((data) => { From 1675f1a133934956a39ca4ade99b809789bb84a2 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Tue, 29 Sep 2020 13:13:42 +0200 Subject: [PATCH 30/93] scoped back margin-right on icons --- src/App.scss | 1 - src/components/nav_panel/nav_panel.vue | 4 ++++ src/components/timeline_menu/timeline_menu.vue | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/App.scss b/src/App.scss index 8b1bbd2d..e2e2d079 100644 --- a/src/App.scss +++ b/src/App.scss @@ -809,7 +809,6 @@ nav { .button-icon { font-size: 1.2em; - margin-right: 0.5em; } @keyframes shakeError { diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue index 080e547f..4f944c95 100644 --- a/src/components/nav_panel/nav_panel.vue +++ b/src/components/nav_panel/nav_panel.vue @@ -125,6 +125,10 @@ } } +.nav-panel .button-icon { + margin-right: 0.5em; +} + .nav-panel .button-icon:before { width: 1.1em; } diff --git a/src/components/timeline_menu/timeline_menu.vue b/src/components/timeline_menu/timeline_menu.vue index 3c029093..481b1d09 100644 --- a/src/components/timeline_menu/timeline_menu.vue +++ b/src/components/timeline_menu/timeline_menu.vue @@ -170,6 +170,10 @@ text-decoration: underline; } } + + i { + margin: 0 0.5em; + } } } From c17012cfe19ecab7efc27a54c90c4369c36de343 Mon Sep 17 00:00:00 2001 From: Dym Sohin Date: Tue, 29 Sep 2020 13:20:16 +0200 Subject: [PATCH 31/93] fix appended 0.65em on wrong line --- src/components/timeline_menu/timeline_menu.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/timeline_menu/timeline_menu.vue b/src/components/timeline_menu/timeline_menu.vue index 481b1d09..b7e5f2da 100644 --- a/src/components/timeline_menu/timeline_menu.vue +++ b/src/components/timeline_menu/timeline_menu.vue @@ -64,7 +64,7 @@ .timeline-menu-popover-wrap { overflow: hidden; // Match panel heading padding to line up menu with bottom of heading - margin-top: 0.6rem 0.65em; + margin-top: 0.6rem; padding: 0 15px 15px 15px; } .timeline-menu-popover { @@ -142,7 +142,7 @@ a { display: block; - padding: 0.6em 0; + padding: 0.6em 0.65em; &:hover { background-color: $fallback--lightBg; @@ -172,7 +172,7 @@ } i { - margin: 0 0.5em; + margin-right: 0.5em; } } } From 414558665f8370390cf4c6dc3c79745217d8d522 Mon Sep 17 00:00:00 2001 From: Shpuld Shpuldson Date: Thu, 1 Oct 2020 16:01:57 +0300 Subject: [PATCH 32/93] lint fix --- src/components/status/status.scss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/status/status.scss b/src/components/status/status.scss index ecca288f..66a91c1e 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -25,6 +25,11 @@ $status-margin: 0.75em; --icon: var(--selectedPostIcon, $fallback--icon); } + &.-conversation { + border-left-width: 4px; + border-left-style: solid; + } + .gravestone { padding: $status-margin; color: $fallback--faint; @@ -36,11 +41,6 @@ $status-margin: 0.75em; align-items: center; } } - - &.-conversation { - border-left-width: 4px; - border-left-style: solid; - } .status-container { display: flex; From 3f119c6875e7c713b71ed6ca9793609ff866f776 Mon Sep 17 00:00:00 2001 From: titizen Date: Wed, 9 Sep 2020 20:39:40 +0000 Subject: [PATCH 33/93] Translated using Weblate (Catalan) Currently translated at 48.7% (323 of 662 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ca/ --- src/i18n/ca.json | 190 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 180 insertions(+), 10 deletions(-) diff --git a/src/i18n/ca.json b/src/i18n/ca.json index f2bcdd06..b15b69f7 100644 --- a/src/i18n/ca.json +++ b/src/i18n/ca.json @@ -9,7 +9,8 @@ "scope_options": "Opcions d'abast i visibilitat", "text_limit": "Límit de text", "title": "Funcionalitats", - "who_to_follow": "A qui seguir" + "who_to_follow": "A qui seguir", + "pleroma_chat_messages": "Xat de Pleroma" }, "finder": { "error_fetching_user": "No s'ha pogut carregar l'usuari/a", @@ -17,7 +18,21 @@ }, "general": { "apply": "Aplica", - "submit": "Desa" + "submit": "Desa", + "close": "Tanca", + "verify": "Verifica", + "confirm": "Confirma", + "enable": "Habilita", + "disable": "Deshabilitar", + "cancel": "Cancel·la", + "show_less": "Mostra menys", + "show_more": "Mostra més", + "optional": "opcional", + "retry": "Prova de nou", + "error_retry": "Si us plau, prova de nou", + "generic_error": "Hi ha hagut un error", + "loading": "Carregant…", + "more": "Més" }, "login": { "login": "Inicia sessió", @@ -25,7 +40,12 @@ "password": "Contrasenya", "placeholder": "p.ex.: Maria", "register": "Registra't", - "username": "Nom d'usuari/a" + "username": "Nom d'usuari/a", + "recovery_code": "Codi de recuperació", + "enter_recovery_code": "Posa un codi de recuperació", + "authentication_code": "Codi d'autenticació", + "hint": "Entra per participar a la conversa", + "description": "Entra amb OAuth" }, "nav": { "chat": "Xat local públic", @@ -33,7 +53,16 @@ "mentions": "Mencions", "public_tl": "Flux públic del node", "timeline": "Flux personal", - "twkn": "Flux de la xarxa coneguda" + "twkn": "Flux de la xarxa coneguda", + "chats": "Xats", + "timelines": "Línies de temps", + "preferences": "Preferències", + "who_to_follow": "A qui seguir", + "search": "Cerca", + "dms": "Missatges directes", + "interactions": "Interaccions", + "back": "Enrere", + "administration": "Administració" }, "notifications": { "broken_favorite": "No es coneix aquest estat. S'està cercant.", @@ -42,14 +71,19 @@ "load_older": "Carrega més notificacions", "notifications": "Notificacions", "read": "Read!", - "repeated_you": "ha repetit el teu estat" + "repeated_you": "ha repetit el teu estat", + "migrated_to": "migrat a", + "no_more_notifications": "No més notificacions", + "follow_request": "et vol seguir" }, "post_status": { "account_not_locked_warning": "El teu compte no està {0}. Qualsevol persona pot seguir-te per llegir les teves entrades reservades només a seguidores.", "account_not_locked_warning_link": "bloquejat", "attachments_sensitive": "Marca l'adjunt com a delicat", "content_type": { - "text/plain": "Text pla" + "text/plain": "Text pla", + "text/markdown": "Markdown", + "text/html": "HTML" }, "content_warning": "Assumpte (opcional)", "default": "Em sento…", @@ -60,7 +94,13 @@ "private": "Només seguidors/es - Publica només per comptes que et segueixin", "public": "Pública - Publica als fluxos públics", "unlisted": "Silenciosa - No la mostris en fluxos públics" - } + }, + "scope_notice": { + "private": "Aquesta entrada serà visible només per a qui et segueixi", + "public": "Aquesta entrada serà visible per a tothom" + }, + "preview_empty": "Buida", + "preview": "Vista prèvia" }, "registration": { "bio": "Presentació", @@ -68,7 +108,17 @@ "fullname": "Nom per mostrar", "password_confirm": "Confirma la contrasenya", "registration": "Registra't", - "token": "Codi d'invitació" + "token": "Codi d'invitació", + "validations": { + "password_confirmation_match": "hauria de ser la mateixa que la contrasenya", + "password_confirmation_required": "no es pot deixar en blanc", + "password_required": "no es pot deixar en blanc", + "email_required": "no es pot deixar en blanc", + "fullname_required": "no es pot deixar en blanc", + "username_required": "no es pot deixar en blanc" + }, + "fullname_placeholder": "p. ex. Lain Iwakura", + "username_placeholder": "p. ex. lain" }, "settings": { "attachmentRadius": "Adjunts", @@ -94,7 +144,7 @@ "data_import_export_tab": "Importa o exporta dades", "default_vis": "Abast per defecte de les entrades", "delete_account": "Esborra el compte", - "delete_account_description": "Esborra permanentment el teu compte i tots els missatges", + "delete_account_description": "Esborra permanentment les teves dades i desactiva el teu compte.", "delete_account_error": "No s'ha pogut esborrar el compte. Si continua el problema, contacta amb l'administració del node.", "delete_account_instructions": "Confirma que vols esborrar el compte escrivint la teva contrasenya aquí sota.", "export_theme": "Desa el tema", @@ -164,7 +214,57 @@ "values": { "false": "no", "true": "sí" - } + }, + "show_moderator_badge": "Mostra una insígnia de Moderació en el meu perfil", + "show_admin_badge": "Mostra una insígnia d'Administració en el meu perfil", + "hide_followers_description": "No mostris qui m'està seguint", + "hide_follows_description": "No mostris a qui segueixo", + "notification_visibility_emoji_reactions": "Reaccions", + "new_email": "Nou correu electrònic", + "profile_fields": { + "value": "Contingut", + "name": "Etiqueta", + "add_field": "Afegeix un camp", + "label": "Metadades del perfil" + }, + "mutes_tab": "Silenciaments", + "interface": "Interfície", + "instance_default_simple": "(per defecte)", + "checkboxRadius": "Caselles", + "import_blocks_from_a_csv_file": "Importa bloquejos des d'un arxiu csv", + "hide_post_stats": "Amaga les estadístiques de les entrades (p. ex. el nombre de favorits)", + "use_one_click_nsfw": "Obre els adjunts NSFW amb només un clic", + "hide_muted_posts": "Amaga les entrades de comptes silenciats", + "avatar_size_instruction": "La mida mínima recomanada per la imatge de l'avatar és de 150x150 píxels.", + "domain_mutes": "Dominis", + "discoverable": "Permet la descoberta d'aquest compte en resultats de cerques i altres serveis", + "mutes_and_blocks": "Silenciaments i bloquejos", + "composing": "Composant", + "chatMessageRadius": "Missatge de xat", + "changed_email": "Correu electrònic canviat amb èxit!", + "change_email_error": "Hi ha hagut un problema al canviar el teu correu electrònic.", + "change_email": "Canvia el correu electrònic", + "bot": "Aquest és un compte automatitzat", + "blocks_tab": "Bloquejos", + "blocks_imported": "Bloquejos importats! Processar-los pot trigar una mica.", + "block_import_error": "Error al importar bloquejos", + "block_import": "Importa bloquejos", + "block_export_button": "Exporta els teus bloquejos a un arxiu csv", + "block_export": "Exporta bloquejos", + "allow_following_move": "Permet el seguiment automàtic quan un compte a qui seguim es mou", + "mfa": { + "scan": { + "secret_code": "Clau" + }, + "authentication_methods": "Mètodes d'autenticació", + "waiting_a_recovery_codes": "Rebent còpies de seguretat dels codis…", + "recovery_codes": "Codis de recuperació.", + "warning_of_generate_new_codes": "Quan generes nous codis de recuperació, els antics ja no funcionaran més.", + "generate_new_recovery_codes": "Genera nous codis de recuperació" + }, + "enter_current_password_to_confirm": "Posar la contrasenya actual per confirmar la teva identitat", + "security": "Seguretat", + "app_name": "Nom de l'aplicació" }, "time": { "day": "{0} dia", @@ -232,5 +332,75 @@ "who_to_follow": { "more": "More", "who_to_follow": "A qui seguir" + }, + "selectable_list": { + "select_all": "Selecciona-ho tot" + }, + "remote_user_resolver": { + "error": "No trobat.", + "searching_for": "Cercant per" + }, + "interactions": { + "load_older": "Carrega antigues interaccions", + "favs_repeats": "Repeticions i favorits" + }, + "emoji": { + "stickers": "Adhesius" + }, + "polls": { + "expired": "L'enquesta va acabar fa {0}", + "expires_in": "L'enquesta acaba en {0}", + "multiple_choices": "Múltiples opcions", + "single_choice": "Una sola opció", + "type": "Tipus d'enquesta", + "vote": "Vota", + "votes": "vots", + "option": "Opció", + "add_option": "Afegeix opció", + "add_poll": "Afegeix enquesta" + }, + "media_modal": { + "next": "Següent", + "previous": "Anterior" + }, + "importer": { + "error": "Ha succeït un error mentre s'importava aquest arxiu.", + "success": "Importat amb èxit." + }, + "image_cropper": { + "cancel": "Cancel·la", + "save_without_cropping": "Desa sense retallar", + "save": "Desa", + "crop_picture": "Retalla la imatge" + }, + "exporter": { + "processing": "Processant, aviat se't preguntarà per descarregar el teu arxiu", + "export": "Exporta" + }, + "domain_mute_card": { + "mute_progress": "Silenciant…", + "mute": "Silencia" + }, + "about": { + "staff": "Equip responsable", + "mrf": { + "simple": { + "quarantine_desc": "Aquesta instància només enviarà entrades públiques a les següents instàncies:", + "quarantine": "Quarantena", + "reject_desc": "Aquesta instància no acceptarà missatges de les següents instàncies:", + "reject": "Rebutja", + "accept_desc": "Aquesta instància només accepta missatges de les següents instàncies:", + "accept": "Accepta", + "simple_policies": "Polítiques específiques de la instància" + }, + "mrf_policies_desc": "Les polítiques MRF controlen el comportament federat de la instància. Les següents polítiques estan habilitades:", + "mrf_policies": "Polítiques MRF habilitades", + "keyword": { + "replace": "Reemplaça", + "reject": "Rebutja", + "keyword_policies": "Polítiques de paraules clau" + }, + "federation": "Federació" + } } } From aca8570b86ad2e96a30e97aefd94895e75c2c98c Mon Sep 17 00:00:00 2001 From: snow Date: Sat, 19 Sep 2020 15:56:25 +0000 Subject: [PATCH 34/93] Added translation using Weblate (Chinese (Traditional)) --- src/i18n/zh_Hant.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/i18n/zh_Hant.json diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/i18n/zh_Hant.json @@ -0,0 +1 @@ +{} From ad6b7148d4989060e45158abdca44493e4e9b44f Mon Sep 17 00:00:00 2001 From: snow Date: Sat, 19 Sep 2020 16:28:37 +0000 Subject: [PATCH 35/93] Translated using Weblate (Chinese (Simplified)) Currently translated at 83.2% (550 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/ --- src/i18n/zh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 8c693f4d..fca206e1 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -11,7 +11,7 @@ "gopher": "Gopher", "media_proxy": "媒体代理", "scope_options": "可见范围设置", - "text_limit": "文本长度限制", + "text_limit": "文字數量限制", "title": "功能", "who_to_follow": "推荐关注" }, From 32ddb387360f84c134b3a5527fdfcd8db97d697d Mon Sep 17 00:00:00 2001 From: snow Date: Sat, 19 Sep 2020 15:57:50 +0000 Subject: [PATCH 36/93] Translated using Weblate (Chinese (Traditional)) Currently translated at 18.9% (125 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/ --- src/i18n/zh_Hant.json | 167 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 1 deletion(-) diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json index 0967ef42..d6ea9047 100644 --- a/src/i18n/zh_Hant.json +++ b/src/i18n/zh_Hant.json @@ -1 +1,166 @@ -{} +{ + "emoji": { + "unicode": "統一碼繪文字", + "custom": "自定義繪文字", + "add_emoji": "插入繪文字", + "search_emoji": "搜索繪文字", + "keep_open": "選擇器保持打開", + "emoji": "繪文字", + "stickers": "貼紙" + }, + "polls": { + "not_enough_options": "投票的選項太少", + "expired": "投票 {0} 前已結束", + "expires_in": "投票於 {0} 內結束", + "expiry": "投票期限", + "multiple_choices": "多選", + "single_choice": "單選", + "type": "問卷類型", + "vote": "投票", + "votes": "票", + "option": "選項", + "add_option": "增加選項", + "add_poll": "增加投票" + }, + "notifications": { + "reacted_with": "和 {0} 互動過", + "migrated_to": "遷移到", + "no_more_notifications": "沒有更多的通知", + "repeated_you": "轉發了你的狀態", + "read": "已閱!", + "notifications": "通知", + "load_older": "載入更早的通知", + "follow_request": "想要關注你", + "followed_you": "關注了你", + "favorited_you": "喜歡了你的狀態", + "broken_favorite": "未知的狀態,正在搜索中…" + }, + "nav": { + "chats": "聊天", + "timelines": "時間線", + "preferences": "偏好設置", + "who_to_follow": "推薦關注", + "search": "搜索", + "user_search": "用戶搜索", + "bookmarks": "書籤", + "twkn": "已知網絡", + "timeline": "時間線", + "public_tl": "公共時間線", + "dms": "私信", + "interactions": "互動", + "mentions": "提及", + "friend_requests": "關注請求", + "back": "後退", + "administration": "管理", + "about": "關於" + }, + "media_modal": { + "next": "往後", + "previous": "往前" + }, + "login": { + "heading": { + "recovery": "雙重因素恢復", + "totp": "雙重因素驗證" + }, + "recovery_code": "恢復碼", + "enter_two_factor_code": "輸入一個雙重因素驗證碼", + "enter_recovery_code": "輸入一個恢復碼", + "authentication_code": "驗證碼", + "hint": "登錄後加入討論", + "username": "用戶名", + "register": "註冊", + "placeholder": "例:鈴音", + "password": "密碼", + "logout": "登出", + "description": "用 OAuth 登入", + "login": "登入" + }, + "importer": { + "error": "導入此文件時出現一個錯誤。", + "success": "導入成功。", + "submit": "提交" + }, + "image_cropper": { + "cancel": "取消", + "save_without_cropping": "保存不裁剪", + "save": "保存", + "crop_picture": "裁剪圖片" + }, + "general": { + "peek": "窺視", + "close": "關閉", + "verify": "驗證", + "confirm": "確認", + "enable": "啟用", + "disable": "禁用", + "cancel": "取消", + "dismiss": "忽略", + "show_less": "收起", + "show_more": "展開", + "optional": "可選", + "retry": "再試", + "error_retry": "請再試", + "generic_error": "發生一個錯誤", + "loading": "載入中…", + "more": "更多", + "submit": "提交", + "apply": "應用" + }, + "finder": { + "find_user": "尋找用戶", + "error_fetching_user": "獲取用戶時發生錯誤" + }, + "features_panel": { + "who_to_follow": "推薦關注", + "title": "特色", + "text_limit": "文字數量限制", + "scope_options": "可見範圍設置", + "media_proxy": "媒體代理", + "pleroma_chat_messages": "Pleroma 聊天", + "chat": "聊天" + }, + "exporter": { + "processing": "正在處理,稍後會提示您下載文件", + "export": "導出" + }, + "domain_mute_card": { + "unmute_progress": "取消靜音中…", + "unmute": "取消靜音", + "mute_progress": "靜音中…", + "mute": "靜音" + }, + "shoutbox": { + "title": "留言板" + }, + "about": { + "staff": "職員", + "mrf": { + "simple": { + "media_nsfw_desc": "這個實例強迫以下實例的帖子媒體設定為敏感:", + "media_nsfw": "媒體強制設定為敏感", + "media_removal_desc": "這個實例移除以下實例的帖子媒體:", + "media_removal": "移除媒體", + "ftl_removal_desc": "這個實例在所有已知網絡中移除下列實例:", + "ftl_removal": "從所有已知網路中移除", + "quarantine_desc": "本實例只會把公開帖子發送到下列實例:", + "quarantine": "隔離", + "reject_desc": "本實例不會接收來自下列實例的消息:", + "reject": "拒絕", + "accept_desc": "本實例只接收來自下列實例的消息:", + "simple_policies": "站規", + "accept": "接受" + }, + "mrf_policies_desc": "MRF 策略會影響本實例的互通行為。以下策略已啟用:", + "keyword": { + "ftl_removal": "從“所有已知網絡”時間軸中刪除", + "replace": "取代", + "reject": "拒絕", + "is_replaced_by": "→", + "keyword_policies": "關鍵字政策" + }, + "mrf_policies": "已啟用的MRF政策", + "federation": "聯邦" + } + } +} From 887ff4dec3e9d8a2cabb8e02374a275e5af23d27 Mon Sep 17 00:00:00 2001 From: Kana Date: Sun, 20 Sep 2020 00:38:06 +0000 Subject: [PATCH 37/93] Translated using Weblate (Chinese (Simplified)) Currently translated at 90.0% (595 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/ --- src/i18n/zh.json | 73 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/src/i18n/zh.json b/src/i18n/zh.json index fca206e1..1deeed35 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -13,7 +13,8 @@ "scope_options": "可见范围设置", "text_limit": "文字數量限制", "title": "功能", - "who_to_follow": "推荐关注" + "who_to_follow": "推荐关注", + "pleroma_chat_messages": "Pleroma 聊天" }, "finder": { "error_fetching_user": "获取用户时发生错误", @@ -32,7 +33,12 @@ "enable": "启用", "confirm": "确认", "verify": "验证", - "dismiss": "忽略" + "dismiss": "忽略", + "peek": "窥探", + "close": "关闭", + "retry": "重试", + "error_retry": "请重试", + "loading": "载入中…" }, "image_cropper": { "crop_picture": "裁剪图片", @@ -77,12 +83,15 @@ "dms": "私信", "public_tl": "公共时间线", "timeline": "时间线", - "twkn": "所有已知网络", + "twkn": "已知网络", "user_search": "用户搜索", "search": "搜索", "who_to_follow": "推荐关注", "preferences": "偏好设置", - "administration": "管理员" + "administration": "管理员", + "chats": "聊天", + "timelines": "时间线", + "bookmarks": "书签" }, "notifications": { "broken_favorite": "未知的状态,正在搜索中…", @@ -146,7 +155,10 @@ "private": "仅关注者 - 只有关注了你的人能看到", "public": "公共 - 发送到公共时间轴", "unlisted": "不公开 - 不会发送到公共时间轴" - } + }, + "preview_empty": "空的", + "preview": "预览", + "media_description": "媒体描述" }, "registration": { "bio": "简介", @@ -350,7 +362,10 @@ "clear_opacity": "清除透明度", "load_theme": "加载主题", "help": { - "upgraded_from_v2": "PleromaFE 已升级,主题会和你记忆中的不太一样。" + "upgraded_from_v2": "PleromaFE 已升级,主题会和你记忆中的不太一样。", + "older_version_imported": "您导入的文件来自旧版本的 FE。", + "future_version_imported": "您导入的文件来自更高版本的 FE。", + "v2_imported": "您导入的文件是旧版 FE 的。我们尽可能保持兼容性,但还是可能出现不一致的情况。" }, "use_source": "新版本", "use_snapshot": "老版本", @@ -470,7 +485,29 @@ "notification_visibility_emoji_reactions": "互动", "notification_visibility_moves": "用户迁移", "new_email": "新邮箱", - "emoji_reactions_on_timeline": "在时间线上显示表情符号互动" + "emoji_reactions_on_timeline": "在时间线上显示表情符号互动", + "notification_setting_hide_notification_contents": "隐藏推送通知中的发送者与内容信息", + "notification_setting_block_from_strangers": "屏蔽来自你没有关注的用户的通知", + "type_domains_to_mute": "搜索需要隐藏的域名", + "useStreamingApi": "实时接收发布以及通知", + "user_mutes": "用户", + "reset_background_confirm": "您确定要重置个人资料背景图吗?", + "reset_banner_confirm": "您确定要重置横幅图片吗?", + "reset_avatar_confirm": "您确定要重置头像吗?", + "reset_profile_banner": "重置横幅图片", + "reset_profile_background": "重置个人资料背景图", + "reset_avatar": "重置头像", + "hide_followers_count_description": "不显示关注者数量", + "profile_fields": { + "value": "内容", + "name": "标签", + "add_field": "添加字段" + }, + "accent": "强调色", + "pad_emoji": "从表情符号选择器插入表情符号时,在表情两侧插入空格", + "discoverable": "允许通过搜索检索等服务找到此账号", + "mutes_and_blocks": "隐藏与屏蔽", + "bot": "这是一个机器人账号" }, "time": { "day": "{0} 天", @@ -628,7 +665,7 @@ }, "search": { "people": "人", - "hashtags": "Hashtags", + "hashtags": "话题标签", "person_talking": "{count} 人正在讨论", "people_talking": "{count} 人正在讨论", "no_results": "没有搜索结果" @@ -655,7 +692,9 @@ "custom": "自定义表情符号", "add_emoji": "插入表情符号", "search_emoji": "搜索表情符号", - "emoji": "表情符号" + "emoji": "表情符号", + "load_all": "加载所有表情符号(共 {emojiAmount} 个)", + "load_all_hint": "最先加载的 {saneAmount} 表情符号,加载全部表情符号可能会带来性能问题。" }, "about": { "mrf": { @@ -667,7 +706,12 @@ "accept_desc": "本实例只接收来自下列实例的消息:", "simple_policies": "站规", "accept": "接受", - "media_removal": "移除媒体" + "media_removal": "移除媒体", + "media_nsfw_desc": "本实例将来自以下实例的媒体强制设置为敏感内容:", + "media_nsfw": "强制设置媒体为敏感内容", + "media_removal_desc": "本实例移除了来自以下实例的媒体内容:", + "ftl_removal_desc": "该实例在从“全部已知网络”时间线上移除了:", + "ftl_removal": "从“全部已知网络”时间线上移除" }, "mrf_policies_desc": "MRF 策略会影响本实例的互通行为。以下策略已启用:", "mrf_policies": "已启动 MRF 策略", @@ -679,12 +723,19 @@ "reject": "拒绝" }, "federation": "联邦" - } + }, + "staff": "管理人员" }, "domain_mute_card": { "unmute_progress": "正在取消隐藏…", "unmute": "取消隐藏", "mute_progress": "隐藏中…", "mute": "隐藏" + }, + "errors": { + "storage_unavailable": "Pleroma 无法访问浏览器储存。您的登陆以及本地设置将不会被保存,您也可能遇到未知问题。请尝试启用 cookies。" + }, + "shoutbox": { + "title": "留言板" } } From c55e09a513c403b980b941f24ad66a0cbd6d2e06 Mon Sep 17 00:00:00 2001 From: Snow Date: Sun, 20 Sep 2020 00:50:22 +0000 Subject: [PATCH 38/93] Translated using Weblate (Chinese (Traditional)) Currently translated at 67.1% (444 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/ --- src/i18n/zh_Hant.json | 412 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 409 insertions(+), 3 deletions(-) diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json index d6ea9047..21c1e538 100644 --- a/src/i18n/zh_Hant.json +++ b/src/i18n/zh_Hant.json @@ -6,7 +6,9 @@ "search_emoji": "搜索繪文字", "keep_open": "選擇器保持打開", "emoji": "繪文字", - "stickers": "貼紙" + "stickers": "貼紙", + "load_all": "加載所有繪文字(共 {emojiAmount} 個)", + "load_all_hint": "最先加載的 {saneAmount} ,加載全部繪文字可能會帶來性能問題。" }, "polls": { "not_enough_options": "投票的選項太少", @@ -118,7 +120,8 @@ "scope_options": "可見範圍設置", "media_proxy": "媒體代理", "pleroma_chat_messages": "Pleroma 聊天", - "chat": "聊天" + "chat": "聊天", + "gopher": "Gopher" }, "exporter": { "processing": "正在處理,稍後會提示您下載文件", @@ -153,7 +156,7 @@ }, "mrf_policies_desc": "MRF 策略會影響本實例的互通行為。以下策略已啟用:", "keyword": { - "ftl_removal": "從“所有已知網絡”時間軸中刪除", + "ftl_removal": "從“全部已知網絡”時間線上移除", "replace": "取代", "reject": "拒絕", "is_replaced_by": "→", @@ -162,5 +165,408 @@ "mrf_policies": "已啟用的MRF政策", "federation": "聯邦" } + }, + "settings": { + "style": { + "common": { + "color": "顏色", + "contrast": { + "context": { + "18pt": "大字文本 (18pt+)" + }, + "level": { + "aaa": "符合 AAA 等級準則(推薦)", + "aa": "符合 AA 等級準則(最低)" + }, + "hint": "對比度是 {ratio}, 它 {level} {context}" + }, + "opacity": "透明度" + }, + "advanced_colors": { + "faint_text": "灰度文字", + "alert_error": "錯誤" + }, + "preview": { + "header_faint": "這很正常" + }, + "shadows": { + "override": "覆寫" + }, + "switcher": { + "use_snapshot": "舊版", + "load_theme": "載入主題", + "keep_color": "保留顏色", + "keep_shadows": "保留陰影", + "keep_opacity": "保留透明度", + "keep_roundness": "保留圓角" + }, + "fonts": { + "components": { + "interface": "界面" + } + } + }, + "notification_setting_block_from_strangers": "屏蔽來自你沒有關注的用戶的通知", + "user_mutes": "用户", + "hide_followers_count_description": "不顯示關注者數量", + "no_rich_text_description": "不顯示富文本格式", + "notification_visibility_moves": "用戶遷移", + "notification_visibility_repeats": "轉發", + "notification_visibility_mentions": "提及", + "notification_visibility_likes": "點贊", + "interfaceLanguage": "界面語言", + "instance_default": "(默認:{value})", + "inputRadius": "輸入框", + "import_theme": "導入預置主題", + "import_followers_from_a_csv_file": "從 csv 文件中導入關注", + "import_blocks_from_a_csv_file": "從 csv 文件中導入封鎖黑名單名單", + "hide_filtered_statuses": "隱藏過濾的狀態", + "lock_account_description": "你需要手動審核關注請求", + "loop_video": "循環視頻", + "loop_video_silent_only": "只循環沒有聲音的視頻(例如:Mastodon 裡的“GIF”)", + "mutes_tab": "靜音", + "play_videos_in_modal": "在彈出框內播放視頻", + "profile_fields": { + "add_field": "添加字段", + "name": "標籤", + "value": "內容" + }, + "use_contain_fit": "生成縮略圖時不要裁剪附件", + "notification_visibility": "要顯示的通知類型", + "notification_visibility_follows": "關注", + "new_email": "新電郵", + "subject_line_mastodon": "比如mastodon: copy as is", + "reset_background_confirm": "您確定要重置個人資料背景圖嗎?", + "reset_banner_confirm": "您確定要重置橫幅圖片嗎?", + "reset_avatar_confirm": "您確定要重置頭像嗎?", + "reset_profile_banner": "重置橫幅圖片", + "reset_profile_background": "重置個人資料背景圖", + "reset_avatar": "重置頭像", + "discoverable": "允許通過搜索檢索等服務找到此賬號", + "delete_account_error": "刪除賬戶時發生錯誤,如果一直刪除不了,請聯繫實例管理員。", + "composing": "正在書寫", + "chatMessageRadius": "聊天訊息", + "mfa": { + "confirm_and_enable": "確認並啟用OTP", + "setup_otp": "設置OTP", + "otp": "OTP", + "wait_pre_setup_otp": "預設OTP", + "verify": { + "desc": "要啟用雙因素驗證,請把你的雙因素驗證 app 裡的數字輸入:" + }, + "scan": { + "secret_code": "密鑰", + "desc": "使用你的雙因素驗證 app,掃瞄這個二維碼,或者輸入這些文字密鑰:", + "title": "掃瞄" + }, + "authentication_methods": "身份驗證方法", + "recovery_codes_warning": "抄寫這些號碼,或者保存在安全的地方。這些號碼不會再次顯示。如果你無法訪問你的 2FA app,也丟失了你的恢復碼,你的賬號就再也無法登錄了。", + "waiting_a_recovery_codes": "正在接收備份碼…", + "recovery_codes": "恢復碼。", + "warning_of_generate_new_codes": "當你生成新的恢復碼時,你的舊恢復碼就失效了。", + "generate_new_recovery_codes": "生成新的恢復碼", + "title": "雙因素驗證" + }, + "new_password": "新密碼", + "name_bio": "名字及簡介", + "name": "名字", + "domain_mutes": "域名", + "delete_account_instructions": "在下面輸入密碼,以確認刪除帳戶。", + "delete_account_description": "永久刪除你的帳號和所有數據。", + "delete_account": "刪除帳戶", + "default_vis": "默認可見性範圍", + "data_import_export_tab": "數據導入/導出", + "mutes_and_blocks": "靜音與封鎖", + "current_password": "當前密碼", + "confirm_new_password": "確認新密碼", + "collapse_subject": "摺疊帶標題的內容", + "checkboxRadius": "複選框", + "instance_default_simple": "(默認)", + "interface": "界面", + "invalid_theme_imported": "您所選擇的主題文件不被 Pleroma 支持,因此主題未被修改。", + "limited_availability": "在您的瀏覽器中無法使用", + "links": "鏈接", + "changed_password": "成功修改了密碼!", + "change_password_error": "修改密碼的時候出了點問題。", + "change_password": "修改密碼", + "changed_email": "郵箱修改成功!", + "bot": "這是一個機器人賬號", + "change_email": "修改電子郵箱", + "cRed": "紅色(取消)", + "cOrange": "橙色(收藏)", + "cGreen": "綠色(轉發)", + "cBlue": "藍色(回覆,關注)", + "btnRadius": "按鈕", + "notification_visibility_emoji_reactions": "互動", + "no_blocks": "沒有封鎖", + "no_mutes": "沒有靜音", + "hide_follows_description": "不要顯示我所關注的人", + "hide_followers_description": "不要顯示關注我的人", + "hide_follows_count_description": "不顯示關注數", + "nsfw_clickthrough": "將敏感附件隱藏,點擊才能打開", + "valid_until": "有效期至", + "panelRadius": "面板", + "pause_on_unfocused": "在離開頁面時暫停時間線推送", + "notifications": "通知", + "notification_setting_filters": "過濾器", + "notification_setting_privacy": "隱私", + "notification_mutes": "要停止收到某個指定的用戶的通知,請使用靜音功能。", + "notification_blocks": "封鎖一個用戶會停掉所有他的通知,等同於取消關注。", + "enable_web_push_notifications": "啟用 web 推送通知", + "presets": "預置", + "profile_background": "個人背景圖", + "profile_banner": "橫幅圖片", + "profile_tab": "個人資料", + "radii_help": "設置界面邊緣的圓角 (單位:像素)", + "reply_visibility_all": "顯示所有回覆", + "autohide_floating_post_button": "自動隱藏新帖子的按鈕(移動設備)", + "saving_err": "保存設置時發生錯誤", + "saving_ok": "設置已保存", + "search_user_to_block": "搜索你想屏蔽的用戶", + "search_user_to_mute": "搜索你想要隱藏的用戶", + "security_tab": "安全", + "set_new_avatar": "設置新頭像", + "set_new_profile_background": "設置新的個人背景", + "set_new_profile_banner": "設置新的個人橫幅", + "settings": "設置", + "subject_input_always_show": "總是顯示主題框", + "subject_line_behavior": "回覆時複製主題", + "subject_line_email": "比如電郵: \"re: 主題\"", + "subject_line_noop": "不要複製", + "post_status_content_type": "發帖內容類型", + "stop_gifs": "鼠標懸停時播放GIF", + "streaming": "開啟滾動到頂部時的自動推送", + "text": "文本", + "theme": "主題", + "theme_help": "使用十六進制代碼(#rrggbb)來設置主題顏色。", + "theme_help_v2_1": "你也可以通過切換複選框來覆蓋某些組件的顏色和透明。使用“清除所有”來清楚所有覆蓋設置。", + "theme_help_v2_2": "某些條目下的圖標是背景或文本對比指示器,鼠標懸停可以獲取詳細信息。請記住,使用透明度來顯示最差的情況。", + "tooltipRadius": "提醒", + "upload_a_photo": "上傳照片", + "user_settings": "用戶設置", + "values": { + "false": "否", + "true": "是" + }, + "avatar_size_instruction": "推薦的頭像圖片最小的尺寸是 150x150 像素。", + "emoji_reactions_on_timeline": "在時間線上顯示繪文字互動", + "export_theme": "導出預置主題", + "filtering": "過濾", + "filtering_explanation": "所有包含以下詞彙的內容都會被隱藏,一行一個", + "follow_export": "導出關注", + "follow_export_button": "將關注導出成 csv 文件", + "follow_import": "導入關注", + "follow_import_error": "導入關注時錯誤", + "follows_imported": "關注已導入!尚需要一些時間來處理。", + "hide_attachments_in_convo": "在對話中隱藏附件", + "hide_attachments_in_tl": "在時間線上隱藏附件", + "hide_muted_posts": "不顯示被靜音的用戶的帖子", + "max_thumbnails": "最多每個帖子所能顯示的縮略圖數量", + "hide_isp": "隱藏指定實例的面板", + "preload_images": "預載圖片", + "use_one_click_nsfw": "點擊一次以打開工作場所不適宜的附件", + "hide_post_stats": "隱藏帖子的統計數據(例如:收藏的次數)", + "hide_user_stats": "隱藏用戶的統計數據(例如:關注者的數量)", + "general": "通用", + "foreground": "前景", + "blocks_tab": "封鎖", + "blocks_imported": "封鎖黑名單導入成功!需要一點時間來處理。", + "block_import_error": "導入封鎖黑名單出錯", + "block_import": "封鎖黑名單導入", + "block_export_button": "導出你的封鎖黑名單到一個 csv 文件", + "block_export": "封鎖黑名單導出", + "bio": "簡介", + "background": "背景", + "avatarRadius": "頭像", + "avatarAltRadius": "頭像(通知)", + "avatar": "頭像", + "attachments": "附件", + "attachmentRadius": "附件", + "allow_following_move": "正在關注的賬號遷移時自動重新關注", + "enter_current_password_to_confirm": "輸入你當前密碼來確認你的身份", + "security": "安全", + "app_name": "App 名稱", + "change_email_error": "修改你的電子郵箱時發生錯誤。", + "type_domains_to_mute": "搜索需要隱藏的域名" + }, + "chats": { + "more": "更多", + "delete_confirm": "您確實要刪除此消息嗎?", + "error_loading_chat": "加載聊天時出了點問題。", + "error_sending_message": "發送消息時出了點問題。", + "empty_chat_list_placeholder": "您還沒有任何聊天記錄。 開始新的聊天!", + "new": "新聊天", + "empty_message_error": "無法發布空消息" + }, + "file_type": { + "audio": "音頻", + "video": "視頻", + "image": "图片", + "file": "檔案" + }, + "display_date": { + "today": "今天" + }, + "status": { + "mute_conversation": "靜音對話", + "replies_list": "回覆:", + "reply_to": "回覆", + "pin": "在個人資料置頂", + "unpin": "取消在個人資料置頂" + }, + "time": { + "hours": "{0} 小時", + "days_short": "{0}天", + "day_short": "{0}天", + "days": "{0} 天", + "hour": "{0} 小时", + "hour_short": "{0}h", + "hours_short": "{0}h", + "years_short": "{0} y", + "now": "剛剛" + }, + "post_status": { + "media_description_error": "無法更新媒體,請重試", + "media_description": "媒體描述", + "scope": { + "unlisted": "不公開 - 不會發送到公共時間軸", + "public": "公共 - 發送到公共時間軸", + "private": "僅關注者 - 只有關注了你的人能看到", + "direct": "私信 - 只發送給被提及的用戶" + }, + "scope_notice": { + "unlisted": "本條內容既不在公共時間線,也不會在所有已知網絡上可見", + "private": "關注你的人才能看到本條內容", + "public": "本條帖子可以被所有人看到" + }, + "preview_empty": "空的", + "preview": "預覽", + "posting": "正在發送", + "direct_warning_to_first_only": "本條內容只有被在消息開始處提及的用戶能夠看到。", + "direct_warning_to_all": "本條內容只有被提及的用戶能夠看到。", + "account_not_locked_warning": "你的帳號沒有 {0}。任何人都可以關注你並瀏覽你的上鎖內容。", + "new_status": "發佈新狀態", + "content_warning": "主題(可選)", + "content_type": { + "text/bbcode": "BBCode", + "text/markdown": "Markdown", + "text/html": "HTML", + "text/plain": "純文本" + }, + "attachments_sensitive": "標記附件為敏感內容", + "account_not_locked_warning_link": "上鎖", + "default": "剛剛抵達洛杉磯。" + }, + "errors": { + "storage_unavailable": "Pleroma無法訪問瀏覽器存儲。您的登錄名或本地設置將不會保存,您可能會遇到意外問題。嘗試啟用Cookie。" + }, + "timeline": { + "error_fetching": "獲取更新時發生錯誤", + "conversation": "對話" + }, + "interactions": { + "load_older": "載入更早的互動", + "moves": "用戶遷移", + "follows": "新的關注者", + "favs_repeats": "轉發和收藏" + }, + "selectable_list": { + "select_all": "選擇全部" + }, + "remote_user_resolver": { + "error": "未找到。", + "searching_for": "搜索", + "remote_user_resolver": "遠程用戶解析器" + }, + "registration": { + "validations": { + "password_confirmation_match": "不能和密碼一樣", + "password_confirmation_required": "不能留空", + "password_required": "不能留空", + "email_required": "不能留空", + "fullname_required": "不能留空", + "username_required": "不能留空" + }, + "fullname": "顯示名稱", + "bio_placeholder": "例如:\n你好,我是玲音。\n我是一個住在日本郊區的動畫少女。你可能在 Wired 見過我。", + "fullname_placeholder": "例如:岩倉玲音", + "username_placeholder": "例如:玲音", + "new_captcha": "點擊圖片獲取新的驗證碼", + "captcha": "CAPTCHA", + "token": "邀請碼", + "registration": "註冊", + "password_confirm": "確認密碼", + "email": "電子郵箱", + "bio": "簡介" + }, + "user_card": { + "its_you": "就是你!!", + "media": "媒體", + "per_day": "每天", + "remote_follow": "跨站關注", + "subscribe": "訂閱", + "mute_progress": "靜音中…", + "admin_menu": { + "delete_account": "刪除賬號", + "delete_user": "刪除用戶", + "delete_user_confirmation": "你確認嗎?此操作無法撤銷。" + } + }, + "user_profile": { + "timeline_title": "用戶時間線", + "profile_does_not_exist": "抱歉,此個人資料不存在。", + "profile_loading_error": "抱歉,載入個人資料時出錯。" + }, + "user_reporting": { + "title": "報告 {0}", + "add_comment_description": "此報告會發送給你的實例管理員。你可以在下面提供更多詳細信息解釋報告的緣由:", + "forward_to": "轉發 {0}", + "submit": "提交", + "generic_error": "當處理你的請求時,發生了一個錯誤。" + }, + "who_to_follow": { + "more": "更多", + "who_to_follow": "推薦關注" + }, + "tool_tip": { + "media_upload": "上傳多媒體", + "repeat": "轉發", + "favorite": "喜歡", + "add_reaction": "添加互動", + "reply": "回覆", + "user_settings": "用戶設置", + "accept_follow_request": "接受關注請求", + "reject_follow_request": "拒絕關注請求" + }, + "upload": { + "file_size_units": { + "B": "B", + "KiB": "KiB", + "TiB": "TiB", + "MiB": "MiB", + "GiB": "GiB" + }, + "error": { + "base": "上傳失敗。", + "file_too_big": "文件太大[{filesize} {filesizeunit} / {allowedsize} {allowedsizeunit}]", + "default": "稍後再試" + } + }, + "search": { + "people": "人", + "hashtags": "標籤", + "person_talking": "{count} 人正在討論", + "people_talking": "{count} 人正在討論", + "no_results": "沒有搜索結果" + }, + "password_reset": { + "forgot_password": "忘記密碼了?", + "password_reset": "重置密碼", + "instruction": "輸入你的電郵地址或者用戶名,我們將發送一個鏈接到你的郵箱,用於重置密碼。", + "placeholder": "你的電郵地址或者用戶名", + "check_email": "檢查你的郵箱,會有一個鏈接用於重置密碼。", + "return_home": "回到首頁", + "too_many_requests": "你觸發了嘗試的限制,請稍後再試。", + "password_reset_disabled": "密碼重置已經被禁用。請聯繫你的實例管理員。" } } From beec425cce09313b35a81dbf94587ce647616287 Mon Sep 17 00:00:00 2001 From: Kana Date: Sun, 20 Sep 2020 12:00:04 +0000 Subject: [PATCH 39/93] Translated using Weblate (Chinese (Simplified)) Currently translated at 90.4% (598 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/ --- src/i18n/zh.json | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 1deeed35..74ba29f0 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -158,7 +158,9 @@ }, "preview_empty": "空的", "preview": "预览", - "media_description": "媒体描述" + "media_description": "媒体描述", + "media_description_error": "更新媒体失败,请重试", + "empty_status_error": "不能发布没有内容、没有附件的状态" }, "registration": { "bio": "简介", @@ -501,13 +503,17 @@ "profile_fields": { "value": "内容", "name": "标签", - "add_field": "添加字段" + "add_field": "添加字段", + "label": "个人资料元数据" }, "accent": "强调色", "pad_emoji": "从表情符号选择器插入表情符号时,在表情两侧插入空格", "discoverable": "允许通过搜索检索等服务找到此账号", "mutes_and_blocks": "隐藏与屏蔽", - "bot": "这是一个机器人账号" + "bot": "这是一个机器人账号", + "fun": "幽默", + "useStreamingApiWarning": "(不推荐,试验性,已知会跳过消息)", + "chatMessageRadius": "聊天消息" }, "time": { "day": "{0} 天", @@ -733,7 +739,7 @@ "mute": "隐藏" }, "errors": { - "storage_unavailable": "Pleroma 无法访问浏览器储存。您的登陆以及本地设置将不会被保存,您也可能遇到未知问题。请尝试启用 cookies。" + "storage_unavailable": "Pleroma 无法访问浏览器储存。您的登陆名以及本地设置将不会被保存,您可能遇到意外问题。请尝试启用 cookies。" }, "shoutbox": { "title": "留言板" From 970bfa2bdd2d28eb9a1536350ac100a97d40eb79 Mon Sep 17 00:00:00 2001 From: Kana Date: Sun, 20 Sep 2020 12:10:50 +0000 Subject: [PATCH 40/93] Translated using Weblate (Chinese (Simplified)) Currently translated at 97.7% (646 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/ --- src/i18n/zh.json | 75 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 74ba29f0..c11dbae2 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -367,7 +367,14 @@ "upgraded_from_v2": "PleromaFE 已升级,主题会和你记忆中的不太一样。", "older_version_imported": "您导入的文件来自旧版本的 FE。", "future_version_imported": "您导入的文件来自更高版本的 FE。", - "v2_imported": "您导入的文件是旧版 FE 的。我们尽可能保持兼容性,但还是可能出现不一致的情况。" + "v2_imported": "您导入的文件是旧版 FE 的。我们尽可能保持兼容性,但还是可能出现不一致的情况。", + "snapshot_source_mismatch": "版本冲突:很有可能是 FE 版本回滚后再次升级了,如果您使用旧版本的 FE 更改了主题那么您可能需要使用旧版本,否则请使用新版本。", + "migration_napshot_gone": "不知出于何种原因,主题快照缺失了,一些地方可能与您印象中的不符。", + "migration_snapshot_ok": "为保万无一失,加载了主题快照。您可以试着加载主题数据。", + "fe_downgraded": "PleromaFE 的版本回滚了。", + "fe_upgraded": "PleromaFE 的主题引擎随着版本更新升级了。", + "snapshot_missing": "在文件中没有主题快照,所以网站外观可能会与原来预想的不同。", + "snapshot_present": "已加载了主题快照,因此所有的值被覆盖了。你可以改为加载主题的实际数据。" }, "use_source": "新版本", "use_snapshot": "老版本", @@ -406,7 +413,23 @@ "borders": "边框", "buttons": "按钮", "inputs": "输入框", - "faint_text": "灰度文字" + "faint_text": "灰度文字", + "chat": { + "border": "边框", + "outgoing": "发出的", + "incoming": "收到的" + }, + "disabled": "禁用的", + "pressed": "按下的", + "highlight": "强调元素", + "selectedMenu": "选中的菜单项", + "selectedPost": "选中的发布内容", + "icons": "图标", + "poll": "投票统计图", + "popover": "提示框,菜单,弹出框", + "post": "发布内容/用户简介", + "alert_neutral": "中性", + "alert_warning": "警告" }, "radii": { "_tab_label": "圆角" @@ -513,7 +536,8 @@ "bot": "这是一个机器人账号", "fun": "幽默", "useStreamingApiWarning": "(不推荐,试验性,已知会跳过消息)", - "chatMessageRadius": "聊天消息" + "chatMessageRadius": "聊天消息", + "greentext": "玩梗箭头" }, "time": { "day": "{0} 天", @@ -572,7 +596,16 @@ "reply_to": "回复", "replies_list": "回复:", "mute_conversation": "隐藏对话", - "unmute_conversation": "对话取消隐藏" + "unmute_conversation": "对话取消隐藏", + "hide_content": "隐藏内容", + "show_content": "显示内容", + "hide_full_subject": "隐藏此部分标题", + "show_full_subject": "显示全部标题", + "thread_muted": "此系列消息已被隐藏", + "copy_link": "复制状态链接", + "status_unavailable": "状态不可取得", + "unbookmark": "取消书签", + "bookmark": "书签" }, "user_card": { "approve": "允许", @@ -626,7 +659,9 @@ }, "hidden": "已隐藏", "show_repeats": "显示转发", - "hide_repeats": "隐藏转发" + "hide_repeats": "隐藏转发", + "message": "消息", + "mention": "提及" }, "user_profile": { "timeline_title": "用户时间线", @@ -653,7 +688,9 @@ "favorite": "收藏", "user_settings": "用户设置", "reject_follow_request": "拒绝关注请求", - "add_reaction": "添加互动" + "add_reaction": "添加互动", + "bookmark": "书签", + "accept_follow_request": "接受关注请求" }, "upload": { "error": { @@ -684,7 +721,9 @@ "check_email": "检查你的邮箱,会有一个链接用于重置密码。", "return_home": "回到首页", "too_many_requests": "你触发了尝试的限制,请稍后再试。", - "password_reset_disabled": "密码重置已经被禁用。请联系你的实例管理员。" + "password_reset_disabled": "密码重置已经被禁用。请联系你的实例管理员。", + "password_reset_required_but_mailer_is_disabled": "您必须重置密码,但是密码重置被禁用了。请联系您所在实例的管理员。", + "password_reset_required": "您必须重置密码才能登陆。" }, "remote_user_resolver": { "error": "未找到。", @@ -743,5 +782,27 @@ }, "shoutbox": { "title": "留言板" + }, + "display_date": { + "today": "今天" + }, + "file_type": { + "file": "文件", + "image": "图片", + "video": "视频", + "audio": "音频" + }, + "chats": { + "empty_chat_list_placeholder": "您还没有任何聊天记录。开始聊天吧!", + "error_sending_message": "发送消息时出了点问题。", + "error_loading_chat": "加载聊天时出了点问题。", + "delete_confirm": "您确实要删除此消息吗?", + "more": "更多", + "empty_message_error": "无法发布空消息", + "new": "新聊天", + "chats": "聊天", + "delete": "删除", + "message_user": "发消息给 {nickname}", + "you": "你:" } } From b3e1cb81a3128835f9da85d7df4a9d5c8337d352 Mon Sep 17 00:00:00 2001 From: Snow Date: Mon, 21 Sep 2020 07:05:18 +0000 Subject: [PATCH 41/93] Translated using Weblate (Chinese (Traditional)) Currently translated at 72.1% (477 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/ --- src/i18n/zh_Hant.json | 47 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json index 21c1e538..0cd79973 100644 --- a/src/i18n/zh_Hant.json +++ b/src/i18n/zh_Hant.json @@ -172,11 +172,13 @@ "color": "顏色", "contrast": { "context": { - "18pt": "大字文本 (18pt+)" + "18pt": "大字文本 (18pt+)", + "text": "文本" }, "level": { "aaa": "符合 AAA 等級準則(推薦)", - "aa": "符合 AA 等級準則(最低)" + "aa": "符合 AA 等級準則(最低)", + "bad": "不符合任何輔助功能指南" }, "hint": "對比度是 {ratio}, 它 {level} {context}" }, @@ -184,7 +186,11 @@ }, "advanced_colors": { "faint_text": "灰度文字", - "alert_error": "錯誤" + "alert_error": "錯誤", + "badge_notification": "通知", + "alert": "提醒或警告背景色", + "_tab_label": "高级", + "alert_warning": "警告" }, "preview": { "header_faint": "這很正常" @@ -198,12 +204,33 @@ "keep_color": "保留顏色", "keep_shadows": "保留陰影", "keep_opacity": "保留透明度", - "keep_roundness": "保留圓角" + "keep_roundness": "保留圓角", + "help": { + "migration_napshot_gone": "不知出於何種原因,主題快照缺失了,一些地方可能與您印象中的不符。", + "snapshot_source_mismatch": "版本衝突:很有可能是 FE 版本回滾後再次升級了,如果您使用舊版本的 FE 更改了主題那麼您可能需要使用舊版本,否則請使用新版本。", + "future_version_imported": "您導入的文件來自更高版本的 FE。", + "older_version_imported": "您導入的文件來自舊版本的 FE。", + "snapshot_missing": "在文件中沒有主題快照,所以網站外觀可能會與原來預想的不同。", + "fe_upgraded": "PleromaFE 的主題引擎隨著版本更新升級了。", + "fe_downgraded": "PleromaFE 的版本回滾了。", + "upgraded_from_v2": "PleromaFE 已升級,主題會和你記憶中的不太一樣。" + }, + "use_source": "新版本", + "keep_as_is": "保持原狀", + "clear_opacity": "清除透明度", + "clear_all": "清除全部", + "reset": "重置", + "keep_fonts": "保留字體" }, "fonts": { "components": { "interface": "界面" } + }, + "common_colors": { + "foreground_hint": "點擊”高級“ 標籤進行細緻的控制", + "main": "常用顏色", + "_tab_label": "共同" } }, "notification_setting_block_from_strangers": "屏蔽來自你沒有關注的用戶的通知", @@ -387,7 +414,17 @@ "security": "安全", "app_name": "App 名稱", "change_email_error": "修改你的電子郵箱時發生錯誤。", - "type_domains_to_mute": "搜索需要隱藏的域名" + "type_domains_to_mute": "搜索需要隱藏的域名", + "pad_emoji": "從表情符號選擇器插入表情符號時,在表情兩側插入空格", + "useStreamingApi": "實時接收發佈以及通知", + "minimal_scopes_mode": "最小發文範圍", + "scope_copy": "回覆時的複製範圍(私信是總是複製的)", + "reply_visibility_self": "只顯示發送給我的回覆", + "reply_visibility_following": "只顯示發送給我的回覆/發送給我關注的用戶的回覆", + "replies_in_timeline": "時間線中的回覆", + "revoke_token": "撤消", + "show_admin_badge": "顯示管理徽章", + "accent": "強調色" }, "chats": { "more": "更多", From 14a2328b85700095e4d92bad45dece35cb7668ef Mon Sep 17 00:00:00 2001 From: Snow Date: Wed, 23 Sep 2020 02:57:14 +0000 Subject: [PATCH 42/93] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (661 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/ --- src/i18n/zh_Hant.json | 248 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 221 insertions(+), 27 deletions(-) diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json index 0cd79973..9306b21a 100644 --- a/src/i18n/zh_Hant.json +++ b/src/i18n/zh_Hant.json @@ -28,13 +28,13 @@ "reacted_with": "和 {0} 互動過", "migrated_to": "遷移到", "no_more_notifications": "沒有更多的通知", - "repeated_you": "轉發了你的狀態", + "repeated_you": "轉發了你的發文", "read": "已閱!", "notifications": "通知", "load_older": "載入更早的通知", "follow_request": "想要關注你", "followed_you": "關注了你", - "favorited_you": "喜歡了你的狀態", + "favorited_you": "喜歡了你的發文", "broken_favorite": "未知的狀態,正在搜索中…" }, "nav": { @@ -146,7 +146,7 @@ "media_removal": "移除媒體", "ftl_removal_desc": "這個實例在所有已知網絡中移除下列實例:", "ftl_removal": "從所有已知網路中移除", - "quarantine_desc": "本實例只會把公開帖子發送到下列實例:", + "quarantine_desc": "本實例只會把公開發文發送到下列實例:", "quarantine": "隔離", "reject_desc": "本實例不會接收來自下列實例的消息:", "reject": "拒絕", @@ -190,13 +190,75 @@ "badge_notification": "通知", "alert": "提醒或警告背景色", "_tab_label": "高级", - "alert_warning": "警告" + "alert_warning": "警告", + "alert_neutral": "中性", + "post": "帖子/用戶簡介", + "badge": "徽章背景", + "popover": "提示框,菜單,彈出框", + "panel_header": "面板標題", + "top_bar": "頂欄", + "borders": "邊框", + "buttons": "按鈕", + "inputs": "輸入框", + "underlay": "底襯", + "poll": "投票統計圖", + "icons": "圖標", + "highlight": "強調元素", + "pressed": "按下", + "selectedPost": "選中的帖子", + "selectedMenu": "選中的菜單項", + "disabled": "關閉", + "toggled": "切換", + "tabs": "標籤", + "chat": { + "incoming": "收到", + "outgoing": "發出", + "border": "邊框" + } }, "preview": { - "header_faint": "這很正常" + "header_faint": "這很正常", + "header": "預覽", + "content": "內容", + "error": "例子錯誤", + "button": "按鈕", + "text": "有堆 {0} 和 {1}", + "mono": "內容", + "input": "剛剛抵達洛杉磯.", + "faint_link": "有用的手冊", + "fine_print": "閱讀我們的 {0} ,然而什麼有用的也學不到!", + "checkbox": "我已經瀏覽了條款及細則", + "link": "一個很好的小鏈接" }, "shadows": { - "override": "覆寫" + "override": "覆寫", + "_tab_label": "陰影和燈光", + "component": "組件", + "shadow_id": "陰影 #{value}", + "blur": "模糊", + "spread": "擴散", + "inset": "插圖", + "hintV3": "對於陰影,您還可以使用{0}表示法來使用其他顏色插槽。", + "filter_hint": { + "always_drop_shadow": "警告,此陰影設置會總是使用 {0} ,如果瀏覽器支持的話。", + "drop_shadow_syntax": "{0} 不支持參數 {1} 和關鍵詞 {2} 。", + "avatar_inset": "請注意組合兩個內部和非內部的陰影到頭像上,在透明頭像上可能會有意料之外的效果。", + "spread_zero": "陰影的擴散 > 0 會同設置成零一樣", + "inset_classic": "插入內部的陰影會使用 {0}" + }, + "components": { + "panel": "面板", + "panelHeader": "面板標題", + "topBar": "頂欄", + "avatar": "用戶頭像(在個人資料欄)", + "avatarStatus": "用戶頭像(在帖子顯示欄)", + "popup": "彈窗和工具提示", + "button": "按鈕", + "buttonHover": "按鈕(懸停)", + "buttonPressed": "按鈕(按下)", + "buttonPressedHover": "按鈕(按下和懸停)", + "input": "輸入框" + } }, "switcher": { "use_snapshot": "舊版", @@ -213,24 +275,41 @@ "snapshot_missing": "在文件中沒有主題快照,所以網站外觀可能會與原來預想的不同。", "fe_upgraded": "PleromaFE 的主題引擎隨著版本更新升級了。", "fe_downgraded": "PleromaFE 的版本回滾了。", - "upgraded_from_v2": "PleromaFE 已升級,主題會和你記憶中的不太一樣。" + "upgraded_from_v2": "PleromaFE 已升級,主題會和你記憶中的不太一樣。", + "v2_imported": "您導入的文件是舊版 FE 的。我們儘可能保持兼容性,但還是可能出現不一致的情況。", + "snapshot_present": "載入快照已加載,因此所有值均被覆蓋。 您可以改為載入主題實際數據。", + "migration_snapshot_ok": "為保萬無一失,載入了主題快照。您可以試著載入主題數據。" }, "use_source": "新版本", "keep_as_is": "保持原狀", "clear_opacity": "清除透明度", "clear_all": "清除全部", "reset": "重置", - "keep_fonts": "保留字體" + "keep_fonts": "保留字體", + "save_load_hint": "\"保留\" 選項在選擇或載入主題時保留當前設置的選項,在導出主題時還會存儲上述選項。當所有複選框未設置時,導出主題將保存所有內容。" }, "fonts": { "components": { - "interface": "界面" - } + "interface": "界面", + "input": "輸入框", + "post": "發帖文字", + "postCode": "帖子中使用等間距文字(富文本)" + }, + "_tab_label": "字體", + "help": "給用戶界面的元素選擇字體。選擇 “自選”的你必須輸入確切的字體名稱。", + "family": "字體名稱", + "size": "大小 (像素)", + "weight": "字重 (粗體))", + "custom": "自選" }, "common_colors": { "foreground_hint": "點擊”高級“ 標籤進行細緻的控制", "main": "常用顏色", - "_tab_label": "共同" + "_tab_label": "共同", + "rgbo": "圖標,強調,徽章" + }, + "radii": { + "_tab_label": "圓角" } }, "notification_setting_block_from_strangers": "屏蔽來自你沒有關注的用戶的通知", @@ -247,7 +326,7 @@ "import_theme": "導入預置主題", "import_followers_from_a_csv_file": "從 csv 文件中導入關注", "import_blocks_from_a_csv_file": "從 csv 文件中導入封鎖黑名單名單", - "hide_filtered_statuses": "隱藏過濾的狀態", + "hide_filtered_statuses": "隱藏過濾的發文", "lock_account_description": "你需要手動審核關注請求", "loop_video": "循環視頻", "loop_video_silent_only": "只循環沒有聲音的視頻(例如:Mastodon 裡的“GIF”)", @@ -256,7 +335,8 @@ "profile_fields": { "add_field": "添加字段", "name": "標籤", - "value": "內容" + "value": "內容", + "label": "個人資料元數據" }, "use_contain_fit": "生成縮略圖時不要裁剪附件", "notification_visibility": "要顯示的通知類型", @@ -360,7 +440,7 @@ "subject_line_behavior": "回覆時複製主題", "subject_line_email": "比如電郵: \"re: 主題\"", "subject_line_noop": "不要複製", - "post_status_content_type": "發帖內容類型", + "post_status_content_type": "發文內容類型", "stop_gifs": "鼠標懸停時播放GIF", "streaming": "開啟滾動到頂部時的自動推送", "text": "文本", @@ -415,7 +495,7 @@ "app_name": "App 名稱", "change_email_error": "修改你的電子郵箱時發生錯誤。", "type_domains_to_mute": "搜索需要隱藏的域名", - "pad_emoji": "從表情符號選擇器插入表情符號時,在表情兩側插入空格", + "pad_emoji": "從繪文字選擇器插入繪文字時,在繪文字兩側插入空格", "useStreamingApi": "實時接收發佈以及通知", "minimal_scopes_mode": "最小發文範圍", "scope_copy": "回覆時的複製範圍(私信是總是複製的)", @@ -424,7 +504,20 @@ "replies_in_timeline": "時間線中的回覆", "revoke_token": "撤消", "show_admin_badge": "顯示管理徽章", - "accent": "強調色" + "accent": "強調色", + "greentext": "前文箭頭", + "show_moderator_badge": "顯示主持人徽章", + "oauth_tokens": "OAuth代幣", + "token": "代幣", + "refresh_token": "刷新代幣", + "useStreamingApiWarning": "(不推薦使用,實驗性的,已知跳過文章)", + "fun": "有趣", + "notification_setting_hide_notification_contents": "隱藏推送通知中的發送者與內容信息", + "version": { + "title": "版本", + "backend_version": "後端版本", + "frontend_version": "前端版本" + } }, "chats": { "more": "更多", @@ -433,7 +526,11 @@ "error_sending_message": "發送消息時出了點問題。", "empty_chat_list_placeholder": "您還沒有任何聊天記錄。 開始新的聊天!", "new": "新聊天", - "empty_message_error": "無法發布空消息" + "empty_message_error": "無法發布空消息", + "you": "你:", + "message_user": "發消息給 {nickname}", + "delete": "刪除", + "chats": "聊天" }, "file_type": { "audio": "音頻", @@ -449,7 +546,23 @@ "replies_list": "回覆:", "reply_to": "回覆", "pin": "在個人資料置頂", - "unpin": "取消在個人資料置頂" + "unpin": "取消在個人資料置頂", + "favorites": "喜歡", + "repeats": "轉發", + "delete": "刪除發文", + "pinned": "置頂", + "bookmark": "書籤", + "unbookmark": "取消書籤", + "delete_confirm": "你真的想要刪除這條發文嗎?", + "unmute_conversation": "對話取消靜音", + "status_unavailable": "發文不可取得", + "copy_link": "複製發文鏈接", + "thread_muted": "静音線程", + "show_full_subject": "顯示完整標題", + "thread_muted_and_words": ",有这些字:", + "hide_full_subject": "隱藏完整標題", + "show_content": "顯示內容", + "hide_content": "隱藏內容" }, "time": { "hours": "{0} 小時", @@ -460,7 +573,30 @@ "hour_short": "{0}h", "hours_short": "{0}h", "years_short": "{0} y", - "now": "剛剛" + "now": "剛剛", + "day": "{0} 天", + "in_future": "還有 {0}", + "in_past": "{0} 之前", + "minute": "{0} 分鐘", + "minute_short": "{0} 分", + "minutes_short": "{0} 分", + "minutes": "{0} 分鐘", + "month": "{0} 月", + "months": "{0} 月", + "month_short": "{0} 月", + "months_short": "{0} 月", + "now_short": "剛剛", + "second": "{0} 秒", + "seconds": "{0} 秒", + "second_short": "{0} 秒", + "seconds_short": "{0} 秒", + "week": "{0}周", + "weeks": "{0}周", + "week_short": "{0}周", + "weeks_short": "{0}周", + "year": "{0} 年", + "years": "{0} 年", + "year_short": "{0}年" }, "post_status": { "media_description_error": "無法更新媒體,請重試", @@ -482,7 +618,7 @@ "direct_warning_to_first_only": "本條內容只有被在消息開始處提及的用戶能夠看到。", "direct_warning_to_all": "本條內容只有被提及的用戶能夠看到。", "account_not_locked_warning": "你的帳號沒有 {0}。任何人都可以關注你並瀏覽你的上鎖內容。", - "new_status": "發佈新狀態", + "new_status": "發佈新發文", "content_warning": "主題(可選)", "content_type": { "text/bbcode": "BBCode", @@ -492,14 +628,24 @@ }, "attachments_sensitive": "標記附件為敏感內容", "account_not_locked_warning_link": "上鎖", - "default": "剛剛抵達洛杉磯。" + "default": "剛剛抵達洛杉磯。", + "empty_status_error": "無法發佈沒有附件的空發文" }, "errors": { "storage_unavailable": "Pleroma無法訪問瀏覽器存儲。您的登錄名或本地設置將不會保存,您可能會遇到意外問題。嘗試啟用Cookie。" }, "timeline": { "error_fetching": "獲取更新時發生錯誤", - "conversation": "對話" + "conversation": "對話", + "no_retweet_hint": "這條內容僅關注者可見,或者是私信,因此不能轉發", + "collapse": "摺疊", + "load_older": "載入更早的發文", + "repeated": "已轉發", + "show_new": "顯示新內容", + "reload": "重新載入", + "up_to_date": "已是最新", + "no_more_statuses": "没有更多發文", + "no_statuses": "没有發文" }, "interactions": { "load_older": "載入更早的互動", @@ -546,8 +692,51 @@ "admin_menu": { "delete_account": "刪除賬號", "delete_user": "刪除用戶", - "delete_user_confirmation": "你確認嗎?此操作無法撤銷。" - } + "delete_user_confirmation": "你確認嗎?此操作無法撤銷。", + "moderation": "調停", + "grant_admin": "賦予管理權限", + "revoke_admin": "撤銷管理權限", + "grant_moderator": "賦予主持人權限", + "revoke_moderator": "撤銷主持人權限", + "activate_account": "啟用賬號", + "deactivate_account": "關閉賬號", + "force_nsfw": "標記所有的帖子都是工作場合不適", + "strip_media": "從帖子裡刪除媒體文件", + "force_unlisted": "強制帖子為不公開", + "sandbox": "強制帖子為只有關注者可看", + "disable_remote_subscription": "禁止從遠程實例關注用戶", + "disable_any_subscription": "完全禁止關注用戶", + "quarantine": "從聯合實例中禁止用戶帖子" + }, + "approve": "批准", + "block": "封鎖", + "blocked": "已封鎖!", + "deny": "拒絕", + "favorites": "喜歡", + "follow": "關注", + "follow_sent": "請求已發送!", + "follow_progress": "請求中…", + "follow_again": "再次發送請求?", + "follow_unfollow": "取消關注", + "followees": "正在關注", + "followers": "關注者", + "following": "正在關注!", + "follows_you": "關注了你!", + "hidden": "已隱藏", + "mention": "提及", + "message": "消息", + "mute": "靜音", + "muted": "已靜音", + "report": "報告", + "statuses": "發文", + "unsubscribe": "退訂", + "unblock": "取消封鎖", + "unblock_progress": "取消封鎖中…", + "block_progress": "封鎖中…", + "unmute": "取消靜音", + "unmute_progress": "取消靜音中…", + "hide_repeats": "隱藏轉發", + "show_repeats": "顯示轉發" }, "user_profile": { "timeline_title": "用戶時間線", @@ -559,7 +748,9 @@ "add_comment_description": "此報告會發送給你的實例管理員。你可以在下面提供更多詳細信息解釋報告的緣由:", "forward_to": "轉發 {0}", "submit": "提交", - "generic_error": "當處理你的請求時,發生了一個錯誤。" + "generic_error": "當處理你的請求時,發生了一個錯誤。", + "additional_comments": "其它評論", + "forward_description": "這個賬號是從另外一個服務器。同時發送一個報告到那裡?" }, "who_to_follow": { "more": "更多", @@ -573,7 +764,8 @@ "reply": "回覆", "user_settings": "用戶設置", "accept_follow_request": "接受關注請求", - "reject_follow_request": "拒絕關注請求" + "reject_follow_request": "拒絕關注請求", + "bookmark": "書籤" }, "upload": { "file_size_units": { @@ -604,6 +796,8 @@ "check_email": "檢查你的郵箱,會有一個鏈接用於重置密碼。", "return_home": "回到首頁", "too_many_requests": "你觸發了嘗試的限制,請稍後再試。", - "password_reset_disabled": "密碼重置已經被禁用。請聯繫你的實例管理員。" + "password_reset_disabled": "密碼重置已經被禁用。請聯繫你的實例管理員。", + "password_reset_required": "您必須重置密碼才能登陸。", + "password_reset_required_but_mailer_is_disabled": "您必須重置密碼,但是密碼重置被禁用了。請聯繫您所在實例的管理員。" } } From fffce4aa984d7a654d193b077b7c814f0312379e Mon Sep 17 00:00:00 2001 From: Kana Date: Fri, 25 Sep 2020 08:28:31 +0000 Subject: [PATCH 43/93] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.6% (659 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/ --- src/i18n/zh.json | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/i18n/zh.json b/src/i18n/zh.json index c11dbae2..40ffe9b1 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -160,7 +160,7 @@ "preview": "预览", "media_description": "媒体描述", "media_description_error": "更新媒体失败,请重试", - "empty_status_error": "不能发布没有内容、没有附件的状态" + "empty_status_error": "不能发布没有内容、没有附件的发文" }, "registration": { "bio": "简介", @@ -374,7 +374,7 @@ "fe_downgraded": "PleromaFE 的版本回滚了。", "fe_upgraded": "PleromaFE 的主题引擎随着版本更新升级了。", "snapshot_missing": "在文件中没有主题快照,所以网站外观可能会与原来预想的不同。", - "snapshot_present": "已加载了主题快照,因此所有的值被覆盖了。你可以改为加载主题的实际数据。" + "snapshot_present": "主题快照已加载,因此所有的值均被覆盖。您可以改为加载主题的实际数据。" }, "use_source": "新版本", "use_snapshot": "老版本", @@ -429,7 +429,9 @@ "popover": "提示框,菜单,弹出框", "post": "发布内容/用户简介", "alert_neutral": "中性", - "alert_warning": "警告" + "alert_warning": "警告", + "tabs": "标签页", + "underlay": "底衬" }, "radii": { "_tab_label": "圆角" @@ -534,10 +536,10 @@ "discoverable": "允许通过搜索检索等服务找到此账号", "mutes_and_blocks": "隐藏与屏蔽", "bot": "这是一个机器人账号", - "fun": "幽默", - "useStreamingApiWarning": "(不推荐,试验性,已知会跳过消息)", + "fun": "趣味", + "useStreamingApiWarning": "(不推荐使用,试验性,已知会跳过一些消息)", "chatMessageRadius": "聊天消息", - "greentext": "玩梗箭头" + "greentext": "玩梗(meme)箭头" }, "time": { "day": "{0} 天", @@ -583,7 +585,8 @@ "show_new": "显示新内容", "up_to_date": "已是最新", "no_more_statuses": "没有更多的状态", - "no_statuses": "没有状态更新" + "no_statuses": "没有状态更新", + "reload": "重新载入" }, "status": { "favorites": "收藏", @@ -605,7 +608,8 @@ "copy_link": "复制状态链接", "status_unavailable": "状态不可取得", "unbookmark": "取消书签", - "bookmark": "书签" + "bookmark": "书签", + "thread_muted_and_words": ",含有过滤词:" }, "user_card": { "approve": "允许", From cd6adac59ae141783372bd0e8682c635f13ebb5d Mon Sep 17 00:00:00 2001 From: Kana Date: Fri, 25 Sep 2020 10:30:16 +0000 Subject: [PATCH 44/93] Translated using Weblate (Chinese (Simplified)) Currently translated at 99.6% (659 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/ --- src/i18n/zh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 40ffe9b1..86e084b7 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -539,7 +539,7 @@ "fun": "趣味", "useStreamingApiWarning": "(不推荐使用,试验性,已知会跳过一些消息)", "chatMessageRadius": "聊天消息", - "greentext": "玩梗(meme)箭头" + "greentext": "Meme 箭头" }, "time": { "day": "{0} 天", From f10abd29f0da19625ff0e7c01ba09bd34c766c46 Mon Sep 17 00:00:00 2001 From: tarteka Date: Sun, 27 Sep 2020 08:37:20 +0000 Subject: [PATCH 45/93] Translated using Weblate (Basque) Currently translated at 77.6% (513 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/ --- src/i18n/eu.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/i18n/eu.json b/src/i18n/eu.json index fdca6b95..2c9df7ba 100644 --- a/src/i18n/eu.json +++ b/src/i18n/eu.json @@ -226,7 +226,7 @@ "composing": "Idazten", "confirm_new_password": "Baieztatu pasahitz berria", "current_avatar": "Zure uneko avatarra", - "current_password": "Indarrean den pasahitza", + "current_password": "Indarrean dagoen pasahitza", "current_profile_banner": "Zure profilaren banner-a", "data_import_export_tab": "Datuak Inportatu / Esportatu", "default_vis": "Lehenetsitako ikusgaitasunak", @@ -634,7 +634,8 @@ "about": { "mrf": { "keyword": { - "keyword_policies": "Gako-hitz politika" + "keyword_policies": "Gako-hitz politika", + "ftl_removal": "\"Ezagutzen den Sarea\" denbora-lerrotik ezabatu" }, "federation": "Federazioa" } From c9033e03510fb9a04b43fafa62fd5a6525a79eec Mon Sep 17 00:00:00 2001 From: tarteka Date: Sun, 27 Sep 2020 08:50:38 +0000 Subject: [PATCH 46/93] Translated using Weblate (Spanish) Currently translated at 100.0% (661 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/es/ --- src/i18n/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/es.json b/src/i18n/es.json index 718d9040..bbe7edde 100644 --- a/src/i18n/es.json +++ b/src/i18n/es.json @@ -762,7 +762,7 @@ "ftl_removal_desc": "Esta instancia elimina las siguientes instancias de la línea de tiempo \"Toda la red conocida\":", "ftl_removal": "Eliminar de la línea de tiempo \"Toda La Red Conocida\"", "quarantine_desc": "Esta instancia enviará solo publicaciones públicas a las siguientes instancias:", - "simple_policies": "Políticas sobre instancias específicas", + "simple_policies": "Políticas específicas de la instancia", "reject_desc": "Esta instancia no aceptará mensajes de las siguientes instancias:", "reject": "Rechazar", "accept": "Aceptar" From 38fa2111f935b8e3b9eb2994b91a69d7d282a509 Mon Sep 17 00:00:00 2001 From: tarteka Date: Sun, 27 Sep 2020 08:42:50 +0000 Subject: [PATCH 47/93] Translated using Weblate (Basque) Currently translated at 83.3% (551 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eu/ --- src/i18n/eu.json | 60 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/src/i18n/eu.json b/src/i18n/eu.json index 2c9df7ba..a45b7cfd 100644 --- a/src/i18n/eu.json +++ b/src/i18n/eu.json @@ -13,7 +13,8 @@ "scope_options": "Ikusgaitasun aukerak", "text_limit": "Testu limitea", "title": "Ezaugarriak", - "who_to_follow": "Nori jarraitu" + "who_to_follow": "Nori jarraitu", + "pleroma_chat_messages": "Pleroma Txata" }, "finder": { "error_fetching_user": "Errorea erabiltzailea eskuratzen", @@ -31,7 +32,13 @@ "disable": "Ezgaitu", "enable": "Gaitu", "confirm": "Baieztatu", - "verify": "Egiaztatu" + "verify": "Egiaztatu", + "peek": "Begiratu", + "close": "Itxi", + "dismiss": "Baztertu", + "retry": "Saiatu berriro", + "error_retry": "Saiatu berriro mesedez", + "loading": "Kargatzen…" }, "image_cropper": { "crop_picture": "Moztu argazkia", @@ -81,7 +88,10 @@ "user_search": "Erabiltzailea Bilatu", "search": "Bilatu", "who_to_follow": "Nori jarraitu", - "preferences": "Hobespenak" + "preferences": "Hobespenak", + "chats": "Txatak", + "timelines": "Denbora-lerroak", + "bookmarks": "Laster-markak" }, "notifications": { "broken_favorite": "Egoera ezezaguna, bilatzen…", @@ -91,7 +101,10 @@ "notifications": "Jakinarazpenak", "read": "Irakurrita!", "repeated_you": "zure mezua errepikatu du", - "no_more_notifications": "Ez dago jakinarazpen gehiago" + "no_more_notifications": "Ez dago jakinarazpen gehiago", + "reacted_with": "{0}kin erreakzionatu zuen", + "migrated_to": "hona migratua:", + "follow_request": "jarraitu nahi zaitu" }, "polls": { "add_poll": "Inkesta gehitu", @@ -114,7 +127,8 @@ "search_emoji": "Bilatu emoji bat", "add_emoji": "Emoji bat gehitu", "custom": "Ohiko emojiak", - "unicode": "Unicode emojiak" + "unicode": "Unicode emojiak", + "load_all": "{emojiAmount} emoji guztiak kargatzen" }, "stickers": { "add_sticker": "Pegatina gehitu" @@ -635,9 +649,39 @@ "mrf": { "keyword": { "keyword_policies": "Gako-hitz politika", - "ftl_removal": "\"Ezagutzen den Sarea\" denbora-lerrotik ezabatu" + "ftl_removal": "\"Ezagutzen den Sarea\" denbora-lerrotik ezabatu", + "is_replaced_by": "→", + "replace": "Ordezkatuak", + "reject": "Ukatuak" }, - "federation": "Federazioa" - } + "federation": "Federazioa", + "simple": { + "media_nsfw_desc": "Instantzia honek hurrengo instantzien multimediak sentikorrak izatera behartzen ditu:", + "media_nsfw": "Behartu Multimedia Sentikor", + "media_removal_desc": "Instantzia honek atxikitutako multimedia hurrengo instantzietatik ezabatzen ditu:", + "media_removal": "Multimedia Ezabatu", + "ftl_removal_desc": "Instantzia honek hurrengo instantziak ezabatzen ditu \"Ezagutzen den Sarea\" denbora-lerrotik:", + "ftl_removal": "\"Ezagutzen den Sarea\" denbora-lerrotik ezabatu", + "quarantine_desc": "Instantzia honek soilik mezu publikoak bidaliko ditu instantzia hauetara:", + "quarantine": "Koarentena", + "reject_desc": "Instantzia honek ez ditu hurrengo instantzien mezuak onartuko:", + "reject": "Ukatuak", + "accept_desc": "Instantzia honek hurrengo instantzietako mezuak soilik onartzen ditu:", + "accept": "Onartu", + "simple_policies": "Gure instantziaren politika zehatzak" + }, + "mrf_policies_desc": "MRF politikek instantzia honen federazioa manipulatzen dute gainerako instantziekin. Honako politika hauek daude gaituta:", + "mrf_policies": "Gaitutako MRF politikak" + }, + "staff": "Arduradunak" + }, + "domain_mute_card": { + "unmute_progress": "Isiltasuna kentzen…", + "unmute": "Isiltasuna kendu", + "mute_progress": "Isiltzen…", + "mute": "Isilarazi" + }, + "shoutbox": { + "title": "Oihu-kutxa" } } From d11ecc5987d45a6d3e6f5e6ba4cf583c126abc8a Mon Sep 17 00:00:00 2001 From: Not HJ Date: Mon, 28 Sep 2020 12:51:44 +0000 Subject: [PATCH 48/93] Translated using Weblate (English) Currently translated at 100.0% (661 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/en/ --- src/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/en.json b/src/i18n/en.json index 01f89503..a888ac63 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -92,7 +92,7 @@ "description": "Log in with OAuth", "logout": "Log out", "password": "Password", - "placeholder": "e.g. lain", + "placeholder": "e.g. Lain", "register": "Register", "username": "Username", "hint": "Log in to join the discussion", From e9f13895b9d98650d3700b5c5a0fcd5080f5be9e Mon Sep 17 00:00:00 2001 From: hj Date: Mon, 28 Sep 2020 13:34:31 +0000 Subject: [PATCH 49/93] Translated using Weblate (English) Currently translated at 100.0% (661 of 661 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/en/ --- src/i18n/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/en.json b/src/i18n/en.json index a888ac63..01f89503 100644 --- a/src/i18n/en.json +++ b/src/i18n/en.json @@ -92,7 +92,7 @@ "description": "Log in with OAuth", "logout": "Log out", "password": "Password", - "placeholder": "e.g. Lain", + "placeholder": "e.g. lain", "register": "Register", "username": "Username", "hint": "Log in to join the discussion", From 71fca987a8b85a9147d77393e82ec6b6748796f6 Mon Sep 17 00:00:00 2001 From: Ben Is Date: Thu, 1 Oct 2020 09:11:38 +0000 Subject: [PATCH 50/93] Translated using Weblate (Italian) Currently translated at 100.0% (668 of 668 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/it/ --- src/i18n/it.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/it.json b/src/i18n/it.json index 474e7fde..4d096004 100644 --- a/src/i18n/it.json +++ b/src/i18n/it.json @@ -407,7 +407,14 @@ "reset_background_confirm": "Vuoi veramente azzerare lo sfondo?", "chatMessageRadius": "Messaggi istantanei", "notification_setting_hide_notification_contents": "Nascondi mittente e contenuti delle notifiche push", - "notification_setting_block_from_strangers": "Blocca notifiche da utenti che non segui" + "notification_setting_block_from_strangers": "Blocca notifiche da utenti che non segui", + "virtual_scrolling": "Velocizza l'elaborazione delle sequenze", + "import_mutes_from_a_csv_file": "Importa silenziati da un file CSV", + "mutes_imported": "Silenziati importati! Saranno elaborati a breve.", + "mute_import_error": "Errore nell'importazione", + "mute_import": "Importa silenziati", + "mute_export_button": "Esporta la tua lista di silenziati in un file CSV", + "mute_export": "Esporta silenziati" }, "timeline": { "error_fetching": "Errore nell'aggiornamento", From f110258fa1e7a75d4c0ebe6a5956f129c87206c0 Mon Sep 17 00:00:00 2001 From: Snow Date: Thu, 1 Oct 2020 08:53:41 +0000 Subject: [PATCH 51/93] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.6% (659 of 668 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/ --- src/i18n/zh.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/zh.json b/src/i18n/zh.json index 86e084b7..1fb0b548 100644 --- a/src/i18n/zh.json +++ b/src/i18n/zh.json @@ -141,7 +141,7 @@ "text/bbcode": "BBCode" }, "content_warning": "主题(可选)", - "default": "刚刚抵达上海", + "default": "刚刚抵达洛杉矶", "direct_warning_to_all": "本条内容只有被提及的用户能够看到。", "direct_warning_to_first_only": "本条内容只有被在消息开始处提及的用户能够看到。", "posting": "发送", From dff7e381542c3f0d85d724a16ccf0783ce2e59ff Mon Sep 17 00:00:00 2001 From: Snow Date: Thu, 1 Oct 2020 08:48:58 +0000 Subject: [PATCH 52/93] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (668 of 668 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hant/ --- src/i18n/zh_Hant.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json index 9306b21a..79a992fc 100644 --- a/src/i18n/zh_Hant.json +++ b/src/i18n/zh_Hant.json @@ -517,7 +517,14 @@ "title": "版本", "backend_version": "後端版本", "frontend_version": "前端版本" - } + }, + "virtual_scrolling": "優化時間線渲染", + "import_mutes_from_a_csv_file": "從CSV文件導入靜音", + "mutes_imported": "靜音導入了!處理它們將需要一段時間。", + "mute_import": "靜音導入", + "mute_import_error": "導入靜音時出錯", + "mute_export_button": "將靜音導出到csv文件", + "mute_export": "靜音導出" }, "chats": { "more": "更多", From 7e4d1b0abb00149b1529a7a649a77346995e5f46 Mon Sep 17 00:00:00 2001 From: nickiii Date: Thu, 1 Oct 2020 10:25:20 +0000 Subject: [PATCH 53/93] Added translation using Weblate (Persian) --- src/i18n/fa.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/i18n/fa.json diff --git a/src/i18n/fa.json b/src/i18n/fa.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/src/i18n/fa.json @@ -0,0 +1 @@ +{} From 14dc0eef3b81aa79b7227d621fd965e7ac593511 Mon Sep 17 00:00:00 2001 From: "Haelwenn (lanodan) Monnier" Date: Thu, 1 Oct 2020 11:17:09 +0000 Subject: [PATCH 54/93] Translated using Weblate (French) Currently translated at 92.0% (615 of 668 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fr/ --- src/i18n/fr.json | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/i18n/fr.json b/src/i18n/fr.json index 3b7eefaf..63ad46d2 100644 --- a/src/i18n/fr.json +++ b/src/i18n/fr.json @@ -13,7 +13,8 @@ "scope_options": "Options de visibilité", "text_limit": "Limite de texte", "title": "Caractéristiques", - "who_to_follow": "Personnes à suivre" + "who_to_follow": "Personnes à suivre", + "pleroma_chat_messages": "Chat Pleroma" }, "finder": { "error_fetching_user": "Erreur lors de la recherche de l'utilisateur·ice", @@ -32,7 +33,12 @@ "enable": "Activer", "confirm": "Confirmer", "verify": "Vérifier", - "dismiss": "Rejeter" + "dismiss": "Rejeter", + "peek": "Jeter un coup d'œil", + "close": "Fermer", + "retry": "Réessayez", + "error_retry": "Veuillez réessayer", + "loading": "Chargement…" }, "image_cropper": { "crop_picture": "Rogner l'image", @@ -77,15 +83,17 @@ "dms": "Messages directs", "public_tl": "Fil d'actualité public", "timeline": "Fil d'actualité", - "twkn": "Ensemble du réseau connu", + "twkn": "Réseau connu", "user_search": "Recherche d'utilisateur·ice", "who_to_follow": "Qui suivre", "preferences": "Préférences", "search": "Recherche", - "administration": "Administration" + "administration": "Administration", + "chats": "Chats", + "bookmarks": "Marques-Pages" }, "notifications": { - "broken_favorite": "Chargement d'un message inconnu…", + "broken_favorite": "Message inconnu, chargement…", "favorited_you": "a aimé votre statut", "followed_you": "a commencé à vous suivre", "load_older": "Charger les notifications précédentes", @@ -115,7 +123,7 @@ "text/bbcode": "BBCode" }, "content_warning": "Sujet (optionnel)", - "default": "Écrivez ici votre prochain statut.", + "default": "Je viens d'atterrir en Tchéquie.", "direct_warning_to_all": "Ce message sera visible pour toutes les personnes mentionnées.", "direct_warning_to_first_only": "Ce message sera visible uniquement pour personnes mentionnées au début du message.", "posting": "Envoi en cours", @@ -129,7 +137,12 @@ "private": "Abonné·e·s uniquement - Seul·e·s vos abonné·e·s verront vos billets", "public": "Publique - Afficher dans les fils publics", "unlisted": "Non-Listé - Ne pas afficher dans les fils publics" - } + }, + "media_description_error": "Échec de téléversement du media, essayez encore", + "empty_status_error": "Impossible de poster un statut vide sans attachements", + "preview_empty": "Vide", + "preview": "Prévisualisation", + "media_description": "Description de l'attachement" }, "registration": { "bio": "Biographie", @@ -488,7 +501,15 @@ "notification_setting_privacy_option": "Masquer l'expéditeur et le contenu des notifications push", "notification_setting_privacy": "Intimité", "hide_followers_count_description": "Masquer le nombre d'abonnés", - "accent": "Accent" + "accent": "Accent", + "chatMessageRadius": "Message de chat", + "bot": "Ce compte est un robot", + "import_mutes_from_a_csv_file": "Importer les masquages depuis un fichier CSV", + "mutes_imported": "Masquages importés ! Leur application peut prendre du temps.", + "mute_import_error": "Erreur à l'import des masquages", + "mute_import": "Import des masquages", + "mute_export_button": "Exporter vos masquages dans un fichier CSV", + "mute_export": "Export des masquages" }, "timeline": { "collapse": "Fermer", @@ -732,5 +753,11 @@ "return_home": "Retourner à la page d'accueil", "too_many_requests": "Vos avez atteint la limite d'essais, essayez plus tard.", "password_reset_required": "Vous devez changer votre mot de passe pour vous authentifier." + }, + "errors": { + "storage_unavailable": "Pleroma n'a pas pu accéder au stockage du navigateur. Votre identifiant ou vos mots de passes ne seront sauvegardés et des problèmes pourront être rencontrés. Essayez d'activer les cookies." + }, + "shoutbox": { + "title": "Shoutbox" } } From b12b6a84a466894ccf85c88d47a87f576de872f0 Mon Sep 17 00:00:00 2001 From: nickiii Date: Thu, 1 Oct 2020 10:44:46 +0000 Subject: [PATCH 55/93] Translated using Weblate (Persian) Currently translated at 2.5% (17 of 668 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fa/ --- src/i18n/fa.json | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/i18n/fa.json b/src/i18n/fa.json index 0967ef42..5a7f6139 100644 --- a/src/i18n/fa.json +++ b/src/i18n/fa.json @@ -1 +1,29 @@ -{} +{ + "about": { + "mrf": { + "simple": { + "media_removal_desc": "این نمونه رسانه‌ی پیغام‌های نمونه‌های ذکر شده را حذف می‌کند:", + "ftl_removal_desc": "این نمونه،‌ نمونه‌های ذکر شده را از تایم‌لاین «تمام شبکه‌ شناخته شده» حذف می‌کند:", + "media_removal": "حذف رسانه", + "ftl_removal": "حذف از تایم‌لاین «تمام شبکه شناخته شده»", + "quarantine_desc": "این نمونه تنها پیغام‌های عمومی را به نمونه‌های ذکر شده پیغام ارسال می‌کند:", + "quarantine": "قرنطینه شده", + "reject_desc": "این نمونه از نمونه‌های ذکر شده پیغامی دریافت نمی‌کند:", + "reject": "رد کننده", + "accept_desc": "این نمونه تنها از نمونه‌های ذکر شده پیغام دریافت می‌کند:", + "simple_policies": "سیاست‌های مخصوص نمونه", + "accept": "دریافت کننده" + }, + "federation": "فدراسیون", + "mrf_policies_desc": "سیاست‌های MRF رفتار فدراسیون این نمونه را تغییر می‌دهد. سیاست‌هایی که در ادامه آمده اعمال شده است:", + "keyword": { + "reject": "رد کننده", + "replace": "جایگزین کننده", + "keyword_policies": "سیاست‌های واژگان کلیدی", + "is_replaced_by": "→", + "ftl_removal": "حذف از تایم‌لاین «تمام شبکه شناخته شده»" + }, + "mrf_policies": "سیاست‌های MRF(وسیله بازنویسی پیغام) فعال شده" + } + } +} From 6dec1544503c531d55ed67ad598c2fbb6239d727 Mon Sep 17 00:00:00 2001 From: nickiii Date: Thu, 1 Oct 2020 12:38:32 +0000 Subject: [PATCH 56/93] Translated using Weblate (Persian) Currently translated at 2.6% (18 of 668 strings) Translation: Pleroma/Pleroma-FE Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/fa/ --- src/i18n/fa.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/i18n/fa.json b/src/i18n/fa.json index 5a7f6139..290a19e3 100644 --- a/src/i18n/fa.json +++ b/src/i18n/fa.json @@ -24,6 +24,7 @@ "ftl_removal": "حذف از تایم‌لاین «تمام شبکه شناخته شده»" }, "mrf_policies": "سیاست‌های MRF(وسیله بازنویسی پیغام) فعال شده" - } + }, + "staff": "کارکنان" } } From ff2fe5c68c6164853e70a12793982c42ff58d2e9 Mon Sep 17 00:00:00 2001 From: Mark Felder Date: Thu, 1 Oct 2020 17:05:46 -0500 Subject: [PATCH 57/93] Fix Follow Requests title style --- src/components/follow_requests/follow_requests.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/follow_requests/follow_requests.vue b/src/components/follow_requests/follow_requests.vue index 5fa4cf39..4b9101e2 100644 --- a/src/components/follow_requests/follow_requests.vue +++ b/src/components/follow_requests/follow_requests.vue @@ -1,7 +1,9 @@