$store.dispatch('fetchBlocks'),
select: (props, $store) => get($store.state.users.currentUser, 'blockIds', []),
- childPropName: 'items'
+ childPropName: 'items',
+ destroy: () => {}
})(SelectableList)
-const MuteList = withSubscription({
+const MuteList = withLoadMore({
fetch: (props, $store) => $store.dispatch('fetchMutes'),
select: (props, $store) => get($store.state.users.currentUser, 'muteIds', []),
- childPropName: 'items'
+ childPropName: 'items',
+ destroy: () => {}
})(SelectableList)
const DomainMuteList = withSubscription({
diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue
index 86943e27..d031a21e 100644
--- a/src/components/side_drawer/side_drawer.vue
+++ b/src/components/side_drawer/side_drawer.vue
@@ -268,6 +268,10 @@
.side-drawer {
overflow-x: hidden;
transition-timing-function: cubic-bezier(0, 1, 0.5, 1);
+ @media (prefers-reduced-motion: reduce) {
+ transition-timing-function: unset;
+ transition: unset;
+ }
transition: 0.35s;
transition-property: transform;
margin: 0 0 0 -100px;
diff --git a/src/components/status/status.js b/src/components/status/status.js
index a35b5084..9bb3364f 100644
--- a/src/components/status/status.js
+++ b/src/components/status/status.js
@@ -20,6 +20,7 @@ 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 StillImage from '../still-image/still-image.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
@@ -117,7 +118,8 @@ const Status = {
RichContent,
MentionLink,
MentionsLine,
- QuoteButton
+ QuoteButton,
+ StillImage
},
props: [
'statusoid',
diff --git a/src/components/status/status.vue b/src/components/status/status.vue
index c9ce4a8a..a54782e3 100644
--- a/src/components/status/status.vue
+++ b/src/components/status/status.vue
@@ -174,12 +174,12 @@
>
@{{ status.user.screen_name_ui }}
-
+ />
diff --git a/src/components/status_body/status_body.scss b/src/components/status_body/status_body.scss
index d618f65e..434cb482 100644
--- a/src/components/status_body/status_body.scss
+++ b/src/components/status_body/status_body.scss
@@ -17,6 +17,9 @@
.emoji:hover {
transform: scale(1.4);
+ @media (prefers-reduced-motion: reduce) {
+ transition: unset;
+ }
transition: 0.05s;
}
diff --git a/src/components/still-image/still-image.js b/src/components/still-image/still-image.js
index 480de9fa..9c335d6c 100644
--- a/src/components/still-image/still-image.js
+++ b/src/components/still-image/still-image.js
@@ -11,8 +11,8 @@ const StillImage = {
],
data () {
return {
- stopGifs: this.$store.getters.mergedConfig.stopGifs,
- isAnimated: false
+ stopGifs: this.$store.getters.mergedConfig.stopGifs || window.matchMedia('(prefers-reduced-motion: reduce)').matches,
+ isAnimated: false,
}
},
computed: {
@@ -39,12 +39,25 @@ const StillImage = {
this.imageLoadError && this.imageLoadError()
},
detectAnimation (image) {
+ // If there are no file extensions, the mimetype isn't set, and no mediaproxy is available, we can't figure out
+ // the mimetype of the image.
+ const hasFileExtension = this.src.split('/').pop().includes('.') // TODO: Better check?
+ const mediaProxyAvailable = this.$store.state.instance.mediaProxyAvailable
+ if (!hasFileExtension && this.mimetype === undefined && !mediaProxyAvailable) {
+ // It's a bit aggressive to assume all images we can't find the mimetype of is animated, but necessary for
+ // people in need of reduced motion accessibility. As such, we'll consider those images animated if the user
+ // agent is set to prefer reduced motion. Otherwise, it'll just be used as an early exit.
+ if (window.matchMedia('(prefers-reduced-motion: reduce)').matches)
+ this.isAnimated = true
+ return
+ }
+
if (this.mimetype === 'image/gif' || this.src.endsWith('.gif')) {
this.isAnimated = true
return
}
// harmless CORS errors without-- clean console with
- if (!this.$store.state.instance.mediaProxyAvailable) return
+ if (!mediaProxyAvailable) return
// Animated JPEGs?
if (!(this.src.endsWith('.webp') || this.src.endsWith('.png'))) return
// Browser Cache should ensure image doesn't get loaded twice if cache exists
diff --git a/src/components/timeline_menu/timeline_menu.vue b/src/components/timeline_menu/timeline_menu.vue
index 61119482..2dd52346 100644
--- a/src/components/timeline_menu/timeline_menu.vue
+++ b/src/components/timeline_menu/timeline_menu.vue
@@ -62,6 +62,9 @@
border-top-right-radius: 0;
border-top-left-radius: 0;
transform: translateY(-100%);
+ @media (prefers-reduced-motion: reduce) {
+ transition: unset;
+ }
transition: transform 100ms;
}
@@ -89,6 +92,9 @@
svg {
margin-left: 0.6em;
+ @media (prefers-reduced-motion: reduce) {
+ transition: unset;
+ }
transition: transform 100ms;
}
diff --git a/src/directives/body_scroll_lock.js b/src/directives/body_scroll_lock.js
index b6d16790..2602ca91 100644
--- a/src/directives/body_scroll_lock.js
+++ b/src/directives/body_scroll_lock.js
@@ -3,11 +3,13 @@ import * as bodyScrollLock from 'body-scroll-lock'
let previousNavPaddingRight
let previousAppBgWrapperRight
const lockerEls = new Set([])
+const allowedScrollableClasses = ['emoji-tabs-item', 'emoji-item']
const disableBodyScroll = (el) => {
const scrollBarGap = window.innerWidth - document.documentElement.clientWidth
bodyScrollLock.disableBodyScroll(el, {
- reserveScrollBarGap: true
+ reserveScrollBarGap: true,
+ allowTouchMove: el => allowedScrollableClasses.includes(el.parentElement.className),
})
lockerEls.add(el)
setTimeout(() => {
diff --git a/src/i18n/el.json b/src/i18n/el.json
new file mode 100644
index 00000000..f09d18a9
--- /dev/null
+++ b/src/i18n/el.json
@@ -0,0 +1,215 @@
+{
+ "about": {
+ "mrf": {
+ "keyword": {
+ "keyword_policies": "Πολιτικές λέξεων-κλειδιών",
+ "reject": "Απόρριψη",
+ "replace": "Αντικατάσταση"
+ },
+ "mrf_policies": "Ενεργοποιημένες πολιτικές MRF",
+ "mrf_policies_desc": "",
+ "simple": {
+ "accept": "Αποδοχή",
+ "accept_desc": "Αυτό το instance αποδέχεται μηνύματα μόνο από τα ακόλουθα instances:",
+ "ftl_removal": "Αφαίρεση από το χρονολόγιο \"Γνωστού Δίκτυου\"",
+ "ftl_removal_desc": "Αυτό το instance αφαιρεί αυτά τα instances από το χρονολόγιο \"Γνωστού Δικτύου\":",
+ "quarantine": "Καραντίνα",
+ "quarantine_desc": "Αυτό το instance δε θα στέλνει αναρτήσεις στα ακόλουθα instances:",
+ "reason": "Λόγος",
+ "simple_policies": "Πολιτικές του instance"
+ }
+ }
+ },
+ "announcements": {
+ "all_day_prompt": "Αυτό είναι ένα ολοήμερο συμβάν",
+ "cancel_edit_action": "Ακύρωση",
+ "close_error": "Κλείσιμο",
+ "delete_action": "Διαγραφή",
+ "edit_action": "Επεξεργασία",
+ "end_time_display": "Λήγει στις {time}",
+ "page_header": "Ανακοινώσεις",
+ "title": "Ανακοίνωση"
+ },
+ "chats": {
+ "empty_message_error": "Δε μπορεί να σταλεί κενό μήνυμα",
+ "error_sending_message": "Κάτι πήγε λάθος κατά την αποστολή του μηνύματος.",
+ "message_user": "Στείλε μήνυμα στον/στην {nickname}",
+ "more": "Περισσότερα",
+ "new": "Νέο Chat",
+ "you": "Εσείς:"
+ },
+ "display_date": {
+ "today": "Σήμερα"
+ },
+ "domain_mute_card": {
+ "mute": "Σίγαση"
+ },
+ "emoji": {
+ "add_emoji": "Εισαγωγή emoji",
+ "load_all": "Φόρτωση όλων των {emojiAmount} emoji",
+ "recent": "Χρησιμοποιήθηκαν πρόσφατα",
+ "search_emoji": "Αναζήτηση για ένα emoji",
+ "stickers": "Αυτοκόλλητα"
+ },
+ "errors": {
+ "storage_unavailable": "Το Pleroma δε μπόρεσε να προσπελάσει τον αποθηκευτικό χώρο του browser. Η σύνδεσή σας ή οι τοπικές ρυθμίσεις σας δε θα αποθηκευτούν και μπορεί να αντιμετωπίσετε απρόοπτα θέματα. Προσπαθήστε να ενεργοποιήσετε τα cookies."
+ },
+ "exporter": {
+ "export": "Εξαγωγή"
+ },
+ "features_panel": {
+ "text_limit": "Όριο κειμένου"
+ },
+ "file_type": {
+ "audio": "Ήχος",
+ "file": "Αρχείο",
+ "image": "Εικόνα",
+ "video": "Βίντεο"
+ },
+ "general": {
+ "apply": "Εφαρμογή",
+ "cancel": "Ακύρωση",
+ "close": "Κλείσιμο",
+ "disable": "Απενεργοποίηση",
+ "enable": "Ενεργοποίηση",
+ "error_retry": "Παρακαλώ δοκιμάστε ξανά",
+ "flash_content": "Κάντε κλικ για την εμφάνιση Flash περιεχομένου με τη χρήση του Ruffle (Πειραματικό, μπορεί να μη λειτουργεί).",
+ "loading": "Φόρτωση…",
+ "more": "Περισσότερα",
+ "optional": "προαιρετικό",
+ "retry": "Δοκιμάστε ξανά",
+ "role": {
+ "admin": "Διαχειριστής",
+ "moderator": "Συντονιστής"
+ },
+ "scope_in_timeline": {
+ "direct": "Άμεσο",
+ "local": "Τοπικό",
+ "private": "Μόνο για ακόλουθους",
+ "public": "Δημόσιο",
+ "unlisted": "Εκτός Λίστας"
+ },
+ "show_less": "Δείξε λιγότερα",
+ "show_more": "Δείξε περισσότερα"
+ },
+ "image_cropper": {
+ "cancel": "Ακύρωση",
+ "crop_picture": "Περικοπή εικόνας",
+ "save": "Αποθήκευση",
+ "save_without_cropping": "Αποθήκευση χωρίς περικοπή"
+ },
+ "importer": {
+ "success": "Εισήχθη επιτυχώς."
+ },
+ "languages": {
+ "ar": "Αραβικά",
+ "az": "Αζερικά",
+ "bg": "Βουλγαρικά",
+ "cs": "Τσεχικά",
+ "da": "Δανικά",
+ "de": "Γερμανικά",
+ "el": "Ελληνικά",
+ "en": "Αγγλικά",
+ "eo": "Εσπεράντο",
+ "es": "Ισπανικά",
+ "fa": "Περσικά",
+ "fi": "Φινλανδικά",
+ "fr": "Γαλλικά",
+ "ga": "Ιρλανδικά",
+ "he": "Εβραϊκά",
+ "hi": "Χίντι",
+ "hu": "Ουγγρικά",
+ "id": "Ινδονησιακά",
+ "it": "Ιταλικά",
+ "ja": "Ιαπωνικά",
+ "ko": "Κορεατικά",
+ "lt": "Λιθουανικά",
+ "lv": "Λετονικά",
+ "nl": "Ολλανδικά",
+ "pl": "Πολωνικά",
+ "pt": "Πορτογαλικά",
+ "ru": "Ρωσικά",
+ "sk": "Σλοβακικά",
+ "sv": "Σουηδικά",
+ "tr": "Τουρκικά",
+ "translated_from": {
+ "ar": "Μεταφράστηκε από τα @:languages.ar",
+ "az": "Μεταφράστηκε από τα @:languages.az",
+ "bg": "Μεταφράστηκε από τα @:languages.bg",
+ "cs": "Μεταφράστηκε από τα @:languages.cs",
+ "da": "Μεταφράστηκε από τα @:languages.da",
+ "de": "Μεταφράστηκε από τα @:languages.de",
+ "el": "Μεταφράστηκε από τα @:languages.el",
+ "en": "Μεταφράστηκε από τα @:languages.en",
+ "eo": "Μεταφράστηκε από τα @:languages.eo",
+ "es": "Μεταφράστηκε από τα @:languages.es",
+ "fa": "Μεταφράστηκε από τα @:languages.fa",
+ "fi": "Μεταφράστηκε από τα @:languages.fi",
+ "fr": "Μεταφράστηκε από τα @:languages.fr",
+ "ga": "Μεταφράστηκε από τα @:languages.ga",
+ "he": "Μεταφράστηκε από τα @:languages.he",
+ "hi": "Μεταφράστηκε από τα @:languages.hi",
+ "hu": "Μεταφράστηκε από τα @:languages.hu",
+ "id": "Μεταφράστηκε από τα @:languages.id",
+ "it": "Μεταφράστηκε από τα @:languages.it",
+ "ja": "Μεταφράστηκε από τα @:languages.ja",
+ "ko": "Μεταφράστηκε από τα @:languages.ko",
+ "lt": "Μεταφράστηκε από τα @:languages.lt",
+ "lv": "Μεταφράστηκε από τα @:languages.lv",
+ "nl": "Μεταφράστηκε από τα @:languages.nl",
+ "pl": "Μεταφράστηκε από τα @:languages.pl",
+ "pt": "Μεταφράστηκε από τα @:languages.pt",
+ "ru": "Μεταφράστηκε από τα @:languages.ru",
+ "sk": "Μεταφράστηκε από τα @:languages.sk",
+ "sv": "Μεταφράστηκε από τα @:languages.sv",
+ "tr": "tr",
+ "uk": "Μεταφράστηκε από τα @:languages.uk",
+ "zh": "Μεταφράστηκε από τα @:languages.zh"
+ },
+ "uk": "Ουκρανικά",
+ "zh": "Κινεζικά"
+ },
+ "lists": {
+ "create": "Δημιουργία",
+ "delete": "Διαγραφή λίστας",
+ "lists": "Λίστες",
+ "new": "Νέα Λίστα",
+ "save": "Αποθήκευση αλλαγών",
+ "search": "Αναζήτηση χρηστών",
+ "title": "Τίτλος λίστας"
+ },
+ "login": {
+ "authentication_code": "Κωδικός επαλήθευσης",
+ "description": "Σύνδεση με OAuth",
+ "enter_recovery_code": "Εισάγετε τον κωδικό ανάκτησης",
+ "hint": "Συνδεθείτε για να μπείτε στη συζήτηση",
+ "login": "Σύνδεση",
+ "logout": "Αποσύνδεση",
+ "logout_confirm": "Θέλετε σίγουρα να αποσυνδεθείτε;",
+ "logout_confirm_accept_button": "Αποσύνδεση",
+ "logout_confirm_cancel_button": "Ακύρωση",
+ "logout_confirm_title": "Αποσύνδεση",
+ "password": "Κωδικός πρόσβασης",
+ "placeholder": "τοονομαχρηστημου",
+ "recovery_code": "Κωδικός ανάκτησης",
+ "register": "Εγγραφή",
+ "username": "Όνομα χρήστη"
+ },
+ "media_modal": {
+ "next": "Επόμενο",
+ "previous": "Προηγούμενο"
+ },
+ "moderation": {
+ "reports": {
+ "add_note": "Προσθήκη σημείωσης",
+ "close": "Κλείσιμο",
+ "delete_note": "Διαγραφή",
+ "delete_note_accept": "Ναι, διάγραψέ το",
+ "delete_note_cancel": "Όχι, κράτα το",
+ "delete_note_confirm": "Θέλετε σίγουρα να διαγράψετε αυτήν τη σημείωση;",
+ "note_placeholder": "Αφήστε μια σημείωση",
+ "notes": "{ count } σημείωση | { count } σημειώσεις",
+ "statuses": "{ count } ανάρτηση| { count } αναρτήσεις"
+ }
+ }
+}
diff --git a/src/i18n/fr.json b/src/i18n/fr.json
index 9bc07077..252291ea 100644
--- a/src/i18n/fr.json
+++ b/src/i18n/fr.json
@@ -425,6 +425,8 @@
"reason_placeholder": "Cette instance modère les inscriptions manuellement.\nExpliquer ce qui motive votre inscription à l'administration.",
"register": "Enregistrer",
"registration": "Inscription",
+ "request_sent": "Votre demande d'enregistrement est en attente d'approbation. Vous recevrez un courriel lorsque votre compte sera approuvé.",
+ "request_sent_title": "Demande d'abonnement envoyée",
"token": "Jeton d'invitation",
"username_placeholder": "ex : misato",
"validations": {
diff --git a/src/i18n/id.json b/src/i18n/id.json
index 71e4ef44..86940ff4 100644
--- a/src/i18n/id.json
+++ b/src/i18n/id.json
@@ -1,11 +1,15 @@
{
"about": {
+ "bubble_instances": "Instance Bubble Lokal",
+ "bubble_instances_description": "Instansi yang dipilih oleh admin untuk mewakili instance ini",
"mrf": {
"federation": "Federasi",
"keyword": {
"ftl_removal": "Penghapusan dari Linimasa \"Jaringan Yang Dikenal\"",
"is_replaced_by": "→",
- "reject": "Tolak"
+ "keyword_policies": "Kebijakan Kata Kunci",
+ "reject": "Tolak",
+ "replace": "Ganti"
},
"mrf_policies": "Kebijakan MRF yang diaktifkan",
"mrf_policies_desc": "Kebijakan MRF memanipulasi federasi yang terjadi pada instansi ini. Kebijakan berikut adalah yang aktif:",
@@ -80,6 +84,7 @@
"keep_open": "Tetap buka pemilih",
"load_all": "Memuat semua {emojiAmount} emoji",
"load_all_hint": "Memuat {saneAmount} emoji pertama, memuat semua emoji dapat menyebabkan masalah performa.",
+ "recent": "Baru-baru ini digunakan",
"search_emoji": "Cari emoji",
"stickers": "Stiker",
"unicode": "Emoji Unicode"
@@ -93,9 +98,11 @@
},
"features_panel": {
"media_proxy": "Proxy media",
+ "scope_options": "Opsi cakupan",
"text_limit": "Batas teks",
"title": "Fitur-fitur",
- "upload_limit": "Batas unggahan"
+ "upload_limit": "Batas unggahan",
+ "who_to_follow": "Siapa untuk diikuti"
},
"file_type": {
"audio": "Audio",
@@ -113,6 +120,7 @@
"close": "Tutup",
"confirm": "Konfirmasi",
"disable": "Nonaktifkan",
+ "dismiss": "Tutup",
"enable": "Aktifkan",
"error_retry": "Harap coba lagi",
"flash_content": "Klik untuk menampilkan konten Flash menggunakan Ruffle (Eksperimental, mungkin tidak bekerja).",
@@ -132,7 +140,8 @@
"direct": "Langsung",
"local": "Lokal - hanya instansi kamu yang dapat melihat postingan ini",
"private": "Hanya pengikut",
- "public": "Publik"
+ "public": "Publik",
+ "unlisted": "Tidak Tercantum"
},
"show_less": "Tampilkan lebih sedikit",
"show_more": "Tampilkan lebih banyak",
@@ -227,6 +236,7 @@
"lists": {
"create": "Buat",
"delete": "Hapus daftar",
+ "following_only": "Batas mengikuti",
"lists": "Daftar",
"new": "Buat Daftar",
"save": "Simpan perubahan",
@@ -276,6 +286,7 @@
"note_placeholder": "Tinggalkan catatan",
"notes": "{ count } catatan",
"reopen": "Buka kembali",
+ "report": "Laporan di",
"reports": "Laporan",
"resolve": "Selesaikan",
"show_closed": "Tampilkan yang telah ditutup",
@@ -291,6 +302,8 @@
"administration": "Administrasi",
"announcements": "Pengumuman",
"back": "Kembali",
+ "bookmarks": "Bookmark",
+ "bubble_timeline": "Timeline Bubble",
"bubble_timeline_description": "Postingan dari instansi yang dekat dengan instansimu, yang direkomendasikan oleh admin kamu",
"chats": "Obrolan",
"dms": "Pesan langsung",
@@ -309,7 +322,8 @@
"timelines": "Linimasa",
"twkn": "Jaringan Yang Dikenal",
"twkn_timeline_description": "Postingan dari seluruh jaringan",
- "user_search": "Penelusuran Pengguna"
+ "user_search": "Penelusuran Pengguna",
+ "who_to_follow": "Siapa untuk diikuti"
},
"notifications": {
"broken_favorite": "Postingan tak dikenal, mencarinya…",
@@ -385,7 +399,8 @@
"direct": "Langsung - posting hanya kepada pengguna yang disebut",
"local": "Lokal - postingan tidak akan difederasi",
"private": "Hanya-pengikut - posting hanya kepada pengikut",
- "public": "Publik - posting ke linimasa publik"
+ "public": "Publik - posting ke linimasa publik",
+ "unlisted": "Tidak Tercantum - Tidak memposting ke timeline publik"
},
"scope_notice": {
"local": "Postingan ini tidak akan terlihat di instansi lain",
@@ -402,6 +417,7 @@
"captcha": "CAPTCHA",
"email": "Surel",
"email_language": "Dalam bahasa apa kamu ingin menerima surel dari server ini?",
+ "fullname": "Tampilan Nama",
"fullname_placeholder": "cth. Atsuko Kagari",
"new_captcha": "Klik gambarnya untuk mendapatkan captcha baru",
"password_confirm": "Konfirmasi kata sandi",
@@ -424,6 +440,7 @@
},
"remote_user_resolver": {
"error": "Tidak ditemukan.",
+ "remote_user_resolver": "Pencarian pengguna jarak jauh",
"searching_for": "Mencari"
},
"search": {
@@ -437,16 +454,22 @@
"select_all": "Pilih semua"
},
"settings": {
+ "accent": "Aksen",
+ "account_alias": "Akun alias",
"account_backup": "Pencadangan akun",
"account_backup_description": "Ini memungkinkan kamu untuk mengunduh arsip yang berisi informasi tentang akun dan postingan kamu, namun belum bisa diimpor ke akun Pleroma.",
"account_privacy": "Privasi",
+ "add_alias_error": "Gagal menambahkan alias: {error}",
"add_backup": "Buat cadangan baru",
"add_backup_error": "Gagal menambahkan cadangan baru: {error}",
+ "added_alias": "Alias telah ditambahkan.",
"added_backup": "Cadangan baru ditambahkan.",
"allow_following_move": "Ikuti otomatis apabila akun yang diikuti pindah",
+ "always_show_post_button": "Selalu tampilkan tombol posting baru yang mengambang",
"app_name": "Nama aplikasi",
"attachmentRadius": "Lampiran",
"attachments": "Lampiran",
+ "autohide_floating_post_button": "Sembunyikan tombol buat posting secara otomatis (Ponsel)",
"avatar": "Avatar",
"avatarAltRadius": "Avatar (notifikasi)",
"avatarRadius": "Avatar",
@@ -474,6 +497,8 @@
"changed_password": "Kata sandi berhasil diubah!",
"chatMessageRadius": "Pesan obrolan",
"checkboxRadius": "Kotak centang",
+ "collapse_subject": "Tampilkan post dengan peringatan",
+ "columns": "Kolum",
"composing": "Menulis",
"confirm_dialogs": "Perlukan konfirmasi sebelum:",
"confirm_dialogs_approve_follow": "Menerima permintaan mengikuti",
@@ -484,17 +509,23 @@
"confirm_dialogs_repeat": "Mengulangi postingan",
"confirm_dialogs_unfollow": "Berhenti mengikuti seseorang",
"confirm_new_password": "Konfirmasi kata sandi baru",
+ "confirmation_dialogs": "Opsi Konfirmasi",
"conversation_display": "Gaya tampilan percakapan",
+ "conversation_display_linear": "Gaya Linier",
"conversation_display_tree": "Bercabang",
+ "conversation_other_replies_button": "Tampilkan tombol \"Balasan lainnya\"",
"conversation_other_replies_button_below": "Di bawah postingan",
"conversation_other_replies_button_inside": "Di postingan",
"current_avatar": "Avatarmu saat ini",
+ "current_mascot": "Maskot utamamu",
"current_password": "Kata sandi saat ini",
"data_import_export_tab": "Impor / ekspor data",
+ "default_vis": "Cakupan visibilitas default",
"delete_account": "Hapus akun",
"delete_account_description": "Hapus data kamu secara permanen dan nonaktifkan akunmu.",
"delete_account_error": "Ada masalah ketika menghapus akun kamu. Jika ini terus terjadi harap hubungi adminstrator instansi kamu.",
"delete_account_instructions": "Ketik kata sandi kamu pada input di bawah untuk mengonfirmasi penghapusan akun.",
+ "disable_sticky_headers": "Jangan tempel tajuk kolom ke bagian atas layar",
"discoverable": "Izinkan penelusuran akun ini pada hasil pencarian dan layanan lainnya",
"domain_mutes": "Domain",
"download_backup": "Unduh",
@@ -505,6 +536,7 @@
"expert_mode": "Tampilkan pengaturan lanjutan",
"expire_posts_enabled": "Hapus postingan setelah jumlah hari yang ditentukan",
"expire_posts_input_placeholder": "Jumlah hari",
+ "export_theme": "Simpan preset",
"file_export_import": {
"backup_restore": "Pencadangan pengaturan",
"backup_settings": "Cadangkan pengaturan ke berkas",
@@ -519,7 +551,11 @@
},
"filtering": "Penyaringan",
"filtering_explanation": "Semua postingan yang mengandung kata-kata ini akan dibisukan, satu kata per baris",
+ "follow_export": "Ekspor Follow",
+ "follow_export_button": "Export yang kamu ikuti ke dalam file csv",
+ "follow_import": "Import pengikut",
"follow_import_error": "Terjadi kesalahan ketika mengimpor pengikut",
+ "follows_imported": "Pengguna yang diikuti telak diimpor! Proses mungkin membutuhkan beberapa saat.",
"fun": "Seru",
"general": "Umum",
"greentext": "Panah meme",
diff --git a/src/i18n/ja_easy.json b/src/i18n/ja_easy.json
index 80fdde44..8dcb6514 100644
--- a/src/i18n/ja_easy.json
+++ b/src/i18n/ja_easy.json
@@ -4,6 +4,7 @@
"mrf": {
"federation": "フェデレーション",
"keyword": {
+ "ftl_removal": "「せつぞくしているすべてのネットワーク」タイムラインからのぞく",
"is_replaced_by": "→",
"keyword_policies": "キーワードポリシー",
"reject": "おことわり",
@@ -120,7 +121,7 @@
"error_retry": "もういちど、ためしてください",
"flash_content": "クリックすると、Ruffle をつかって、フラッシュさくひんをひょうじします。(うまくうごかないかもしれません)",
"flash_fail": "フラッシュさくひんのロードに、しっぱいしました。コンソールに、くわしいことがかかれています。",
- "flash_security": "フラッシュさくひんは、あぶないことをしてくるかもしれないので、ちゅういしてください。",
+ "flash_security": "フラッシュさくひんは、あなたのコンピューターに、あぶないことをしてくるかもしれないので、ちゅういしてください。",
"generic_error": "エラーになりました",
"loading": "ロードしています…",
"more": "つづき",
@@ -533,7 +534,7 @@
"expert_mode": "こまかいせっていをひょうじ",
"export_theme": "セーブ",
"filtering": "フィルタリング",
- "filtering_explanation": "これらのことばをふくむすべてのものがミュートされます。1ぎょうに1つのことばをかいてください",
+ "filtering_explanation": "これらのことばをふくむすべてのとうこうがミュートされます。1ぎょうに1つのことばをかいてください",
"follow_export": "フォローのエクスポート",
"follow_export_button": "エクスポート",
"follow_import": "フォローインポート",
@@ -887,6 +888,7 @@
"media": "メディア",
"mention": "メンション",
"mute": "ミュート",
+ "mute_domain": "ドメインをブロック",
"mute_progress": "ミュートしています…",
"muted": "ミュートしています!",
"per_day": "/日",
@@ -897,6 +899,7 @@
"subscribe": "サブスクライブ",
"unblock": "ブロックをやめる",
"unblock_progress": "ブロックをとりけしています…",
+ "unfollow_confirm": "{user}のフォローをやめますか?",
"unmute": "ミュートをやめる",
"unmute_progress": "ミュートをとりけしています…",
"unsubscribe": "サブスクライブをやめる"
diff --git a/src/i18n/pt.json b/src/i18n/pt.json
index 5e04c73c..b904c958 100644
--- a/src/i18n/pt.json
+++ b/src/i18n/pt.json
@@ -30,7 +30,7 @@
"simple_policies": "Políticas especificas do domínio"
}
},
- "staff": "Staff"
+ "staff": "Equipe"
},
"announcements": {
"all_day_prompt": "Este evento dura o dia inteiro",
@@ -167,7 +167,7 @@
"password": "Palavra-passe",
"placeholder": "ex. lain",
"recovery_code": "Código de recuperação",
- "register": "Registar",
+ "register": "Registrar",
"username": "Nome de Utilizador"
},
"media_modal": {
@@ -244,7 +244,7 @@
"text/plain": "Texto puro"
},
"content_warning": "Assunto (opcional)",
- "default": "Acabei de chegar a Lisboa.",
+ "default": "Acabei de chegar em",
"direct_warning_to_all": "Esta publicação será visível para todos os utilizadores mencionados.",
"direct_warning_to_first_only": "Esta publicação só será visível para os utilizadores mencionados no início da mensagem.",
"empty_status_error": "Não consegues publicar um post vazio e sem ficheiros",
@@ -268,7 +268,7 @@
},
"registration": {
"bio": "Biografia",
- "bio_placeholder": "ex.\nOlá, sou a Lain\nSou uma menina de anime que vive no Japão suburbano. Devem conhecer-me do \"the Wired\".",
+ "bio_placeholder": "Ex.:\nBem-vindo a minha bio.\nEu amo assistir anime e jogar. Eu espero que possamos ser amigos!",
"captcha": "CAPTCHA",
"email": "Endereço de e-mail",
"fullname": "Nome para exibição",
@@ -401,7 +401,7 @@
"scan": {
"desc": "Utilizando a sua aplicação de dois fatores, faça scan deste código QR ou insira a chave de texto:",
"secret_code": "Chave",
- "title": "Scan"
+ "title": "Escanear"
},
"setup_otp": "Configurar palavra-passe de utilização única",
"title": "Autenticação de Dois Fatores",
@@ -566,7 +566,7 @@
"fine_print": "Leia nosso {0} para não aprender nada!",
"header": "Pré-visualizar",
"header_faint": "Isto está bem",
- "input": "Acabei de chegar a Lisboa.",
+ "input": "Acabei de chegar na Lua",
"link": "um belo link",
"mono": "conteúdo",
"text": "Vários {0} e {1}"
@@ -648,7 +648,7 @@
"type_domains_to_mute": "Pesquisar domínios para silenciar",
"upload_a_photo": "Enviar uma foto",
"useStreamingApi": "Receber publicações e notificações em tempo real",
- "useStreamingApiWarning": "(não recomendado, experimental, pode omitir publicações)",
+ "useStreamingApiWarning": "É legal usar isso. Se der algum problema, atualize, eu acho?",
"use_contain_fit": "Não cortar o anexo na miniatura",
"use_one_click_nsfw": "Abrir anexos sensíveis com um clique",
"user_mutes": "Utilizadores",
diff --git a/src/i18n/th.json b/src/i18n/th.json
new file mode 100644
index 00000000..77f73c2f
--- /dev/null
+++ b/src/i18n/th.json
@@ -0,0 +1,34 @@
+{
+ "about": {
+ "bubble_instances": "เซิร์ฟเวอร์เพื่อนบ้าน",
+ "bubble_instances_description": "เซิร์ฟเวอร์ที่แอดมินตั้งค่าไว้เพื่อแสดงเป็นเพื่อนบ้าน",
+ "mrf": {
+ "keyword": {
+ "keyword_policies": "นโยบายของคีย์เวิร์ดค้นหา",
+ "reject": "ไม่อนุมัติ",
+ "replace": "แทนที่"
+ },
+ "simple": {
+ "accept": "ยอมรับ",
+ "accept_desc": "เซิร์ฟเวอร์นี้จะรับข้อความเฉพาะเซิฟร์เวอร์ต่อไปนี้:",
+ "instance": "เซิฟเวอร์",
+ "media_nsfw": "มีเดียถูกบังคับตั้งให้เป็น NSFW",
+ "not_applicable": "ไม่สามารถใช้ได้",
+ "quarantine": "คัดกรอง",
+ "reason": "เหตุผล",
+ "reject": "ปฎิเสธ"
+ }
+ },
+ "staff": "ผู้ดูแล"
+ },
+ "announcements": {
+ "cancel_edit_action": "ยกเลิก",
+ "close_error": "ปิด",
+ "delete_action": "ลบประกาศ",
+ "edit_action": "แก้ไขประกาศ",
+ "end_time_prompt": "เวลาสิ้นสุด: ",
+ "mark_as_read_action": "ตั้งเป็นอ่านแล้ว",
+ "page_header": "ประกาศ",
+ "post_action": "โพสต์"
+ }
+}
diff --git a/src/i18n/tr.json b/src/i18n/tr.json
index 43c498c8..4e36c306 100644
--- a/src/i18n/tr.json
+++ b/src/i18n/tr.json
@@ -49,6 +49,86 @@
"post_error": "Hata: {error}",
"post_form_header": "Post sonrası",
"post_placeholder": "Duyuru içeriği",
- "published_time_display": "{time} tarihinde yayınlandı"
+ "published_time_display": "{time} tarihinde yayınlandı",
+ "start_time_display": "{time} saatinde başlar",
+ "start_time_prompt": "Başlangıç saati: ",
+ "submit_edit_action": "Gönder",
+ "title": "Duyuru"
+ },
+ "chats": {
+ "chats": "Sohbetler",
+ "delete": "Sil",
+ "delete_confirm": "Bu mesajı gerçekten silmek istiyor musun?",
+ "empty_chat_list_placeholder": "Henüz hiç sohbetiniz yok. Yeni bir sohbet başlatın!",
+ "empty_message_error": "Boş mesaj gönderilemiyor",
+ "error_loading_chat": "Sohbet yüklenirken bir şeyler ters gitti.",
+ "error_sending_message": "Mesajı gönderirken bir şeyler ters gitti.",
+ "message_user": "{nickname} mesajı",
+ "more": "Daha",
+ "new": "Yeni Sohbet",
+ "you": "Sen:"
+ },
+ "display_date": {
+ "today": "Bugün"
+ },
+ "domain_mute_card": {
+ "mute": "Sesini kapat",
+ "mute_progress": "Ses kapatılıyor…",
+ "unmute": "Sesini aç",
+ "unmute_progress": "Sessize alınıyor…"
+ },
+ "emoji": {
+ "add_emoji": "Emoji ekle",
+ "custom": "Özel emoji",
+ "emoji": "Emoji",
+ "keep_open": "Seçiciyi açık tut",
+ "load_all": "Tüm {emojiAmount} emoji yükleniyor",
+ "load_all_hint": "İlk {saneAmount} emoji yüklendi, tüm emojilerin yüklenmesi performans sorunlarına neden olabilir.",
+ "recent": "Son zamanlarda kullanılmış",
+ "search_emoji": "Emoji ara",
+ "stickers": "Çıkartmalar",
+ "unicode": "Unicode emojisi"
+ },
+ "errors": {
+ "storage_unavailable": "Pleroma, tarayıcı depolama alanına erişemedi. Oturum açma bilgileriniz veya yerel ayarlarınız kaydedilmeyecek ve beklenmeyen sorunlarla karşılaşabilirsiniz. Çerezleri etkinleştirmeyi deneyin."
+ },
+ "exporter": {
+ "export": "Dışa aktar",
+ "processing": "İşleniyor, yakında dosyanızı indirmeniz istenecek"
+ },
+ "features_panel": {
+ "media_proxy": "Medya proxy'si",
+ "scope_options": "Kapsam seçenekleri",
+ "text_limit": "Metin sınırı",
+ "title": "Özellikler",
+ "upload_limit": "Yükleme sınırı",
+ "who_to_follow": "Kimi takip etmeli"
+ },
+ "file_type": {
+ "audio": "Ses",
+ "file": "Dosya",
+ "image": "Resim",
+ "video": "Video"
+ },
+ "finder": {
+ "error_fetching_user": "Kullanıcı getirilirken hata oluştu",
+ "find_user": "Kullanıcı bul"
+ },
+ "general": {
+ "apply": "Uygula",
+ "cancel": "İptal",
+ "close": "Kapalı",
+ "confirm": "Onayla",
+ "disable": "Devre dışı bırak",
+ "dismiss": "Reddetmek",
+ "enable": "Etkinleştir",
+ "error_retry": "Lütfen tekrar deneyin",
+ "flash_content": "Ruffle kullanarak Flash içeriğini göstermek için tıklayın (Deneysel, çalışmayabilir).",
+ "flash_fail": "Flash içeriği yüklenemedi, ayrıntılar için konsola bakın.",
+ "flash_security": "Flash içeriği hala isteğe bağlı kod olduğundan, bunun potansiyel olarak tehlikeli olabileceğini unutmayın.",
+ "generic_error": "Bir hata oluştu",
+ "loading": "Yükleniyor…",
+ "more": "Daha",
+ "optional": "Seçenek"
}
}
diff --git a/src/i18n/uk.json b/src/i18n/uk.json
index 25f4cd3b..08570f9b 100644
--- a/src/i18n/uk.json
+++ b/src/i18n/uk.json
@@ -23,6 +23,7 @@
"media_nsfw_desc": "Сервер примусово позначає дражливими медіа з таких серверів:",
"media_removal": "Видалення медіа",
"media_removal_desc": "Сервер вилучає медіа в дописах із таких серверів:",
+ "not_applicable": "Не застосовується",
"quarantine": "Карантин",
"quarantine_desc": "Сервер не надсилатиме дописів таким серверам:",
"reason": "Підстава",
@@ -31,7 +32,7 @@
"simple_policies": "Відносно цілих серверів"
}
},
- "staff": "Адміністрація"
+ "staff": "Команда"
},
"announcements": {
"all_day_prompt": "Триває весь день",
@@ -71,10 +72,10 @@
"today": "Сьогодні"
},
"domain_mute_card": {
- "mute": "Ігнорувати",
- "mute_progress": "Вимикаю…",
- "unmute": "Вимкнути заглушення",
- "unmute_progress": "Вмикаю…"
+ "mute": "Приглушити",
+ "mute_progress": "Глушіння…",
+ "unmute": "Відновити",
+ "unmute_progress": "Відновлення…"
},
"emoji": {
"add_emoji": "Додати емоджі",
@@ -83,6 +84,7 @@
"keep_open": "Тримати панель відкритою",
"load_all": "Всі {emojiAmount} емоджі завантажуються",
"load_all_hint": "Завантажено {saneAmount} емоджі, більша кількість може спричинити гальмування.",
+ "recent": "Нещодавно вжиті",
"search_emoji": "Пошук емоджі",
"stickers": "Наліпки",
"unicode": "Стандартні емоджі"
@@ -131,19 +133,19 @@
"peek": "Глянути",
"retry": "Спробуйте ще раз",
"role": {
- "admin": "Адмініструє",
- "moderator": "Модерує"
+ "admin": "Адміністрація",
+ "moderator": "Модерування"
},
"scope_in_timeline": {
"direct": "Особисто",
"local": "Місцево — допис видно тільки на вашому сервері",
"private": "Приватно",
"public": "Загальнодоступно",
- "unlisted": "Непублічно"
+ "unlisted": "Приховано"
},
"show_less": "Показати менше",
"show_more": "Показати більше",
- "submit": "Відправити",
+ "submit": "Надіслати",
"verify": "Перевірити"
},
"image_cropper": {
@@ -154,7 +156,7 @@
},
"importer": {
"error": "Під час імпортування файлу сталася помилка.",
- "submit": "Відправити",
+ "submit": "Надіслати",
"success": "Імпортовано успішно."
},
"interactions": {
@@ -164,8 +166,72 @@
"moves": "Переїзди користувач_ок"
},
"languages": {
+ "ar": "арабська",
+ "az": "азербайджанська",
+ "bg": "болгарська",
+ "cs": "чеська",
+ "da": "данська",
+ "de": "німецька",
+ "el": "грецька",
"en": "англійська",
- "uk": "українська"
+ "eo": "есперанто",
+ "es": "іспанська",
+ "fa": "перська",
+ "fi": "фінська",
+ "fr": "французька",
+ "ga": "ірландська",
+ "he": "іврит",
+ "hi": "гінді",
+ "hu": "угорська",
+ "id": "індонезійська",
+ "it": "італійська",
+ "ja": "японська",
+ "ko": "корейська",
+ "lt": "литовська",
+ "lv": "латвійська",
+ "nl": "нідерландська",
+ "pl": "польська",
+ "pt": "португальська",
+ "ru": "російська",
+ "sk": "словацька",
+ "sv": "шведська",
+ "tr": "турецька",
+ "translated_from": {
+ "ar": "Перекладено з арабської",
+ "az": "Перекладено з азербайджанської",
+ "bg": "Перекладено з болгарської",
+ "cs": "Перекладено з чеської",
+ "da": "Перекладено з данської",
+ "de": "Перекладено з німецької",
+ "el": "Перекладено з грецької",
+ "en": "Перекладено з англійської",
+ "eo": "Перекладено з есперанто",
+ "es": "Перекладено з іспанської",
+ "fa": "Перекладено з перської",
+ "fi": "Перекладено з фінської",
+ "fr": "Перекладено з французької",
+ "ga": "Перекладено з ірландської",
+ "he": "Перекладено з івриту",
+ "hi": "Перекладено з гінді",
+ "hu": "Перекладено з угорської",
+ "id": "Перекладено з індонезійської",
+ "it": "Перекладено з італійської",
+ "ja": "Перекладено з японської",
+ "ko": "Перекладено з корейської",
+ "lt": "Перекладено з литовської",
+ "lv": "Перекладено з латвійської",
+ "nl": "Перекладено з нідерландської",
+ "pl": "Перекладено з польської",
+ "pt": "Перекладено з португальської",
+ "ru": "Перекладено з російської",
+ "sk": "Перекладено зі словацької",
+ "sv": "Перекладено зі словенської",
+ "tr": "Перекладено з турецької",
+ "uk": "Перекладено з української",
+ "zh": "Перекладено з китайської"
+ },
+ "uk": "українська",
+ "zh": "китайська"
},
"lists": {
"create": "Створити",
@@ -173,6 +239,7 @@
"following_only": "Лише за ким ви стежите",
"lists": "Списки",
"new": "Новий список",
+ "save": "Зберегти зміни",
"search": "Знайти користувач_ок",
"title": "Назва списку"
},
@@ -199,6 +266,7 @@
"username": "Логін"
},
"media_modal": {
+ "counter": "{current} / {total}",
"hide": "Закрити медіаперегляд",
"next": "Наступна",
"previous": "Попередня"
@@ -222,7 +290,9 @@
"reports": "Скарги",
"resolve": "Вирішено",
"show_closed": "Показати закриті",
- "statuses": "Дописів: { count } | Дописів: { count }"
+ "statuses": "Дописів: { count } | Дописів: { count }",
+ "tag_policy_notice": "Увімкніть MRF TagPolicy, щоб обмежувати окремі обліковки",
+ "tags": "Обмежити обліковку"
},
"statuses": "Дописи",
"users": "Користувач_ки"
@@ -242,21 +312,21 @@
"home_timeline_description": "Дописи від тих, на кого ви підписані",
"interactions": "Взаємодії",
"lists": "Списки",
- "mentions": "Згадування",
+ "mentions": "Згадки",
"moderation": "Модерування",
"preferences": "Налаштування",
"public_timeline_description": "Загальнодоступні дописи всіх на цьому сервері",
"public_tl": "Спільна стрічка",
"search": "Пошук",
- "timeline": "Домашня стрічка",
+ "timeline": "Стрічка",
"timelines": "Стрічки",
"twkn": "Уся відома мережа",
"twkn_timeline_description": "Дописи з усієї мережі",
"user_search": "Пошук користувач_ок",
- "who_to_follow": "Кого відстежувати"
+ "who_to_follow": "На кого підписатись"
},
"notifications": {
- "broken_favorite": "Невідомий допис, шукаю його…",
+ "broken_favorite": "Допис невідомий, пошук триває…",
"error": "Помилка при оновленні сповіщень: {0}",
"favorited_you": "вподобує",
"follow_request": "хоче підписатись",
@@ -285,12 +355,12 @@
"polls": {
"add_option": "Додати варіант",
"add_poll": "Додати опитування",
- "expired": "Опитування закінчилось {0} тому",
- "expires_in": "Опитування закінчується через {0}",
+ "expired": "Завершено {0} тому",
+ "expires_in": "До кінця {0}",
"expiry": "Термін опитування",
"multiple_choices": "Декілька варіантів",
"not_enough_options": "Замало унікальних варіантів в опитуванні",
- "option": "Відповідь",
+ "option": "Варіант",
"people_voted_count": "Осіб: {count} | Осіб: {count}",
"single_choice": "Один варіант",
"type": "Тип опитування",
@@ -322,7 +392,7 @@
"media_not_sensitive_warning": "Ви вказали засторогу, але не позначили вкладення дражливими!",
"new_status": "Новий допис",
"post": "Розмістити",
- "posting": "Відправляється",
+ "posting": "Розміщення",
"preview": "Попередній перегляд",
"preview_empty": "Порожньо",
"scope": {
@@ -340,11 +410,13 @@
}
},
"registration": {
+ "awaiting_email_confirmation": "Вам надіслано лист підтвердження створення обліковки. Перевірте е-пошту, щоб завершити реєстрацію.",
+ "awaiting_email_confirmation_title": "Очікування підтвердження поштою",
"bio": "Опис",
"bio_placeholder": "як-от:\nВолинянка. Подорожую.\nДемократична соціалістка. Пишу драматичні поеми. Жити хочу! Геть, думи сумні!",
"captcha": "CAPTCHA",
"email": "Е-пошта",
- "email_language": "Якою мовою отримувати листи з сервера?",
+ "email_language": "Мова листів сервера",
"fullname": "Ім'я",
"fullname_placeholder": "як-от Лариса Косач",
"new_captcha": "Натисніть на зображення, щоб оновити код, якщо він нерозбірливий",
@@ -353,6 +425,8 @@
"reason_placeholder": "Запити на реєстрацію підтверджуються вручну.\nРозкажіть адміністрації, чому хочете зареєструватися.",
"register": "Зареєструватися",
"registration": "Реєстрація",
+ "request_sent": "Ваш запит на реєстрацію надіслано на розгляд. Ви отримаєте лист, коли вашу реєстрацію схвалять.",
+ "request_sent_title": "Запит на реєстрацію надіслано",
"token": "Ключ запрошення",
"username_placeholder": "як-от lesia",
"validations": {
@@ -370,7 +444,7 @@
"searching_for": "Шукаю"
},
"search": {
- "hashtags": "Хештеги",
+ "hashtags": "Теги",
"no_results": "Немає результатів",
"people": "Люди",
"people_talking": "{count} людей говорять про це",
@@ -382,34 +456,34 @@
"settings": {
"accent": "Акцент",
"account_alias": "Інші обліковки",
- "account_alias_table_head": "Нова обліковка",
+ "account_alias_table_head": "Попередня обліковка",
"account_backup": "Резервне копіювання обліковки",
"account_backup_description": "Можете завантажити архів даних і дописів своєї обліковки. Але імпортувати їх на іншу обліковку поки неможливо.",
"account_backup_table_head": "Резервна копія",
"account_privacy": "Приватність",
- "add_alias_error": "Помилка додання нової обліковки: {error}",
+ "add_alias_error": "Помилка додання обліковки: {error}",
"add_backup": "Створити резервну копію",
"add_backup_error": "Помилка резервного копіювання: {error}",
- "added_alias": "Нову обліковку додано.",
+ "added_alias": "Обліковку додано.",
"added_backup": "Резервну копію створено.",
"allow_following_move": "Дозволити автостеження при переміщенні на інший інстанс",
"always_show_post_button": "Завжди показувати кнопку «Новий допис»",
"app_name": "Назва програми",
"attachmentRadius": "Вкладення",
"attachments": "Вкладення",
- "autohide_floating_post_button": "Автоматично ховати кнопку \"Новий допис\" (в мобільній версії)",
+ "autohide_floating_post_button": "Автоматично ховати кнопку «Новий допис» (на мобільному)",
"avatar": "Аватар",
"avatarAltRadius": "Аватари у сповіщеннях",
"avatarRadius": "Аватари",
"avatar_size_instruction": "Рекомендований мінімальний розмір для зображень аватара становить 150x150 пікселів.",
- "background": "Обкладинка",
+ "background": "Тло",
"backup_not_ready": "Резервна копія ще не готова.",
"bio": "Опис",
"block_export": "Експорт блокувань",
- "block_export_button": "Експорт блокувань у файл CSV",
+ "block_export_button": "Експорт блокувань у CSV-файл",
"block_import": "Імпорт блокувань",
- "block_import_error": "Помилка імпортування блокувань",
- "blocks_imported": "Блокування імпортовані! Їх обробка триватиме певний час.",
+ "block_import_error": "Помилка імпорту блокувань",
+ "blocks_imported": "Блокування імпортовано! Їх буде застосовано поступово.",
"blocks_tab": "Блокування",
"bot": "Це обліковка бота",
"btnRadius": "Кнопки",
@@ -441,6 +515,11 @@
"conversation_display": "Стиль показу розмови",
"conversation_display_linear": "Колонка",
"conversation_display_tree": "Дерево",
+ "conversation_other_replies_button": "Кнопка «Переглянути ще»",
+ "conversation_other_replies_button_below": "Під дописами",
+ "conversation_other_replies_button_inside": "Всередині дописів",
+ "current_avatar": "Ваш поточний аватар",
+ "current_mascot": "Ваш поточний маскот",
"current_password": "Поточний пароль",
"data_import_export_tab": "Імпорт/експорт даних",
"default_vis": "Типовий рівень приватності",
@@ -461,24 +540,24 @@
"expire_posts_input_placeholder": "Скільки днів",
"export_theme": "Завантажити",
"file_export_import": {
- "backup_restore": "Резервне копіювання налаштувань",
+ "backup_restore": "Копія налаштувань",
"backup_settings": "Завантажити файл налаштувань",
"backup_settings_theme": "Завантажити налаштування й тему",
"errors": {
- "file_slightly_new": "Другорядна версія файлу відрізняється, деякі налаштування можуть бути не прийняті",
- "file_too_new": "Несумісна основна версія: {fileMajor}, ця версія PleromaFE ({feMajor}) занадто стара для його обробки",
- "file_too_old": "Несумісна основна версія: {fileMajor}, версія файлу занадто стара і не підтримується (мінімальна версія налаштувань {feMajor})",
+ "file_slightly_new": "Файл призначено для трохи новішої версії й може спрацювати не повністю",
+ "file_too_new": "Версія {fileMajor} новіша, ніж ця AkkomaFE ({feMajor}) може обробити",
+ "file_too_old": "Версія {fileMajor} більше не підтримується (треба {feMajor} чи новіше)",
"invalid_file": "Вибраний файл не є резервною копією налаштувань Pleroma. Ніяких змін не було зроблено."
},
"restore_settings": "Відновити налаштування з файлу"
},
"filtering": "Фільтр",
"filtering_explanation": "Усі дописи з цими словами буде сховано. Пишіть кожне слово з нового рядка",
- "follow_export": "Експортувати відстежуваних",
- "follow_export_button": "Експортувати відстежуваних до csv файлу",
- "follow_import": "Імпортувати відстежуваних",
- "follow_import_error": "Помилка імпортування відстежуваних",
- "follows_imported": "Відстежуваних імпортовано! Їхня обробка потребує часу.",
+ "follow_export": "Експорт підписок",
+ "follow_export_button": "Експорт підписок до CSV-файлу",
+ "follow_import": "Імпорт підписок",
+ "follow_import_error": "Помилка імпорту підписок",
+ "follows_imported": "Підписки імпортовано! Їх буде застосовано поступово.",
"foreground": "Передній план",
"fun": "Іграшки",
"general": "Загальні",
@@ -497,7 +576,7 @@
"hide_list_aliases_error_action": "Закрити",
"hide_media_previews": "Приховати попередній перегляд медіа",
"hide_muted_posts": "Ховати повідомлення приглушених користувач_ок",
- "hide_muted_threads": "Ховати заглушені гілки",
+ "hide_muted_threads": "Ховати приглушені гілки",
"hide_post_stats": "Ховати статистику дописів (скільки вподобань тощо)",
"hide_shoutbox": "Приховати оголошення сервера",
"hide_site_favicon": "Вилучити значок сервера з шапки",
@@ -506,9 +585,9 @@
"hide_user_stats": "Ховати користувацьку статистику (скільки підписок тощо)",
"hide_wallpaper": "Сховати шпалери сервера",
"hide_wordfiltered_statuses": "Ховати дописи зі словами з фільтру",
- "import_blocks_from_a_csv_file": "Імпортувати заблокованих з csv файлу",
- "import_followers_from_a_csv_file": "Імпортувати відстежуваних з csv файлу",
- "import_mutes_from_a_csv_file": "Імпорт заглушених з csv файлу",
+ "import_blocks_from_a_csv_file": "Імпортуйте CSV-файл блокувань",
+ "import_followers_from_a_csv_file": "Імпортуйте CSV-файл підписок",
+ "import_mutes_from_a_csv_file": "Імпортуйте CSV-файл приглушень",
"import_theme": "Вивантажити",
"inputRadius": "Поля вводу",
"instance_default": "(усталено: {value})",
@@ -518,13 +597,16 @@
"invalid_theme_imported": "Вибраний файл не є темою Pleroma. У вашу тему не внесено жодних змін.",
"limited_availability": "Недоступно у вашому браузері",
"links": "Посилання",
- "list_aliases_error": "Помилка завантаження нових обліковок: {error}",
+ "list_aliases_error": "Помилка завантаження обліковок: {error}",
"list_backups_error": "Помилка завантаження переліку копій: {error}",
"lock_account_description": "Показувати лише схваленим підписни_цям",
"loop_video": "Зациклити відео",
"loop_video_silent_only": "Зациклити відео без звуку (напр. Mastodon \"gifs\")",
+ "mascot": "Маскот Mastodon FE",
+ "max_depth_in_thread": "Максимальна кількість типово показаних рівнів гілки обговорення",
"max_thumbnails": "Максимальна кількість мініатюр на повідомлення",
- "mention_link_display": "Показувати згадування",
+ "mention_link_bolden_you": "Підсвічувати посилання, коли вас згадують",
+ "mention_link_display": "Формат посилань згадок",
"mention_link_display_full": "завжди повністю (як-от {'@'}lesia{'@'}example.org)",
"mention_link_display_full_for_remote": "повністю, якщо це інший сервер (як-от {'@'}lesia{'@'}example.org)",
"mention_link_display_short": "завжди коротко (як-от {'@'}lesia)",
@@ -557,34 +639,37 @@
"more_settings": "Більше налаштувань",
"move_account": "Переїхати",
"move_account_error": "Помилка переїзду обліковки: {error}",
- "move_account_notes": "Щоб переїхати з цієї обліковки на іншу, вкажіть у її налаштуваннях цю облікову як нову.",
+ "move_account_notes": "Щоб переїхати з цієї обліковки на іншу, додайте в її налаштуваннях цю обліковку як попередню.",
+ "move_account_target": "Нова обліковка (як-от {example})",
+ "moved_account": "Переїзд обліковки виконано.",
"mute_bot_posts": "Сховати дописи ботів",
- "mute_export": "Експорт ігнорувань",
- "mute_export_button": "Експорт заглушених у csv файл",
- "mute_import": "Імпорт ігнорувань",
- "mute_import_error": "Під час імпорту заглушених сталася помилка",
- "mutes_and_blocks": "Заглушення та блокування",
- "mutes_imported": "Заглушені імпортовані! Їх обробка триватиме певний час.",
- "mutes_tab": "Заглушені",
+ "mute_export": "Експорт приглушень",
+ "mute_export_button": "Експорт приглушених у csv файл",
+ "mute_import": "Імпорт приглушень",
+ "mute_import_error": "Під час імпорту приглушених сталася помилка",
+ "mutes_and_blocks": "Приглушення та блокування",
+ "mutes_imported": "Приглушення імпортовано! Їх буде застосовано поступово.",
+ "mutes_tab": "Приглушення",
"name": "Ім'я",
"name_bio": "Особисті дані",
- "new_alias_target": "Вкажіть нову обліковку (як-от {example})",
+ "new_alias_target": "Додайте стару обліковку ({example})",
"new_email": "Нова е-пошта",
"new_password": "Новий пароль",
- "no_blocks": "Блокування відсутні",
- "no_mutes": "Заглушені відсутні",
+ "no_blocks": "Нікого не заблоковано",
+ "no_mutes": "Нікого не приглушено",
"no_rich_text_description": "Видалення всього форматування тексту з усіх дописів",
- "notification_blocks": "Блокування користувача зупиняє всі сповіщення від нього, а також скасовує його відстеження.",
- "notification_mutes": "Щоб перестати отримувати сповіщення від певного користувача, заглушіть його.",
+ "notification_blocks": "Щоб не отримувати сповіщень від когось і вилучити їх із підписни_ць, заблокуйте їх.",
+ "notification_mutes": "Щоб просто не отримувати сповіщень від когось, приглушіть їх.",
"notification_setting_block_from_strangers": "Блокувати сповіщення від тих, на кого ви не підписані",
"notification_setting_filters": "Фільтри",
+ "notification_setting_hide_if_cw": "Ховати вміст push-сповіщення за наявності застороги",
"notification_setting_hide_notification_contents": "Ховати відправника та вміст push-сповіщень",
"notification_setting_privacy": "Приватність",
"notification_visibility": "Сповіщати про такі події",
"notification_visibility_emoji_reactions": "Реакції",
"notification_visibility_follows": "Підписни_ці",
"notification_visibility_likes": "Вподобане",
- "notification_visibility_mentions": "Згадування",
+ "notification_visibility_mentions": "Згадки",
"notification_visibility_moves": "Переїзди користувач_ок",
"notification_visibility_polls": "Результати голосувань",
"notification_visibility_repeats": "Поширення",
@@ -593,7 +678,7 @@
"oauth_tokens": "OAuth-ключі",
"pad_emoji": "Автоматично додавати простір з обидвох сторін емоджі",
"panelRadius": "Панелі",
- "pause_on_unfocused": "Призупинити трансляцію, коли вкладка неактивна",
+ "pause_on_unfocused": "Лише коли вкладка активна",
"play_videos_in_modal": "Відтворювати відео у спливаючій рамці",
"post_look_feel": "Вигляд дописів",
"post_status_content_type": "Типова розмітка тексту",
@@ -611,7 +696,7 @@
"profile_tab": "Профіль",
"radii_help": "Радіус заокруглення кутів інтерфейсу (в пікселях)",
"refresh_token": "Оновити ключ",
- "remove_alias": "Вилучити нову обліковку",
+ "remove_alias": "Вилучити обліковку",
"remove_backup": "Вилучити",
"render_mfm": "Показувати розмітку Misskey",
"render_mfm_on_hover": "Анімувати MFM лише при наведенні",
@@ -633,13 +718,14 @@
"saving_err": "Помилка при збереженні налаштувань",
"saving_ok": "Налаштування збережені",
"scope_copy": "Відповідати на тому ж рівні приватності (завжди ввімкнено для особистих повідомлень)",
- "search_user_to_block": "Шукайте кого ви хочете заблокувати",
- "search_user_to_mute": "Шукайте кого ви хочете заглушити",
+ "search_user_to_block": "Шукайте, кого слід заблокувати",
+ "search_user_to_mute": "Шукайте, кого слід приглушити",
"security": "Безпека",
"security_tab": "Безпека",
"sensitive_by_default": "Одразу позначати дописи дражливими",
- "sensitive_if_subject": "Позначати зображення дражливими, якщо вказано застереження",
+ "sensitive_if_subject": "Позначати зображення дражливими, якщо вказано засторогу",
"set_new_avatar": "Встановити новий аватар",
+ "set_new_mascot": "Встановити нового маскота",
"set_new_profile_background": "Встановити нову обкладинку профілю",
"set_new_profile_banner": "Встановити новий банер",
"setting_changed": "Конфігурація відрізняється від типової",
@@ -664,6 +750,7 @@
"show_panel_nav_shortcuts": "Ярлики стрічок у заголовку панелі",
"show_scrollbars": "Смуги прокрутки в бокових панелях",
"show_wider_shortcuts": "Більша відстань між ярликами в заголовку",
+ "show_yous": "Показувати «(ви)»",
"stop_gifs": "Анімувати GIF лише при наведенні",
"streaming": "Автоматично показувати нові дописи вгорі стрічки",
"style": {
@@ -744,10 +831,10 @@
"faint_link": "корисний підручник",
"fine_print": "Прочитайте наш {0} аби нічого нового не дізнатись!",
"header": "Попередній перегляд",
- "header_faint": "Все гаразд",
+ "header_faint": "Усе гаразд",
"input": "Що нового?",
"link": "невеличке посилання",
- "mono": "змісту",
+ "mono": "вмісту",
"text": "Трохи більше {0} та {1}"
},
"radii": {
@@ -819,7 +906,7 @@
"subject_line_noop": "не копіювати",
"text": "Текст",
"theme": "Тема",
- "theme_help": "Замініть кольори теми своїми в форматі (#rrggbb).",
+ "theme_help": "Замініть кольори теми своїми в форматі #rrggbb.",
"theme_help_v2_1": "Деякі кольори й прозорості розраховуються автоматично. Позначайте їх пташками, щоб замінити їх вручну. Кнопка «Очистити все» видаляє всі такі заміни.",
"theme_help_v2_2": "Значки під кольорами показують, наскільки добре видно текст на тлі. При наведенні побачите деталі. Якщо використовуєте прозорість, буде оцінено найгірший варіант.",
"third_column_mode": "Третя панель, якщо достатньо місця",
@@ -828,13 +915,21 @@
"third_column_mode_postform": "Новий допис і меню",
"token": "Ключ",
"tooltipRadius": "Підказки/попередження",
- "type_domains_to_mute": "Пошук доменів для заглушення",
+ "translation_language": "Мова автоматичного перекладу",
+ "tree_advanced": "Показувати додаткові кнопки відкриття й закриття ланцюгів відповідей у гілках",
+ "tree_fade_ancestors": "Показувати менш виразно дописи, що передують поточному",
+ "type_domains_to_mute": "Шукайте домени, які слід приглушити",
"upload_a_photo": "Вивантажити фото",
"useStreamingApi": "Отримувати дописи та сповіщення наживо",
- "useStreamingApiWarning": "(Не рекомендується, експериментально, повідомлення можуть зникати)",
- "use_at_icon": "Значок {'@'} замість символа",
+ "useStreamingApiWarning": "Загалом працює. Якщо не зовсім, спробуєте оновити сторінку?",
+ "use_at_icon": "Значок {'@'} замість символу",
+ "use_blurhash": "Показувати дражливі мініатюри (як розмиті кольори)",
"use_contain_fit": "Не обрізати краї мініатюр",
"use_one_click_nsfw": "Відкривати NSFW вкладення одним кліком миші",
+ "user_accepts_direct_messages_from": "Приймати особисті повідомлення",
+ "user_accepts_direct_messages_from_everybody": "Будь-чиї",
+ "user_accepts_direct_messages_from_nobody": "Нічиї",
+ "user_accepts_direct_messages_from_people_i_follow": "Від тих, на кого я підписуюсь",
"user_mutes": "Користувач_ки",
"user_profile_default_tab": "Типова вкладка профілів",
"user_profiles": "Користувацькі профілі",
@@ -853,8 +948,18 @@
"word_filter": "Фільтр слів",
"wordfilter": "Фільтр слів"
},
+ "settings_profile": {
+ "creating": "Створення профілю налаштувань «{profile}»…",
+ "synchronization_error": "Не вдалося синхронізувати налаштування: {err}",
+ "synchronized": "Налаштування синхронізовано!",
+ "synchronizing": "Синхронізація профілю налаштувань «{profile}»…"
+ },
"status": {
+ "ancestor_follow": "Переглянути ще {numReplies} під цим дописом | Переглянути ще {numReplies} під цим дописом",
+ "ancestor_follow_with_icon": "{icon} {text}",
+ "attachment_stop_flash": "Зупинити Flash-плеєр",
"bookmark": "Додати до закладок",
+ "collapse_attachments": "Згорнути вкладення",
"copy_link": "Скопіювати посилання на допис",
"delete": "Видалити допис",
"delete_confirm": "Точно видалити допис?",
@@ -868,11 +973,17 @@
"expand": "Розгорнути",
"external_source": "Зовнішнє джерело",
"favorites": "Вподобане",
+ "hide_attachment": "Сховати вкладення",
"hide_content": "Сховати вміст",
- "hide_full_subject": "Сховати всю тему",
- "mute_conversation": "Заглушити розмову",
+ "hide_full_subject": "Згорнути засторогу",
+ "many_attachments": "Вкладень: {number} | Вкладень: {number}",
+ "mentions": "Згадки",
+ "move_down": "Посунути вкладення праворуч",
+ "move_up": "Посунути вкладення ліворуч",
+ "mute_conversation": "Приглушити розмову",
"nsfw": "Дражливий вміст",
"open_gallery": "Відкрити галерею",
+ "override_translation_source_language": "Замістити початкову мову",
"pin": "Закріпити в профілі",
"pinned": "Закріплено",
"plus_more": "ще {number}",
@@ -881,21 +992,33 @@
"redraft_confirm_accept_button": "Так, видалити й переписати",
"redraft_confirm_cancel_button": "Ні, лишити оригінал",
"redraft_confirm_title": "Підтвердьте видалення й переписання",
- "remove_attachment": "Видалити долучення",
+ "remove_attachment": "Видалити вкладення",
+ "repeat_confirm": "Точно поширити допис?",
+ "repeat_confirm_accept_button": "Так, поширити",
+ "repeat_confirm_cancel_button": "Ні, не поширювати",
+ "repeat_confirm_title": "Підтвердьте поширення",
"repeats": "Поширення",
"replies_list": "Відповіді:",
+ "replies_list_with_others": "Ще відповідей: {numReplies} | Ще відповідей: {numReplies}",
"reply_to": "Відповідь",
"show_all_attachments": "Показати всі вкладення",
+ "show_all_conversation": "Показати всю розмову (ще дописів: {numStatus}) | Показати всю розмову (ще дописів: {numStatus})",
+ "show_all_conversation_with_icon": "{icon} {text}",
"show_attachment_description": "Переглянути опис (натисніть саме вкладення, якщо опис не вміщається)",
"show_attachment_in_modal": "Показати вкладення у вікні",
"show_content": "Показати вміст",
"show_full_subject": "Показати всю засторогу",
+ "show_only_conversation_under_this": "Показати відповіді лише до цього допису",
"status_deleted": "Цей допис був видалений",
"status_unavailable": "Допис недоступний",
+ "thread_follow": "Ще відповідей: {numStatus} | Ще відповідей: {numStatus}",
+ "thread_follow_with_icon": "{icon} {text}",
"thread_hide": "Сховати гілку",
"thread_muted": "Гілку приглушено",
"thread_muted_and_words": ", має слова:",
"thread_show": "Показати гілку",
+ "thread_show_full": "Показати відповіді: {numStatus} | Показати відповіді: {numStatus}",
+ "thread_show_full_with_icon": "{icon} {text}",
"translate": "Перекласти",
"translated_from": "В оригіналі: {language}",
"unbookmark": "Видалити із закладок",
@@ -929,6 +1052,7 @@
"collapse": "Згорнути",
"conversation": "Розмова",
"error": "Помилка завантаження стрічки: {0}",
+ "follow_tag": "Підписатись на тег",
"load_older": "Завантажити давніші дописи",
"no_more_statuses": "Більше немає дописів",
"no_retweet_hint": "Допис приватний чи особистий, тож його не можна поширити чи цитувати",
@@ -938,8 +1062,12 @@
"show_new": "Показати нові",
"socket_broke": "Втрачено з'єднання у реальному часі: код {0}",
"socket_reconnected": "Встановлено з'єднання у реальному часі",
+ "unfollow_tag": "Відписатись від тегу",
"up_to_date": "Оновлено"
},
+ "toast": {
+ "no_translation_target_set": "Не обрано цільової мови перекладу — може не вдатися. Оберіть у налаштуваннях, на яку мову перекладати."
+ },
"tool_tip": {
"accept_follow_request": "Дозволити підписатись",
"add_reaction": "Додати реакцію",
@@ -978,14 +1106,14 @@
"disable_remote_subscription": "Заборонити підписуватись користувач_кам з інших серверів",
"force_nsfw": "Позначити всі дописи дражливими",
"force_unlisted": "Не показувати дописи в стрічці",
- "grant_admin": "Надати права адміністратора",
- "grant_moderator": "Надати права модератора",
+ "grant_admin": "Дозволити адміністрування",
+ "grant_moderator": "Дозволити модерування",
"moderation": "Модерування",
"quarantine": "Не розповсюджувати дописи на інших інстансах",
- "revoke_admin": "Позбавити прав адміністратора",
- "revoke_moderator": "Позбавити прав модератора",
+ "revoke_admin": "Позбавити прав адміністрування",
+ "revoke_moderator": "Позбавити прав модерування",
"sandbox": "Показувати дописи лише підписни_цям",
- "strip_media": "Вилучити медіа з дописів користувача"
+ "strip_media": "Вилучити медіа з дописів"
},
"approve": "Дозволити",
"approve_confirm": "Точно дозволити користувач_ці на вас підписатись?",
@@ -1006,13 +1134,18 @@
"deny_confirm": "Точно відхилити запит на підписку?",
"deny_confirm_accept_button": "Так, відхилити",
"deny_confirm_cancel_button": "Ні, скасувати",
+ "deny_confirm_title": "Відхилити запит на підписку",
+ "domain_muted": "Розблокувати домен",
"edit_profile": "Редагувати профіль",
"favorites": "Вподобання",
"follow": "Підписатись",
"follow_cancel": "Скасувати запит",
- "follow_progress": "Запитую…",
- "follow_sent": "Запит відправлено!",
+ "follow_progress": "Надсилання…",
+ "follow_sent": "Запит надіслано!",
+ "follow_tag": "Підписатись на тег",
"follow_unfollow": "Відписатись",
+ "followed_tags": "Підписки на теги",
+ "followed_users": "Підписки на користувач_ок",
"followees": "Підписки",
"followers": "Підписни_ці",
"following": "Ви підписані!",
@@ -1036,7 +1169,8 @@
"mute_confirm_title": "Приглушення",
"mute_domain": "Заблокувати домен",
"mute_progress": "Глушимо…",
- "muted": "Заглушено",
+ "muted": "Приглушено",
+ "not_following_any_hashtags": "У вас нема підписок на теги",
"note": "Приватна нотатка",
"per_day": "на день",
"remote_follow": "Підписатись",
@@ -1053,8 +1187,9 @@
"unfollow_confirm_accept_button": "Так, відписатись",
"unfollow_confirm_cancel_button": "Ні, не відписуватись",
"unfollow_confirm_title": "Відписка",
- "unmute": "Зняти глушення",
- "unmute_progress": "Знімаємо глушення…",
+ "unfollow_tag": "Відписатись від тегу",
+ "unmute": "Відновити",
+ "unmute_progress": "Відновлення…",
"unsubscribe": "Відписатись"
},
"user_profile": {
@@ -1069,7 +1204,7 @@
"forward_description": "Це обліковка з іншого сервера. Надіслати його адміністрації копію скарги?",
"forward_to": "Переслати до {0}",
"generic_error": "Виникла помилка під час обробки вашого запиту.",
- "submit": "Відправити",
+ "submit": "Надіслати",
"title": "Поскаржитись на {0}"
},
"who_to_follow": {
diff --git a/src/i18n/zh.json b/src/i18n/zh.json
index 6488d654..7fec7226 100644
--- a/src/i18n/zh.json
+++ b/src/i18n/zh.json
@@ -926,6 +926,10 @@
"use_blurhash": "对NSFW的缩略图使用模糊处理",
"use_contain_fit": "生成缩略图时不要裁剪附件",
"use_one_click_nsfw": "点击一次以打开工作场所不适宜(NSFW)的附件",
+ "user_accepts_direct_messages_from": "允许私信自",
+ "user_accepts_direct_messages_from_everybody": "所有人",
+ "user_accepts_direct_messages_from_nobody": "没有人",
+ "user_accepts_direct_messages_from_people_i_follow": "我关注的人",
"user_mutes": "用户",
"user_profile_default_tab": "用户资料中的默认标签页",
"user_profiles": "用户资料",
diff --git a/src/modules/users.js b/src/modules/users.js
index 9d81f9bc..6968ce1e 100644
--- a/src/modules/users.js
+++ b/src/modules/users.js
@@ -199,21 +199,28 @@ export const mutations = {
})
},
saveBlockIds (state, blockIds) {
- state.currentUser.blockIds = blockIds
+ console.log("ADDING BLOCK IDS", blockIds);
+ state.currentUser.blockIds = uniq(concat(state.currentUser.blockIds || [], blockIds))
},
addBlockId (state, blockId) {
if (state.currentUser.blockIds.indexOf(blockId) === -1) {
state.currentUser.blockIds.push(blockId)
}
},
+ setBlockIdsMaxId (state, blockIdsMaxId) {
+ state.currentUser.blockIdsMaxId = blockIdsMaxId
+ },
saveMuteIds (state, muteIds) {
- state.currentUser.muteIds = muteIds
+ state.currentUser.muteIds = uniq(concat(state.currentUser.muteIds || [], muteIds))
},
addMuteId (state, muteId) {
if (state.currentUser.muteIds.indexOf(muteId) === -1) {
state.currentUser.muteIds.push(muteId)
}
},
+ setMuteIdsMaxId (state, muteIdsMaxId) {
+ state.currentUser.muteIdsMaxId = muteIdsMaxId
+ },
updateMascot (state, mascotUrl) {
state.currentUser.mascot = mascotUrl
},
@@ -330,10 +337,21 @@ const users = {
.then((relationships) => store.commit('updateUserRelationship', relationships))
}
},
- fetchBlocks (store) {
- return store.rootState.api.backendInteractor.fetchBlocks()
+ fetchBlocks (store, args) {
+ const { reset } = args || {}
+
+ const maxId = store.state.currentUser.blockIdsMaxId
+ return store.rootState.api.backendInteractor.fetchBlocks({ maxId })
.then((blocks) => {
store.commit('saveBlockIds', map(blocks, 'id'))
+ if (reset) {
+ store.commit('saveBlockIds', map(blocks, 'id'))
+ } else {
+ map(blocks, 'id').map(id => store.commit('addBlockId', id))
+ }
+ if (blocks.length) {
+ store.commit('setBlockIdsMaxId', last(blocks).id)
+ }
store.commit('addNewUsers', blocks)
return blocks
})
@@ -353,10 +371,22 @@ const users = {
unblockUsers (store, ids = []) {
return Promise.all(ids.map(id => unblockUser(store, id)))
},
- fetchMutes (store) {
- return store.rootState.api.backendInteractor.fetchMutes()
+ fetchMutes (store, args) {
+ const { reset } = args || {}
+
+ const maxId = store.state.currentUser.muteIdsMaxId
+ return store.rootState.api.backendInteractor.fetchMutes({ maxId })
.then((mutes) => {
store.commit('saveMuteIds', map(mutes, 'id'))
+ if (reset) {
+ store.commit('saveMuteIds', map(mutes, 'id'))
+ } else {
+ map(mutes, 'id').map(id => store.commit('addMuteId', id))
+ }
+ if (mutes.length) {
+ store.commit('setMuteIdsMaxId', last(mutes).id)
+ }
+
store.commit('addNewUsers', mutes)
return mutes
})
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 947e9da9..de21ef3b 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -1166,8 +1166,13 @@ const generateMfaBackupCodes = ({ credentials }) => {
}).then((data) => data.json())
}
-const fetchMutes = ({ credentials }) => {
- return promisedRequest({ url: MASTODON_USER_MUTES_URL, credentials })
+const fetchMutes = ({ maxId, credentials }) => {
+ const query = new URLSearchParams({ with_relationships: true })
+ if (maxId) {
+ query.append('max_id', maxId)
+ }
+
+ return promisedRequest({ url: `${MASTODON_USER_MUTES_URL}?${query.toString()}`, credentials })
.then((users) => users.map(parseUser))
}
@@ -1213,8 +1218,12 @@ const unsubscribeUser = ({ id, credentials }) => {
return promisedRequest({ url: MASTODON_UNSUBSCRIBE_USER(id), credentials, method: 'POST' })
}
-const fetchBlocks = ({ credentials }) => {
- return promisedRequest({ url: MASTODON_USER_BLOCKS_URL, credentials })
+const fetchBlocks = ({ maxId, credentials }) => {
+ const query = new URLSearchParams({ with_relationships: true })
+ if (maxId) {
+ query.append('max_id', maxId)
+ }
+ return promisedRequest({ url: `${MASTODON_USER_BLOCKS_URL}?${query.toString()}`, credentials })
.then((users) => users.map(parseUser))
}