Merge branch 'consistent-mutes' into shigusegubu-themes3

This commit is contained in:
Henry Jameson 2025-01-02 23:03:37 +02:00
commit 3ffe042b25
28 changed files with 462 additions and 273 deletions

1
changelog.d/mutes.change Normal file
View file

@ -0,0 +1 @@
better display of mutes

View file

@ -0,0 +1 @@
Authenticate and subscribe to streaming after connection

View file

@ -44,7 +44,7 @@
"url": "0.11.0", "url": "0.11.0",
"utf8": "3.0.0", "utf8": "3.0.0",
"vue": "3.2.45", "vue": "3.2.45",
"vue-i18n": "9.2.2", "vue-i18n": "10",
"vue-router": "4.1.6", "vue-router": "4.1.6",
"vue-template-compiler": "2.7.14", "vue-template-compiler": "2.7.14",
"vue-virtual-scroller": "^2.0.0-beta.7", "vue-virtual-scroller": "^2.0.0-beta.7",

View file

@ -73,7 +73,7 @@
</template> </template>
<template #text> <template #text>
<span> <span>
{{ $tc('status.show_all_conversation', otherTopLevelCount, { numStatus: otherTopLevelCount }) }} {{ $t('status.show_all_conversation', { numStatus: otherTopLevelCount }, otherTopLevelCount) }}
</span> </span>
</template> </template>
</i18n-t> </i18n-t>
@ -146,7 +146,7 @@
</template> </template>
<template #text> <template #text>
<span> <span>
{{ $tc('status.ancestor_follow', getReplies(status.id).length - 1, { numReplies: getReplies(status.id).length - 1 }) }} {{ $t('status.ancestor_follow', { numReplies: getReplies(status.id, getReplies(status.id).length - 1).length - 1 }) }}
</span> </span>
</template> </template>
</i18n-t> </i18n-t>

View file

@ -293,9 +293,12 @@ const EmojiInput = {
})) }))
this.highlighted = this.defaultCandidateIndex this.highlighted = this.defaultCandidateIndex
this.$refs.screenReaderNotice.announce( this.$refs.screenReaderNotice.announce(
this.$tc('tool_tip.autocomplete_available', this.$t(
this.suggestions.length, 'tool_tip.autocomplete_available',
{ number: this.suggestions.length })) { number: this.suggestions.length },
this.suggestions.length
)
)
} }
}, },
methods: { methods: {

View file

@ -92,7 +92,7 @@ const EmojiReactions = {
toggled: this.reactedWith(reaction.name) toggled: this.reactedWith(reaction.name)
} }
], ],
'aria-label': this.$tc('status.reaction_count_label', reaction.count, { num: reaction.count }) 'aria-label': this.$t('status.reaction_count_label', { num: reaction.count }, reaction.count)
} }
} }
} }

View file

@ -14,7 +14,7 @@
class="fa-scale-110 icon" class="fa-scale-110 icon"
icon="comments" icon="comments"
/> />
{{ $tc('notifications.unread_chats', unreadChatCount, { num: unreadChatCount }) }} {{ $t('notifications.unread_chats', { num: unreadChatCount }, unreadChatCount) }}
</router-link> </router-link>
</div> </div>
<div <div
@ -31,7 +31,7 @@
class="fa-scale-110 icon" class="fa-scale-110 icon"
icon="bullhorn" icon="bullhorn"
/> />
{{ $tc('notifications.unread_announcements', unreadAnnouncementCount, { num: unreadAnnouncementCount }) }} {{ $t('notifications.unread_announcements', { num: unreadAnnouncementCount }, unreadAnnouncementCount) }}
</router-link> </router-link>
</div> </div>
<div <div
@ -48,7 +48,7 @@
class="fa-scale-110 icon" class="fa-scale-110 icon"
icon="user-plus" icon="user-plus"
/> />
{{ $tc('notifications.unread_follow_requests', followRequestCount, { num: followRequestCount }) }} {{ $t('notifications.unread_follow_requests', { num: followRequestCount }, followRequestCount) }}
</router-link> </router-link>
</div> </div>
<i18n-t <i18n-t

View file

@ -9,7 +9,7 @@
:key="index" :key="index"
> >
<label> <label>
{{ index === 0 ? $t('settings.primary_language') : $tc('settings.fallback_language', index, { index }) }} {{ index === 0 ? $t('settings.primary_language') : $t('settings.fallback_language', { index }, index) }}
<Select <Select
class="language-select" class="language-select"
:model-value="controlledLanguage[index]" :model-value="controlledLanguage[index]"

View file

@ -98,7 +98,7 @@
<span <span
class="counter" class="counter"
> >
{{ $tc('media_modal.counter', currentIndex + 1, { current: currentIndex + 1, total: media.length }) }} {{ $t('media_modal.counter', { current: currentIndex + 1, total: media.length }, currentIndex + 1) }}
</span> </span>
<span <span
v-if="loading" v-if="loading"

View file

@ -85,10 +85,10 @@
</span> </span>
<div class="total"> <div class="total">
<template v-if="typeof poll.voters_count === 'number'"> <template v-if="typeof poll.voters_count === 'number'">
{{ $tc("polls.people_voted_count", poll.voters_count, { count: poll.voters_count }) }} {{ $t("polls.people_voted_count", { count: poll.voters_count }, poll.voters_count) }}
</template> </template>
<template v-else> <template v-else>
{{ $tc("polls.votes_count", poll.votes_count, { count: poll.votes_count }) }} {{ $t("polls.votes_count", { count: poll.votes_count }, poll.votes_count) }}
</template> </template>
<span v-if="expiresAt !== null"> <span v-if="expiresAt !== null">
&nbsp;·&nbsp; &nbsp;·&nbsp;

View file

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

View file

@ -201,7 +201,7 @@
<span>{{ $t('registration.validations.birthday_required') }}</span> <span>{{ $t('registration.validations.birthday_required') }}</span>
</li> </li>
<li v-if="v$.user.birthday.maxValue.$invalid"> <li v-if="v$.user.birthday.maxValue.$invalid">
<span>{{ $tc('registration.validations.birthday_min_age', { date: birthdayMinFormatted }) }}</span> <span>{{ $t('registration.validations.birthday_min_age', { date: birthdayMinFormatted }) }}</span>
</li> </li>
</ul> </ul>
</div> </div>

View file

