Merge branch 'develop' of https://akkoma.dev/AkkomaGang/pleroma-fe into develop

This commit is contained in:
Thomate 2022-08-01 13:49:59 +02:00
commit a859b02674
58 changed files with 21675 additions and 21233 deletions

View file

@ -6,7 +6,11 @@ This is a fork of Pleroma-FE from the Pleroma project, with support for new Akko
# For Translators
To translate Pleroma-FE, add your language to [src/i18n/messages.js](https://akkoma.dev/AkkomaGang/pleroma-fe/src/branch/develop/src/i18n/messages.js). Pleroma-FE will set your language by your browser locale, but you can temporarily force it in the code by changing the locale in main.js.
The [Weblate UI](https://translate.akkoma.dev/projects/akkoma/pleroma-fe/) is recommended for adding or modifying translations for Pleroma-FE.
Alternatively, edit/create `src/i18n/$LANGUAGE_CODE.json` (where `$LANGUAGE_CODE` is the [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language), then add your language to [src/i18n/messages.js](https://akkoma.dev/AkkomaGang/pleroma-fe/src/branch/develop/src/i18n/messages.js) if it doesn't already exist there.
Pleroma-FE will set your language by your browser locale, but you can temporarily force it in the code by changing the locale in main.js.
# FOR ADMINS

View file

@ -34,8 +34,7 @@
"js-cookie": "^3.0.1",
"localforage": "1.10.0",
"marked": "^4.0.17",
"marked-mfm": "^0.4.0",
"mfm-js": "^0.22.1",
"marked-mfm": "^0.5.0",
"parse-link-header": "1.0.1",
"phoenix": "1.6.2",
"punycode.js": "2.1.0",

View file

@ -2,7 +2,8 @@
.notification-reaction-emoji {
width: 40px;
display: flex;
display: inline-flex;
vertical-align: middle;
flex-direction: column;
}

View file

@ -84,7 +84,7 @@
:key="unit"
:value="unit"
>
{{ $t(`time.unit.${unit}_short`, ['']) }}
{{ $tc(`time.unit.${unit}_short`, expiryAmount, ['']) }}
</option>
</Select>
</div>

View file

@ -56,6 +56,7 @@ const pxStringToNumber = (str) => {
const PostStatusForm = {
props: [
'replyTo',
'quoteId',
'repliedUser',
'attentions',
'copyMessageScope',
@ -99,12 +100,12 @@ const PostStatusForm = {
this.updateIdempotencyKey()
this.resize(this.$refs.textarea)
if (this.replyTo) {
if (this.replyTo || this.quoteId) {
const textLength = this.$refs.textarea.value.length
this.$refs.textarea.setSelectionRange(textLength, textLength)
}
if (this.replyTo || this.autoFocus) {
if (this.replyTo || this.quoteId || this.autoFocus) {
this.$refs.textarea.focus()
}
},
@ -112,7 +113,7 @@ const PostStatusForm = {
const preset = this.$route.query.message
let statusText = preset || ''
if (this.replyTo) {
if (this.replyTo || this.quoteId) {
const currentUser = this.$store.state.users.currentUser
statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)
}
@ -314,6 +315,7 @@ const PostStatusForm = {
media: newStatus.files,
store: this.$store,
inReplyToStatusId: this.replyTo,
quoteId: this.quoteId,
contentType: newStatus.contentType,
poll,
idempotencyKey: this.idempotencyKey
@ -347,6 +349,7 @@ const PostStatusForm = {
media: [],
store: this.$store,
inReplyToStatusId: this.replyTo,
quoteId: this.quoteId,
contentType: newStatus.contentType,
poll: {},
preview: true

View file

@ -0,0 +1,16 @@
import { library } from '@fortawesome/fontawesome-svg-core'
import { faQuoteLeft } from '@fortawesome/free-solid-svg-icons'
library.add(faQuoteLeft)
const QuoteButton = {
name: 'QuoteButton',
props: ['status', 'quoting', 'visibility'],
computed: {
loggedIn () {
return !!this.$store.state.users.currentUser
}
}
}
export default QuoteButton

View file

@ -0,0 +1,47 @@
<template>
<div
v-if="(visibility === 'public' || visibility === 'unlisted') && loggedIn"
class="QuoteButton"
>
<button
class="button-unstyled interactive"
:class="{'-active': quoting}"
:title="$t('tool_tip.quote')"
@click.prevent="$emit('toggle')"
>
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="quote-left"
/>
</button>
</div>
</template>
<script src="./quote_button.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.QuoteButton {
display: flex;
> :first-child {
padding: 10px;
margin: -10px -8px -10px -10px;
}
.action-counter {
pointer-events: none;
user-select: none;
}
.interactive {
&:hover .svg-inline--fa,
&.-active .svg-inline--fa {
color: $fallback--cBlue;
color: var(--cBlue, $fallback--cBlue);
}
}
}
</style>

View file

@ -0,0 +1,24 @@
import { mapGetters } from 'vuex'
import QuoteCardContent from '../quote_card_content/quote_card_content.vue'
const QuoteCard = {
name: 'QuoteCard',
props: [
'status'
],
data () {
return {
imageLoaded: false
}
},
computed: {
...mapGetters([
'mergedConfig'
])
},
components: {
QuoteCardContent
}
}
export default QuoteCard

View file

@ -0,0 +1,74 @@
<template>
<div>
<router-link
class="quote-card"
:to="{ name: 'conversation', params: { id: status.id } }"
>
<QuoteCardContent
:status="status"
/>
</router-link>
</div>
</template>
<script src="./quote_card"></script>
<style lang="scss">
@import '../../_variables.scss';
.quote-card {
display: flex;
flex-direction: row;
cursor: pointer;
overflow: hidden;
margin-top: 0.5em;
.card-image {
flex-shrink: 0;
width: 120px;
max-width: 25%;
img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
}
}
.card-content {
max-height: 100%;
margin: 0.5em;
display: flex;
flex-direction: column;
}
.card-host {
font-size: 0.85em;
}
.card-description {
margin: 0.5em 0 0 0;
overflow: hidden;
text-overflow: ellipsis;
word-break: break-word;
line-height: 1.2em;
// cap description at 3 lines, the 1px is to clean up some stray pixels
// TODO: fancier fade-out at the bottom to show off that it's too long?
max-height: calc(1.2em * 3 - 1px);
}
.nsfw-alert {
margin: 2em 0;
}
color: $fallback--text;
color: var(--text, $fallback--text);
border-style: solid;
border-width: 1px;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
}
</style>

View file

@ -0,0 +1,22 @@
<template>
<Status
v-if="status"
:is-preview="true"
:statusoid="status"
:compact="true"
/>
</template>
<script>
import { defineAsyncComponent } from 'vue'
export default {
name: 'QuoteCardContent',
components: {
Status: defineAsyncComponent(() => import('../status/status.vue'))
},
props: [
'status'
]
}
</script>

View file

@ -37,6 +37,15 @@
{{ $t('settings.hide_muted_posts') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting
v-if="user"
:disabled="hideFilteredStatuses"
path="hideThreadsWithBlockedUsers"
>
{{ $t('settings.hide_threads_with_blocked_users') }}
</BooleanSetting>
</li>
</ul>
</li>
<li>

View file

@ -1,7 +1,7 @@
import { extractCommit } from 'src/services/version/version.service'
const pleromaFeCommitUrl = 'https://akkoma.dev/AkkomaGang/pleroma-fe/commit/'
const pleromaBeCommitUrl = 'https://akkoma.dev/AkkomaGang/akkoma/commits/'
const pleromaBeCommitUrl = 'https://akkoma.dev/AkkomaGang/akkoma/commit/'
const VersionTab = {
data () {

View file

@ -1,4 +1,5 @@
import ReplyButton from '../reply_button/reply_button.vue'
import QuoteButton from '../quote_button/quote_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'
@ -115,7 +116,8 @@ const Status = {
StatusContent,
RichContent,
MentionLink,
MentionsLine
MentionsLine,
QuoteButton
},
props: [
'statusoid',
@ -145,6 +147,8 @@ const Status = {
'controlledToggleShowingLongSubject',
'controlledReplying',
'controlledToggleReplying',
'controlledQuoting',
'controlledToggleQuoting',
'controlledMediaPlaying',
'controlledSetMediaPlaying',
'dive'
@ -152,6 +156,7 @@ const Status = {
data () {
return {
uncontrolledReplying: false,
uncontrolledQuoting: false,
unmuted: false,
userExpanded: false,
uncontrolledMediaPlaying: [],
@ -161,7 +166,7 @@ const Status = {
}
},
computed: {
...controlledOrUncontrolledGetters(['replying', 'mediaPlaying']),
...controlledOrUncontrolledGetters(['replying', 'quoting', 'mediaPlaying']),
muteWords () {
return this.mergedConfig.muteWords
},
@ -256,6 +261,38 @@ const Status = {
hasMentionsLine () {
return this.mentionsLine.length > 0
},
mentionsBlockedUser () {
// XXX: doesn't work on domain blocks, because users from blocked domains
// don't appear in `attentions' and therefore cannot be filtered.
let mentions = false
// find if user in mentions list is blocked
this.status.attentions.forEach((attn) => {
if (attn.id === this.currentUser.id) return
const relationship = this.$store.getters.relationship(attn.id)
if (relationship.blocking) {
mentions = true
}
})
return mentions
},
mentionsMutedUser () {
// XXX: doesn't work on domain blocks, because users from blocked domains
// don't appear in `attentions' and therefore cannot be filtered.
let mentions = false
// find if user in mentions list is blocked
this.status.attentions.forEach((attn) => {
if (attn.id === this.currentUser.id) return
const relationship = this.$store.getters.relationship(attn.id)
if (relationship.muting) {
mentions = true
}
})
return mentions
},
muted () {
if (this.statusoid.user.id === this.currentUser.id) return false
const reasonsToMute = this.userIsMuted ||
@ -264,7 +301,11 @@ const Status = {
// Wordfiltered
this.muteWordHits.length > 0 ||
// bot status
(this.muteBotStatuses && this.botStatus && !this.compact)
(this.muteBotStatuses && this.botStatus && !this.compact) ||
// mentions blocked user
this.mentionsBlockedUser ||
// mentions muted user
this.mentionsMutedUser
return !this.unmuted && !this.shouldNotMute && reasonsToMute
},
userIsMuted () {
@ -307,6 +348,9 @@ const Status = {
hideFilteredStatuses () {
return this.mergedConfig.hideFilteredStatuses
},
hideThreadsWithBlockedUsers () {
return this.mergedConfig.hideThreadsWithBlockedUsers
},
hideWordFilteredPosts () {
return this.mergedConfig.hideWordFilteredPosts
},
@ -314,8 +358,9 @@ const Status = {
return (!this.shouldNotMute) && (
(this.muted && this.hideFilteredStatuses) ||
(this.userIsMuted && this.hideMutedUsers) ||
(this.status.thread_muted && this.hideMutedThreads) ||
(this.muteWordHits.length > 0 && this.hideWordFilteredPosts)
((this.status.thread_muted || this.mentionsMutedUser) && this.hideMutedThreads) ||
(this.muteWordHits.length > 0 && this.hideWordFilteredPosts) ||
(this.mentionsBlockedUser && this.hideThreadsWithBlockedUsers)
)
},
isFocused () {
@ -418,6 +463,9 @@ const Status = {
toggleReplying () {
controlledOrUncontrolledToggle(this, 'replying')
},
toggleQuoting () {
controlledOrUncontrolledToggle(this, 'quoting')
},
gotoOriginal (id) {
if (this.inConversation) {
this.$emit('goto', id)

View file

@ -101,6 +101,10 @@
.status-heading {
margin-bottom: 0.5em;
.emoji {
--emoji-size: 16px;
}
}
.heading-name-row {
@ -355,6 +359,15 @@
flex: 1;
}
.quote-form {
padding-top: 0;
padding-bottom: 0;
}
.quote-body {
flex: 1;
}
.favs-repeated-users {
margin-top: var(--status-margin, $status-margin);
}

View file

@ -430,6 +430,12 @@
:status="status"
@toggle="toggleReplying"
/>
<quote-button
:visibility="status.visibility"
:quoting="quoting"
:status="status"
@toggle="toggleQuoting"
/>
<retweet-button
:visibility="status.visibility"
:logged-in="loggedIn"
@ -488,6 +494,20 @@
@posted="toggleReplying"
/>
</div>
<div
v-if="quoting"
class="status-container quote-form"
>
<PostStatusForm
class="quote-body"
:quote-id="status.id"
:attentions="[status.user]"
:replied-user="status.user"
:copy-message-scope="status.visibility"
:subject="replySubject"
@posted="toggleQuoting"
/>
</div>
</template>
</div>
</template>

View file

@ -6,9 +6,12 @@
.emoji {
--_still_image-label-scale: 0.5;
--emoji-size: 38px;
}
width: 50px;
height: 50px;
.emoji:hover {
transform: scale(1.4);
transition: 0.05s;
}
._mfm_x2_ {
@ -94,7 +97,7 @@
overflow-y: hidden;
z-index: 1;
.media-body {
.media-body-wrapper {
min-height: 0;
mask:
linear-gradient(to top, white, transparent) bottom/100% 70px no-repeat,
@ -154,16 +157,19 @@
--emoji-size: 16px;
& .body,
& .body:not(:active),
& .attachments {
max-height: 3.25em;
}
.body {
overflow: hidden;
white-space: normal;
min-width: 5em;
flex: 5 1 auto;
}
.body:not(:active) {
overflow: hidden;
mask-size: auto 3.5em, auto auto;
mask-position: 0 0, 0 0;
mask-repeat: repeat-x, repeat;

View file

@ -43,6 +43,7 @@
</button>
<div
v-if="!hideSubjectStatus && !(singleLine && status.summary_raw_html)"
class="media-body-wrapper"
>
<RichContent
:class="{ '-single-line': singleLine }"

View file

@ -3,6 +3,7 @@ import Poll from '../poll/poll.vue'
import Gallery from '../gallery/gallery.vue'
import StatusBody from 'src/components/status_body/status_body.vue'
import LinkPreview from '../link-preview/link-preview.vue'
import QuoteCard from '../quote_card/quote_card.vue'
import { mapGetters, mapState } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
@ -109,7 +110,8 @@ const StatusContent = {
Poll,
Gallery,
LinkPreview,
StatusBody
StatusBody,
QuoteCard
},
methods: {
toggleShowingTall () {

View file

@ -40,7 +40,14 @@
@play="$emit('mediaplay', attachment.id)"
@pause="$emit('mediapause', attachment.id)"
/>
<div
v-if="status.quote && !compact"
class="quote"
>
<QuoteCard
:status="status.quote"
/>
</div>
<div
v-if="status.card && !noHeading && !compact"
class="link-preview media-body"

View file

@ -4,7 +4,6 @@
},
"features_panel": {
"chat": "الدردشة",
"gopher": "غوفر",
"media_proxy": "بروكسي الوسائط",
"scope_options": "",
"text_limit": "الحد الأقصى للنص",

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,6 @@
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Mediální proxy",
"scope_options": "Možnosti rozsahů",
"text_limit": "Textový limit",

View file

@ -4,14 +4,12 @@
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Medienproxy",
"scope_options": "Reichweitenoptionen",
"text_limit": "Zeichenlimit",
"title": "Funktionen",
"who_to_follow": "Vorschläge",
"upload_limit": "Maximale Upload Größe",
"pleroma_chat_messages": "Pleroma Chat"
"upload_limit": "Maximale Upload Größe"
},
"finder": {
"error_fetching_user": "Fehler beim Suchen des Benutzers",
@ -775,9 +773,6 @@
"errors": {
"storage_unavailable": "Pleroma konnte nicht auf den Browser Speicher zugreifen. Deine Anmeldung und deine Einstellungen werden nicht gespeichert. Es kann unvorhersehbare Probleme geben. Versuche ansonsten Cookies zu erlauben."
},
"shoutbox": {
"title": "Shoutbox"
},
"chats": {
"error_sending_message": "Beim Senden der Nachricht ist ein Fehler aufgetreten.",
"error_loading_chat": "Beim Laden des Chats ist ein Fehler aufgetreten.",

File diff suppressed because it is too large Load diff

View file

@ -4,13 +4,11 @@
},
"features_panel": {
"chat": "Babilejo",
"gopher": "Gopher",
"media_proxy": "Vidaŭdaĵa retperilo",
"scope_options": "Agordoj de amplekso",
"text_limit": "Limo de teksto",
"title": "Funkcioj",
"who_to_follow": "Kiun aboni",
"pleroma_chat_messages": "Babilejo de Pleroma",
"upload_limit": "Limo de alŝutoj"
},
"finder": {
@ -875,8 +873,5 @@
"additional_comments": "Aldonaj komentoj",
"add_comment_description": "Ĉi tiu raporto sendiĝos al reguligistoj de via nodo. Vi povas komprenigi kial vi raportas ĉi tiun konton sube:",
"title": "Raportante {0}"
},
"shoutbox": {
"title": "Kriujo"
}
}

View file

@ -8,13 +8,11 @@
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Proxy de medios",
"scope_options": "Opciones del alcance de la visibilidad",
"text_limit": "Límite de caracteres",
"title": "Características",
"who_to_follow": "A quién seguir",
"pleroma_chat_messages": "Chat de Pleroma",
"upload_limit": "Límite de subida"
},
"finder": {
@ -854,9 +852,6 @@
},
"staff": "Equipo"
},
"shoutbox": {
"title": "Jaula de Grillos"
},
"remote_user_resolver": {
"remote_user_resolver": "Resolución de usuario remoto",
"error": "No encontrado.",

View file

@ -435,7 +435,6 @@
"text_limit": "Tekstilimiit",
"scope_options": "Ulatuse valikud",
"media_proxy": "Meedia proksi",
"gopher": "Gopher",
"chat": "Vestlus"
},
"exporter": {

View file

@ -8,13 +8,11 @@
},
"features_panel": {
"chat": "Txata",
"gopher": "Ghoper",
"media_proxy": "Media proxy",
"scope_options": "Ikusgaitasun aukerak",
"text_limit": "Testu limitea",
"title": "Ezaugarriak",
"who_to_follow": "Nori jarraitu",
"pleroma_chat_messages": "Pleroma Txata",
"upload_limit": "Kargatzeko muga"
},
"finder": {
@ -708,9 +706,6 @@
"mute_progress": "Isiltzen…",
"mute": "Isilarazi"
},
"shoutbox": {
"title": "Oihu-kutxa"
},
"errors": {
"storage_unavailable": "Pleromak ezin izan du nabigatzailearen biltegira sartu. Hasiera-saioa edo tokiko ezarpenak ez dira gordeko eta ustekabeko arazoak sor ditzake. Saiatu cookie-ak gaitzen."
},

View file

@ -65,8 +65,6 @@
"text_limit": "محدودیت متن",
"scope_options": "تنظیمات حوزه",
"media_proxy": "پروکسی رسانه",
"gopher": "گوفر",
"pleroma_chat_messages": "گپ پلروما",
"chat": "گپ"
},
"media_modal": {
@ -129,9 +127,6 @@
"mute_progress": "در حال بی صدا کردن…",
"mute": "بی صدا"
},
"shoutbox": {
"title": "چت باکس"
},
"display_date": {
"today": "امروز"
},

View file

@ -4,7 +4,6 @@
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Media-välityspalvelin",
"scope_options": "Näkyvyyden rajaus",
"text_limit": "Tekstin pituusraja",

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,6 @@
},
"features_panel": {
"chat": "Comhrá",
"gopher": "Gófar",
"media_proxy": "Seachfhreastalaí meáin",
"scope_options": "Rogha scóip",
"text_limit": "Teorainn Téacs",

View file

@ -8,7 +8,6 @@
},
"features_panel": {
"chat": "צ'אט",
"gopher": "גופר",
"media_proxy": "מדיה פרוקסי",
"scope_options": "אפשרויות טווח",
"text_limit": "מגבלת טקסט",

View file

@ -251,7 +251,6 @@
"hours": "{0} jam",
"hour_short": "{0}j",
"hours_short": "{0}j",
"minute": "{0} menit",
"minutes": "{0} menit",
"minute_short": "{0}m",
@ -597,8 +596,6 @@
"features_panel": {
"title": "Fitur-fitur",
"text_limit": "Batas teks",
"gopher": "Gopher",
"pleroma_chat_messages": "Pleroma Obrolan",
"chat": "Obrolan",
"upload_limit": "Batas unggahan"
},
@ -626,8 +623,5 @@
},
"errors": {
"storage_unavailable": "Pleroma tidak dapat mengakses penyimpanan browser. Login Anda atau pengaturan lokal Anda tidak akan tersimpan dan masalah yang tidak terduga dapat terjadi. Coba mengaktifkan kuki."
},
"shoutbox": {
"title": "Kotak Suara"
}
}

View file

@ -536,13 +536,11 @@
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Proxy allegati",
"scope_options": "Opzioni visibilità",
"text_limit": "Lunghezza massima",
"title": "Caratteristiche",
"who_to_follow": "Chi seguire",
"pleroma_chat_messages": "Chiacchiere",
"upload_limit": "Limite allegati"
},
"finder": {
@ -875,8 +873,5 @@
"delete": "Elimina",
"message_user": "Contatta {nickname}",
"you": "Tu:"
},
"shoutbox": {
"title": "Graffiti"
}
}

View file

@ -31,7 +31,6 @@
},
"features_panel": {
"chat": "チャット",
"gopher": "Gopher",
"media_proxy": "メディアプロクシ",
"scope_options": "こうかいはんいせんたく",
"text_limit": "もじのかず",

View file

@ -8,14 +8,12 @@
},
"features_panel": {
"chat": "チャット",
"gopher": "Gopher",
"media_proxy": "メディアプロクシ",
"scope_options": "公開範囲選択",
"text_limit": "文字の数",
"title": "有効な機能",
"who_to_follow": "おすすめユーザー",
"upload_limit": "ファイルサイズの上限",
"pleroma_chat_messages": "Pleroma チャット"
"upload_limit": "ファイルサイズの上限"
},
"finder": {
"error_fetching_user": "ユーザー検索がエラーになりました",
@ -856,7 +854,8 @@
"accept_desc": "このインスタンスでは、以下のインスタンスからのメッセージのみを受け付けます:",
"accept": "許可",
"simple_policies": "インスタンス固有のポリシー",
"reject": "拒否"
"reject": "拒否",
"instance": "インスタンス"
},
"mrf_policies": "有効なMRFポリシー",
"keyword": {
@ -886,9 +885,6 @@
"errors": {
"storage_unavailable": "ブラウザのストレージに接続できなかったため、ログインや設定情報は保存されません。Cookieを有効にしてください。"
},
"shoutbox": {
"title": "Shoutbox"
},
"chats": {
"empty_chat_list_placeholder": "チャットはありません。新規チャットのボタンを押して始めましょう!",
"error_sending_message": "メッセージの送信に失敗しました。",
@ -907,5 +903,8 @@
"unmute": "ミュート解除",
"mute_progress": "ミュート中…",
"mute": "ミュート"
},
"announcements": {
"page_header": "お知らせ"
}
}

View file

@ -4,14 +4,12 @@
},
"features_panel": {
"chat": "챗",
"gopher": "고퍼",
"media_proxy": "미디어 프록시",
"scope_options": "범위 옵션",
"text_limit": "텍스트 제한",
"title": "기능",
"who_to_follow": "팔로우 추천",
"upload_limit": "최대 파일용량",
"pleroma_chat_messages": "Pleroma 채트"
"upload_limit": "최대 파일용량"
},
"finder": {
"error_fetching_user": "사용자 정보 불러오기 실패",
@ -549,9 +547,6 @@
"federation": "연합"
}
},
"shoutbox": {
"title": "Shoutbox"
},
"time": {
"now_short": "방금",
"now": "방끔",

View file

@ -8,7 +8,6 @@
},
"features_panel": {
"chat": "Nettprat",
"gopher": "Gopher",
"media_proxy": "Media proxy",
"scope_options": "Velg mottakere",
"text_limit": "Tekstgrense",

File diff suppressed because it is too large Load diff

View file

@ -8,7 +8,6 @@
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Servidor mandatari mèdia",
"scope_options": "Nivèls de confidencialitat",
"text_limit": "Limita de tèxte",
@ -522,7 +521,7 @@
"favorite": "aimar",
"user_settings": "Paramètres utilizaire"
},
"upload":{
"upload": {
"error": {
"base": "Mandadís fracassat.",
"file_too_big": "Fichièr tròp grand [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",

View file

@ -44,13 +44,11 @@
},
"features_panel": {
"chat": "Czat",
"gopher": "Gopher",
"media_proxy": "Proxy mediów",
"scope_options": "Ustawienia zakresu",
"text_limit": "Limit tekstu",
"title": "Funkcje",
"who_to_follow": "Propozycje obserwacji",
"pleroma_chat_messages": "Czat Pleromy",
"upload_limit": "Limit wysyłania"
},
"finder": {
@ -858,9 +856,6 @@
"display_date": {
"today": "Dzisiaj"
},
"shoutbox": {
"title": "Shoutbox"
},
"errors": {
"storage_unavailable": "Pleroma nie mogła uzyskać dostępu do pamięci masowej przeglądarki. Twój login lub lokalne ustawienia nie zostaną zapisane i możesz napotkać problemy. Spróbuj włączyć ciasteczka."
}

View file

@ -4,14 +4,12 @@
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Proxy de multimédia",
"scope_options": "Opções de privacidade",
"text_limit": "Limite de caracteres",
"title": "Características",
"who_to_follow": "Quem seguir",
"upload_limit": "Limite de carregamento",
"pleroma_chat_messages": "Chat do Pleroma"
"upload_limit": "Limite de carregamento"
},
"finder": {
"error_fetching_user": "Erro ao pesquisar utilizador",
@ -36,8 +34,7 @@
"error_retry": "Por favor, tenta novamente",
"loading": "A carregar…",
"dismiss": "Ignorar",
"role":
{
"role": {
"moderator": "Moderador",
"admin": "Admin"
}
@ -742,9 +739,6 @@
"errors": {
"storage_unavailable": "O Pleroma não conseguiu aceder ao armazenamento do navegador. A sua sessão ou definições locais não serão armazenadas e poderá encontrar problemas inesperados. Tente ativar as cookies."
},
"shoutbox": {
"title": "Chat Geral"
},
"chats": {
"chats": "Chats",
"empty_chat_list_placeholder": "Não tens conversações ainda. Inicia uma nova conversa!",

View file

@ -657,9 +657,7 @@
"media_proxy": "Прокси для внешних вложений",
"text_limit": "Лимит символов",
"title": "Особенности",
"gopher": "Gopher",
"who_to_follow": "Предложения кого читать",
"pleroma_chat_messages": "Pleroma Чат",
"upload_limit": "Наибольший размер загружаемого файла",
"scope_options": "Настраиваемая видимость статусов"
},
@ -716,9 +714,6 @@
"emoji": "Эмодзи",
"stickers": "Стикеры"
},
"shoutbox": {
"title": "Болтовня"
},
"time": {
"now_short": "только что",
"now": "только что",

View file

@ -32,9 +32,6 @@
},
"staff": "Personál"
},
"shoutbox": {
"title": "Verejné fórum"
},
"domain_mute_card": {
"mute": "Utíš",
"mute_progress": "Utišujem…",
@ -47,8 +44,6 @@
},
"features_panel": {
"shout": "Verejné fórum",
"pleroma_chat_messages": "Pleroma Chat",
"gopher": "Gopher",
"media_proxy": "Proxy pre médiá",
"scope_options": "Nastavenia rámca",
"text_limit": "Limit počtu znakov",

View file

@ -1,7 +1,6 @@
{
"chat.title": "చాట్",
"features_panel.chat": "చాట్",
"features_panel.gopher": "గోఫర్",
"features_panel.media_proxy": "మీడియా ప్రాక్సీ",
"features_panel.scope_options": "స్కోప్ ఎంపికలు",
"features_panel.text_limit": "వచన పరిమితి",

View file

@ -31,8 +31,6 @@
"find_user": "Знайти користувача"
},
"features_panel": {
"gopher": "Gopher",
"pleroma_chat_messages": "Чати",
"chat": "Оголошення",
"who_to_follow": "Кого відстежувати",
"title": "Особливості",
@ -51,9 +49,6 @@
"mute_progress": "Вимикаю…",
"mute": "Ігнорувати"
},
"shoutbox": {
"title": "Оголошення"
},
"about": {
"staff": "Адміністрація",
"mrf": {

View file

@ -41,8 +41,6 @@
},
"features_panel": {
"chat": "Chat",
"pleroma_chat_messages": "Pleroma Chat",
"gopher": "Gopher",
"media_proxy": "Proxy media",
"text_limit": "Giới hạn ký tự",
"title": "Tính năng",
@ -54,9 +52,6 @@
"error_fetching_user": "Lỗi khi nạp người dùng",
"find_user": "Tìm người dùng"
},
"shoutbox": {
"title": "Chat cùng nhau"
},
"general": {
"apply": "Áp dụng",
"submit": "Gửi tặng",

View file

@ -8,13 +8,11 @@
},
"features_panel": {
"chat": "聊天",
"gopher": "Gopher",
"media_proxy": "媒体代理",
"scope_options": "可见范围设置",
"text_limit": "文字数量限制",
"title": "功能",
"who_to_follow": "推荐关注",
"pleroma_chat_messages": "Pleroma 聊天",
"upload_limit": "上传限制"
},
"finder": {
@ -850,9 +848,6 @@
"errors": {
"storage_unavailable": "Pleroma 无法访问浏览器储存。您的登陆以及本地设置将不会被保存,您也可能遇到未知问题。请尝试启用 cookies。"
},
"shoutbox": {
"title": "留言板"
},
"display_date": {
"today": "今天"
},

View file

@ -130,9 +130,7 @@
"text_limit": "文字數量限制",
"scope_options": "可見範圍設置",
"media_proxy": "媒體代理",
"pleroma_chat_messages": "Pleroma 聊天",
"chat": "聊天",
"gopher": "Gopher",
"upload_limit": "上傳限制"
},
"exporter": {
@ -145,9 +143,6 @@
"mute_progress": "靜音中…",
"mute": "靜音"
},
"shoutbox": {
"title": "留言板"
},
"about": {
"staff": "職員",
"mrf": {

View file

@ -31,6 +31,7 @@ export const defaultState = {
// bad name: actually hides posts of muted USERS
hideMutedPosts: undefined, // instance default
hideMutedThreads: undefined, // instance default
hideThreadsWithBlockedUsers: undefined, // instance default
hideWordFilteredPosts: undefined, // instance default
muteBotStatuses: undefined, // instance default
collapseMessageWithSubject: undefined, // instance default

View file

@ -30,6 +30,7 @@ const defaultState = {
// bad name: actually hides posts of muted USERS
hideMutedPosts: false,
hideMutedThreads: true,
hideThreadsWithBlockedUsers: false,
hideWordFilteredPosts: false,
hidePostStats: false,
hideBotIndication: false,

View file

@ -57,12 +57,16 @@ const actions = {
commit('setList', { id, title })
},
setListAccounts ({ rootState, commit }, { id, accountIds }) {
const saved = rootState.lists.allListsObject[id].accountIds
const added = accountIds.filter(id => !saved.includes(id))
const removed = saved.filter(id => !accountIds.includes(id))
commit('setListAccounts', { id, accountIds })
rootState.api.backendInteractor.addAccountsToList({ id, accountIds })
rootState.api.backendInteractor.removeAccountsFromList({
id,
accountIds: rootState.lists.allListsObject[id].accountIds.filter(id => !accountIds.includes(id))
})
if (added.length > 0) {
rootState.api.backendInteractor.addAccountsToList({ id, accountIds: added })
}
if (removed.length > 0) {
rootState.api.backendInteractor.removeAccountsFromList({ id, accountIds: removed })
}
},
deleteList ({ rootState, commit }, { id }) {
rootState.api.backendInteractor.deleteList({ id })
@ -76,7 +80,7 @@ export const getters = {
return state.allListsObject[id].title
},
findListAccounts: state => id => {
return state.allListsObject[id].accountIds
return [...state.allListsObject[id].accountIds]
}
}

View file

@ -763,6 +763,7 @@ const postStatus = ({
poll,
mediaIds = [],
inReplyToStatusId,
quoteId,
contentType,
preview,
idempotencyKey
@ -795,6 +796,9 @@ const postStatus = ({
if (inReplyToStatusId) {
form.append('in_reply_to_id', inReplyToStatusId)
}
if (quoteId) {
form.append('quote_id', quoteId)
}
if (preview) {
form.append('preview', 'true')
}

View file

@ -347,6 +347,9 @@ export const parseStatus = (data) => {
output.visibility = data.visibility
output.card = data.card
output.created_at = new Date(data.created_at)
if (data.quote) {
output.quote = parseStatus(data.quote)
}
// Converting to string, the right way.
output.in_reply_to_status_id = output.in_reply_to_status_id

View file

@ -10,6 +10,7 @@ const postStatus = ({
poll,
media = [],
inReplyToStatusId = undefined,
quoteId = undefined,
contentType = 'text/plain',
preview = false,
idempotencyKey = ''
@ -24,6 +25,7 @@ const postStatus = ({
sensitive,
mediaIds,
inReplyToStatusId,
quoteId,
contentType,
poll,
preview,

View file

@ -37,11 +37,11 @@
}
._mfm_jump_ {
animation: mfm-jump 0.75 linear infinite;
animation: mfm-jump 0.75s linear infinite;
}
._mfm_bounce_ {
animation: mfm-bounce 0.75 linear infinite;
animation: mfm-bounce 0.75s linear infinite;
transform-origin: center bottom;
}
@ -67,7 +67,13 @@
font-size: 600%;
}
/* blur */
._mfm_blur_ {
filter: blur(6px);
transition: filter 0.3s
}
._mfm_blur_:hover {
filter: blur(0px);
}
._mfm_rainbow_ {
animation: mfm-rainbow 1s linear infinite;

View file

@ -7445,10 +7445,10 @@ markdown-table@^2.0.0:
dependencies:
repeat-string "^1.0.0"
marked-mfm@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/marked-mfm/-/marked-mfm-0.4.0.tgz#d3094c42daaa57b1b0b263278633de82ebf62396"
integrity sha512-2ZdBHGOV7BFJUcQNLp/jjwEE2IT1O5d1H7cd4dGeuOBI1nivuBCv1Azt7fbRlygfUSQ2rgGtFZ1ZbrP4dRhh3A==
marked-mfm@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/marked-mfm/-/marked-mfm-0.5.0.tgz#0632c4fa8f5044d350b3aaa771b136e5d50b4b60"
integrity sha512-nRazH80nu7gVEDeORQWCWehY3v7fofC4usKdY/d6mckxfRY4PrPNLM3iGpVedpij9ktmesWAtY7SpCLq/BxP4Q==
dependencies:
"@babel/core" "^7.18.6"
"@babel/preset-env" "^7.18.6"
@ -7561,13 +7561,6 @@ methods@~1.1.2:
version "1.1.2"
resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
mfm-js@^0.22.1:
version "0.22.1"
resolved "https://registry.npmjs.org/mfm-js/-/mfm-js-0.22.1.tgz"
integrity sha512-UV5zvDKlWPpBFeABhyCzuOTJ3RwrNrmVpJ+zz/dFX6D/ntEywljgxkfsLamcy0ZSwUAr0O+WQxGHvAwyxUgsAQ==
dependencies:
twemoji-parser "14.0.x"
micromatch@^3.1.10, micromatch@^3.1.4:
version "3.1.10"
resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz"
@ -10747,11 +10740,6 @@ tty-browserify@0.0.0:
version "0.0.0"
resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz"
twemoji-parser@14.0.x:
version "14.0.0"
resolved "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-14.0.0.tgz"
integrity sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"