Compare commits

..

1 Commits

Author SHA1 Message Date
Pleroma Renovate Bot e3e002ea39 Update Font Awesome 2024-04-03 08:53:00 +00:00
63 changed files with 173 additions and 1174 deletions

View File

@ -43,8 +43,6 @@ lint:
test:
stage: test
tags:
- amd64
variables:
APT_CACHE_DIR: apt-cache
script:
@ -56,8 +54,6 @@ test:
build:
stage: build
tags:
- amd64
script:
- yarn
- npm run build

View File

@ -1 +0,0 @@
stop using that one runner for intensive tasks

View File

@ -1 +0,0 @@
Added ability to mute sensitive posts (ported from eintei)

View File

@ -1 +0,0 @@
Synchronized requested notification types with backend, hopefully should fix missing notifications for polls and follow requests

View File

@ -1 +0,0 @@
Add poll end notifications to fetched types.

View File

@ -1 +0,0 @@
Display quotes count on posts and add quotes list page

View File

@ -1 +0,0 @@
Option to only show scrobbles that are recent enough

View File

@ -1 +0,0 @@
Display loading and error indicator for conversation page

View File

@ -1 +0,0 @@
Add caching system for themes3

View File

@ -1 +0,0 @@
fix color inputs and some in-development themes3 issues

View File