@ -24,10 +24,7 @@
margin: 0.5em 0; margin: 0.5em 0;
} }
.palettes { .palettes-container {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 0.5em;
height: 15em; height: 15em;
overflow-y: auto; overflow-y: auto;
overflow-x: hidden; overflow-x: hidden;
@ -35,7 +32,14 @@
border-radius: var(--roundness); border-radius: var(--roundness);
border: 1px solid var(--border); border: 1px solid var(--border);
margin: -0.5em; margin: -0.5em;
}
.palettes {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 0.5em;
padding: 0.5em; padding: 0.5em;
width: 100%;
h4 { h4 {
margin: 0; margin: 0;

View file

@ -93,56 +93,58 @@
<h2>{{ $t('settings.style.themes3.palette.label') }}</h2> <h2>{{ $t('settings.style.themes3.palette.label') }}</h2>
<div <div
v-if="customThemeVersion === 'v3'" v-if="customThemeVersion === 'v3'"
class="palettes" class="palettes-container"
> >
<h4 v-if="stylePalettes?.length > 0"> <h4 v-if="stylePalettes?.length > 0">
{{ $t('settings.style.themes3.palette.style') }} {{ $t('settings.style.themes3.palette.style') }}
</h4> </h4>
<button <div class="palettes">
v-for="p in stylePalettes || []" <button
:key="p.name" v-for="p in stylePalettes || []"
class="btn button-default palette-entry" :key="p.name"
:class="{ toggled: isPaletteActive(p.key), disabled: switchInProgress }" class="btn button-default palette-entry"
:disabled="switchInProgress" :class="{ toggled: isPaletteActive(p.key), disabled: switchInProgress }"
@click="() => setPalette(p.key, p)" :disabled="switchInProgress"
> @click="() => setPalette(p.key, p)"
<div class="palette-label"> >
<label> <div class="palette-label">
{{ p.name ?? $t('settings.style.themes3.palette.user') }} <label>
</label> {{ p.name ?? $t('settings.style.themes3.palette.user') }}
</div> </label>
<div class="palette-preview"> </div>
<span <div class="palette-preview">
v-for="c in palettesKeys" <span
:key="c" v-for="c in palettesKeys"
class="palette-square" :key="c"
:style="{ backgroundColor: p[c], border: '1px solid ' + (p[c] ?? 'var(--text)') }" class="palette-square"
/> :style="{ backgroundColor: p[c], border: '1px solid ' + (p[c] ?? 'var(--text)') }"
</div> />
</button> </div>
<h4>{{ $t('settings.style.themes3.palette.bundled') }}</h4> </button>
<button <h4>{{ $t('settings.style.themes3.palette.bundled') }}</h4>
v-for="p in bundledPalettes" <button
:key="p.name" v-for="p in bundledPalettes"
class="btn button-default palette-entry" :key="p.name"
:class="{ toggled: isPaletteActive(p.key), disabled: switchInProgress }" class="btn button-default palette-entry"
:disabled="switchInProgress" :class="{ toggled: isPaletteActive(p.key), disabled: switchInProgress }"
@click="() => setPalette(p.key, p)" :disabled="switchInProgress"
> @click="() => setPalette(p.key, p)"
<div class="palette-label"> >
<label> <div class="palette-label">
{{ p.name }} <label>
</label> {{ p.name }}
</div> </label>
<div class="palette-preview"> </div>
<span <div class="palette-preview">
v-for="c in palettesKeys" <span
:key="c" v-for="c in palettesKeys"
class="palette-square" :key="c"
:style="{ backgroundColor: p[c], border: '1px solid ' + (p[c] ?? 'var(--text)') }" class="palette-square"
/> :style="{ backgroundColor: p[c], border: '1px solid ' + (p[c] ?? 'var(--text)') }"
</div> />
</button> </div>
</button>
</div>
</div> </div>
<div> <div>
<template v-if="customThemeVersion === 'v3'"> <template v-if="customThemeVersion === 'v3'">

View file

@ -80,7 +80,7 @@
<span <span
v-else-if="backup.state === 'running'" v-else-if="backup.state === 'running'"
> >
{{ $tc('settings.backup_running', backup.processed_number, { number: backup.processed_number }) }} {{ $t('settings.backup_running', { number: backup.processed_number }, backup.processed_number) }}
</span> </span>
<span <span
v-else-if="backup.state === 'failed'" v-else-if="backup.state === 'failed'"

View file

@ -260,18 +260,47 @@ const Status = {
hasMentionsLine () { hasMentionsLine () {
return this.mentionsLine.length > 0 return this.mentionsLine.length > 0
}, },
muteReasons () {
return [
this.userIsMuted ? 'user' : null,
status.thread_muted ? 'thread' : null,
(this.muteWordHits.length > 0) ? 'wordfilter' : null,
(this.muteBotStatuses && this.botStatus) ? 'bot' : null,
(this.muteSensitiveStatuses && this.sensitiveStatus) ? 'nsfw' : null
].filter(_ => _)
},
muteLocalized () {
if (this.muteReasons.length === 0) return null
const mainReason = () => {
switch (this.muteReasons[0]) {
case 'user': return this.$t('status.muted_user')
case 'thread': return this.$t('status.thread_muted')
case 'wordfilter':
return this.$t(
'status.muted_words',
{
word: this.muteWordHits[0],
numWordsMore: this.muteWordHits.length - 1
},
this.muteWordHits.length
)
case 'bot': return this.$t('status.bot_muted')
case 'nsfw': return this.$t('status.sensitive_muted')
}
}
console.log(this.muteReasons, mainReason())
return this.$t(
'status.multi_reason_mute',
{
main: mainReason(),
numReasonsMore: this.muteReasons.length - 1
},
this.muteReasons.length - 1
)
},
muted () { muted () {
if (this.statusoid.user.id === this.currentUser.id) return false if (this.statusoid.user.id === this.currentUser.id) return false
const reasonsToMute = this.userIsMuted || return !this.unmuted && !this.shouldNotMute && this.muteReasons.length > 0
// Thread is muted
status.thread_muted ||
// Wordfiltered
this.muteWordHits.length > 0 ||
// bot status
(this.muteBotStatuses && this.botStatus && !this.compact) ||
// sensitive status
(this.muteSensitiveStatuses && this.sensitiveStatus && !this.compact)
return !this.unmuted && !this.shouldNotMute && reasonsToMute
}, },
userIsMuted () { userIsMuted () {
if (this.statusoid.user.id === this.currentUser.id) return false if (this.statusoid.user.id === this.currentUser.id) return false

View file

@ -284,15 +284,10 @@
gap: 1ex; gap: 1ex;
& .status-username, & .status-username,
& .mute-thread, & .mute-reason {
& .mute-words {
word-wrap: normal; word-wrap: normal;
word-break: normal; word-break: normal;
white-space: nowrap; white-space: nowrap;
}
& .status-username,
& .mute-words {
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
} }
@ -302,19 +297,7 @@
flex: 0 1 auto; flex: 0 1 auto;
margin-right: 0.2em; margin-right: 0.2em;
font-size: smaller; font-size: smaller;
} display: flex;
.mute-thread {
flex: 0 0 auto;
}
.mute-words {
flex: 1 0 5em;
margin-left: 0.2em;
&::before {
content: " ";
}
} }
.unmute { .unmute {

View file

@ -30,36 +30,8 @@
:at="false" :at="false"
/> />
</small> </small>
<small <small class="mute-reason">
v-if="muteSensitiveStatuses && status.nsfw" {{ muteLocalized }}
class="mute-thread"
>
{{ $t('status.sensitive_muted') }}
</small>
<small
v-if="muteBotStatuses && botStatus"
class="mute-thread"
>
{{ $t('status.bot_muted') }}
</small>
<small
v-if="showReasonMutedThread"
class="mute-thread"
>
<span>
{{ $t('status.thread_muted') }}
</span>
<span
v-if="muteWordHits.length > 0"
>
{{ $t('status.thread_muted_and_words') }}
</span>
</small>
<small
class="mute-words"
:title="muteWordHits.join(', ')"
>
{{ muteWordHits.join(', ') }}
</small> </small>
<button <button
class="unmute button-unstyled" class="unmute button-unstyled"
@ -313,13 +285,14 @@
> >
<i18n-t <i18n-t
keypath="status.reply_to_with_arg" keypath="status.reply_to_with_arg"
scope="global"
> >
<template #replyToWithIcon> <template #replyToWithIcon>
<StatusPopover <StatusPopover
v-if="!isPreview" v-if="!isPreview"
:status-id="status.parent_visible && status.in_reply_to_status_id" :status-id="status.parent_visible && status.in_reply_to_status_id"
class="reply-to-popover" class="reply-to-popover"
style="min-width: 0;" style="min-width: 0"
:class="{ '-strikethrough': !status.parent_visible }" :class="{ '-strikethrough': !status.parent_visible }"
> >
<button <button
@ -327,7 +300,10 @@
:aria-label="$t('tool_tip.reply')" :aria-label="$t('tool_tip.reply')"
@click.prevent="gotoOriginal(status.in_reply_to_status_id)" @click.prevent="gotoOriginal(status.in_reply_to_status_id)"
> >
<i18n-t keypath="status.reply_to_with_icon"> <i18n-t
keypath="status.reply_to_with_icon"
scope="global"
>
<template #icon> <template #icon>
<FAIcon <FAIcon
class="fa-scale-110 fa-old-padding" class="fa-scale-110 fa-old-padding"
@ -481,10 +457,10 @@
<button <button
v-if="showOtherRepliesAsButton && replies.length > 1" v-if="showOtherRepliesAsButton && replies.length > 1"
class="button-unstyled -link" class="button-unstyled -link"
:title="$tc('status.ancestor_follow', replies.length - 1, { numReplies: replies.length - 1 })" :title="$t('status.ancestor_follow', { numReplies: replies.length - 1 }, replies.length - 1)"
@click.prevent="dive" @click.prevent="dive"
> >
{{ $tc('status.replies_list_with_others', replies.length - 1, { numReplies: replies.length - 1 }) }} {{ $t('status.replies_list_with_others', { numReplies: replies.length - 1 }, replies.length - 1) }}
</button> </button>
<span <span
v-else v-else
@ -622,15 +598,13 @@
class="status-container reply-form" class="status-container reply-form"
> >
<PostStatusForm <PostStatusForm
ref="postStatusForm"
class="reply-body" class="reply-body"
:reply-to="status.id" :reply-to="status.id"
:attentions="status.attentions" :attentions="status.attentions"
:replied-user="status.user" :replied-user="status.user"
:copy-message-scope="status.visibility" :copy-message-scope="status.visibility"
:subject="replySubject" :subject="replySubject"
@posted="doToggleReplying" @posted="toggleReplying"
@can-close="doToggleReplying"
/> />
</div> </div>
</template> </template>

View file

@ -89,7 +89,7 @@
</template> </template>
<template #text> <template #text>
<span> <span>
{{ $tc('status.thread_follow', totalReplyCount[status.id], { numStatus: totalReplyCount[status.id] }) }} {{ $t('status.thread_follow', { numStatus: totalReplyCount[status.id] }, totalReplyCount[status.id]) }}
</span> </span>
</template> </template>
</i18n-t> </i18n-t>
@ -108,7 +108,7 @@
</template> </template>
<template #text> <template #text>
<span> <span>
{{ $tc('status.thread_show_full', totalReplyCount[status.id], { numStatus: totalReplyCount[status.id], depth: totalReplyDepth[status.id] }) }} {{ $t('status.thread_show_full', { numStatus: totalReplyCount[status.id], depth: totalReplyDepth[status.id] }, totalReplyCount[status.id]) }}
</span> </span>
</template> </template>
</i18n-t> </i18n-t>

View file

@ -1243,6 +1243,8 @@
"status_unavailable": "Status unavailable", "status_unavailable": "Status unavailable",
"copy_link": "Copy link to status", "copy_link": "Copy link to status",
"external_source": "External source", "external_source": "External source",
"muted_words": "Wordfiltered: {word} | Wordfiltered: {word} and {numWordsMore} more word",
"multi_reason_mute": "{main} | {main} + one more reason | {main} + {numReasonsMore} more reasons",
"thread_muted": "Thread muted", "thread_muted": "Thread muted",
"thread_muted_and_words": ", has words:", "thread_muted_and_words": ", has words:",
"sensitive_muted": "Muting sensitive content", "sensitive_muted": "Muting sensitive content",

View file

@ -58,7 +58,7 @@
"yes": "Oui", "yes": "Oui",
"no": "Non", "no": "Non",
"unpin": "Dégrafer l'élément", "unpin": "Dégrafer l'élément",
"scroll_to_top": "Défiler au début", "scroll_to_top": "Défiler vers le haut",
"pin": "Agrafer l'élément", "pin": "Agrafer l'élément",
"generic_error_message": "Une erreur est apparue : {0}", "generic_error_message": "Une erreur est apparue : {0}",
"never_show_again": "Ne plus afficher" "never_show_again": "Ne plus afficher"
@ -110,7 +110,7 @@
"mentions": "Mentions", "mentions": "Mentions",
"interactions": "Interactions", "interactions": "Interactions",
"dms": "Messages directs", "dms": "Messages directs",
"public_tl": "Flux publique", "public_tl": "Flux public",
"timeline": "Flux personnel", "timeline": "Flux personnel",
"twkn": "Réseau connu", "twkn": "Réseau connu",
"user_search": "Recherche de comptes", "user_search": "Recherche de comptes",
@ -119,7 +119,7 @@
"search": "Recherche", "search": "Recherche",
"administration": "Administration", "administration": "Administration",
"chats": "Chats", "chats": "Chats",
"bookmarks": "Marques-Pages", "bookmarks": "Marque-Pages",
"timelines": "Flux", "timelines": "Flux",
"home_timeline": "Flux personnel", "home_timeline": "Flux personnel",
"edit_nav_mobile": "Personnaliser la barre de navigation", "edit_nav_mobile": "Personnaliser la barre de navigation",
@ -127,12 +127,14 @@
"lists": "Listes", "lists": "Listes",
"edit_pinned": "Éditer les éléments agrafés", "edit_pinned": "Éditer les éléments agrafés",
"edit_finish": "Édition terminée", "edit_finish": "Édition terminée",
"mobile_sidebar": "(Dés)activer le panneau latéral", "mobile_sidebar": "Basculer la barre latérale",
"mobile_notifications_close": "Fermer les notifications", "mobile_notifications_close": "Fermer les notifications",
"search_close": "Fermer la barre de recherche", "search_close": "Fermer la barre de recherche",
"announcements": "Annonces", "announcements": "Annonces",
"mobile_notifications_mark_as_seen": "Marquer tout comme vu", "mobile_notifications_mark_as_seen": "Marquer tout comme vu",
"quotes": "Citations" "quotes": "Citations",
"all_bookmarks": "Tous les marque-pages",
"bookmark_folders": "Dossiers des marque-pages"
}, },
"notifications": { "notifications": {
"broken_favorite": "Message inconnu, recherche en cours…", "broken_favorite": "Message inconnu, recherche en cours…",
@ -154,7 +156,8 @@
"configuration_tip_settings": "les préférences", "configuration_tip_settings": "les préférences",
"unread_follow_requests": "{num} nouvelle demande de suivi | {num} nouvelles demandes de suivi", "unread_follow_requests": "{num} nouvelle demande de suivi | {num} nouvelles demandes de suivi",
"configuration_tip": "Vous pouvez personnaliser ce qui est affiché ici dans {theSettings}. {dismiss}", "configuration_tip": "Vous pouvez personnaliser ce qui est affiché ici dans {theSettings}. {dismiss}",
"configuration_tip_dismiss": "Ne plus montrer" "configuration_tip_dismiss": "Ne plus montrer",
"subscribed_status": "posté"
}, },
"interactions": { "interactions": {
"favs_repeats": "Partages et favoris", "favs_repeats": "Partages et favoris",
@ -162,7 +165,8 @@
"load_older": "Chargez d'anciennes interactions", "load_older": "Chargez d'anciennes interactions",
"moves": "Migrations de comptes", "moves": "Migrations de comptes",
"emoji_reactions": "Émoticônes de réaction", "emoji_reactions": "Émoticônes de réaction",
"reports": "Rapports" "reports": "Rapports",
"statuses": "Abonnements"
}, },
"post_status": { "post_status": {
"new_status": "Poster un nouveau statut", "new_status": "Poster un nouveau statut",
@ -187,8 +191,8 @@
}, },
"scope": { "scope": {
"direct": "Direct - N'envoyer qu'aux personnes mentionnées", "direct": "Direct - N'envoyer qu'aux personnes mentionnées",
"private": "Abonné·e·s uniquement - Seul·e·s vos abonné·e·s verront vos status", "private": "Abonné·e·s uniquement - Seul·e·s vos abonné·e·s verront vos statuts",
"public": "Publique - Afficher dans les flux publics", "public": "Public - Afficher dans les flux publics",
"unlisted": "Non-Listé - Ne pas afficher dans les flux publics" "unlisted": "Non-Listé - Ne pas afficher dans les flux publics"
}, },
"media_description_error": "Échec de téléversement du media, essayez encore", "media_description_error": "Échec de téléversement du media, essayez encore",
@ -345,8 +349,8 @@
"notification_visibility_mentions": "Mentionnés", "notification_visibility_mentions": "Mentionnés",
"notification_visibility_repeats": "Partages", "notification_visibility_repeats": "Partages",
"no_rich_text_description": "Ne formatez pas le texte", "no_rich_text_description": "Ne formatez pas le texte",
"no_blocks": "Aucun bloqués", "no_blocks": "Aucun bloqué",
"no_mutes": "Aucun masqués", "no_mutes": "Aucun masqué",
"hide_follows_description": "Ne pas afficher à qui je suis abonné", "hide_follows_description": "Ne pas afficher à qui je suis abonné",
"hide_followers_description": "Ne pas afficher qui est abonné à moi", "hide_followers_description": "Ne pas afficher qui est abonné à moi",
"show_admin_badge": "Afficher le badge d'Admin sur mon profil", "show_admin_badge": "Afficher le badge d'Admin sur mon profil",
@ -401,7 +405,7 @@
"true": "oui" "true": "oui"
}, },
"notifications": "Notifications", "notifications": "Notifications",
"notification_mutes": "Pour stopper la récéption de notifications d'un utilisateur particulier, utilisez un masquage.", "notification_mutes": "Pour stopper la réception de notifications dun utilisateur particulier, utilisez la fonction « masquer ».",
"notification_blocks": "Bloquer un utilisateur stoppe toute notification et se désabonne de lui.", "notification_blocks": "Bloquer un utilisateur stoppe toute notification et se désabonne de lui.",
"enable_web_push_notifications": "Activer les notifications de push web", "enable_web_push_notifications": "Activer les notifications de push web",
"style": { "style": {
@ -505,7 +509,8 @@
"drop_shadow_syntax": "{0} ne supporte pas le paramètre {1} et mot-clé {2}.", "drop_shadow_syntax": "{0} ne supporte pas le paramètre {1} et mot-clé {2}.",
"avatar_inset": "Veuillez noter que combiner à la fois les ombres internes et non-internes sur les avatars peut fournir des résultats inattendus avec la transparence des avatars.", "avatar_inset": "Veuillez noter que combiner à la fois les ombres internes et non-internes sur les avatars peut fournir des résultats inattendus avec la transparence des avatars.",
"spread_zero": "Les ombres avec une dispersion > 0 apparaitrons comme si ils étaient à zéro", "spread_zero": "Les ombres avec une dispersion > 0 apparaitrons comme si ils étaient à zéro",
"inset_classic": "L'ombre interne utilisera toujours {0}" "inset_classic": "L'ombre interne utilisera toujours {0}",
"avatar_inset_short": "Séparer l'ombre incrustée"
}, },
"components": { "components": {
"panel": "Panneau", "panel": "Panneau",
@ -520,7 +525,10 @@
"buttonPressedHover": "Bouton (cliqué+survol)", "buttonPressedHover": "Bouton (cliqué+survol)",
"input": "Champ de saisie" "input": "Champ de saisie"
}, },
"hintV3": "Pour les ombres vous pouvez aussi utiliser la notation {0} pour utiliser un autre emplacement de couleur." "hintV3": "Pour les ombres vous pouvez aussi utiliser la notation {0} pour utiliser un autre emplacement de couleur.",
"name": "Nom",
"offset": "Décalage d'ombre",
"light_grid": "Utiliser un damier clair"
}, },
"fonts": { "fonts": {
"_tab_label": "Polices", "_tab_label": "Polices",
@ -529,7 +537,8 @@
"interface": "Interface", "interface": "Interface",
"input": "Champs de saisie", "input": "Champs de saisie",
"post": "Post text", "post": "Post text",
"postCode": "Texte à taille fixe dans un article (texte enrichi)" "postCode": "Texte à taille fixe dans un article (texte enrichi)",
"monospace": "Texte à espacement fixe"
}, },
"family": "Nom de la police", "family": "Nom de la police",
"size": "Taille (en px)", "size": "Taille (en px)",
@ -549,7 +558,43 @@
"header_faint": "Tout va bien", "header_faint": "Tout va bien",
"checkbox": "J'ai survolé les conditions d'utilisation", "checkbox": "J'ai survolé les conditions d'utilisation",
"link": "un petit lien sympa" "link": "un petit lien sympa"
} },
"themes2_outdated": "L'éditeur pour les thèmes V2 est en train d'être supprimé et sera remplacé par un nouvel éditeur qui tirera parti du nouveau moteur pour les thèmes V3. Il devrait toujours fonctionner, mais l'expérience pourrait être dégradée et incohérente.",
"appearance_tab_note": "Dans cet onglet, les changements n'affectent pas le thème utilisé, donc le thème exporté sera différent de ce que vous voyez à l'écran",
"themes3": {
"define": "Écraser",
"hacks": {
"underlay_override_mode_none": "Valeurs par défaut du thème",
"underlay_overrides": "Changer le fond",
"underlay_override_mode_opaque": "Remplacer par une couleur uniforme",
"force_interface_roundness": "Écraser les arrondis de l'interface",
"underlay_override_mode_transparent": "Retirer complètement (peut casser certains thèmes)",
"forced_roundness_mode_disabled": "Utiliser les valeurs par défaut du thème",
"forced_roundness_mode_sharp": "Forcer les bords carrés",
"forced_roundness_mode_round": "Forcer les bords ronds",
"forced_roundness_mode_nonsharp": "Forcer les bords \"pas-vraiment-carrés\" (1 px d'arrondi)"
},
"font": {
"builtin": {
"serif": "Serif",
"sans-serif": "Sans-serif",
"monospace": "Monospace",
"inherit": "Inchangé"
},
"group-builtin": "Polices par défaut du navigateur",
"local-unavailable2": "Entrer manuellement une police spécifique",
"lookup_local_fonts": "Charger la liste des polices installées sur cet ordinateur",
"enter_manually": "Entrer le nom d'une famille de police manuellement",
"entry": "Entrer {fontFamily}",
"select": "Choisir une police",
"local-unavailable1": "Listes des polices indisponibles installées localement",
"font_list_unavailable": "Impossible de trouver la police locale : {error}",
"group-local": "Polices installées localement"
}
},
"interface_font_user_override": "Écraser le thème ou les polices utilisées",
"custom_theme_used": "(Thème personnalisé)",
"update_preview": "Mise à jour de l'aperçu"
}, },
"version": { "version": {
"title": "Version", "title": "Version",
@ -576,7 +621,7 @@
"useStreamingApi": "Recevoir les messages et notifications en temps réel", "useStreamingApi": "Recevoir les messages et notifications en temps réel",
"notification_setting_filters": "Filtres", "notification_setting_filters": "Filtres",
"notification_setting_privacy_option": "Masquer l'expéditeur et le contenu des notifications push", "notification_setting_privacy_option": "Masquer l'expéditeur et le contenu des notifications push",
"notification_setting_privacy": "Intimité", "notification_setting_privacy": "Vie privée",
"hide_followers_count_description": "Masquer le nombre d'abonnés", "hide_followers_count_description": "Masquer le nombre d'abonnés",
"accent": "Accent", "accent": "Accent",
"chatMessageRadius": "Message de chat", "chatMessageRadius": "Message de chat",
@ -587,7 +632,7 @@
"mute_import": "Import des masquages", "mute_import": "Import des masquages",
"mute_export_button": "Exporter vos masquages dans un fichier CSV", "mute_export_button": "Exporter vos masquages dans un fichier CSV",
"mute_export": "Export des masquages", "mute_export": "Export des masquages",
"notification_setting_hide_notification_contents": "Cacher l'expéditeur et le contenu des notifications push", "notification_setting_hide_notification_contents": "Masquer lexpéditeur et le contenu des notifications « push »",
"notification_setting_block_from_strangers": "Bloquer les notifications des utilisateur⋅ice⋅s que vous ne suivez pas", "notification_setting_block_from_strangers": "Bloquer les notifications des utilisateur⋅ice⋅s que vous ne suivez pas",
"virtual_scrolling": "Optimiser le rendu des flux", "virtual_scrolling": "Optimiser le rendu des flux",
"reset_background_confirm": "Voulez-vraiment réinitialiser l'arrière-plan ?", "reset_background_confirm": "Voulez-vraiment réinitialiser l'arrière-plan ?",
@ -654,7 +699,7 @@
"hide_bot_indication": "Cacher l'indication d'un robot avec les messages", "hide_bot_indication": "Cacher l'indication d'un robot avec les messages",
"always_show_post_button": "Toujours montrer le bouton flottant Nouveau Message", "always_show_post_button": "Toujours montrer le bouton flottant Nouveau Message",
"hide_muted_threads": "Cacher les fils masqués", "hide_muted_threads": "Cacher les fils masqués",
"account_privacy": "Intimité", "account_privacy": "Confidentialité",
"posts": "Messages", "posts": "Messages",
"disable_sticky_headers": "Ne pas coller les en-têtes des colonnes en haut de l'écran", "disable_sticky_headers": "Ne pas coller les en-têtes des colonnes en haut de l'écran",
"show_scrollbars": "Montrer les ascenseurs des colonnes", "show_scrollbars": "Montrer les ascenseurs des colonnes",
@ -674,7 +719,7 @@
"mention_link_fade_domain": "Estomper les domaines (ex. {'@'}example.org en {'@'}foo{'@'}example.org)", "mention_link_fade_domain": "Estomper les domaines (ex. {'@'}example.org en {'@'}foo{'@'}example.org)",
"mention_link_bolden_you": "Surligner les mentions qui vous sont destinées", "mention_link_bolden_you": "Surligner les mentions qui vous sont destinées",
"show_yous": "Afficher (Vous)", "show_yous": "Afficher (Vous)",
"setting_server_side": "Cette préférence est liée au profile et affecte toutes les sessions et clients", "setting_server_side": "Cette préférence est liée au profil et affecte toutes les sessions et clients",
"account_backup": "Sauvegarde de compte", "account_backup": "Sauvegarde de compte",
"account_backup_description": "Ceci permet de télécharger une archive des informations du compte et vos messages, mais ils ne peuvent pas actuellement être importé dans un compte Pleroma.", "account_backup_description": "Ceci permet de télécharger une archive des informations du compte et vos messages, mais ils ne peuvent pas actuellement être importé dans un compte Pleroma.",
"add_backup_error": "Erreur à l'ajout d'une nouvelle sauvegarde : {error}", "add_backup_error": "Erreur à l'ajout d'une nouvelle sauvegarde : {error}",
@ -699,7 +744,7 @@
"mention_link_show_avatar_quick": "Afficher l'avatar de l'utilisateur à côté des mentions", "mention_link_show_avatar_quick": "Afficher l'avatar de l'utilisateur à côté des mentions",
"navbar_column_stretch": "Élargir la barre de navigation à la taille des colonnes", "navbar_column_stretch": "Élargir la barre de navigation à la taille des colonnes",
"column_sizes": "Taille des colonnes", "column_sizes": "Taille des colonnes",
"column_sizes_sidebar": "Panneau latéral", "column_sizes_sidebar": "Barre latérale",
"column_sizes_content": "Contenu", "column_sizes_content": "Contenu",
"column_sizes_notifs": "Notifications", "column_sizes_notifs": "Notifications",
"conversation_display_linear_quick": "Vue linéaire", "conversation_display_linear_quick": "Vue linéaire",
@ -736,11 +781,11 @@
"hard_reset_value_tooltip": "Supprime le réglage du stockage, force l'utilisation de la valeur par défaut", "hard_reset_value_tooltip": "Supprime le réglage du stockage, force l'utilisation de la valeur par défaut",
"reset_value_tooltip": "Réinitialiser le brouillon", "reset_value_tooltip": "Réinitialiser le brouillon",
"hard_reset_value": "Remise à zéro", "hard_reset_value": "Remise à zéro",
"hide_actor_type_indication": "Cacher le type (robots, groupes, etc.) dans les status", "hide_actor_type_indication": "Cacher le type (robots, groupes, etc.) dans les statuts",
"notification_extra_follow_requests": "Afficher les nouvelles demandes de suivi", "notification_extra_follow_requests": "Afficher les nouvelles demandes de suivi",
"user_popover_avatar_action": "Action du clic sur l'avatar", "user_popover_avatar_action": "Action lors du clic sur la fenêtre Avatar",
"user_popover_avatar_action_close": "Fermer la fenêtre contextuelle", "user_popover_avatar_action_close": "Fermer la fenêtre contextuelle",
"notification_setting_ignore_inactionable_seen": "Ignorer les status de lecture des notifications non actionnables (favoris, répétitions, etc)", "notification_setting_ignore_inactionable_seen": "Ignorer les statuts de lecture des notifications non actionnables (favoris, répétitions, etc)",
"notification_setting_ignore_inactionable_seen_tip": "Ceci ne marquera pas ces notifications comme lues, et vous recevrez encore les notifications de bureau si vous le décidez", "notification_setting_ignore_inactionable_seen_tip": "Ceci ne marquera pas ces notifications comme lues, et vous recevrez encore les notifications de bureau si vous le décidez",
"notification_setting_unseen_at_top": "Afficher les notifications non lues au-dessus des autres", "notification_setting_unseen_at_top": "Afficher les notifications non lues au-dessus des autres",
"notification_setting_filters_chrome_push": "Sur certains navigateurs (chrome), il peut être impossible de filtrer complètement les notifications par type lorsqu'elles arrivent", "notification_setting_filters_chrome_push": "Sur certains navigateurs (chrome), il peut être impossible de filtrer complètement les notifications par type lorsqu'elles arrivent",
@ -760,16 +805,44 @@
"notification_extra_chats": "Afficher les discussions non lues", "notification_extra_chats": "Afficher les discussions non lues",
"notification_extra_announcements": "Afficher les annonces non lues", "notification_extra_announcements": "Afficher les annonces non lues",
"notification_extra_tip": "Afficher les astuces de personnalisation pour les notifications extras", "notification_extra_tip": "Afficher les astuces de personnalisation pour les notifications extras",
"enable_web_push_always_show_tip": "Certains navigateurs (Chromium, Chrome) exigent que les messages push donnent toujours lieu à une notification, sinon le message générique \"Le site web a été mis à jour en arrière-plan\" s'affiche ; activez cette option pour empêcher l'affichage de cette notification, car Chrome semble masquer les notifications push si l'onglet est au centre de l'attention. Cela peut entraîner l'affichage de notifications en double sur d'autres navigateurs.", "enable_web_push_always_show_tip": "Certains navigateurs (Chromium, Chrome) exigent que les messages push donnent toujours lieu à une notification, sinon le message générique « Le site web a été mis à jour en arrière-plan » saffiche : activez cette option pour empêcher laffichage de cette notification, car Chrome semble masquer les notifications push si longlet est au centre de lattention. Ceci peut entraîner laffichage de notifications en double sur dautres navigateurs.",
"user_popover_avatar_overlay": "Afficher la fenêtre contextuelle sur l'avatar de l'utilisateur", "user_popover_avatar_overlay": "Afficher la fiche de lutilisateur au survol de lavatar",
"notification_visibility_in_column": "Afficher la colonne / le tiroir de notifications", "notification_visibility_in_column": "Afficher la colonne / le tiroir de notifications",
"notification_show_extra": "Afficher les extras dans la colonne de notifications" "notification_show_extra": "Afficher les extras dans la colonne de notifications",
"units": {
"time": {
"m": "minutes",
"s": "secondes",
"h": "heures",
"d": "jours"
}
},
"force_theme_recompilation_debug": "Désactiver le cache du thème, forcer la recompilation à chaque démarrage (DEBUG)",
"absolute_time_format": "Utiliser le format UTC",
"absolute_time_format_min_age": "À n'utiliser que pour les périodes plus anciennes que cette durée",
"notification_visibility_statuses": "Abonnements",
"mute_sensitive_posts": "Masquer les postes sensibles",
"appearance": "Apparence",
"confirm_new_setting": "Confirmer le nouveau réglage ?",
"confirm_new_question": "Est-ce que tout est ok ? Le réglage sera rétabli dans dix secondes.",
"revert": "Rétablir",
"confirm": "Confirmer",
"text_size": "Taille du texte et de l'interface",
"text_size_tip": "Utiliser {0} pour des valeurs absolues, {1} mettra l'échelle du texte à la valeur par défaut du navigateur.",
"text_size_tip2": "Les valeurs différentes de {0} pourraient casser les thèmes ou d'autres trucs",
"emoji_size": "Taille des émojis",
"navbar_size": "Taille de la barre supérieure",
"panel_header_size": "Taille du panneau d'en-tête",
"visual_tweaks": "Ajustements visuels mineurs",
"theme_debug": "Montrer ce que le moteur de thème de l'arrière-plan bricole lorsqu'il travaille avec la transparence (DEBUG)",
"scale_and_layout": "Taille et disposition de l'interface",
"hide_scrobbles_after": "Masquer les scrobbles plus vieux que"
}, },
"timeline": { "timeline": {
"collapse": "Fermer", "collapse": "Fermer",
"conversation": "Conversation", "conversation": "Conversation",
"error_fetching": "Erreur en cherchant les mises à jour", "error_fetching": "Erreur en cherchant les mises à jour",
"load_older": "Afficher des status plus ancien", "load_older": "Afficher des statuts plus anciens",
"no_retweet_hint": "Le message est marqué en abonnés-seulement ou direct et ne peut pas être partagé", "no_retweet_hint": "Le message est marqué en abonnés-seulement ou direct et ne peut pas être partagé",
"repeated": "a partagé", "repeated": "a partagé",
"show_new": "Afficher plus", "show_new": "Afficher plus",
@ -795,8 +868,8 @@
"replies_list": "Réponses:", "replies_list": "Réponses:",
"mute_conversation": "Masquer la conversation", "mute_conversation": "Masquer la conversation",
"unmute_conversation": "Démasquer la conversation", "unmute_conversation": "Démasquer la conversation",
"status_unavailable": "Status indisponible", "status_unavailable": "Statut indisponible",
"copy_link": "Copier le lien au status", "copy_link": "Copier le lien au statut",
"expand": "Développer", "expand": "Développer",
"nsfw": "Contenu sensible", "nsfw": "Contenu sensible",
"status_deleted": "Ce post a été effacé", "status_deleted": "Ce post a été effacé",
@ -834,23 +907,28 @@
"move_up": "Décaler la pièce-jointe à gauche", "move_up": "Décaler la pièce-jointe à gauche",
"open_gallery": "Ouvrir la galerie", "open_gallery": "Ouvrir la galerie",
"thread_show_full": "Montrer tout le fil ({numStatus} message, {depth} niveaux maximum) | Montrer tout le fil ({numStatus} messages, {depth} niveaux maximum)", "thread_show_full": "Montrer tout le fil ({numStatus} message, {depth} niveaux maximum) | Montrer tout le fil ({numStatus} messages, {depth} niveaux maximum)",
"show_all_conversation": "Montrer tout le fil ({numStatus} autre message) | Montrer tout le fil ({numStatus} autre messages)", "show_all_conversation": "Montrer tout le fil ({numStatus} autre message) | Montrer tout le fil ({numStatus} autres messages)",
"edit": "Éditer le status", "edit": "Éditer le statuts",
"edited_at": "(dernière édition {time})", "edited_at": "(dernière édition {time})",
"status_history": "Historique du status", "status_history": "Historique du statut",
"delete_error": "Erreur de suppression du statut : {0}", "delete_error": "Erreur de suppression du statut : {0}",
"repeat_confirm": "Voulez-vous réellement reposter ce statut ?", "repeat_confirm": "Voulez-vous réellement reposter ce statut ?",
"reaction_count_label": "{num} personne a réagi | {num} personnes ont réagi", "reaction_count_label": "{num} personne a réagi | {num} personnes ont réagi",
"repeat_confirm_cancel_button": "Ne pas reposter", "repeat_confirm_cancel_button": "Ne pas reposter",
"hide_quote": "Masquer les status cités", "hide_quote": "Masquer les statuts cités",
"display_quote": "Afficher les status cités", "display_quote": "Afficher les statuts cités",
"invisible_quote": "Citation de statut non disponible : {link}", "invisible_quote": "Citation de statut non disponible : {link}",
"delete_confirm_title": "Confirmer la suppression", "delete_confirm_title": "Confirmer la suppression",
"more_actions": "Plus d'action sur ce statut", "more_actions": "Plus d'action sur ce statut",
"delete_confirm_cancel_button": "Conserver", "delete_confirm_cancel_button": "Conserver",
"repeat_confirm_title": "Confirmer reposte", "repeat_confirm_title": "Confirmer reposte",
"repeat_confirm_accept_button": "Reposter", "repeat_confirm_accept_button": "Reposter",
"delete_confirm_accept_button": "Supprimer" "delete_confirm_accept_button": "Supprimer",
"sensitive_muted": "Silencer le contenu sensible",
"quotes": "Citations",
"load_error": "Impossible de charger la publication : {error}",
"loading": "En cours de chargement…",
"bot_muted": "Silencer le contenu de robots"
}, },
"user_card": { "user_card": {
"approve": "Accepter", "approve": "Accepter",
@ -929,9 +1007,9 @@
"unfollow_confirm": "Voulez-vous vraiment arrêter de suivre {user} ?", "unfollow_confirm": "Voulez-vous vraiment arrêter de suivre {user} ?",
"unfollow_confirm_accept_button": "Ne plus suivre", "unfollow_confirm_accept_button": "Ne plus suivre",
"birthday": "Né(e) le {birthday}", "birthday": "Né(e) le {birthday}",
"edit_note": "Éditer note", "edit_note": "Modifier la note",
"edit_note_apply": "Appliquer", "edit_note_apply": "Appliquer",
"edit_note_cancel": "Abandonner", "edit_note_cancel": "Annuler",
"note": "Note", "note": "Note",
"group": "Groupe", "group": "Groupe",
"unfollow_confirm_title": "Confirmer l'arrêt de suivi", "unfollow_confirm_title": "Confirmer l'arrêt de suivi",
@ -943,7 +1021,7 @@
"remove_follower_confirm_cancel_button": "Conserver", "remove_follower_confirm_cancel_button": "Conserver",
"mute_duration_prompt": "Mettre cet utilisateur en sourdine pour (0 pour une durée indéterminée) :", "mute_duration_prompt": "Mettre cet utilisateur en sourdine pour (0 pour une durée indéterminée) :",
"remove_follower_confirm_title": "Confirmation de suppression d'utilisateur", "remove_follower_confirm_title": "Confirmation de suppression d'utilisateur",
"note_blank": "(Aucun)", "note_blank": "(vide)",
"mute_confirm": "Voulez-vous vraiment mettre {user} en sourdine ?", "mute_confirm": "Voulez-vous vraiment mettre {user} en sourdine ?",
"mute_confirm_accept_button": "Mettre en sourdine", "mute_confirm_accept_button": "Mettre en sourdine",
"mute_confirm_cancel_button": "Ne pas mettre en sourdine", "mute_confirm_cancel_button": "Ne pas mettre en sourdine",
@ -983,8 +1061,8 @@
"reject_follow_request": "Rejeter la demande de suivit", "reject_follow_request": "Rejeter la demande de suivit",
"bookmark": "Favori", "bookmark": "Favori",
"autocomplete_available": "{number} résultat est disponible. Utilisez les touches haut et bas pour naviguer à l'intérieur. | {number} résultats sont disponibles. Utilisez les touches haut et bas pour naviguer à l'intérieur.", "autocomplete_available": "{number} résultat est disponible. Utilisez les touches haut et bas pour naviguer à l'intérieur. | {number} résultats sont disponibles. Utilisez les touches haut et bas pour naviguer à l'intérieur.",
"toggle_expand": "Développer ou réduire la notification pour afficher le message dans son intégralité", "toggle_expand": "Étendre ou réduire la notification pour montrer les messages en entier",
"toggle_mute": "Développer ou réduire la notification pour révéler le contenu en sourdine" "toggle_mute": "Étendre ou réduire les notifications pour révéler le contenu masqué"
}, },
"upload": { "upload": {
"error": { "error": {
@ -1013,11 +1091,11 @@
"simple": { "simple": {
"simple_policies": "Politiques par instances", "simple_policies": "Politiques par instances",
"accept": "Acceptées", "accept": "Acceptées",
"accept_desc": "Cette instance accepte les messages seulement depuis ces instances :", "accept_desc": "Cette instance accepte les messages seulement depuis les instances suivantes :",
"reject": "Rejetées", "reject": "Rejetées",
"reject_desc": "Cette instance n'acceptera pas de message de ces instances :", "reject_desc": "Cette instance n'acceptera pas de message de ces instances :",
"quarantine": "Quarantaine", "quarantine": "Quarantaine",
"quarantine_desc": "Cette instance enverra seulement des messages publics à ces instances :", "quarantine_desc": "Cette instance enverra uniquement des messages publics aux instances suivantes :",
"ftl_removal_desc": "Cette instance supprime les instance suivantes du flux fédéré :", "ftl_removal_desc": "Cette instance supprime les instance suivantes du flux fédéré :",
"media_removal": "Suppression des pièce-jointes", "media_removal": "Suppression des pièce-jointes",
"media_removal_desc": "Cette instance supprime le contenu multimédia des instances suivantes :", "media_removal_desc": "Cette instance supprime le contenu multimédia des instances suivantes :",
@ -1054,7 +1132,9 @@
"vote": "Voter", "vote": "Voter",
"expired": "Sondage terminé il y a {0}", "expired": "Sondage terminé il y a {0}",
"people_voted_count": "{count} voteur | {count} voteurs", "people_voted_count": "{count} voteur | {count} voteurs",
"votes_count": "{count} vote | {count} votes" "votes_count": "{count} vote | {count} votes",
"non_anonymous": "Sondage public",
"non_anonymous_title": "Certaines instances pourraient afficher ce pour quoi vous avez voté"
}, },
"emoji": { "emoji": {
"emoji": "Émoji", "emoji": "Émoji",
@ -1064,7 +1144,7 @@
"unicode": "émoji unicode", "unicode": "émoji unicode",
"load_all": "Charger tout les {emojiAmount} émojis", "load_all": "Charger tout les {emojiAmount} émojis",
"load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.", "load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.",
"stickers": "Stickers", "stickers": "Autocollants",
"keep_open": "Garder ouvert", "keep_open": "Garder ouvert",
"unicode_groups": { "unicode_groups": {
"activities": "Activités", "activities": "Activités",
@ -1072,7 +1152,7 @@
"flags": "Drapeaux", "flags": "Drapeaux",
"food-and-drink": "Nourriture & boissons", "food-and-drink": "Nourriture & boissons",
"objects": "Objets", "objects": "Objets",
"people-and-body": "Personnes & Corps", "people-and-body": "Humain·e·s & Corps",
"smileys-and-emotion": "Emoticônes", "smileys-and-emotion": "Emoticônes",
"symbols": "Symboles", "symbols": "Symboles",
"travel-and-places": "Voyages & lieux" "travel-and-places": "Voyages & lieux"
@ -1176,7 +1256,7 @@
"empty_chat_list_placeholder": "Vous n'avez pas encore de discussions. Démarrez-en une nouvelle !", "empty_chat_list_placeholder": "Vous n'avez pas encore de discussions. Démarrez-en une nouvelle !",
"error_sending_message": "Quelque chose s'est mal passé pendant l'envoi du message.", "error_sending_message": "Quelque chose s'est mal passé pendant l'envoi du message.",
"error_loading_chat": "Quelque chose s'est mal passé au chargement de la discussion.", "error_loading_chat": "Quelque chose s'est mal passé au chargement de la discussion.",
"delete_confirm": "Voulez-vous vraiment effacer ce message ?", "delete_confirm": "Souhaitez-vous vraiment effacer ce message ?",
"more": "Plus", "more": "Plus",
"empty_message_error": "Impossible d'envoyer un message vide", "empty_message_error": "Impossible d'envoyer un message vide",
"new": "Nouvelle discussion", "new": "Nouvelle discussion",
@ -1213,7 +1293,7 @@
"art_by": "Œuvre par {linkToArtist}", "art_by": "Œuvre par {linkToArtist}",
"big_update_content": "Nous n'avons pas fait de nouvelle version depuis un moment, les choses peuvent vous paraitre différentes de vos habitudes.", "big_update_content": "Nous n'avons pas fait de nouvelle version depuis un moment, les choses peuvent vous paraitre différentes de vos habitudes.",
"update_bugs": "Veuillez rapporter les problèmes sur {pleromaGitlab}, comme beaucoup de changements on été fait, même si nous testons entièrement et utilisons la version de dévelopement nous-même, nous avons pu en louper. Les retours et suggestions sont bienvenues sur ce que vous avez pu rencontrer, ou sur comment améliorer Pleroma (BE) et Pleroma-FE.", "update_bugs": "Veuillez rapporter les problèmes sur {pleromaGitlab}, comme beaucoup de changements on été fait, même si nous testons entièrement et utilisons la version de dévelopement nous-même, nous avons pu en louper. Les retours et suggestions sont bienvenues sur ce que vous avez pu rencontrer, ou sur comment améliorer Pleroma (BE) et Pleroma-FE.",
"big_update_title": "Soyez indulgent avec nous" "big_update_title": "Soyez patients avec nous"
}, },
"unicode_domain_indicator": { "unicode_domain_indicator": {
"tooltip": "Ce domaine contient des caractères non ascii." "tooltip": "Ce domaine contient des caractères non ascii."
@ -1221,9 +1301,9 @@
"report": { "report": {
"reporter": "Rapporteur·euse :", "reporter": "Rapporteur·euse :",
"reported_user": "Compte rapporté :", "reported_user": "Compte rapporté :",
"reported_statuses": "Status rapportés :", "reported_statuses": "Statuts rapportés :",
"notes": "Notes :", "notes": "Notes :",
"state": "Status :", "state": "Statut :",
"state_open": "Ouvert", "state_open": "Ouvert",
"state_closed": "Fermé", "state_closed": "Fermé",
"state_resolved": "Résolut" "state_resolved": "Résolut"
@ -1232,9 +1312,9 @@
"page_header": "Annonces", "page_header": "Annonces",
"title": "Annonce", "title": "Annonce",
"mark_as_read_action": "Marquer comme lu", "mark_as_read_action": "Marquer comme lu",
"post_form_header": "Faire une annonce", "post_form_header": "Envoyer l'annonce",
"post_placeholder": "Écrivez le contenu de l'annonce ici...", "post_placeholder": "Rédiger ici le contenu de l'annonce...",
"post_action": "Envoyer", "post_action": "Publier",
"post_error": "Erreur : {error}", "post_error": "Erreur : {error}",
"close_error": "Fermer", "close_error": "Fermer",
"delete_action": "Supprimer", "delete_action": "Supprimer",
@ -1254,7 +1334,7 @@
"success_installing_frontend": "Installation réussie de l'interface {version}", "success_installing_frontend": "Installation réussie de l'interface {version}",
"failure_installing_frontend": "Échec de l'installation de l'interface {version} : {reason}", "failure_installing_frontend": "Échec de l'installation de l'interface {version} : {reason}",
"default_frontend_unavail": "Les paramètres de l'interface ne sont pas disponibles, ils doivent être configurés dans la base de données", "default_frontend_unavail": "Les paramètres de l'interface ne sont pas disponibles, ils doivent être configurés dans la base de données",
"build_url": "Construction URL", "build_url": "URL de référence",
"reinstall": "Réinstaller", "reinstall": "Réinstaller",
"repository": "Lien du dépôt", "repository": "Lien du dépôt",
"versions": "Versions disponibles", "versions": "Versions disponibles",
@ -1306,7 +1386,7 @@
"restrict": { "restrict": {
"header": "Restreindre l'accès aux visiteurs anonymes", "header": "Restreindre l'accès aux visiteurs anonymes",
"profiles": "Accès aux profils d'utilisateur", "profiles": "Accès aux profils d'utilisateur",
"activities": "Accès aux status/activités", "activities": "Accès aux statuts/activités",
"description": "Paramètre détaillé permettant d'autoriser/interdire l'accès à certains aspects de l'API. Par défaut (état indéterminé), l'accès est interdit si l'instance n'est pas publique ; si la case est cochée, l'accès est interdit même si l'instance est publique ; si la case n'est pas cochée, l'accès est autorisé même si l'instance est privée. Veuillez noter qu'un comportement inattendu peut se produire si certains paramètres sont définis, par exemple si l'accès au profil est désactivé, les messages s'afficheront sans les informations relatives au profil.", "description": "Paramètre détaillé permettant d'autoriser/interdire l'accès à certains aspects de l'API. Par défaut (état indéterminé), l'accès est interdit si l'instance n'est pas publique ; si la case est cochée, l'accès est interdit même si l'instance est publique ; si la case n'est pas cochée, l'accès est autorisé même si l'instance est privée. Veuillez noter qu'un comportement inattendu peut se produire si certains paramètres sont définis, par exemple si l'accès au profil est désactivé, les messages s'afficheront sans les informations relatives au profil.",
"timelines": "Accès aux flux" "timelines": "Accès aux flux"
}, },
@ -1341,7 +1421,7 @@
"revert": "Revenir en arrière", "revert": "Revenir en arrière",
"add_file": "Ajouter un fichier", "add_file": "Ajouter un fichier",
"adding_new": "Ajouter un nouvel émoji", "adding_new": "Ajouter un nouvel émoji",
"shortcode": "Shortcode", "shortcode": "Code court",
"filename": "Nom du fichier", "filename": "Nom du fichier",
"new_filename": "Nom de fichier, laisser blanc pour inférer", "new_filename": "Nom de fichier, laisser blanc pour inférer",
"delete_confirm": "Êtes-vous sûr de vouloir supprimer {0} ?", "delete_confirm": "Êtes-vous sûr de vouloir supprimer {0} ?",
@ -1355,7 +1435,8 @@
"delete_title": "Supprimer ?", "delete_title": "Supprimer ?",
"metadata_changed": "Métadonnées différentes de celles sauvegardées", "metadata_changed": "Métadonnées différentes de celles sauvegardées",
"emoji_changed": "Modifications du fichier émoji non sauvegardées, vérifier l'émoji surligné", "emoji_changed": "Modifications du fichier émoji non sauvegardées, vérifier l'émoji surligné",
"replace_warning": "Vous allez REMPLACER le pack local qui porte ce nom" "replace_warning": "Vous allez REMPLACER le pack local qui porte ce nom",
"new_shortcode": "Shortcode, laissez vide pour déduire"
}, },
"window_title": "Administration", "window_title": "Administration",
"nodb": { "nodb": {
@ -1380,5 +1461,30 @@
"old_ui_link": "L'ancien espace d'administration est disponible ici", "old_ui_link": "L'ancien espace d'administration est disponible ici",
"reset_all": "Tout réinitialiser", "reset_all": "Tout réinitialiser",
"commit_all": "Tout sauvegarder" "commit_all": "Tout sauvegarder"
},
"splash": {
"settings": "Application des paramètres…",
"almost": "Réticulation des splines…",
"fun_2": "Allez-y doucement !",
"fun_3": "Suya…",
"fun_4": "Ma machine Pleroma est à pleine puissance !",
"loading": "En cours de chargement…",
"theme": "Application du thème, veuillez patienter chaleureusement…",
"instance": "Récupération des infos de l'instance…",
"fun_1": "Buvez plus d'eau",
"error": "Quelque chose s'est mal passé"
},
"bookmark_folders": {
"select_folder": "Sélectionnez le dossier des favoris",
"create": "Créer le dossier",
"emoji": "Emoji",
"name": "Nom du dossier",
"new": "Nouveau dossier",
"delete": "Supprimer le dossier",
"update_folder": "Enregistrer les changements",
"really_delete": "Voulez-vous vraiment supprimer le dossier ?",
"error": "Erreur lors de la manipulation des dossiers de favoris : {0}",
"creating_folder": "Création du dossier des favoris",
"editing_folder": "Édition du dossier {folderName}"
} }
} }

View file

@ -130,7 +130,11 @@
"edit_finish": "完了", "edit_finish": "完了",
"mobile_notifications": "通知を開く (未読あり)", "mobile_notifications": "通知を開く (未読あり)",
"mobile_notifications_close": "通知を閉じる", "mobile_notifications_close": "通知を閉じる",
"announcements": "お知らせ" "announcements": "お知らせ",
"all_bookmarks": "全てのブックマーク",
"bookmark_folders": "ブックマークフォルダ",
"mobile_sidebar": "モバイルのサイドバーを開く",
"quotes": "引用"
}, },
"notifications": { "notifications": {
"broken_favorite": "ステータスが見つかりません。探しています…", "broken_favorite": "ステータスが見つかりません。探しています…",
@ -152,7 +156,8 @@
"unread_follow_requests": "フォローリクエストが{num}件来ています | フォローリクエストが{num}件来ています", "unread_follow_requests": "フォローリクエストが{num}件来ています | フォローリクエストが{num}件来ています",
"configuration_tip": "ここに表示する通知の種類は{theSettings}にて変更することができます。 {dismiss}", "configuration_tip": "ここに表示する通知の種類は{theSettings}にて変更することができます。 {dismiss}",
"submitted_report": "通報が送信されました", "submitted_report": "通報が送信されました",
"configuration_tip_settings": "設定" "configuration_tip_settings": "設定",
"subscribed_status": "投稿しました"
}, },
"polls": { "polls": {
"add_poll": "投票を追加", "add_poll": "投票を追加",
@ -192,7 +197,8 @@
"load_older": "古い通知を読み込む", "load_older": "古い通知を読み込む",
"moves": "ユーザーの引っ越し", "moves": "ユーザーの引っ越し",
"emoji_reactions": "絵文字リアクション", "emoji_reactions": "絵文字リアクション",
"reports": "通報" "reports": "通報",
"statuses": "購読"
}, },
"post_status": { "post_status": {
"new_status": "投稿する", "new_status": "投稿する",
@ -537,11 +543,11 @@
"inset": "内側", "inset": "内側",
"hint": "影の設定では、色の値として --variable を使うことができます。これはCSS3変数です。ただし、透明度の設定は、効かなくなります。", "hint": "影の設定では、色の値として --variable を使うことができます。これはCSS3変数です。ただし、透明度の設定は、効かなくなります。",
"filter_hint": { "filter_hint": {
"always_drop_shadow": "ブラウザーがサポートしていれば、常に {0} が使われます。", "always_drop_shadow": "注意: この影には、ブラウザーがサポートしている場合、常に {0} が使われます。",
"drop_shadow_syntax": "{0} は、{1} パラメーターと {2} キーワードをサポートしていません。", "drop_shadow_syntax": "{0} は、{1} パラメーターと {2} キーワードをサポートしていません。",
"avatar_inset": "内側の影と外側の影を同時に使うと、透明なアイコンの表示がおかしくなることがあります。", "avatar_inset": "内側の影と外側の影を同時に使うと、透明なアイコンの表示が変になる場合があることに注意してください。",
"spread_zero": "広がりが 0 よりも大きな影は、0 と同じです", "spread_zero": "広がりを 0 より大きくしても、表示は 0 と変わりません",
"inset_classic": "内側の影は {0} を使います" "inset_classic": "内側の影には {0} が使われます"
}, },
"components": { "components": {
"panel": "パネル", "panel": "パネル",
@ -556,7 +562,10 @@
"buttonPressedHover": "ボタン (ホバー、かつ、押されているとき)", "buttonPressedHover": "ボタン (ホバー、かつ、押されているとき)",
"input": "入力欄" "input": "入力欄"
}, },
"hintV3": "影の場合は、 {0} 表記を使って他の色スロットを使うこともできます。" "hintV3": "影の色には、 {0} 表記を使って他の色スロットに指定した色を再利用することもできます。",
"offset": "影のオフセット",
"name": "名前",
"light_grid": "背景のチェック模様を明るくする"
}, },
"fonts": { "fonts": {
"_tab_label": "フォント", "_tab_label": "フォント",
@ -851,7 +860,12 @@
"emoji_size": "絵文字のサイズ", "emoji_size": "絵文字のサイズ",
"navbar_size": "トップバーのサイズ", "navbar_size": "トップバーのサイズ",
"panel_header_size": "パネルヘッダーのサイズ", "panel_header_size": "パネルヘッダーのサイズ",
"notification_visibility_statuses": "購読" "notification_visibility_statuses": "購読",
"text_size_tip": "絶対的な値には{0}を使用してください。{1}はブラウザのデフォルトのフォントサイズを基準にスケールされます。",
"visual_tweaks": "細かい外観の変更",
"absolute_time_format": "時間の表示に絶対表記を使用する",
"absolute_time_format_min_age": "これより古い日時に対してのみ使用する:",
"theme_debug": "テーマエンジンが透明度を処理する際に見ているものを表示する (デバッグ用)"
}, },
"time": { "time": {
"day": "{0}日", "day": "{0}日",
@ -992,7 +1006,8 @@
"sensitive_muted": "閲覧注意な投稿のためミュートされています", "sensitive_muted": "閲覧注意な投稿のためミュートされています",
"load_error": "投稿の読み込みに失敗しました: {error}", "load_error": "投稿の読み込みに失敗しました: {error}",
"loading": "読み込み中…", "loading": "読み込み中…",
"quotes": "引用" "quotes": "引用",
"bot_muted": "BOTによる投稿のためミュートされています"
}, },
"user_card": { "user_card": {
"approve": "承認", "approve": "承認",
@ -1001,8 +1016,8 @@
"deny": "拒否", "deny": "拒否",
"favorites": "お気に入り", "favorites": "お気に入り",
"follow": "フォロー", "follow": "フォロー",
"follow_sent": "リクエストを送信しました", "follow_sent": "リクエスト完了",
"follow_progress": "リクエストしています…", "follow_progress": "リクエスト…",
"follow_unfollow": "フォロー解除", "follow_unfollow": "フォロー解除",
"followees": "フォロー", "followees": "フォロー",
"followers": "フォロワー", "followers": "フォロワー",
@ -1093,7 +1108,8 @@
"remove_follower_confirm_accept_button": "解除する", "remove_follower_confirm_accept_button": "解除する",
"mute_confirm_title": "ミュートの確認", "mute_confirm_title": "ミュートの確認",
"deactivated": "無効化済み", "deactivated": "無効化済み",
"group": "グループ" "group": "グループ",
"mute_duration_prompt": "ミュート期間 (0で無期限):"
}, },
"user_profile": { "user_profile": {
"timeline_title": "ユーザータイムライン", "timeline_title": "ユーザータイムライン",
@ -1354,7 +1370,13 @@
"files": "ファイル", "files": "ファイル",
"delete_title": "削除しますか?", "delete_title": "削除しますか?",
"metadata_changed": "変更されたメタデータ", "metadata_changed": "変更されたメタデータ",
"emoji_changed": "保存されていない変更点があります。ハイライトされた絵文字を確認してください" "emoji_changed": "保存されていない変更点があります。ハイライトされた絵文字を確認してください",
"importFS": "ファイルシステムから絵文字をインポート",
"do_list": "一覧を取得",
"remote_pack_instance": "リモートパックを取得するインスタンス",
"download_as_name": "パック名",
"download_as_name_full": "名前を入力 (空にするとリモートの名前を使用)",
"replace_warning": "続行するとローカルにある同名のパックが上書きされます"
} }
}, },
"lists": { "lists": {
@ -1417,6 +1439,30 @@
"edit_action": "編集", "edit_action": "編集",
"start_time_prompt": "開始日時: ", "start_time_prompt": "開始日時: ",
"end_time_prompt": "終了日時: ", "end_time_prompt": "終了日時: ",
"all_day_prompt": "終日" "all_day_prompt": "終日",
"inactive_message": "このお知らせは無効です"
},
"splash": {
"loading": "読み込み中…",
"theme": "テーマを適用中です。お待ちください…",
"instance": "インスタンス情報を取得中…",
"settings": "設定を適用中…",
"fun_2": "ゆっくりしていってね!",
"error": "問題が発生しました",
"fun_3": "( ˘ω˘)スヤァ…",
"almost": "少女祈祷中…",
"fun_4": "俺のPleromaが火を吹くぜ"
},
"bookmark_folders": {
"emoji": "絵文字",
"update_folder": "変更を保存",
"really_delete": "本当にフォルダを削除しますか?",
"name": "フォルダ名",
"editing_folder": "{folderName}フォルダの編集",
"creating_folder": "新規ブックマークフォルダの作成",
"create": "フォルダを作成",
"delete": "フォルダを削除",
"error": "ブックマークフォルダの処理中にエラーが発生しました: {0}",
"new": "新規フォルダ"
} }
} }

View file

@ -235,7 +235,7 @@
"emoji": { "emoji": {
"stickers": "貼圖", "stickers": "貼圖",
"emoji": "繪文字", "emoji": "繪文字",
"keep_open": "Hōo 揀選開 leh", "keep_open": "Hōo 揀選開 leh",
"search_emoji": "Tshuē 繪文字", "search_emoji": "Tshuē 繪文字",
"add_emoji": "插繪文字", "add_emoji": "插繪文字",
"custom": "定製 ê 繪文字", "custom": "定製 ê 繪文字",
@ -988,7 +988,7 @@
"repeat_confirm_accept_button": "轉送", "repeat_confirm_accept_button": "轉送",
"repeat_confirm_title": "轉送ê確認", "repeat_confirm_title": "轉送ê確認",
"repeat_confirm": "Lí kám真ê beh轉送tsit ê狀態?", "repeat_confirm": "Lí kám真ê beh轉送tsit ê狀態?",
"delete": "Thâi掉身份", "delete": "Thâi掉狀態",
"delete_error": "Thâi狀態ê時出tshê{0}", "delete_error": "Thâi狀態ê時出tshê{0}",
"mentions": "提起", "mentions": "提起",
"move_down": "Kā附件suá kàu正pîng", "move_down": "Kā附件suá kàu正pîng",

View file

@ -87,6 +87,9 @@ const api = {
const { state, commit, dispatch, rootState } = store const { state, commit, dispatch, rootState } = store
const timelineData = rootState.statuses.timelines.friends const timelineData = rootState.statuses.timelines.friends
state.mastoUserSocket = state.backendInteractor.startUserSocket({ store }) state.mastoUserSocket = state.backendInteractor.startUserSocket({ store })
state.mastoUserSocket.addEventListener('pleroma:authenticated', () => {
state.mastoUserSocket.subscribe('user')
})
state.mastoUserSocket.addEventListener( state.mastoUserSocket.addEventListener(
'message', 'message',
({ detail: message }) => { ({ detail: message }) => {

View file

@ -1484,17 +1484,18 @@ const deleteAnnouncement = ({ id, credentials }) => {
}) })
} }
export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => { export const getMastodonSocketURI = ({ credentials, stream, args = {} }, base) => {
return Object.entries({ const url = new URL(MASTODON_STREAMING, base)
...(credentials if (credentials) {
? { access_token: credentials } url.searchParams.append('access_token', credentials)
: {} }
), if (stream) {
stream, url.searchParams.append('stream', stream)
...args }
}).reduce((acc, [key, val]) => { Object.entries(args).forEach(([key, val]) => {
return acc + `${key}=${val}&` url.searchParams.append(key, val)
}, MASTODON_STREAMING + '?') })
return url
} }
const MASTODON_STREAMING_EVENTS = new Set([ const MASTODON_STREAMING_EVENTS = new Set([
@ -1506,7 +1507,8 @@ const MASTODON_STREAMING_EVENTS = new Set([
]) ])
const PLEROMA_STREAMING_EVENTS = new Set([ const PLEROMA_STREAMING_EVENTS = new Set([
'pleroma:chat_update' 'pleroma:chat_update',
'pleroma:respond'
]) ])
// A thin wrapper around WebSocket API that allows adding a pre-processor to it // A thin wrapper around WebSocket API that allows adding a pre-processor to it
@ -1514,7 +1516,8 @@ const PLEROMA_STREAMING_EVENTS = new Set([
export const ProcessedWS = ({ export const ProcessedWS = ({
url, url,
preprocessor = handleMastoWS, preprocessor = handleMastoWS,
id = 'Unknown' id = 'Unknown',
credentials
}) => { }) => {
const eventTarget = new EventTarget() const eventTarget = new EventTarget()
const socket = new WebSocket(url) const socket = new WebSocket(url)
@ -1529,6 +1532,12 @@ export const ProcessedWS = ({
} }
socket.addEventListener('open', (wsEvent) => { socket.addEventListener('open', (wsEvent) => {
console.debug(`[WS][${id}] Socket connected`, wsEvent) console.debug(`[WS][${id}] Socket connected`, wsEvent)
if (credentials) {
socket.send(JSON.stringify({
type: 'pleroma:authenticate',
token: credentials
}))
}
}) })
socket.addEventListener('error', (wsEvent) => { socket.addEventListener('error', (wsEvent) => {
console.debug(`[WS][${id}] Socket errored`, wsEvent) console.debug(`[WS][${id}] Socket errored`, wsEvent)
@ -1549,19 +1558,47 @@ export const ProcessedWS = ({
}) })
/**/ /**/
const onAuthenticated = () => {
eventTarget.dispatchEvent(new CustomEvent('pleroma:authenticated'))
}
proxy(socket, 'open') proxy(socket, 'open')
proxy(socket, 'close') proxy(socket, 'close')
proxy(socket, 'message', preprocessor) proxy(socket, 'message', (event) => preprocessor(event, { onAuthenticated }))
proxy(socket, 'error') proxy(socket, 'error')
// 1000 = Normal Closure // 1000 = Normal Closure
eventTarget.close = () => { socket.close(1000, 'Shutting down socket') } eventTarget.close = () => { socket.close(1000, 'Shutting down socket') }
eventTarget.getState = () => socket.readyState eventTarget.getState = () => socket.readyState
eventTarget.subscribe = (stream, args = {}) => {
console.debug(
`[WS][${id}] Subscribing to stream ${stream} with args`,
args
)
socket.send(JSON.stringify({
type: 'subscribe',
stream,
...args
}))
}
eventTarget.unsubscribe = (stream, args = {}) => {
console.debug(
`[WS][${id}] Unsubscribing from stream ${stream} with args`,
args
)
socket.send(JSON.stringify({
type: 'unsubscribe',
stream,
...args
}))
}
return eventTarget return eventTarget
} }
export const handleMastoWS = (wsEvent) => { export const handleMastoWS = (wsEvent, {
onAuthenticated = () => {}
} = {}) => {
const { data } = wsEvent const { data } = wsEvent
if (!data) return if (!data) return
const parsedEvent = JSON.parse(data) const parsedEvent = JSON.parse(data)
@ -1572,7 +1609,18 @@ export const handleMastoWS = (wsEvent) => {
return { event, id: payload } return { event, id: payload }
} }
const data = payload ? JSON.parse(payload) : null const data = payload ? JSON.parse(payload) : null
if (event === 'update') { if (event === 'pleroma:respond') {
if (data.type === 'pleroma:authenticate') {
if (data.result === 'success') {
console.debug('[WS] Successfully authenticated')
onAuthenticated()
} else {
console.error('[WS] Unable to authenticate:', data.error)
wsEvent.target.close()
}
}
return null
} else if (event === 'update') {
return { event, status: parseStatus(data) } return { event, status: parseStatus(data) }
} else if (event === 'status.update') { } else if (event === 'status.update') {
return { event, status: parseStatus(data) } return { event, status: parseStatus(data) }

View file

@ -36,8 +36,8 @@ const backendInteractorService = credentials => ({
startUserSocket ({ store }) { startUserSocket ({ store }) {
const serv = store.rootState.instance.server.replace('http', 'ws') const serv = store.rootState.instance.server.replace('http', 'ws')
const url = serv + getMastodonSocketURI({ credentials, stream: 'user' }) const url = getMastodonSocketURI({}, serv)
return ProcessedWS({ url, id: 'User' }) return ProcessedWS({ url, id: 'Unified', credentials })
}, },
...Object.entries(apiService).reduce((acc, [key, func]) => { ...Object.entries(apiService).reduce((acc, [key, func]) => {

View file

@ -238,10 +238,10 @@ export const getTextColor = function (bg, text, preserve) {
const result = convert(rgb2hex(workColor)).hsl const result = convert(rgb2hex(workColor)).hsl
const delta = result.l > 50 ? 1 : -1 const delta = result.l > 50 ? 1 : -1
const multiplier = 10 const multiplier = 10
while (contrast < 4.5 && result.l > 0 && result.l < 100) { while (contrast < 4.5 && result.l > 20 && result.l < 80) {
result.l += delta * multiplier result.l += delta * multiplier
result.l = Math.min(100, Math.max(0, result.l))
contrast = getContrastRatio(bg, convert(result).rgb) contrast = getContrastRatio(bg, convert(result).rgb)
console.log(convert(result).hex, result.l, contrast)
} }
const base = typeof text.a !== 'undefined' ? { a: text.a } : {} const base = typeof text.a !== 'undefined' ? { a: text.a } : {}

View file

@ -1804,30 +1804,21 @@
source-map "0.6.1" source-map "0.6.1"
yaml-eslint-parser "^0.3.2" yaml-eslint-parser "^0.3.2"
"@intlify/core-base@9.2.2": "@intlify/core-base@10.0.5":
version "9.2.2" version "10.0.5"
resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-9.2.2.tgz#5353369b05cc9fe35cab95fe20afeb8a4481f939" resolved "https://registry.yarnpkg.com/@intlify/core-base/-/core-base-10.0.5.tgz#c4d992381f8c3a50c79faf67be3404b399c3be28"
integrity sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA== integrity sha512-F3snDTQs0MdvnnyzTDTVkOYVAZOE/MHwRvF7mn7Jw1yuih4NrFYLNYIymGlLmq4HU2iIdzYsZ7f47bOcwY73XQ==
dependencies: dependencies:
"@intlify/devtools-if" "9.2.2" "@intlify/message-compiler" "10.0.5"
"@intlify/message-compiler" "9.2.2" "@intlify/shared" "10.0.5"
"@intlify/shared" "9.2.2"
"@intlify/vue-devtools" "9.2.2"
"@intlify/devtools-if@9.2.2": "@intlify/message-compiler@10.0.5":
version "9.2.2" version "10.0.5"
resolved "https://registry.yarnpkg.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz#b13d9ac4b4e2fe6d2e7daa556517a8061fe8bd39" resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-10.0.5.tgz#4eeace9f4560020d5e5d77f32bed7755e71d8efd"
integrity sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg== integrity sha512-6GT1BJ852gZ0gItNZN2krX5QAmea+cmdjMvsWohArAZ3GmHdnNANEcF9JjPXAMRtQ6Ux5E269ymamg/+WU6tQA==
dependencies: dependencies:
"@intlify/shared" "9.2.2" "@intlify/shared" "10.0.5"
source-map-js "^1.0.2"
"@intlify/message-compiler@9.2.2":
version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz#e42ab6939b8ae5b3d21faf6a44045667a18bba1c"
integrity sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==
dependencies:
"@intlify/shared" "9.2.2"
source-map "0.6.1"
"@intlify/message-compiler@next": "@intlify/message-compiler@next":
version "9.2.0-beta.34" version "9.2.0-beta.34"
@ -1837,24 +1828,21 @@
"@intlify/shared" "9.2.0-beta.34" "@intlify/shared" "9.2.0-beta.34"
source-map "0.6.1" source-map "0.6.1"
"@intlify/shared@10.0.5":
version "10.0.5"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-10.0.5.tgz#1b46ca8b541f03508fe28da8f34e4bb85506d6bc"
integrity sha512-bmsP4L2HqBF6i6uaMqJMcFBONVjKt+siGluRq4Ca4C0q7W2eMaVZr8iCgF9dKbcVXutftkC7D6z2SaSMmLiDyA==
"@intlify/shared@9.2.0-beta.34", "@intlify/shared@next": "@intlify/shared@9.2.0-beta.34", "@intlify/shared@next":
version "9.2.0-beta.34" version "9.2.0-beta.34"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.0-beta.34.tgz#e8e9a93455eadcc9785fe2e2437fe037fc267f7d" resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.0-beta.34.tgz#e8e9a93455eadcc9785fe2e2437fe037fc267f7d"
integrity sha512-hbUKcVbTOkLVpnlSeZE1OPgEI7FpvhuZF/gb84xECTjXEImIa3u0fIcJKUUffv3dlAx8fMOE5xKgDzngidm0tw== integrity sha512-hbUKcVbTOkLVpnlSeZE1OPgEI7FpvhuZF/gb84xECTjXEImIa3u0fIcJKUUffv3dlAx8fMOE5xKgDzngidm0tw==
"@intlify/shared@9.2.2", "@intlify/shared@^9.2.2": "@intlify/shared@^9.2.2":
version "9.2.2" version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5" resolved "https://registry.yarnpkg.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5"
integrity sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q== integrity sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==
"@intlify/vue-devtools@9.2.2":
version "9.2.2"
resolved "https://registry.yarnpkg.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz#b95701556daf7ebb3a2d45aa3ae9e6415aed8317"
integrity sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==
dependencies:
"@intlify/core-base" "9.2.2"
"@intlify/shared" "9.2.2"
"@intlify/vue-i18n-loader@5.0.1": "@intlify/vue-i18n-loader@5.0.1":
version "5.0.1" version "5.0.1"
resolved "https://registry.yarnpkg.com/@intlify/vue-i18n-loader/-/vue-i18n-loader-5.0.1.tgz#af7d32059e32138e91495e5240f7ce2adb71c738" resolved "https://registry.yarnpkg.com/@intlify/vue-i18n-loader/-/vue-i18n-loader-5.0.1.tgz#af7d32059e32138e91495e5240f7ce2adb71c738"
@ -2410,16 +2398,16 @@
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.1.3.tgz#a44c52e8fa6d22f84db3abdcdd0be5135b7dd7cf" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.1.3.tgz#a44c52e8fa6d22f84db3abdcdd0be5135b7dd7cf"
integrity sha512-79InfO2xHv+WHIrH1bHXQUiQD/wMls9qBk6WVwGCbdwP7/3zINtvqPNMtmSHXsIKjvUAHc8L0ouOj6ZQQRmcXg== integrity sha512-79InfO2xHv+WHIrH1bHXQUiQD/wMls9qBk6WVwGCbdwP7/3zINtvqPNMtmSHXsIKjvUAHc8L0ouOj6ZQQRmcXg==
"@vue/devtools-api@^6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092"
integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
"@vue/devtools-api@^6.4.5": "@vue/devtools-api@^6.4.5":
version "6.4.5" version "6.4.5"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz#d54e844c1adbb1e677c81c665ecef1a2b4bb8380" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz#d54e844c1adbb1e677c81c665ecef1a2b4bb8380"
integrity sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ== integrity sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==
"@vue/devtools-api@^6.5.0":
version "6.6.4"
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343"
integrity sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==
"@vue/reactivity-transform@3.2.45": "@vue/reactivity-transform@3.2.45":
version "3.2.45" version "3.2.45"
resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d" resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d"
@ -9206,15 +9194,14 @@ vue-eslint-parser@^9.0.1:
lodash "^4.17.21" lodash "^4.17.21"
semver "^7.3.6" semver "^7.3.6"
vue-i18n@9.2.2: vue-i18n@10:
version "9.2.2" version "10.0.5"
resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-9.2.2.tgz#aeb49d9424923c77e0d6441e3f21dafcecd0e666" resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-10.0.5.tgz#fdf4e6c7b669e80cfa3a12ed9625e2b46671cdf0"
integrity sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ== integrity sha512-9/gmDlCblz3i8ypu/afiIc/SUIfTTE1mr0mZhb9pk70xo2csHAM9mp2gdQ3KD2O0AM3Hz/5ypb+FycTj/lHlPQ==
dependencies: dependencies:
"@intlify/core-base" "9.2.2" "@intlify/core-base" "10.0.5"
"@intlify/shared" "9.2.2" "@intlify/shared" "10.0.5"
"@intlify/vue-devtools" "9.2.2" "@vue/devtools-api" "^6.5.0"
"@vue/devtools-api" "^6.2.1"
vue-loader@17.0.1: vue-loader@17.0.1:
version "17.0.1" version "17.0.1"