@ -18,10 +18,10 @@
"dependencies": {
"@babel/runtime": "7.21.5",
"@chenfengyuan/vue-qrcode": "2.0.0",
"@fortawesome/fontawesome-svg-core": "6.4.0",
"@fortawesome/free-regular-svg-icons": "6.4.0",
"@fortawesome/free-solid-svg-icons": "6.4.0",
"@fortawesome/vue-fontawesome": "3.0.3",
"@fortawesome/fontawesome-svg-core": "6.5.2",
"@fortawesome/free-regular-svg-icons": "6.5.2",
"@fortawesome/free-solid-svg-icons": "6.5.2",
"@fortawesome/vue-fontawesome": "3.0.6",
"@kazvmoe-infra/pinch-zoom-element": "1.2.0",
"@kazvmoe-infra/unicode-emoji-json": "0.4.0",
"@ruffle-rs/ruffle": "0.1.0-nightly.2024.3.17",
@ -32,7 +32,6 @@
"click-outside-vue3": "4.0.1",
"cropperjs": "1.5.13",
"escape-html": "1.0.3",
"hash-sum": "^2.0.0",
"js-cookie": "3.0.5",
"localforage": "1.10.0",
"parse-link-header": "2.0.0",

View File

@ -14,9 +14,6 @@
--ZI_navbar_popovers: 7500;
--ZI_navbar: 7000;
--ZI_popovers: 6000;
// Fallback for when stuff is loading
--background: var(--bg);
}
html {
@ -373,7 +370,6 @@ nav {
border: none;
border-radius: var(--roundness);
cursor: pointer;
background-color: var(--background);
box-shadow: var(--shadow);
font-size: 1em;
font-family: sans-serif;
@ -410,7 +406,6 @@ nav {
width: 100%;
line-height: var(--__line-height);
padding: var(--__vertical-gap) var(--__horizontal-gap);
background: transparent;
--__line-height: 1.5em;
--__horizontal-gap: 0.75em;
@ -475,7 +470,6 @@ nav {
font-size: 100%;
font-family: inherit;
box-shadow: var(--shadow);
background-color: transparent;
padding: 0;
line-height: unset;
cursor: pointer;
@ -508,8 +502,6 @@ textarea {
border: none;
border-radius: var(--roundness);
background-color: var(--background);
color: var(--text);
box-shadow: var(--shadow);
font-family: var(--font);
font-size: 1em;

View File

@ -1,6 +1,5 @@
<template>
<div
v-show="$store.state.interface.themeApplied"
id="app-loaded"
:style="bgStyle"
>

View File

@ -14,7 +14,7 @@ import { windowWidth, windowHeight } from '../services/window_utils/window_utils
import { getOrCreateApp, getClientToken } from '../services/new_api/oauth.js'
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js'
import { applyTheme, applyConfig, tryLoadCache } from '../services/style_setter/style_setter.js'
import { applyTheme, applyConfig } from '../services/style_setter/style_setter.js'
import FaviconService from '../services/favicon_service/favicon_service.js'
import { initServiceWorker, updateFocus } from '../services/sw/sw.js'
@ -353,25 +353,20 @@ const afterStoreSetup = async ({ store, i18n }) => {
await setConfig({ store })
const { customTheme, customThemeSource, forceThemeRecompilation } = store.state.config
const { customTheme, customThemeSource } = store.state.config
const { theme } = store.state.instance
const customThemePresent = customThemeSource || customTheme
if (!forceThemeRecompilation && tryLoadCache()) {
store.commit('setThemeApplied')
} else {
if (customThemePresent) {
if (customThemeSource && customThemeSource.themeEngineVersion === CURRENT_VERSION) {
applyTheme(customThemeSource)
} else {
applyTheme(customTheme)
}
store.commit('setThemeApplied')
} else if (theme) {
// do nothing, it will load asynchronously
if (customThemePresent) {
if (customThemeSource && customThemeSource.themeEngineVersion === CURRENT_VERSION) {
applyTheme(customThemeSource)
} else {
console.error('Failed to load any theme!')
applyTheme(customTheme)
}
} else if (theme) {
// do nothing, it will load asynchronously
} else {
console.error('Failed to load any theme!')
}
applyConfig(store.state.config)

View File

@ -25,7 +25,6 @@ import ListsTimeline from 'components/lists_timeline/lists_timeline.vue'
import ListsEdit from 'components/lists_edit/lists_edit.vue'
import NavPanel from 'src/components/nav_panel/nav_panel.vue'
import AnnouncementsPage from 'components/announcements_page/announcements_page.vue'
import QuotesTimeline from '../components/quotes_timeline/quotes_timeline.vue'
export default (store) => {
const validateAuthenticatedRoute = (to, from, next) => {
@ -52,7 +51,6 @@ export default (store) => {
{ name: 'tag-timeline', path: '/tag/:tag', component: TagTimeline },
{ name: 'bookmarks', path: '/bookmarks', component: BookmarkTimeline },
{ name: 'conversation', path: '/notice/:id', component: ConversationPage, meta: { dontScroll: true } },
{ name: 'quotes', path: '/notice/:id/quotes', component: QuotesTimeline },
{
name: 'remote-user-profile-acct',
path: '/remote-users/:_(@)?:username([^/@]+)@:hostname([^/@]+)',

View File

@ -9,7 +9,6 @@
padding: 0.2em 8px;
input {
color: var(--text);
background: none;
border: none;
padding: 0;
@ -20,38 +19,21 @@
min-width: 3em;
padding: 0;
}
}
.nativeColor {
cursor: pointer;
flex: 0 0 auto;
input {
appearance: none;
max-width: 0;
min-width: 0;
max-height: 0;
/* stylelint-disable-next-line declaration-no-important */
opacity: 0 !important;
&.nativeColor {
flex: 0 0 2em;
min-width: 2em;
align-self: stretch;
min-height: 100%;
}
}
.computedIndicator,
.validIndicator,
.invalidIndicator,
.transparentIndicator {
flex: 0 0 2em;
margin: 0 0.5em;
min-width: 2em;
align-self: stretch;
min-height: 1.5em;
border-radius: var(--roundness);
}
.invalidIndicator {
background: transparent;
box-sizing: border-box;
border: 2px solid var(--cRed);
min-height: 100%;
}
.transparentIndicator {
@ -72,13 +54,11 @@
&::after {
top: 0;
left: 0;
border-top-left-radius: var(--roundness);
}
&::before {
bottom: 0;
right: 0;
border-bottom-right-radius: var(--roundness);
}
}
}

View File

@ -25,51 +25,30 @@
:disabled="!present || disabled"
@input="$emit('update:modelValue', $event.target.value)"
>
<div
<input
v-if="validColor"
class="validIndicator"
:style="{backgroundColor: modelValue || fallback}"
/>
:id="name"
class="nativeColor unstyled"
type="color"
:value="modelValue || fallback"
:disabled="!present || disabled"
@input="$emit('update:modelValue', $event.target.value)"
>
<div
v-else-if="transparentColor"
v-if="transparentColor"
class="transparentIndicator"
/>
<div
v-else-if="computedColor"
v-if="computedColor"
class="computedIndicator"
:style="{backgroundColor: fallback}"
/>
<div
v-else
class="invalidIndicator"
/>
<label class="nativeColor">
<FAIcon icon="eye-dropper" />
<input
:id="name"
class="unstyled"
type="color"
:value="modelValue || fallback"
:disabled="!present || disabled"
@input="$emit('update:modelValue', $event.target.value)"
>
</label>
</div>
</div>
</template>
<script>
import Checkbox from '../checkbox/checkbox.vue'
import { hex2rgb } from '../../services/color_convert/color_convert.js'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faEyeDropper
} from '@fortawesome/free-solid-svg-icons'
library.add(
faEyeDropper
)
export default {
components: {
Checkbox
@ -129,3 +108,12 @@ export default {
}
</script>
<style lang="scss" src="./color_input.scss"></style>
<style lang="scss">
.color-control {
input.text-input {
max-width: 7em;
flex: 1;
}
}
</style>

View File

@ -56,8 +56,7 @@ const conversation = {
expanded: false,
threadDisplayStatusObject: {}, // id => 'showing' | 'hidden'
statusContentPropertiesObject: {},
inlineDivePosition: null,
loadStatusError: null
inlineDivePosition: null
}
},
props: [
@ -393,15 +392,11 @@ const conversation = {
this.setHighlight(this.originalStatusId)
})
} else {
this.loadStatusError = null
this.$store.state.api.backendInteractor.fetchStatus({ id: this.statusId })
.then((status) => {
this.$store.dispatch('addNewStatuses', { statuses: [status] })
this.fetchConversation()
})
.catch((error) => {
this.loadStatusError = error
})
}
},
getReplies (id) {

View File

@ -29,23 +29,6 @@
/>
</div>
<div
v-if="isPage && !status"
class="conversation-body"
:class="{ 'panel-body': isExpanded }"
>
<p v-if="!loadStatusError">
<FAIcon
spin
icon="circle-notch"
/>
{{ $t('status.loading') }}
</p>
<p v-else>
{{ $t('status.load_error', { error: loadStatusError }) }}
</p>
</div>
<div
v-else
class="conversation-body"
:class="{ 'panel-body': isExpanded }"
>
@ -98,7 +81,7 @@
:replies="getReplies(status.id)"
:in-profile="inProfile"
:profile-user-id="profileUserId"
class="conversation-status status-fadein panel-body"
class="conversation-status status-fadein"
:simple-tree="treeViewIsSimple"
:toggle-thread-display="toggleThreadDisplay"
@ -203,7 +186,7 @@
:replies="getReplies(status.id)"
:in-profile="inProfile"
:profile-user-id="profileUserId"
class="conversation-status status-fadein panel-body"
class="conversation-status status-fadein"
:toggle-thread-display="toggleThreadDisplay"
:thread-display-status="threadDisplayStatus"

View File

@ -71,7 +71,6 @@
border-color: var(--border);
border-style: solid;
border-width: 1px;
background-color: var(--background);
}
.dropdown-menu {
@ -83,7 +82,6 @@
max-width: 100vw;
z-index: var(--ZI_popover_override, var(--ZI_popovers));
white-space: nowrap;
background-color: var(--background);
.dropdown-divider {
height: 0;

View File

@ -63,13 +63,6 @@ const QuickFilterSettings = {
const value = !this.muteBotStatuses
this.$store.dispatch('setOption', { name: 'muteBotStatuses', value })
}
},
muteSensitiveStatuses: {
get () { return this.mergedConfig.muteSensitiveStatuses },
set () {
const value = !this.muteSensitiveStatuses
this.$store.dispatch('setOption', { name: 'muteSensitiveStatuses', value })
}
}
}
}

View File

@ -71,18 +71,6 @@
:aria-hidden="true"
/>{{ $t('settings.mute_bot_posts') }}
</button>
<button
class="menu-item dropdown-item"
role="menuitemcheckbox"
:aria-checked="muteSensitiveStatuses"
@click="muteSensitiveStatuses = !muteSensitiveStatuses"
>
<span
class="input menu-checkbox"
:class="{ 'menu-checkbox-checked': muteSensitiveStatuses }"
:aria-hidden="true"
/>{{ $t('settings.mute_sensitive_posts') }}
</button>
<button
class="menu-item dropdown-item"
role="menuitemcheckbox"

View File

@ -61,13 +61,6 @@ const QuickViewSettings = {
const value = !this.muteBotStatuses
this.$store.dispatch('setOption', { name: 'muteBotStatuses', value })
}
},
muteSensitiveStatuses: {
get () { return this.mergedConfig.muteSensitiveStatuses },
set () {
const value = !this.muteSensitiveStatuses
this.$store.dispatch('setOption', { name: 'muteSensitiveStatuses', value })
}
}
}
}

View File

@ -1,26 +0,0 @@
import Timeline from '../timeline/timeline.vue'
const QuotesTimeline = {
created () {
this.$store.commit('clearTimeline', { timeline: 'quotes' })
this.$store.dispatch('startFetchingTimeline', { timeline: 'quotes', statusId: this.statusId })
},
components: {
Timeline
},
computed: {
statusId () { return this.$route.params.id },
timeline () { return this.$store.state.statuses.timelines.quotes }
},
watch: {
statusId () {
this.$store.commit('clearTimeline', { timeline: 'quotes' })
this.$store.dispatch('startFetchingTimeline', { timeline: 'quotes', statusId: this.statusId })
}
},
unmounted () {
this.$store.dispatch('stopFetchingTimeline', 'quotes')
}
}
export default QuotesTimeline

View File

@ -1,10 +0,0 @@
<template>
<Timeline
:title="$t('nav.quotes')"
:timeline="timeline"
:timeline-name="'quotes'"
:status-id="statusId"
/>
</template>
<script src='./quotes_timeline.js'></script>

View File

@ -83,8 +83,3 @@
color: var(--funtextCyantext);
}
}
a .RichContent {
/* stylelint-disable-next-line declaration-no-important */
color: var(--link) !important;
}

View File

@ -17,10 +17,6 @@ export default {
units: {
type: Array,
default: () => allCssUnits
},
unitSet: {
type: String,
default: 'none'
}
},
computed: {
@ -34,10 +30,6 @@ export default {
},
methods: {
...Setting.methods,
getUnitString (value) {
if (this.unitSet === 'none') return value
return this.$t(['settings', 'units', this.unitSet, value].join('.'))
},
updateValue (e) {
this.configSink(this.path, parseInt(e.target.value) + this.stateUnit)
},

View File

@ -1,7 +1,7 @@
<template>
<span
v-if="matchesExpertLevel"
class="UnitSetting"
class="SizeSetting"
>
<label
:for="path"
@ -23,7 +23,7 @@
:id="path"
:model-value="stateUnit"
:disabled="disabled"
class="unit-input unstyled"
class="css-unit-input"
@change="updateUnit"
>
<option
@ -31,7 +31,7 @@
:key="option"
:value="option"
>
{{ getUnitString(option) }}
{{ option }}
</option>
</Select>
{{ ' ' }}
@ -42,19 +42,20 @@
</span>
</template>
<script src="./unit_setting.js"></script>
<script src="./size_setting.js"></script>
<style lang="scss">
.UnitSetting {
.SizeSetting {
.number-input {
max-width: 6.5em;
text-align: right;
}
.unit-input,
.unit-input select {
.css-unit-input,
.css-unit-input select {
margin-left: 0.5em;
width: 4em;
max-width: 4em;
min-width: 4em;
width: auto;
}
}

View File

@ -31,6 +31,10 @@
margin-bottom: 1em;
}
select {
min-width: 10em;
}
textarea {
width: 100%;
max-width: 100%;

View File

@ -31,6 +31,10 @@
margin-bottom: 1em;
}
select {
min-width: 10em;
}
textarea {
width: 100%;
max-width: 100%;

View File

@ -1,7 +1,6 @@
import { filter, trim, debounce } from 'lodash'
import BooleanSetting from '../helpers/boolean_setting.vue'
import ChoiceSetting from '../helpers/choice_setting.vue'
import UnitSetting from '../helpers/unit_setting.vue'
import IntegerSetting from '../helpers/integer_setting.vue'
import SharedComputedObject from '../helpers/shared_computed_object.js'
@ -20,7 +19,6 @@ const FilteringTab = {
components: {
BooleanSetting,
ChoiceSetting,
UnitSetting,
IntegerSetting
},
computed: {

View File

@ -44,29 +44,6 @@
{{ $t('settings.mute_bot_posts') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="muteSensitiveStatuses">
{{ $t('settings.mute_sensitive_posts') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="hideMutedFederationRestrictions">
{{ $t('settings.hide_muted_federation_restrictions') }}
</BooleanSetting>
<ul
class="setting-list suboptions"
:class="[{disabled: !streaming}]"
>
<li
v-for="item in muteFederationRestrictionsLevels"
:key="'mute_' + item + '_federation_restriction'"
>
<BooleanSetting :path="'muteFederationRestrictions.' + item">
{{ $t('settings.mute_' + item + '_federation_restriction') }}
</BooleanSetting>
</li>
</ul>
</li>
<li>
<BooleanSetting path="hidePostStats">
{{ $t('settings.hide_post_stats') }}
@ -119,17 +96,6 @@
{{ $t('settings.hide_scrobbles') }}
</BooleanSetting>
</li>
<li>
<UnitSetting
key="hideScrobblesAfter"
path="hideScrobblesAfter"
:units="['m', 'h', 'd']"
unitSet="time"
expert="1"
>
{{ $t('settings.hide_scrobbles_after') }}
</UnitSetting>
</li>
</ul>
</div>
<div

View File

@ -3,7 +3,7 @@ import ChoiceSetting from '../helpers/choice_setting.vue'
import ScopeSelector from 'src/components/scope_selector/scope_selector.vue'
import IntegerSetting from '../helpers/integer_setting.vue'
import FloatSetting from '../helpers/float_setting.vue'
import UnitSetting, { defaultHorizontalUnits } from '../helpers/unit_setting.vue'
import SizeSetting, { defaultHorizontalUnits } from '../helpers/size_setting.vue'
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
import SharedComputedObject from '../helpers/shared_computed_object.js'
@ -64,7 +64,7 @@ const GeneralTab = {
ChoiceSetting,
IntegerSetting,
FloatSetting,
UnitSetting,
SizeSetting,
InterfaceLanguageSwitcher,
ScopeSelector,
ProfileSettingIndicator

View File

@ -134,7 +134,7 @@
<li v-if="expertLevel > 0">
{{ $t('settings.column_sizes') }}
<div class="column-settings">
<UnitSetting
<SizeSetting
v-for="column in columns"
:key="column"
:path="column + 'ColumnWidth'"
@ -142,7 +142,7 @@
expert="1"
>
{{ $t('settings.column_sizes_' + column) }}
</UnitSetting>
</SizeSetting>
</div>
</li>
<li class="select-multiple">
@ -200,14 +200,6 @@
<div class="setting-item">
<h2>{{ $t('settings.post_look_feel') }}</h2>
<ul class="setting-list">
<li>
<BooleanSetting
path="forceThemeRecompilation"
:expert="1"
>
{{ $t('settings.force_theme_recompilation_debug') }}
</BooleanSetting>
</li>
<li>
<ChoiceSetting
id="conversationDisplay"

View File

@ -5,7 +5,7 @@
>
<div class="panel panel-default">
<div
class="panel-heading"
class="panel-heading timeline-heading"
:class="{ 'shout-heading': floating }"
@click.stop.prevent="togglePanel"
>
@ -18,7 +18,7 @@
/>
</div>
</div>
<div class="panel-body shout-window">
<div class="shout-window">
<div
v-for="message in messages"
:key="message.id"
@ -41,10 +41,10 @@
</div>
</div>
</div>
<div class="panel-body shout-input">
<div class="shout-input">
<textarea
v-model="currentMessage"
class="shout-input-textarea input"
class="shout-input-textarea"
rows="1"
@keyup.enter="submit(currentMessage)"
/>

View File

@ -238,9 +238,6 @@ const Status = {
showActorTypeIndicator () {
return !this.hideBotIndication
},
sensitiveStatus () {
return this.status.nsfw
},
mentionsLine () {
if (!this.headTailLinks) return []
const writtenSet = new Set(this.headTailLinks.writtenMentions.map(_ => _.url))
@ -268,9 +265,7 @@ const Status = {
// Wordfiltered
this.muteWordHits.length > 0 ||
// bot status
(this.muteBotStatuses && this.botStatus && !this.compact) ||
// sensitive status
(this.muteSensitiveStatuses && this.sensitiveStatus && !this.compact)
(this.muteBotStatuses && this.botStatus && !this.compact)
return !this.unmuted && !this.shouldNotMute && reasonsToMute
},
userIsMuted () {
@ -373,15 +368,9 @@ const Status = {
hidePostStats () {
return this.mergedConfig.hidePostStats
},
shouldDisplayFavsAndRepeats () {
return !this.hidePostStats && this.isFocused && (this.combinedFavsAndRepeatsUsers.length > 0 || this.statusFromGlobalRepository.quotes_count)
},
muteBotStatuses () {
return this.mergedConfig.muteBotStatuses
},
muteSensitiveStatuses () {
return this.mergedConfig.muteSensitiveStatuses
},
hideBotIndication () {
return this.mergedConfig.hideBotIndication
},
@ -425,27 +414,7 @@ const Status = {
return this.quotedStatus && this.displayQuote
},
scrobblePresent () {
if (this.mergedConfig.hideScrobbles) return false
if (!this.status.user.latestScrobble) return false
const value = this.mergedConfig.hideScrobblesAfter.match(/\d+/gs)[0]
const unit = this.mergedConfig.hideScrobblesAfter.match(/\D+/gs)[0]
let multiplier = 60 * 1000 // minutes is smallest unit
switch (unit) {
case 'm':
break
case 'h':
multiplier *= 60 // hour
break
case 'd':
multiplier *= 60 // hour
multiplier *= 24 // day
break
}
const maxAge = Number(value) * multiplier
const createdAt = Date.parse(this.status.user.latestScrobble.created_at)
const age = Date.now() - createdAt
if (age > maxAge) return false
return this.status.user.latestScrobble.artist
return !this.mergedConfig.hideScrobbles && this.status.user.latestScrobble && this.status.user.latestScrobble.artist
},
scrobble () {
return this.status.user.latestScrobble

View File

@ -374,7 +374,6 @@
font-weight: bolder;
font-size: 1.1em;
line-height: 1em;
color: var(--text);
}
&:hover .stat-title {

View File

@ -30,12 +30,6 @@
:at="false"
/>
</small>
<small
v-if="muteSensitiveStatuses && status.nsfw"
class="mute-thread"
>
{{ $t('status.sensitive_muted') }}
</small>
<small
v-if="showReasonMutedThread"
class="mute-thread"
@ -484,7 +478,7 @@
<transition name="fade">
<div
v-if="shouldDisplayFavsAndRepeats"
v-if="!hidePostStats && isFocused && combinedFavsAndRepeatsUsers.length > 0"
class="favs-repeated-users"
>
<div class="stats">
@ -512,19 +506,6 @@
</div>
</div>
</UserListPopover>
<router-link
v-if="statusFromGlobalRepository.quotes_count > 0"
:to="{ name: 'quotes', params: { id: status.id } }"
>
<div
class="stat-count"
>
<a class="stat-title">{{ $t('status.quotes') }}</a>
<div class="stat-number">
{{ statusFromGlobalRepository.quotes_count }}
</div>
</div>
</router-link>
<div class="avatar-row">
<AvatarList :users="combinedFavsAndRepeatsUsers" />
</div>

View File

@ -174,7 +174,6 @@
font-size: 1em;
font-family: var(--font);
border-radius: var(--roundness);
background-color: var(--background);
position: relative;
white-space: nowrap;
padding: 6px 1em;

View File

@ -25,7 +25,6 @@ const Timeline = {
'title',
'userId',
'listId',
'statusId',
'tag',
'embedded',
'count',
@ -122,7 +121,6 @@ const Timeline = {
showImmediately,
userId: this.userId,
listId: this.listId,
statusId: this.statusId,
tag: this.tag
})
},
@ -185,7 +183,6 @@ const Timeline = {
showImmediately: true,
userId: this.userId,
listId: this.listId,
statusId: this.statusId,
tag: this.tag
}).then(({ statuses }) => {
if (statuses && statuses.length === 0) {

View File

@ -19,8 +19,7 @@ export const timelineNames = () => {
bookmarks: 'nav.bookmarks',
dms: 'nav.dms',
'public-timeline': 'nav.public_tl',
'public-external-timeline': 'nav.twkn',
quotes: 'nav.quotes'
'public-external-timeline': 'nav.twkn'
}
}

View File

@ -204,11 +204,6 @@
--emoji-size: 1.7em;
.RichContent {
/* stylelint-disable-next-line declaration-no-important */
--link: var(--text) !important;
}
.top-line,
.bottom-line {
display: flex;

View File

@ -127,7 +127,7 @@
:title="$t('user_card.favorites')"
timeline-name="favorites"
:timeline="favorites"
:user-id="isUs ? undefined : userId"
:user-id="userId"
:in-profile="true"
:footer-slipgate="footerRef"
/>

View File

@ -678,7 +678,7 @@
"autohide_floating_post_button": "Automaticky skrýt tlačítko nového příspěvku (mobilní zařízení)",
"minimal_scopes_mode": "Minimalizovat možnosti rozsahu příspěvků",
"conversation_display": "Styl zobrazení konverzací",
"conversation_display_tree": "Stromové zobrazení",
"conversation_display_tree": "Stromový styl",
"conversation_display_tree_quick": "Stromový styl",
"show_scrollbars": "Zobrazit posuvníky bočních sloupců",
"third_column_mode": "Pokud je volné místo, zobrazit třetí sloupec obsahující",
@ -737,8 +737,7 @@
"frontend_version": "Frontend verze"
},
"commit_value_tooltip": "Hodnota není uložena, stiskněte toto tlačítko pro potvrzení změn",
"hard_reset_value_tooltip": "Odstranit nastavení z úložiště a vynutit výchozí hodnotu",
"accent": "Akcentní barva"
"hard_reset_value_tooltip": "Odstranit nastavení z úložiště a vynutit výchozí hodnotu"
},
"time": {
"day": "{0} day",
@ -749,7 +748,7 @@
"hours": "{0} hours",
"hour_short": "{0}h",
"hours_short": "{0}h",
"in_future": "za {0}",
"in_future": "in {0}",
"in_past": "před {0}",
"minute": "{0} minute",
"minutes": "{0} minutes",
@ -759,8 +758,8 @@
"months": "{0} měs",
"month_short": "{0} měs",
"months_short": "{0} měs",
"now": "právě teď",
"now_short": "nyní",
"now": "teď",
"now_short": "teď",
"second": "{0} second",
"seconds": "{0} seconds",
"second_short": "{0}s",
@ -772,23 +771,7 @@
"year": "{0} r",
"years": "{0} l",
"year_short": "{0}r",
"years_short": "{0}l",
"unit": {
"seconds_short": "{0}s",
"days": "{0} den | {0} dnů",
"days_short": "{0}d",
"hours": "{0} hodina | {0} hodin",
"hours_short": "{0}h",
"minutes": "{0} minuta | {0} minut",
"months": "{0} měsíc | {0} měsíců",
"months_short": "{0}mo",
"minutes_short": "{0}min",
"seconds": "{0} sekunda | {0} sekund",
"weeks": "{0} týden | {0} týdnů",
"weeks_short": "{0}w",
"years": "{0} rok | {0} roky",
"years_short": "{0}y"
}
"years_short": "{0}l"
},
"timeline": {
"collapse": "Zabalit",
@ -800,60 +783,11 @@
"show_new": "Zobrazit nové",
"up_to_date": "Aktuální",
"no_more_statuses": "Žádné další příspěvky",
"no_statuses": "Žádné příspěvky",
"socket_reconnected": "Navázáno spojení v reálném čase",
"error": "Chyba při načítání časové osy: {0}",
"reload": "Načíst znovu",
"socket_broke": "Spojení v reálném čase ztraceno: CloseEvent code {0}"
"no_statuses": "Žádné příspěvky"
},
"status": {
"reply_to": "Odpověď uživateli",
"replies_list": "Odpovědi:",
"many_attachments": "Příspěvek má {number} příloh(u)",
"collapse_attachments": "Sbalit přílohy",
"unpin": "Odepnout z profilu",
"thread_muted": "Vlákno ztlumeno",
"show_attachment_description": "Popis náhledu (otevřete přílohu pro celý popis)",
"move_down": "Posunout přílohu doprava",
"thread_show": "Zobrazit toto vlákno",
"pin": "Připnout na profil",
"mute_conversation": "Ztlumit konverzaci",
"thread_hide": "Skrýt toto vlákno",
"show_full_subject": "Zobrazit celý předmět",
"edited_at": "(naposledy upraveno {time})",
"repeat_confirm_accept_button": "Zopakovat",
"repeat_confirm_title": "Potvrzení zopakování",
"delete_error": "Chyba při mazání příspěvku: {0}",
"delete_confirm": "Opravdu chcete smazat tento příspěvek?",
"delete_confirm_title": "Potvrzení smazání",
"delete_confirm_accept_button": "Smazat",
"delete_confirm_cancel_button": "Ponechat",
"you": "(Vy)",
"hide_attachment": "Skrýt přílohu",
"remove_attachment": "Odstranit přílohu",
"attachment_stop_flash": "Zastavit Flash player",
"nsfw": "NSFW",
"repeat_confirm_cancel_button": "Neopakovat",
"favorites": "Oblíbené",
"repeats": "Opakovaní",
"repeat_confirm": "Opravdu chcete zopakovat tento příspěvek?",
"delete": "Smazat příspěvek",
"copy_link": "Kopírovat odkaz k příspěvku",
"external_source": "Externí zdroj",
"edit": "Upravit příspěvek",
"bookmark": "Přidat do záložek",
"unbookmark": "Odebrat ze záložek",
"mentions": "Zmínky",
"hide_full_subject": "Skrýt celý předmět",
"show_content": "Zobrazit obsah",
"hide_content": "Skrýt obsah",
"unmute_conversation": "Zrušit ztlumení konverzace",
"status_unavailable": "Příspěvek je nedostupný",
"status_deleted": "Tento příspěvek byl smazán",
"expand": "Rozbalit",
"show_all_attachments": "Zobrazit všechny přílohy",
"move_up": "Posunout přílohu doleva",
"open_gallery": "Otevřít galerii"
"replies_list": "Odpovědi:"
},
"user_card": {
"approve": "Schválit",
@ -863,7 +797,7 @@
"favorites": "Oblíbené",
"follow": "Sledovat",
"follow_sent": "Požadavek odeslán!",
"follow_progress": "Odesílám požadavek…",
"follow_progress": "Odeslílám požadavek…",
"follow_unfollow": "Přestat sledovat",
"followees": "Sledovaní",
"followers": "Sledující",
@ -1061,121 +995,13 @@
"nodb": "Žádné nastavení v databázi",
"frontends": "Frontendy",
"instance": "Instance",
"limits": "Limity",
"emoji": "Emoji"
"limits": "Limity"
},
"nodb": {
"heading": "Nastavení v databázi je vypnuto",
"documentation": "dokumentace",
"text2": "Většina konfiguračních možností nebude dostupná."
"heading": "Nastavení v databázi je vypnuto"
},
"wip_notice": "Tento administrační panel je experimentální a v aktivní vývoji, {adminFeLink}.",
"old_ui_link": "staré administrační rozhraní je dostupné zde",
"reset_all": "Resetovat vše",
"frontend": {
"failure_installing_frontend": "Nepodařilo se nainstalovat frontend {version}: {reason}",
"reinstall": "Přeinstalovat",
"available_frontends": "Dostupné k instalaci",
"is_default": "(Výchozí)",
"versions": "Dostupné verze",
"build_url": "URL sestavení",
"install": "Instalovat",
"install_version": "Instalovat verzi {version}",
"more_install_options": "Více instalačních možností",
"more_default_options": "Více výchozích nastavení pro možnosti",
"set_default": "Nastavit výchozí",
"default_frontend": "Výchozí frontend",
"set_default_version": "Nastavit verzi {version} jako výchozí",
"repository": "Odkaz k repozitáři",
"is_default_custom": "(Výchozí, verze: {version})",
"success_installing_frontend": "Frontend {version} byl úspěšně nainstalován"
},
"captcha": {
"native": "Nativní",
"kocaptcha": "KoCaptcha"
},
"instance": {
"instance": "Informace o instanci",
"captcha_header": "CAPTCHA",
"restrict": {
"activities": "Přístup k příspěvkům a aktivitám",
"timelines": "Přístup k časovým osám",
"profiles": "Přístup k uživatelským profilům",
"header": "Omezit přístup pro anonymní návštěvníky"
},
"registrations": "Registrace uživatelů",
"kocaptcha": "KoCaptcha nastavení"
},
"limits": {
"posts": "Limity příspěvků",
"uploads": "Limity příloh",
"users": "Limity uživatelských profilů",
"arbitrary_limits": "Libovolné limity",
"profile_fields": "Limity profilových polí",
"user_uploads": "Limity médií profilů"
},
"emoji": {
"global_actions": "Globální akce",
"reload": "Znovu načíst emoji",
"importFS": "Importovat emoji ze souborového systému",
"error": "Chyba: {0}",
"create_pack": "Vytvořit balíček",
"delete_pack": "Smazat balíček",
"new_pack_name": "Nový název balíčku",
"create": "Vytvořit",
"emoji_packs": "Emoji balíčky",
"remote_packs": "Vzdálené balíčky",
"do_list": "List",
"emoji_pack": "Emoji balíček",
"edit_pack": "Upravit balíček",
"description": "Popis",
"homepage": "Domovská stránka",
"fallback_src": "Záložní zdroj",
"fallback_sha256": "Záložní SHA256",
"share": "Sdílet",
"save": "Uložit",
"save_meta": "Uložit metadata",
"revert_meta": "Vrátit zpět metadata",
"delete": "Smazat",
"add_file": "Přidat soubor",
"adding_new": "Přidávání nových emoji",
"shortcode": "Zkratka",
"filename": "Jméno souboru",
"new_shortcode": "Zkrat, ponechte prázdné pro odvození",
"delete_confirm": "Opravdu chcete smazat {0}?",
"download_pack": "Stáhnout balíček",
"downloading_pack": "Stahování {0}",
"download": "Stáhnout",
"download_as_name": "Nové jméno",
"download_as_name_full": "Nové jméno, pro opakované použití ponechte prázdné",
"files": "Soubory",
"editing": "Upravování {0}",
"delete_title": "Smazat?",
"emoji_changed": "Neuložené změny emoji souborů, zkontrolujte zvýrazněné emoji",
"replace_warning": "Tímto se NAHRADÍ místní balíček se stejným jménem",
"metadata_changed": "Metadata jsou rozdílné od uložených",
"revert": "Vrátit zpět",
"new_filename": "Jméno souboru, ponechte prázdné pro odvození"
},
"temp_overrides": {
":pleroma": {
":instance": {
":background_image": {
"label": "Obrázek na pozadí",
"description": "Obrázek na pozadí (především používáno PleromaFE)"
},
":description_limit": {
"label": "Limit",
"description": "Limit počtu znaků pro popisy příloh"
},
":public": {
"label": "Instance je veřejná"
},
":limit_to_local_content": {
"label": "Limitovat vyhledávání pouze na místní obsah"
}
}
}
}
"reset_all": "Resetovat vše"
}
}

View File

@ -186,11 +186,11 @@
"edit_pinned": "Edit pinned items",
"edit_finish": "Done editing",
"mobile_sidebar": "Toggle mobile sidebar",
"mobile_notifications": "Open notifications",
"mobile_notifications": "Open notifications (there are unread ones)",
"mobile_notifications_close": "Close notifications",
"mobile_notifications_mark_as_seen": "Mark all as seen",
"announcements": "Announcements",
"quotes": "Quotes"
"announcements": "Announcements"
},
"notifications": {
"broken_favorite": "Unknown status, searching for it…",
@ -395,14 +395,6 @@
"desc": "To enable two-factor authentication, enter the code from your two-factor app:"
}
},
"units": {
"time": {
"m": "minutes",
"s": "seconds",
"h": "hours",
"d": "days"
}
},
"lists_navigation": "Show lists in navigation",
"allow_following_move": "Allow auto-follow when following account moves",
"attachmentRadius": "Attachments",
@ -510,8 +502,6 @@
"mute_bot_posts": "Mute bot posts",
"hide_actor_type_indication": "Hide actor type (bots, groups, etc.) indication in posts",
"hide_scrobbles": "Hide scrobbles",
"hide_scrobbles_after": "Hide scrobbles older than",
"mute_sensitive_posts": "Mute sensitive posts",
"hide_all_muted_posts": "Hide muted posts",
"max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)",
"hide_isp": "Hide instance-specific panel",
@ -645,7 +635,6 @@
"subject_line_email": "Like email: \"re: subject\"",
"subject_line_mastodon": "Like mastodon: copy as is",
"subject_line_noop": "Do not copy",
"force_theme_recompilation_debug": "Disable theme cahe, force recompile on each boot (DEBUG)",
"conversation_display": "Conversation display style",
"conversation_display_tree": "Tree-style",
"conversation_display_tree_quick": "Tree view",
@ -917,7 +906,7 @@
"description": "Detailed setting for allowing/disallowing access to certain aspects of API. By default (indeterminate state) it will disallow if instance is not public, ticked checkbox means disallow access even if instance is public, unticked means allow access even if instance is private. Please note that unexpected behavior might happen if some settings are set, i.e. if profile access is disabled posts will show without profile information.",
"timelines": "Timelines access",
"profiles": "User profiles access",
"activities": "Statuses/activities access"
"activities": "Statues/activities access"
}
},
"limits": {
@ -942,8 +931,8 @@
"set_default": "Set default",
"set_default_version": "Set version {version} as default",
"wip_notice": "Please note that this section is a WIP and lacks certain features as backend implementation of front-end management is incomplete.",
"default_frontend": "Default frontend",
"default_frontend_tip": "Default frontend will be shown to all users. Currently there's no way to for a user to select personal frontend. If you switch away from PleromaFE you'll most likely have to use old and buggy AdminFE to do instance configuration until we replace it.",
"default_frontend": "Default front-end",
"default_frontend_tip": "Default front-end will be shown to all users. Currently there's no way to for a user to select personal front-end. If you switch away from PleromaFE you'll most likely have to use old and buggy AdminFE to do instance configuration until we replace it.",
"default_frontend_unavail": "Default frontend settings are not available, as this requires configuration in the database",
"available_frontends": "Available for install",
"failure_installing_frontend": "Failed to install frontend {version}: {reason}",
@ -1058,7 +1047,6 @@
"status": {
"favorites": "Favorites",
"repeats": "Repeats",
"quotes": "Quotes",
"repeat_confirm": "Do you really want to repeat this status?",
"repeat_confirm_title": "Repeat confirmation",
"repeat_confirm_accept_button": "Repeat",
@ -1087,7 +1075,6 @@
"external_source": "External source",
"thread_muted": "Thread muted",
"thread_muted_and_words": ", has words:",
"sensitive_muted": "Muting sensitive content",
"show_full_subject": "Show full subject",
"hide_full_subject": "Hide full subject",
"show_content": "Show content",
@ -1124,9 +1111,7 @@
"hide_quote": "Hide the quoted status",
"display_quote": "Display the quoted status",
"invisible_quote": "Quoted status unavailable: {link}",
"more_actions": "More actions on this status",
"loading": "Loading...",
"load_error": "Unable to load status: {error}"
"more_actions": "More actions on this status"
},
"user_card": {
"approve": "Approve",

View File

@ -90,11 +90,7 @@
"heading": {
"totp": "Authentification à double-facteur",
"recovery": "Récupération de l'authentification à double-facteur"
},
"logout_confirm_title": "Confirmation de déconnexion",
"logout_confirm": "Souhaitez-vous vous déconnecter ?",
"logout_confirm_accept_button": "Déconnexion",
"logout_confirm_cancel_button": "Ne pas se déconnecter"
}
},
"media_modal": {
"previous": "Précédent",
@ -114,7 +110,7 @@
"timeline": "Flux personnel",
"twkn": "Réseau connu",
"user_search": "Recherche de comptes",
"who_to_follow": "Suggestion de suivi",
"who_to_follow": "Suggestion de suivit",
"preferences": "Préférences",
"search": "Recherche",
"administration": "Administration",
@ -128,10 +124,7 @@
"edit_pinned": "Éditer les éléments agrafés",
"edit_finish": "Édition terminée",
"mobile_sidebar": "(Dés)activer le panneau latéral",
"mobile_notifications_close": "Fermer les notifications",
"search_close": "Fermer la barre de recherche",
"announcements": "Annonces",
"mobile_notifications_mark_as_seen": "Marquer tout comme vu"
"mobile_notifications_close": "Fermer les notifications"
},
"notifications": {
"broken_favorite": "Message inconnu, recherche en cours…",
@ -147,13 +140,7 @@
"follow_request": "veut vous suivre",
"error": "Erreur de chargement des notifications: {0}",
"poll_ended": "Sondage terminé",
"submitted_report": "Rapport envoyé",
"unread_announcements": "{num} annonce non lue | {num} annonces non lues",
"unread_chats": "{num} message non lu | {num} messages non lus",
"configuration_tip_settings": "les préférences",
"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_dismiss": "Ne plus montrer"
"submitted_report": "Rapport envoyé"
},
"interactions": {
"favs_repeats": "Partages et favoris",
@ -167,7 +154,7 @@
"new_status": "Poster un nouveau statut",
"account_not_locked_warning": "Votre compte n'est pas {0}. N'importe qui peut vous suivre pour voir vos billets en Abonné·e·s uniquement.",
"account_not_locked_warning_link": "verrouillé",
"attachments_sensitive": "Marquer les pièces jointes comme sensible",
"attachments_sensitive": "Marquer les pièce-jointes comme sensible",
"content_type": {
"text/plain": "Texte brut",
"text/html": "HTML",
@ -196,13 +183,9 @@
"preview": "Prévisualisation",
"media_description": "Description de la pièce-jointe",
"post": "Post",
"edit_status": "Éditer le statut",
"edit_status": "Éditer le status",
"edit_remote_warning": "Des instances distantes pourraient ne pas supporter l'édition et seront incapables de recevoir la nouvelle version de votre post.",
"edit_unsupported_warning": "Pleroma ne supporte pas l'édition de mentions ni de sondages.",
"reply_option": "Répondre à ce statut",
"quote_option": "Citer ce statut",
"scope_notice_dismiss": "Fermer ce message",
"content_type_selection": "Format du statut"
"edit_unsupported_warning": "Pleroma ne supporte pas l'édition de mentions ni de sondages."
},
"registration": {
"bio": "Biographie",
@ -222,18 +205,14 @@
"email_required": "ne peut pas être laissé vide",
"password_required": "ne peut pas être laissé vide",
"password_confirmation_required": "ne peut pas être laissé vide",
"password_confirmation_match": "doit être identique au mot de passe",
"birthday_min_age": "doit être le ou avant le {date}",
"birthday_required": "ne peut pas être vide"
"password_confirmation_match": "doit être identique au mot de passe"
},
"reason_placeholder": "Cette instance modère les inscriptions manuellement.\nExpliquer ce qui motive votre inscription à l'administration.",
"reason": "Motivation d'inscription",
"register": "Enregistrer",
"email_language": "Dans quelle langue voulez-vous recevoir les emails du server ?",
"bio_optional": "Biographie (optionnelle)",
"email_optional": "Courriel (optionnel)",
"birthday": "Anniversaire :",
"birthday_optional": "Anniversaire (optionnel) :"
"email_optional": "Courriel (optionnel)"
},
"selectable_list": {
"select_all": "Tout selectionner"
@ -705,64 +684,7 @@
"use_websockets": "Utiliser les websockets (mises à jour en temps réel)",
"user_popover_avatar_action_zoom": "Zoomer sur l'avatar",
"user_popover_avatar_action_open": "Ouvrir le profil",
"conversation_display_tree_quick": "Vue arborescente",
"emoji_reactions_scale": "Taille des réactions",
"backup_running": "Cette sauvegarde est en cours, {number} enregistrement effectué. | Cette sauvegarde est en cours, {number} enregistrements effectués.",
"backup_failed": "Cette sauvegarde a échoué.",
"autocomplete_select_first": "Sélectionner automatiquement la première occurrence lorsque les résultats de l'autocomplétion sont disponibles",
"confirm_dialogs_unfollow": "arrête de suivre un utilisateur",
"confirm_dialogs_repeat": "reposte un statut",
"actor_type": "Ce compte est :",
"actor_type_Person": "un utilisateur normal",
"actor_type_Service": "un robot",
"actor_type_Group": "un groupe",
"confirm_dialogs_logout": "à la déconnexion",
"confirm_dialogs_approve_follow": "accepte un nouvel abonné",
"confirm_dialogs_deny_follow": "refuse un nouvel abonné",
"confirm_dialogs_remove_follower": "supprime un abonné",
"actor_type_description": "En marquant votre compte comme un groupe, vous répétez automatiquement les statuts qui le mentionnent.",
"add_language": "Ajouter une langue de remplacement",
"remove_language": "Supprimer",
"primary_language": "Langue principale :",
"fallback_language": "Langue de remplacement {index} :",
"confirm_dialogs": "Demande de confirmation quand",
"confirm_dialogs_block": "bloque un utilisateur",
"confirm_dialogs_mute": "mute un utilisateur",
"confirm_dialogs_delete": "supprime un statut",
"url": "URL",
"preview": "Aperçu",
"reset_value": "Réinitialiser",
"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",
"hard_reset_value": "Remise à zéro",
"hide_actor_type_indication": "Cacher le type (robots, groupes, etc.) dans les status",
"notification_extra_follow_requests": "Afficher les nouvelles demandes de suivi",
"user_popover_avatar_action": "Action du clic sur l'avatar",
"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_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_filters_chrome_push": "Sur certains navigateurs (chrome), il peut être impossible de filtrer complètement les notifications par type lorsqu'elles arrivent",
"enable_web_push_always_show": "Toujours afficher les notifications web",
"commit_value": "Sauvegarder",
"hide_scrobbles": "Masquer les scrobbles",
"notification_setting_annoyance": "Agacement",
"notification_setting_drawer_marks_as_seen": "Fermer le tiroir marque toutes les notifications comme lues (mobile)",
"commit_value_tooltip": "Les valeurs ne sont pas sauvegardées, appuyez sur ce bouton pour soumettre vos changements",
"birthday": {
"show_birthday": "Afficher mon anniversaire",
"label": "Anniversaire"
},
"notification_visibility_native_notifications": "Afficher une notification native",
"notification_visibility_follow_requests": "Demandes de suivi",
"notification_visibility_reports": "Rapports",
"notification_extra_chats": "Afficher les discussions non lues",
"notification_extra_announcements": "Afficher les annonces non lues",
"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.",
"user_popover_avatar_overlay": "Afficher la fenêtre contextuelle sur l'avatar de l'utilisateur",
"notification_visibility_in_column": "Afficher la colonne / le tiroir de notifications",
"notification_show_extra": "Afficher les extras dans la colonne de notifications"
"conversation_display_tree_quick": "Vue arborescente"
},
"timeline": {
"collapse": "Fermer",
@ -836,20 +758,7 @@
"show_all_conversation": "Montrer tout le fil ({numStatus} autre message) | Montrer tout le fil ({numStatus} autre messages)",
"edit": "Éditer le status",
"edited_at": "(dernière édition {time})",
"status_history": "Historique du status",
"delete_error": "Erreur de suppression du statut : {0}",
"repeat_confirm": "Voulez-vous réellement reposter ce statut ?",
"reaction_count_label": "{num} personne a réagi | {num} personnes ont réagi",
"repeat_confirm_cancel_button": "Ne pas reposter",
"hide_quote": "Masquer les status cités",
"display_quote": "Afficher les status cités",
"invisible_quote": "Citation de statut non disponible : {link}",
"delete_confirm_title": "Confirmer la suppression",
"more_actions": "Plus d'action sur ce statut",
"delete_confirm_cancel_button": "Conserver",
"repeat_confirm_title": "Confirmer reposte",
"repeat_confirm_accept_button": "Reposter",
"delete_confirm_accept_button": "Supprimer"
"status_history": "Historique du status"
},
"user_card": {
"approve": "Accepter",
@ -919,39 +828,7 @@
"edit_profile": "Éditer le profil",
"deactivated": "Désactivé",
"follow_cancel": "Annuler la requête",
"remove_follower": "Retirer l'abonné·e",
"remove_follower_confirm_accept_button": "Supprimer",
"approve_confirm_cancel_button": "Ne pas approuver",
"block_confirm_accept_button": "Bloquer",
"mute_confirm_title": "Confirmation de mise en sourdine",
"block_confirm_cancel_button": "Ne pas bloquer",
"unfollow_confirm": "Voulez-vous vraiment arrêter de suivre {user} ?",
"unfollow_confirm_accept_button": "Ne plus suivre",
"birthday": "Né(e) le {birthday}",
"edit_note": "Éditer note",
"edit_note_apply": "Appliquer",
"edit_note_cancel": "Abandonner",
"note": "Note",
"group": "Groupe",
"unfollow_confirm_title": "Confirmer l'arrêt de suivi",
"block_confirm_title": "Confirmer le blocage",
"deny_confirm_accept_button": "Refuser",
"deny_confirm_cancel_button": "Ne pas refuser",
"deny_confirm": "Voulez-vous refuser la demande de suivi de {user} ?",
"deny_confirm_title": "Refuser la confirmation",
"remove_follower_confirm_cancel_button": "Conserver",
"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",
"note_blank": "(Aucun)",
"mute_confirm": "Voulez-vous vraiment mettre {user} en sourdine ?",
"mute_confirm_accept_button": "Mettre en sourdine",
"mute_confirm_cancel_button": "Ne pas mettre en sourdine",
"remove_follower_confirm": "Voulez-vous vraiment supprimer {user} de vos abonnés ?",
"approve_confirm_accept_button": "Approuver",
"approve_confirm": "Voulez-vous approuver la demande de suivi de {user} ?",
"block_confirm": "Voulez-vous vraiment bloquer {user} ?",
"approve_confirm_title": "Approuver confirmation",
"unfollow_confirm_cancel_button": "Ne pas arrêter le suivi"
"remove_follower": "Retirer l'abonné·e"
},
"user_profile": {
"timeline_title": "Flux du compte",
@ -980,10 +857,7 @@
"add_reaction": "Ajouter une réaction",
"accept_follow_request": "Accepter la demande de suivit",
"reject_follow_request": "Rejeter la demande de suivit",
"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.",
"toggle_expand": "Développer ou réduire la notification pour afficher le message dans son intégralité",
"toggle_mute": "Développer ou réduire la notification pour révéler le contenu en sourdine"
"bookmark": "Favori"
},
"upload": {
"error": {
@ -1076,9 +950,7 @@
"symbols": "Symboles",
"travel-and-places": "Voyages & lieux"
},
"regional_indicator": "Indicateur régional {letter}",
"unpacked": "Émojis non catégorisés",
"hide_custom_emoji": "Masquer les émojis personnalisés"
"regional_indicator": "Indicateur régional {letter}"
},
"remote_user_resolver": {
"error": "Non trouvé.",
@ -1140,7 +1012,7 @@
"person_talking": "{count} personnes discutant",
"hashtags": "Mot-dièses",
"people_talking": "{count} personnes discutant",
"no_results": "Aucun résultat",
"no_results": "Aucun résultats",
"no_more_results": "Pas de résultats supplémentaires",
"load_more": "Charger plus de résultats"
},
@ -1211,8 +1083,7 @@
"update_changelog_here": "Liste compète des changements",
"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.",
"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"
"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."
},
"unicode_domain_indicator": {
"tooltip": "Ce domaine contient des caractères non ascii."
@ -1226,158 +1097,5 @@
"state_open": "Ouvert",
"state_closed": "Fermé",
"state_resolved": "Résolut"
},
"announcements": {
"page_header": "Annonces",
"title": "Annonce",
"mark_as_read_action": "Marquer comme lu",
"post_form_header": "Faire une annonce",
"post_placeholder": "Écrivez le contenu de l'annonce ici...",
"post_action": "Envoyer",
"post_error": "Erreur : {error}",
"close_error": "Fermer",
"delete_action": "Supprimer",
"start_time_prompt": "Heure de début : ",
"end_time_prompt": "Heure de fin : ",
"all_day_prompt": "L'événement dure toute la journée",
"inactive_message": "Cette annonce n'est pas active",
"published_time_display": "Publié le {time}",
"start_time_display": "Démarre à {time}",
"end_time_display": "Se termine à {time}",
"edit_action": "Modifier",
"submit_edit_action": "Envoyer",
"cancel_edit_action": "Annuler"
},
"admin_dash": {
"frontend": {
"success_installing_frontend": "Installation réussie de l'interface {version}",
"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",
"build_url": "Construction URL",
"reinstall": "Réinstaller",
"repository": "Lien du dépôt",
"versions": "Versions disponibles",
"default_frontend_tip": "L'interface par défaut sera affichée à tous les utilisateurs. Si vous décidez de quitter PleromaFE, vous devrez utiliser l'ancienne AdminFE buguée pour configurer votre instance jusqu'à ce que nous la remplacions.",
"is_default": "(Défaut)",
"is_default_custom": "(Défaut, version : {version})",
"install": "Installation",
"install_version": "Installation de la version {version}",
"more_install_options": "Plus d'options d'installation",
"more_default_options": "Plus d'options de paramétrages par défaut",
"set_default": "Définir la valeur par défaut",
"set_default_version": "Définir la version {version} comme version par défaut",
"wip_notice": "Veuillez noter que cette section est en cours de développement et que certaines fonctionnalités de l'interface ne sont pas implémentées côté serveur.",
"default_frontend": "Interface par défaut",
"available_frontends": "Disponible pour installation"
},
"temp_overrides": {
":pleroma": {
":instance": {
":public": {
"label": "Cette instance est publique",
"description": "En désactivant cette option, toutes les API ne seront accessibles qu'aux utilisateurs connectés, ce qui rendra les chronologies publiques et fédérées inaccessibles aux visiteurs anonymes."
},
":limit_to_local_content": {
"label": "Limitez la recherche au contenu local",
"description": "Désactive la recherche globale sur le réseau pour les utilisateurs non authentifiés (par défaut), tous les utilisateurs ou aucun"
},
":description_limit": {
"label": "Limite",
"description": "Limite de nombre de caractères pour la description des fichiers joints"
},
":background_image": {
"description": "Image de fond (principalement utilisé par PleromaFE)",
"label": "Image de fond d'écran"
}
}
}
},
"tabs": {
"emoji": "Émoji",
"limits": "Limites",
"frontends": "Interfaces",
"instance": "Instance",
"nodb": "Pas de configuration de base de données"
},
"instance": {
"kocaptcha": "Réglages KoCaptcha",
"access": "Accès à l'instance",
"restrict": {
"header": "Restreindre l'accès aux visiteurs anonymes",
"profiles": "Accès aux profils d'utilisateur",
"activities": "Accès aux status/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.",
"timelines": "Accès aux flux"
},
"registrations": "Inscription des utilisateurs",
"captcha_header": "CAPTCHA",
"instance": "Informations sur l'instance"
},
"emoji": {
"global_actions": "Actions globales",
"reload": "Recharger les émojis",
"importFS": "Importer les émojis depuis le système de fichiers",
"error": "Erreur : {0}",
"create_pack": "Créer un pack",
"delete_pack": "Supprimer un paquet",
"new_pack_name": "Renommer le pack",
"create": "Créer",
"emoji_packs": "Pack d'émojis",
"remote_packs": "Packs d'autres instances",
"do_list": "Liste",
"remote_pack_instance": "Instance du pack",
"emoji_pack": "Pack d'émoji",
"edit_pack": "Modifier le pack",
"description": "Description",
"homepage": "Page d'accueil",
"fallback_src": "Source de remplacement",
"fallback_sha256": "Remplacement SHA256",
"share": "Partager",
"save": "Sauvegarder",
"save_meta": "Sauvegarder les métadonnées",
"revert_meta": "Annuler métadonnées",
"delete": "Supprimer",
"revert": "Revenir en arrière",
"add_file": "Ajouter un fichier",
"adding_new": "Ajouter un nouvel émoji",
"shortcode": "Shortcode",
"filename": "Nom du fichier",
"new_filename": "Nom de fichier, laisser blanc pour inférer",
"delete_confirm": "Êtes-vous sûr de vouloir supprimer {0} ?",
"download_pack": "Télécharger pack",
"downloading_pack": "Télécharge {0}",
"download": "Téléchargement",
"download_as_name": "Nouveau nom",
"download_as_name_full": "Nouveau nom, laissez blanc pour réutiliser le précédent",
"files": "Fichiers",
"editing": "Édition de {0}",
"delete_title": "Supprimer ?",
"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é",
"replace_warning": "Vous allez REMPLACER le pack local qui porte ce nom"
},
"window_title": "Administration",
"nodb": {
"heading": "La configuration de base de données est désactivée",
"documentation": "documentation",
"text2": "La majorité des options de configuration ne seront pas disponibles.",
"text": "Vous devez modifier les fichiers de configuration du serveur pour que {property} soit définie à {value}, plus de détails dans la {documentation}."
},
"limits": {
"arbitrary_limits": "Limites arbitraires",
"posts": "Limites des statuts",
"uploads": "Limites des pièces jointes",
"users": "Limites du profil d'utilisateur",
"profile_fields": "Limites des champs du profile",
"user_uploads": "Limites des médias du profil"
},
"captcha": {
"native": "Natif",
"kocaptcha": "KoCaptcha"
},
"wip_notice": "Ce tableau de bord d'administration est expérimental et en cours de développement, {adminFeLink}.",
"old_ui_link": "L'ancien espace d'administration est disponible ici",
"reset_all": "Tout réinitialiser",
"commit_all": "Tout sauvegarder"
}
}

View File

@ -1243,8 +1243,7 @@
"tabs": {
"limits": "制限",
"instance": "インスタンス",
"frontends": "フロントエンド",
"emoji": "絵文字"
"frontends": "フロントエンド"
},
"limits": {
"arbitrary_limits": "変更可能な制限",
@ -1253,27 +1252,6 @@
"profile_fields": "追加情報欄の制限",
"user_uploads": "プロフィール画像の制限",
"users": "ユーザープロフィールの設定"
},
"emoji": {
"create_pack": "パックを作成",
"delete_pack": "パックを削除",
"create": "作成",
"emoji_packs": "絵文字パック",
"remote_packs": "リモートのパック",
"emoji_pack": "絵文字パック",
"edit_pack": "パックを編集",
"homepage": "ホームページ",
"save": "保存",
"save_meta": "メタデータを保存",
"shortcode": "ショートコード",
"filename": "ファイル名",
"delete_confirm": "{0}を削除してもよろしいですか?",
"download_pack": "パックをダウンロード",
"downloading_pack": "{0}をダウンロード中",
"download": "ダウンロード",
"editing": "{0}を編集中",
"error": "エラー: {0}",
"delete": "削除"
}
},
"lists": {

View File

@ -11,8 +11,7 @@
"title": "Características",
"who_to_follow": "Quem seguir",
"upload_limit": "Limite de carregamento",
"pleroma_chat_messages": "Chat do Pleroma",
"shout": "Shoutbox"
"pleroma_chat_messages": "Chat do Pleroma"
},
"finder": {
"error_fetching_user": "Erro ao pesquisar utilizador",
@ -37,27 +36,11 @@
"error_retry": "Por favor, tenta novamente",
"loading": "A carregar…",
"dismiss": "Ignorar",
"role": {
"role":
{
"moderator": "Moderador",
"admin": "Admin"
},
"undo": "Refazer",
"yes": "Sim",
"no": "Não",
"unpin": "Desafixar o item",
"scroll_to_top": "Rolar para o topo",
"flash_content": "Clique para mostrar conteúdo Flash usando o Ruffle (Experimental, talvez não funcione).",
"flash_security": "Note que isso pode ser potencialmente perigoso dado que o conteúdo Flash ainda é código arbitrário.",
"flash_fail": "Falha ao carregar conteúdo flash, veja o console para detalhes.",
"scope_in_timeline": {
"direct": "Direct",
"private": "Apenas-seguidores",
"public": "Público",
"unlisted": "Não-listado"
},
"pin": "Fixar o item",
"generic_error_message": "Um erro ocorreu: {0}",
"never_show_again": "Não mostrar mais"
}
},
"image_cropper": {
"crop_picture": "Cortar imagem",
@ -81,17 +64,11 @@
"recovery_code": "Código de recuperação",
"authentication_code": "Código de autenticação",
"enter_two_factor_code": "Introduza o código de dois fatores",
"enter_recovery_code": "Introduza um código de recuperação",
"logout_confirm_title": "Confirmação de logoff",
"logout_confirm": "Você realmente quer sair?",
"logout_confirm_accept_button": "Sair",
"logout_confirm_cancel_button": "Não sair"
"enter_recovery_code": "Introduza um código de recuperação"
},
"media_modal": {
"previous": "Anterior",
"next": "Próximo",
"counter": "{current} / {total}",
"hide": "Fechar visualizador de mídia"
"next": "Próximo"
},
"nav": {
"about": "Sobre",
@ -111,18 +88,7 @@
"administration": "Administração",
"chats": "Salas de Chat",
"timelines": "Cronologias",
"bookmarks": "Itens Guardados",
"home_timeline": "Timeline da home",
"lists": "Listas",
"edit_pinned": "Editar itens fixados",
"edit_nav_mobile": "Customizar barra de navegação",
"mobile_notifications_mark_as_seen": "Marcar todas como vistas",
"search_close": "Fechar barra de busca",
"mobile_notifications_close": "Fechar notificações",
"announcements": "Anúncios",
"edit_finish": "Edição finalizada",
"mobile_sidebar": "Alternar barra lateral móvel",
"mobile_notifications": "Abrir notificações (há notificações não lidas)"
"bookmarks": "Itens Guardados"
},
"notifications": {
"broken_favorite": "Publicação desconhecida, a procurar…",
@ -136,15 +102,7 @@
"reacted_with": "reagiu com {0}",
"migrated_to": "migrou para",
"follow_request": "quer seguir-te",
"error": "Erro ao obter notificações: {0}",
"unread_announcements": "{num} anúncio não lido | {num} anúncios não lidos",
"unread_chats": "{num} mensagem não lida | {num} mensagens não lidas",
"configuration_tip": "Você pode customizar o que você deseja mostrar aqui em {theSettings}. {dismiss}",
"unread_follow_requests": "{num} novo pedido de seguidor | {num} novos pedidos de seguidores",
"configuration_tip_settings": "as configurações",
"configuration_tip_dismiss": "Não mostrar novamente",
"poll_ended": "enquete finalizada",
"submitted_report": "enviado um relatório"
"error": "Erro ao obter notificações: {0}"
},
"post_status": {
"new_status": "Publicar nova publicação",
@ -178,14 +136,7 @@
"media_description": "Descrição da multimédia",
"media_description_error": "Falha ao atualizar ficheiro, tente novamente",
"direct_warning_to_first_only": "Esta publicação só será visível para os utilizadores mencionados no início da mensagem.",
"direct_warning_to_all": "Esta publicação será visível para todos os utilizadores mencionados.",
"edit_status": "Editar status",
"reply_option": "Responder a esse status",
"quote_option": "Citar esse status",
"edit_remote_warning": "Outras instâncias remotas talvez não suportem edição e sejam incapazes de receber a última versão do seu post.",
"content_type_selection": "Formato do post",
"scope_notice_dismiss": "Fechar essa notificação",
"edit_unsupported_warning": "Pleroma não suporta editar menções ou enquetes."
"direct_warning_to_all": "Esta publicação será visível para todos os utilizadores mencionados."
},
"registration": {
"bio": "Biografia",
@ -205,18 +156,8 @@
"email_required": "não pode ser deixado em branco",
"password_required": "não pode ser deixado em branco",
"password_confirmation_required": "não pode ser deixado em branco",
"password_confirmation_match": "deve corresponder à palavra-passe",
"birthday_required": "não pode ser deixado em branco",
"birthday_min_age": "deve ser em ou antes de {date}"
},
"birthday": "Data de nascimento:",
"reason": "Razão para registrar",
"register": "Registrar",
"reason_placeholder": "Essa instância aprova os registros manualmente.\nPermita ao administrador saber o porquê do seu registro.",
"birthday_optional": "Data de nascimento (opcional):",
"bio_optional": "Bio (opcional)",
"email_optional": "Email (opcional)",
"email_language": "Em qual linguagem você deseja receber emails do servidor?"
"password_confirmation_match": "deve corresponder à palavra-passe"
}
},
"settings": {
"app_name": "Nome da aplicação",
@ -582,56 +523,7 @@
"autohide_floating_post_button": "Automaticamente ocultar o botão 'Nova Publicação' (telemóvel)",
"notification_visibility_moves": "Utilizador Migrado",
"accent": "Destaque",
"pad_emoji": "Preencher espaços ao adicionar emojis do seletor",
"confirm_dialogs_logout": "saindo",
"move_account_error": "Erro ao mover conta: {error}",
"confirm_dialogs_delete": "excluindo um status",
"save": "Salvar mudanças",
"lists_navigation": "Mostrar listas na navegação",
"email_language": "Linguagem para receber emails do servidor",
"account_backup_description": "Isso permite a você baixar um arquivo das informações da sua conta e os seus posts, mas eles ainda não podem ser importados para uma conta do Pleroma.",
"add_backup_error": "Erro ao adicionar um novo backup: {error}",
"confirm_dialogs": "Pedir por confirmação quando",
"confirm_dialogs_repeat": "repetindo um status",
"account_alias": "Apelidos de conta",
"account_alias_table_head": "Apelido",
"list_aliases_error": "Erro ao buscar por apelidos: {error}",
"hide_list_aliases_error_action": "Fechar",
"confirm_dialogs_deny_follow": "negando um seguidor",
"confirm_dialogs_approve_follow": "aprovando um seguidor",
"backup_running": "Esse backup está em andamento, {number} registro processado. | Esse backup está em progresso, {number} registros processados.",
"add_backup": "Criar um novo backup",
"added_backup": "Adicionado um novo backup.",
"backup_failed": "Esse backup falhou.",
"list_backups_error": "Erro ao buscar a lista de backup: {error}",
"move_account_notes": "Se você deseja mover a conta para outro lugar, você deve ir para sua conta de destino e adicionar um apelido apontando para cá.",
"add_alias_error": "Erro ao adicionar apelido: {error}",
"move_account": "Mover conta",
"actor_type": "Essa conta é:",
"actor_type_description": "Marcando a sua conta como um grupo irá fazer com que ela automaticamente repita os status que a mencionam.",
"actor_type_Person": "um usuário normal",
"actor_type_Service": "um bot",
"actor_type_Group": "um grupo",
"account_backup": "Backup da conta",
"confirm_dialogs_unfollow": "deixando de seguir usuário",
"confirm_dialogs_block": "bloqueando um usuário",
"confirm_dialogs_remove_follower": "removendo um seguidor",
"remove_alias": "Remover esse apelido",
"new_alias_target": "Adicionar um novo apelido (e.g. {example})",
"added_alias": "Apelido adicionado.",
"move_account_target": "Conta de destino (e.g. {example})",
"moved_account": "Conta movida.",
"remove_language": "Remover",
"primary_language": "Linguagem primária:",
"fallback_language": "Linguagem de reserva {index}:",
"add_language": "Adicionar linguagem de reserva",
"expert_mode": "Mostrar avançados",
"setting_changed": "As configurações são diferentes do padrão",
"setting_server_side": "Essas configurações estão atreladas ao seu perfil e afetarão todas as sessões e clientes",
"mention_links": "Links de menção",
"confirm_dialogs_mute": "mutando um usuário",
"backup_not_ready": "Esse backup não está pronto ainda.",
"remove_backup": "Remover"
"pad_emoji": "Preencher espaços ao adicionar emojis do seletor"
},
"timeline": {
"collapse": "Esconder",
@ -807,20 +699,7 @@
"load_all": "A carregar todos os {emojiAmount} emojis",
"load_all_hint": "Carregado o primeiro emoji {saneAmount}, carregar todos os emojis pode causar problemas de desempenho.",
"keep_open": "Manter o seletor aberto",
"stickers": "Autocolantes",
"hide_custom_emoji": "Ocultar emojis customizados",
"unicode_groups": {
"symbols": "Símbolos",
"activities": "Atividades",
"animals-and-nature": "Animais & Natureza",
"people-and-body": "Pessoas & Corpo",
"smileys-and-emotion": "Sorriso & Emoção",
"travel-and-places": "Viagem & Lugares",
"food-and-drink": "Comida & Bebidas",
"objects": "Objetos"
},
"regional_indicator": "Indicador regional {letter}",
"unpacked": "Emoji desempacotado"
"stickers": "Autocolantes"
},
"polls": {
"single_choice": "Escolha única",
@ -834,9 +713,7 @@
"expiry": "Tempo para finalizar sondagem",
"multiple_choices": "Escolha múltipla",
"type": "Tipo de sondagem",
"add_poll": "Adicionar Sondagem",
"votes_count": "{count} voto | {count} votos",
"people_voted_count": "{count} pessoa votou | {count} pessoas votaram"
"add_poll": "Adicionar Sondagem"
},
"importer": {
"error": "Ocorreu um erro ao importar este ficheiro.",
@ -860,9 +737,7 @@
"load_older": "Carregar interações mais antigas",
"follows": "Novos seguidores",
"favs_repeats": "Gostos e Partilhas",
"moves": "O utilizador migra",
"emoji_reactions": "Reações de Emoji",
"reports": "Relatórios"
"moves": "O utilizador migra"
},
"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."
@ -953,35 +828,5 @@
"day_short": "{0}d",
"days": "{0} dias",
"day": "{0} dia"
},
"report": {
"state_closed": "Fechar",
"reported_statuses": "Estado das denúncias:",
"reported_user": "Usuário denunciado:",
"state_resolved": "Resolvido",
"state": "Estado:",
"state_open": "Abrir",
"notes": "Notas:"
},
"announcements": {
"start_time_display": "Inicia às {time}",
"post_form_header": "Enviar anúncio",
"post_placeholder": "Digite o conteúdo do seu anúncio aqui...",
"page_header": "Anúncios",
"title": "Anúncio",
"mark_as_read_action": "Marcar como lido",
"post_action": "Postar",
"post_error": "Erro: {error}",
"close_error": "Fechar",
"delete_action": "Apagar",
"start_time_prompt": "Tempo de início: ",
"end_time_prompt": "Tempo de término: ",
"all_day_prompt": "Esse é um evento para o dia todo",
"published_time_display": "Publicado às {time}",
"end_time_display": "Finaliza às {time}",
"edit_action": "Editar",
"submit_edit_action": "Enviar",
"cancel_edit_action": "Cancelar",
"inactive_message": "Esse anúncio está inativo"
}
}

View File

@ -202,13 +202,12 @@ const api = {
timeline = 'friends',
tag = false,
userId = false,
listId = false,
statusId = false
listId = false
}) {
if (store.state.fetchers[timeline]) return
const fetcher = store.state.backendInteractor.startFetchingTimeline({
timeline, store, userId, listId, statusId, tag
timeline, store, userId, listId, tag
})
store.commit('addFetcher', { fetcherName: timeline, fetcher })
},

View File

@ -28,7 +28,6 @@ export const defaultState = {
theme: undefined,
customTheme: undefined,
customThemeSource: undefined,
forceThemeRecompilation: false,
hideISP: false,
hideInstanceWallpaper: false,
hideShoutbox: false,
@ -37,13 +36,11 @@ export const defaultState = {
hideMutedThreads: undefined, // instance default
hideWordFilteredPosts: undefined, // instance default
muteBotStatuses: undefined, // instance default
muteSensitiveStatuses: undefined, // instance default
collapseMessageWithSubject: undefined, // instance default
padEmoji: true,
hideAttachments: false,
hideAttachmentsInConv: false,
hideScrobbles: false,
hideScrobblesAfter: '2d',
maxThumbnails: 16,
hideNsfw: true,
preloadImage: true,

View File

@ -71,7 +71,6 @@ const defaultState = {
hideSitename: false,
hideUserStats: false,
muteBotStatuses: false,
muteSensitiveStatuses: false,
modalOnRepeat: false,
modalOnUnfollow: false,
modalOnBlock: true,
@ -378,8 +377,7 @@ const instance = {
commit('setInstanceOption', { name: 'themeData', value: themeData })
// No need to apply theme if there's user theme already
const { customTheme } = rootState.config
const { themeApplied } = rootState.interface
if (customTheme || themeApplied) return
if (customTheme) return
// New theme presets don't have 'theme' property, they use 'source'
const themeSource = themeData.source
@ -388,7 +386,6 @@ const instance = {
} else {
applyTheme(themeData.theme)
}
commit('setThemeApplied')
})
},
fetchEmoji ({ dispatch, state }) {

View File

@ -1,5 +1,4 @@
const defaultState = {
themeApplied: false,
settingsModalState: 'hidden',
settingsModalLoadedUser: false,
settingsModalLoadedAdmin: false,
@ -36,9 +35,6 @@ const interfaceMod = {
state.settings.currentSaveStateNotice = { error: true, errorData: error }
}
},
setThemeApplied (state) {
state.themeApplied = true
},
setNotificationPermission (state, permission) {
state.notificationPermission = permission
},

View File

@ -108,7 +108,6 @@ const PLEROMA_POST_ANNOUNCEMENT_URL = '/api/v1/pleroma/admin/announcements'
const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
const PLEROMA_SCROBBLES_URL = id => `/api/v1/pleroma/accounts/${id}/scrobbles`
const PLEROMA_STATUS_QUOTES_URL = id => `/api/v1/pleroma/statuses/${id}/quotes`
const PLEROMA_USER_FAVORITES_TIMELINE_URL = id => `/api/v1/pleroma/accounts/${id}/favourites`
const PLEROMA_ADMIN_CONFIG_URL = '/api/pleroma/admin/config'
@ -686,7 +685,6 @@ const fetchTimeline = ({
until = false,
userId = false,
listId = false,
statusId = false,
tag = false,
withMuted = false,
replyVisibility = 'all',
@ -704,8 +702,7 @@ const fetchTimeline = ({
favorites: MASTODON_USER_FAVORITES_TIMELINE_URL,
publicFavorites: PLEROMA_USER_FAVORITES_TIMELINE_URL,
tag: MASTODON_TAG_TIMELINE_URL,
bookmarks: MASTODON_BOOKMARK_TIMELINE_URL,
quotes: PLEROMA_STATUS_QUOTES_URL
bookmarks: MASTODON_BOOKMARK_TIMELINE_URL
}
const isNotifications = timeline === 'notifications'
const params = []
@ -724,10 +721,6 @@ const fetchTimeline = ({
url = url(listId)
}
if (timeline === 'quotes') {
url = url(statusId)
}
if (minId) {
params.push(['min_id', minId])
}

View File

@ -5,8 +5,8 @@ import followRequestFetcher from '../../services/follow_request_fetcher/follow_r
import listsFetcher from '../../services/lists_fetcher/lists_fetcher.service.js'
const backendInteractorService = credentials => ({
startFetchingTimeline ({ timeline, store, userId = false, listId = false, statusId = false, tag }) {
return timelineFetcher.startFetching({ timeline, store, credentials, userId, listId, statusId, tag })
startFetchingTimeline ({ timeline, store, userId = false, listId = false, tag }) {
return timelineFetcher.startFetching({ timeline, store, credentials, userId, listId, tag })
},
fetchTimeline (args) {

View File

@ -331,7 +331,6 @@ export const parseStatus = (data) => {
output.quote_id = pleroma.quote_id ? pleroma.quote_id : (output.quote ? output.quote.id : undefined)
output.quote_url = pleroma.quote_url
output.quote_visible = pleroma.quote_visible
output.quotes_count = pleroma.quotes_count
} else {
output.text = data.content
output.summary = data.spoiler_text

View File

@ -8,11 +8,8 @@ const mastoApiNotificationTypes = [
'favourite',
'reblog',
'follow',
'follow_request',
'move',
'poll',
'pleroma:emoji_reaction',
'pleroma:chat_mention',
'pleroma:report'
]

View File

@ -1,18 +1,12 @@
import { hex2rgb } from '../color_convert/color_convert.js'
import { generatePreset } from '../theme_data/theme_data.service.js'
import { init, getEngineChecksum } from '../theme_data/theme_data_3.service.js'
import { init } from '../theme_data/theme_data_3.service.js'
import { convertTheme2To3 } from '../theme_data/theme2_to_theme3.js'
import { getCssRules } from '../theme_data/css_utils.js'
import { defaultState } from '../../modules/config.js'
import { chunk } from 'lodash'
export const generateTheme = async (input, callbacks) => {
const {
onNewRule = (rule, isLazy) => {},
onLazyFinished = () => {},
onEagerFinished = () => {}
} = callbacks
export const applyTheme = async (input) => {
let extraRules
if (input.themeFileVersion === 1) {
extraRules = convertTheme2To3(input)
@ -23,6 +17,11 @@ export const generateTheme = async (input, callbacks) => {
// Assuming that "worst case scenario background" is panel background since it's the most likely one
const themes3 = init(extraRules, extraRules[0].directives['--bg'].split('|')[1].trim())
const body = document.body
const styleSheet = new CSSStyleSheet()
document.adoptedStyleSheets = [styleSheet]
body.classList.add('hidden')
getCssRules(themes3.eager, themes3.staticVars).forEach(rule => {
// Hacks to support multiple selectors on same component
@ -38,12 +37,13 @@ export const generateTheme = async (input, callbacks) => {
parts[1],
'}'
].join('')
onNewRule(newRule, false)
styleSheet.insertRule(newRule, 'index-max')
} else {
onNewRule(rule, false)
styleSheet.insertRule(rule, 'index-max')
}
})
onEagerFinished()
body.classList.remove('hidden')
// Optimization - instead of processing all lazy rules in one go, process them in small chunks
// so that UI can do other things and be somewhat responsive while less important rules are being
@ -61,15 +61,13 @@ export const generateTheme = async (input, callbacks) => {
parts[0],
', ',
parts[0].replace(/\.modal-view/, '#modal'),
', ',
parts[0].replace(/\.modal-view/, '.shout-panel'),
' {',
parts[1],
'}'
].join('')
onNewRule(newRule, true)
styleSheet.insertRule(newRule, 'index-max')
} else {
onNewRule(rule, true)
styleSheet.insertRule(rule, 'index-max')
}
})
// const t1 = performance.now()
@ -78,72 +76,10 @@ export const generateTheme = async (input, callbacks) => {
counter += 1
if (counter < chunks.length) {
setTimeout(processChunk, 0)
} else {
onLazyFinished()
}
})
}
return { lazyProcessFunc: processChunk }
}
export const tryLoadCache = () => {
const json = localStorage.getItem('pleroma-fe-theme-cache')
if (!json) return null
let cache
try {
cache = JSON.parse(json)
} catch (e) {
console.error('Failed to decode theme cache:', e)
return false
}
if (cache.engineChecksum === getEngineChecksum()) {
const styleSheet = new CSSStyleSheet()
const lazyStyleSheet = new CSSStyleSheet()
cache.data[0].forEach(rule => styleSheet.insertRule(rule, 'index-max'))
cache.data[1].forEach(rule => lazyStyleSheet.insertRule(rule, 'index-max'))
document.adoptedStyleSheets = [styleSheet, lazyStyleSheet]
return true
} else {
console.warn('Engine checksum doesn\'t match, cache not usable, clearing')
localStorage.removeItem('pleroma-fe-theme-cache')
}
}
export const applyTheme = async (input, onFinish = (data) => {}) => {
const styleSheet = new CSSStyleSheet()
const styleArray = []
const lazyStyleSheet = new CSSStyleSheet()
const lazyStyleArray = []
const { lazyProcessFunc } = await generateTheme(
input,
{
onNewRule (rule, isLazy) {
if (isLazy) {
lazyStyleSheet.insertRule(rule, 'index-max')
lazyStyleArray.push(rule)
} else {
styleSheet.insertRule(rule, 'index-max')
styleArray.push(rule)
}
},
onEagerFinished () {
document.adoptedStyleSheets = [styleSheet]
},
onLazyFinished () {
document.adoptedStyleSheets = [styleSheet, lazyStyleSheet]
const cache = { engineChecksum: getEngineChecksum(), data: [styleArray, lazyStyleArray] }
onFinish(cache)
localStorage.setItem('pleroma-fe-theme-cache', JSON.stringify(cache))
}
}
)
setTimeout(lazyProcessFunc, 0)
setTimeout(processChunk, 0)
return Promise.resolve()
}

View File

@ -158,12 +158,12 @@ export default [
'alertPopupNeutral',
'alertPopupNeutralText',
'badgeNeutral',
'badgeNeutralText',
'badgeNotification',
'badgeNotificationText',
'badgeNeutral',
'badgeNeutralText',
'chatBg',
'chatMessageIncomingBg',

View File

@ -517,8 +517,6 @@ export const convertTheme2To3 = (data) => {
} else if (newRule.component === 'Badge') {
if (newRule.variant === 'notification') {
return [newRule, { component: 'Root', directives: { '--badgeNotification': 'color | ' + newRule.directives.background } }]
} else if (newRule.variant === 'neutral') {
return [{ ...newRule, variant: 'normal' }]
} else {
return [newRule]
}

View File

@ -1,5 +1,4 @@
import { convert, brightness } from 'chromatism'
import sum from 'hash-sum'
import { flattenDeep } from 'lodash'
import {
alphaBlend,
@ -143,12 +142,8 @@ componentsContext.keys().forEach(key => {
components[component.name] = component
})
const engineChecksum = sum(components)
const ruleToSelector = genericRuleToSelector(components)
export const getEngineChecksum = () => engineChecksum
export const init = (extraRuleset, ultimateBackgroundColor) => {
const staticVars = {}
const stacked = {}
@ -468,7 +463,6 @@ export const init = (extraRuleset, ultimateBackgroundColor) => {
return {
lazy: result.filter(x => typeof x === 'function'),
eager: result.filter(x => typeof x !== 'function'),
staticVars,
engineChecksum
staticVars
}
}

View File

@ -24,7 +24,6 @@ const fetchAndUpdate = ({
showImmediately = false,
userId = false,
listId = false,
statusId = false,
tag = false,
until,
since
@ -48,7 +47,6 @@ const fetchAndUpdate = ({
args.userId = userId
args.listId = listId
args.statusId = statusId
args.tag = tag
args.withMuted = !hideMutedPosts
if (loggedIn && ['friends', 'public', 'publicAndExternal'].includes(timeline)) {
@ -80,15 +78,15 @@ const fetchAndUpdate = ({
})
}
const startFetching = ({ timeline = 'friends', credentials, store, userId = false, listId = false, statusId = false, tag = false }) => {
const startFetching = ({ timeline = 'friends', credentials, store, userId = false, listId = false, tag = false }) => {
const rootState = store.rootState || store.state
const timelineData = rootState.statuses.timelines[camelCase(timeline)]
const showImmediately = timelineData.visibleStatuses.length === 0
timelineData.userId = userId
timelineData.listId = listId
fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, listId, statusId, tag })
fetchAndUpdate({ timeline, credentials, store, showImmediately, userId, listId, tag })
const boundFetchAndUpdate = () =>
fetchAndUpdate({ timeline, credentials, store, userId, listId, statusId, tag })
fetchAndUpdate({ timeline, credentials, store, userId, listId, tag })
return promiseInterval(boundFetchAndUpdate, 10000)
}
const timelineFetcher = {

View File

@ -1702,36 +1702,36 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@fortawesome/fontawesome-common-types@6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz#88da2b70d6ca18aaa6ed3687832e11f39e80624b"
integrity sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==
"@fortawesome/fontawesome-common-types@6.5.2":
version "6.5.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz#eaf2f5699f73cef198454ebc0c414e3688898179"
integrity sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==
"@fortawesome/fontawesome-svg-core@6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz#3727552eff9179506e9203d72feb5b1063c11a21"
integrity sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==
"@fortawesome/fontawesome-svg-core@6.5.2":
version "6.5.2"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz#4b42de71e196039b0d5ccf88559b8044e3296c21"
integrity sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==
dependencies:
"@fortawesome/fontawesome-common-types" "6.4.0"
"@fortawesome/fontawesome-common-types" "6.5.2"
"@fortawesome/free-regular-svg-icons@6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.0.tgz#cacc53bd8d832d46feead412d9ea9ce80a55e13a"
integrity sha512-ZfycI7D0KWPZtf7wtMFnQxs8qjBXArRzczABuMQqecA/nXohquJ5J/RCR77PmY5qGWkxAZDxpnUFVXKwtY/jPw==
"@fortawesome/free-regular-svg-icons@6.5.2":
version "6.5.2"
resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.2.tgz#e8e04b4368d49920abdf1bacc63c67c870635222"
integrity sha512-iabw/f5f8Uy2nTRtJ13XZTS1O5+t+anvlamJ3zJGLEVE2pKsAWhPv2lq01uQlfgCX7VaveT3EVs515cCN9jRbw==
dependencies:
"@fortawesome/fontawesome-common-types" "6.4.0"
"@fortawesome/fontawesome-common-types" "6.5.2"
"@fortawesome/free-solid-svg-icons@6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz#48c0e790847fa56299e2f26b82b39663b8ad7119"
integrity sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==
"@fortawesome/free-solid-svg-icons@6.5.2":
version "6.5.2"
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz#9b40b077b27400a5e9fcbf2d15b986c7be69e9ca"
integrity sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==
dependencies:
"@fortawesome/fontawesome-common-types" "6.4.0"
"@fortawesome/fontawesome-common-types" "6.5.2"
"@fortawesome/vue-fontawesome@3.0.3":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz#633e2998d11f7d4ed41f0d5ea461a22ec9b9d034"
integrity sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==
"@fortawesome/vue-fontawesome@3.0.6":
version "3.0.6"
resolved "https://registry.yarnpkg.com/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.6.tgz#c5e627475c10869a091280610c96411d18206f3a"
integrity sha512-akrL7lTroyNpPkoHtvK2UpsMzJr6jXdHaQ0YdcwqDsB8jdwlpNHZYijpOUd9KJsARr+VB3WXY4EyObepqJ4ytQ==
"@humanwhocodes/config-array@^0.11.8":
version "0.11.8"