Merge remote-tracking branch 'origin/develop' into better-selects

* origin/develop: (76 commits)
  Translated using Weblate (Italian)
  Translated using Weblate (Basque)
  Translated using Weblate (Spanish)
  Translated using Weblate (Chinese (Simplified))
  Translated using Weblate (Italian)
  Translated using Weblate (Chinese (Traditional))
  Translated using Weblate (Russian)
  Translated using Weblate (Italian)
  Translated using Weblate (French)
  Translated using Weblate (Russian)
  Translated using Weblate (Italian)
  Translated using Weblate (French)
  Translated using Weblate (Basque)
  Translated using Weblate (Spanish)
  Translated using Weblate (Chinese (Simplified))
  Translated using Weblate (Japanese)
  Translated using Weblate (Italian)
  Translated using Weblate (Esperanto)
  Translated using Weblate (Chinese (Traditional))
  Translated using Weblate (Norwegian Bokmål)
  ...
This commit is contained in:
Henry Jameson 2021-04-07 20:45:57 +03:00
commit 4e56e64034
54 changed files with 1556 additions and 745 deletions

View file

@ -7,6 +7,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Added ### Added
- Added a quick settings to timeline header for easier access - Added a quick settings to timeline header for easier access
- Added option to mark posts as sensitive by default - Added option to mark posts as sensitive by default
- Added quick filters for notifications
## [2.3.0] - 2021-03-01 ## [2.3.0] - 2021-03-01
### Fixed ### Fixed
@ -20,6 +22,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed ### Changed
- Display 'people voted' instead of 'votes' for multi-choice polls - Display 'people voted' instead of 'votes' for multi-choice polls
- Changed the "Timelines" link in side panel to toggle show all timeline options inside the panel
- Renamed "Timeline" to "Home Timeline" to be more clear
- Optimized chat to not get horrible performance after keeping the same chat open for a long time - Optimized chat to not get horrible performance after keeping the same chat open for a long time
- When opening emoji picker or react picker, it automatically focuses the search field - When opening emoji picker or react picker, it automatically focuses the search field
- Language picker now uses native language names - Language picker now uses native language names
@ -28,6 +32,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Added reason field for registration when approval is required - Added reason field for registration when approval is required
- Group staff members by role in the About page - Group staff members by role in the About page
## [2.2.3] - 2021-01-18 ## [2.2.3] - 2021-01-18
### Added ### Added
- Added Report button to status ellipsis menu for easier reporting - Added Report button to status ellipsis menu for easier reporting
@ -35,6 +40,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Fixed ### Fixed
- Follows/Followers tabs on user profiles now display the content properly. - Follows/Followers tabs on user profiles now display the content properly.
- Handle punycode in screen names - Handle punycode in screen names
- Fixed local dev mode having non-functional websockets in some cases
- Show notices for websocket events (errors, abnormal closures, reconnections)
- Fix not being able to re-enable websocket until page refresh
- Fix annoying issue where timeline might have few posts when streaming is enabled
### Changed ### Changed
- Don't filter own posts when they hit your wordfilter - Don't filter own posts when they hit your wordfilter

View file

@ -3,6 +3,11 @@ const path = require('path')
let settings = {} let settings = {}
try { try {
settings = require('./local.json') settings = require('./local.json')
if (settings.target && settings.target.endsWith('/')) {
// replacing trailing slash since it can conflict with some apis
// and that's how actual BE reports its url
settings.target = settings.target.replace(/\/$/, '')
}
console.log('Using local dev server settings (/config/local.json):') console.log('Using local dev server settings (/config/local.json):')
console.log(JSON.stringify(settings, null, 2)) console.log(JSON.stringify(settings, null, 2))
} catch (e) { } catch (e) {

View file

@ -511,9 +511,21 @@ main-router {
border-radius: var(--panelRadius, $fallback--panelRadius); border-radius: var(--panelRadius, $fallback--panelRadius);
} }
.panel-footer { /* TODO Should remove timeline-footer from here when we refactor panels into
* separate component and utilize slots
*/
.panel-footer, .timeline-footer {
display: flex;
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius; border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius); border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
flex: none;
padding: 0.6em 0.6em;
text-align: left;
line-height: 28px;
align-items: baseline;
border-width: 1px 0 0 0;
border-style: solid;
border-color: var(--border, $fallback--border);
.faint { .faint {
color: $fallback--faint; color: $fallback--faint;
@ -670,6 +682,15 @@ nav {
color: var(--alertWarningPanelText, $fallback--text); color: var(--alertWarningPanelText, $fallback--text);
} }
} }
&.success {
background-color: var(--alertSuccess, $fallback--alertWarning);
color: var(--alertSuccessText, $fallback--text);
.panel-heading & {
color: var(--alertSuccessPanelText, $fallback--text);
}
}
} }
.faint { .faint {
@ -819,16 +840,10 @@ nav {
} }
.new-status-notification { .new-status-notification {
position:relative; position: relative;
margin-top: -1px;
font-size: 1.1em; font-size: 1.1em;
border-width: 1px 0 0 0;
border-style: solid;
border-color: var(--border, $fallback--border);
padding: 10px;
z-index: 1; z-index: 1;
background-color: $fallback--fg; flex: 1;
background-color: var(--panel, $fallback--fg);
} }
.chat-layout { .chat-layout {

View file

@ -1,102 +0,0 @@
<template>
<div class="import-export-container">
<slot name="before" />
<button
class="btn button-default"
@click="exportData"
>
{{ exportLabel }}
</button>
<button
class="btn button-default"
@click="importData"
>
{{ importLabel }}
</button>
<slot name="afterButtons" />
<p
v-if="importFailed"
class="alert error"
>
{{ importFailedText }}
</p>
<slot name="afterError" />
</div>
</template>
<script>
export default {
props: [
'exportObject',
'importLabel',
'exportLabel',
'importFailedText',
'validator',
'onImport',
'onImportFailure'
],
data () {
return {
importFailed: false
}
},
methods: {
exportData () {
const stringified = JSON.stringify(this.exportObject, null, 2) // Pretty-print and indent with 2 spaces
// Create an invisible link with a data url and simulate a click
const e = document.createElement('a')
e.setAttribute('download', 'pleroma_theme.json')
e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified))
e.style.display = 'none'
document.body.appendChild(e)
e.click()
document.body.removeChild(e)
},
importData () {
this.importFailed = false
const filePicker = document.createElement('input')
filePicker.setAttribute('type', 'file')
filePicker.setAttribute('accept', '.json')
filePicker.addEventListener('change', event => {
if (event.target.files[0]) {
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({ target }) => {
try {
const parsed = JSON.parse(target.result)
const valid = this.validator(parsed)
if (valid) {
this.onImport(parsed)
} else {
this.importFailed = true
// this.onImportFailure(valid)
}
} catch (e) {
// This will happen both if there is a JSON syntax error or the theme is missing components
this.importFailed = true
// this.onImportFailure(e)
}
}
reader.readAsText(event.target.files[0])
}
})
document.body.appendChild(filePicker)
filePicker.click()
document.body.removeChild(filePicker)
}
}
}
</script>
<style lang="scss">
.import-export-container {
display: flex;
flex-wrap: wrap;
align-items: baseline;
justify-content: center;
}
</style>

View file

@ -71,6 +71,14 @@
} }
} }
.global-success {
background-color: var(--alertPopupSuccess, $fallback--cGreen);
color: var(--alertPopupSuccessText, $fallback--text);
.svg-inline--fa {
color: var(--alertPopupSuccessText, $fallback--text);
}
}
.global-info { .global-info {
background-color: var(--alertPopupNeutral, $fallback--fg); background-color: var(--alertPopupNeutral, $fallback--fg);
color: var(--alertPopupNeutralText, $fallback--text); color: var(--alertPopupNeutralText, $fallback--text);

View file

@ -1,6 +1,11 @@
import { library } from '@fortawesome/fontawesome-svg-core'
import { faChevronDown } from '@fortawesome/free-solid-svg-icons'
import DialogModal from '../dialog_modal/dialog_modal.vue' import DialogModal from '../dialog_modal/dialog_modal.vue'
import Popover from '../popover/popover.vue' import Popover from '../popover/popover.vue'
library.add(faChevronDown)
const FORCE_NSFW = 'mrf_tag:media-force-nsfw' const FORCE_NSFW = 'mrf_tag:media-force-nsfw'
const STRIP_MEDIA = 'mrf_tag:media-strip' const STRIP_MEDIA = 'mrf_tag:media-strip'
const FORCE_UNLISTED = 'mrf_tag:force-unlisted' const FORCE_UNLISTED = 'mrf_tag:force-unlisted'

View file

@ -124,10 +124,11 @@
</div> </div>
<button <button
slot="trigger" slot="trigger"
class="btn button-default btn-block" class="btn button-default btn-block moderation-tools-button"
:class="{ toggled }" :class="{ toggled }"
> >
{{ $t('user_card.admin_menu.moderation') }} {{ $t('user_card.admin_menu.moderation') }}
<FAIcon icon="chevron-down" />
</button> </button>
</Popover> </Popover>
<portal to="modal"> <portal to="modal">
@ -170,4 +171,10 @@
height: 100%; height: 100%;
} }
} }
.moderation-tools-button {
svg,i {
font-size: 0.8em;
}
}
</style> </style>

View file

@ -1,4 +1,4 @@
import { timelineNames } from '../timeline_menu/timeline_menu.js' import TimelineMenuContent from '../timeline_menu/timeline_menu_content.vue'
import { mapState, mapGetters } from 'vuex' import { mapState, mapGetters } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
@ -7,10 +7,12 @@ import {
faGlobe, faGlobe,
faBookmark, faBookmark,
faEnvelope, faEnvelope,
faHome, faChevronDown,
faChevronUp,
faComments, faComments,
faBell, faBell,
faInfoCircle faInfoCircle,
faStream
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
library.add( library.add(
@ -18,10 +20,12 @@ library.add(
faGlobe, faGlobe,
faBookmark, faBookmark,
faEnvelope, faEnvelope,
faHome, faChevronDown,
faChevronUp,
faComments, faComments,
faBell, faBell,
faInfoCircle faInfoCircle,
faStream
) )
const NavPanel = { const NavPanel = {
@ -30,16 +34,20 @@ const NavPanel = {
this.$store.dispatch('startFetchingFollowRequests') this.$store.dispatch('startFetchingFollowRequests')
} }
}, },
components: {
TimelineMenuContent
},
data () {
return {
showTimelines: false
}
},
methods: {
toggleTimelines () {
this.showTimelines = !this.showTimelines
}
},
computed: { computed: {
onTimelineRoute () {
return !!timelineNames()[this.$route.name]
},
timelinesRoute () {
if (this.$store.state.interface.lastTimeline) {
return this.$store.state.interface.lastTimeline
}
return this.currentUser ? 'friends' : 'public-timeline'
},
...mapState({ ...mapState({
currentUser: state => state.users.currentUser, currentUser: state => state.users.currentUser,
followRequestCount: state => state.api.followRequests.length, followRequestCount: state => state.api.followRequests.length,

View file

@ -3,19 +3,33 @@
<div class="panel panel-default"> <div class="panel panel-default">
<ul> <ul>
<li v-if="currentUser || !privateMode"> <li v-if="currentUser || !privateMode">
<router-link <button
:to="{ name: timelinesRoute }" class="button-unstyled menu-item"
:class="onTimelineRoute && 'router-link-active'" @click="toggleTimelines"
> >
<FAIcon <FAIcon
fixed-width fixed-width
class="fa-scale-110" class="fa-scale-110"
icon="home" icon="stream"
/>{{ $t("nav.timelines") }} />{{ $t("nav.timelines") }}
</router-link> <FAIcon
class="timelines-chevron"
fixed-width
:icon="showTimelines ? 'chevron-up' : 'chevron-down'"
/>
</button>
<div
v-show="showTimelines"
class="timelines-background"
>
<TimelineMenuContent class="timelines" />
</div>
</li> </li>
<li v-if="currentUser"> <li v-if="currentUser">
<router-link :to="{ name: 'interactions', params: { username: currentUser.screen_name } }"> <router-link
class="menu-item"
:to="{ name: 'interactions', params: { username: currentUser.screen_name } }"
>
<FAIcon <FAIcon
fixed-width fixed-width
class="fa-scale-110" class="fa-scale-110"
@ -24,7 +38,10 @@
</router-link> </router-link>
</li> </li>
<li v-if="currentUser && pleromaChatMessagesAvailable"> <li v-if="currentUser && pleromaChatMessagesAvailable">
<router-link :to="{ name: 'chats', params: { username: currentUser.screen_name } }"> <router-link
class="menu-item"
:to="{ name: 'chats', params: { username: currentUser.screen_name } }"
>
<div <div
v-if="unreadChatCount" v-if="unreadChatCount"
class="badge badge-notification" class="badge badge-notification"
@ -39,7 +56,10 @@
</router-link> </router-link>
</li> </li>
<li v-if="currentUser && currentUser.locked"> <li v-if="currentUser && currentUser.locked">
<router-link :to="{ name: 'friend-requests' }"> <router-link
class="menu-item"
:to="{ name: 'friend-requests' }"
>
<FAIcon <FAIcon
fixed-width fixed-width
class="fa-scale-110" class="fa-scale-110"
@ -54,7 +74,10 @@
</router-link> </router-link>
</li> </li>
<li> <li>
<router-link :to="{ name: 'about' }"> <router-link
class="menu-item"
:to="{ name: 'about' }"
>
<FAIcon <FAIcon
fixed-width fixed-width
class="fa-scale-110" class="fa-scale-110"
@ -91,14 +114,14 @@
border-color: var(--border, $fallback--border); border-color: var(--border, $fallback--border);
padding: 0; padding: 0;
&:first-child a { &:first-child .menu-item {
border-top-right-radius: $fallback--panelRadius; border-top-right-radius: $fallback--panelRadius;
border-top-right-radius: var(--panelRadius, $fallback--panelRadius); border-top-right-radius: var(--panelRadius, $fallback--panelRadius);
border-top-left-radius: $fallback--panelRadius; border-top-left-radius: $fallback--panelRadius;
border-top-left-radius: var(--panelRadius, $fallback--panelRadius); border-top-left-radius: var(--panelRadius, $fallback--panelRadius);
} }
&:last-child a { &:last-child .menu-item {
border-bottom-right-radius: $fallback--panelRadius; border-bottom-right-radius: $fallback--panelRadius;
border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius); border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius);
border-bottom-left-radius: $fallback--panelRadius; border-bottom-left-radius: $fallback--panelRadius;
@ -110,13 +133,15 @@
border: none; border: none;
} }
a { .menu-item {
display: block; display: block;
box-sizing: border-box; box-sizing: border-box;
align-items: stretch;
height: 3.5em; height: 3.5em;
line-height: 3.5em; line-height: 3.5em;
padding: 0 1em; padding: 0 1em;
width: 100%;
color: $fallback--link;
color: var(--link, $fallback--link);
&:hover { &:hover {
background-color: $fallback--lightBg; background-color: $fallback--lightBg;
@ -146,6 +171,25 @@
} }
} }
.timelines-chevron {
margin-left: 0.8em;
font-size: 1.1em;
}
.timelines-background {
padding: 0 0 0 0.6em;
background-color: $fallback--lightBg;
background-color: var(--selectedMenu, $fallback--lightBg);
border-top: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
}
.timelines {
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
}
.fa-scale-110 { .fa-scale-110 {
margin-right: 0.8em; margin-right: 0.8em;
} }

View file

@ -0,0 +1,122 @@
<template>
<Popover
trigger="click"
class="NotificationFilters"
placement="bottom"
:bound-to="{ x: 'container' }"
>
<template
v-slot:content
>
<div class="dropdown-menu">
<button
class="button-default dropdown-item"
@click="toggleNotificationFilter('likes')"
>
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': filters.likes }"
/>{{ $t('settings.notification_visibility_likes') }}
</button>
<button
class="button-default dropdown-item"
@click="toggleNotificationFilter('repeats')"
>
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': filters.repeats }"
/>{{ $t('settings.notification_visibility_repeats') }}
</button>
<button
class="button-default dropdown-item"
@click="toggleNotificationFilter('follows')"
>
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': filters.follows }"
/>{{ $t('settings.notification_visibility_follows') }}
</button>
<button
class="button-default dropdown-item"
@click="toggleNotificationFilter('mentions')"
>
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': filters.mentions }"
/>{{ $t('settings.notification_visibility_mentions') }}
</button>
<button
class="button-default dropdown-item"
@click="toggleNotificationFilter('emojiReactions')"
>
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': filters.emojiReactions }"
/>{{ $t('settings.notification_visibility_emoji_reactions') }}
</button>
<button
class="button-default dropdown-item"
@click="toggleNotificationFilter('moves')"
>
<span
class="menu-checkbox"
:class="{ 'menu-checkbox-checked': filters.moves }"
/>{{ $t('settings.notification_visibility_moves') }}
</button>
</div>
</template>
<template v-slot:trigger>
<FAIcon icon="filter" />
</template>
</Popover>
</template>
<script>
import Popover from '../popover/popover.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import { faFilter } from '@fortawesome/free-solid-svg-icons'
library.add(
faFilter
)
export default {
components: { Popover },
computed: {
filters () {
return this.$store.getters.mergedConfig.notificationVisibility
}
},
methods: {
toggleNotificationFilter (type) {
this.$store.dispatch('setOption', {
name: 'notificationVisibility',
value: {
...this.filters,
[type]: !this.filters[type]
}
})
}
}
}
</script>
<style lang="scss">
.NotificationFilters {
align-self: stretch;
> button {
font-size: 1.2em;
padding-left: 0.7em;
padding-right: 0.2em;
line-height: 100%;
height: 100%;
}
.dropdown-item {
margin: 0;
}
}
</style>

View file

@ -1,5 +1,6 @@
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import Notification from '../notification/notification.vue' import Notification from '../notification/notification.vue'
import NotificationFilters from './notification_filters.vue'
import notificationsFetcher from '../../services/notifications_fetcher/notifications_fetcher.service.js' import notificationsFetcher from '../../services/notifications_fetcher/notifications_fetcher.service.js'
import { import {
notificationsFromStore, notificationsFromStore,
@ -17,6 +18,10 @@ library.add(
const DEFAULT_SEEN_TO_DISPLAY_COUNT = 30 const DEFAULT_SEEN_TO_DISPLAY_COUNT = 30
const Notifications = { const Notifications = {
components: {
Notification,
NotificationFilters
},
props: { props: {
// Disables display of panel header // Disables display of panel header
noHeading: Boolean, noHeading: Boolean,
@ -35,11 +40,6 @@ const Notifications = {
seenToDisplayCount: DEFAULT_SEEN_TO_DISPLAY_COUNT seenToDisplayCount: DEFAULT_SEEN_TO_DISPLAY_COUNT
} }
}, },
created () {
const store = this.$store
const credentials = store.state.users.currentUser.credentials
notificationsFetcher.fetchAndUpdate({ store, credentials })
},
computed: { computed: {
mainClass () { mainClass () {
return this.minimalMode ? '' : 'panel panel-default' return this.minimalMode ? '' : 'panel panel-default'
@ -70,9 +70,6 @@ const Notifications = {
}, },
...mapGetters(['unreadChatCount']) ...mapGetters(['unreadChatCount'])
}, },
components: {
Notification
},
watch: { watch: {
unseenCountTitle (count) { unseenCountTitle (count) {
if (count > 0) { if (count > 0) {

View file

@ -1,6 +1,6 @@
@import '../../_variables.scss'; @import '../../_variables.scss';
.notifications { .Notifications {
&:not(.minimal) { &:not(.minimal) {
// a bit of a hack to allow scrolling below notifications // a bit of a hack to allow scrolling below notifications
padding-bottom: 15em; padding-bottom: 15em;
@ -11,6 +11,10 @@
color: var(--text, $fallback--text); color: var(--text, $fallback--text);
} }
.notifications-footer {
border: none;
}
.notification { .notification {
position: relative; position: relative;
@ -82,7 +86,6 @@
} }
} }
.follow-text, .move-text { .follow-text, .move-text {
padding: 0.5em 0; padding: 0.5em 0;
overflow-wrap: break-word; overflow-wrap: break-word;

View file

@ -1,7 +1,7 @@
<template> <template>
<div <div
:class="{ minimal: minimalMode }" :class="{ minimal: minimalMode }"
class="notifications" class="Notifications"
> >
<div :class="mainClass"> <div :class="mainClass">
<div <div
@ -22,6 +22,7 @@
> >
{{ $t('notifications.read') }} {{ $t('notifications.read') }}
</button> </button>
<NotificationFilters />
</div> </div>
<div class="panel-body"> <div class="panel-body">
<div <div
@ -34,10 +35,10 @@
<notification :notification="notification" /> <notification :notification="notification" />
</div> </div>
</div> </div>
<div class="panel-footer"> <div class="panel-footer notifications-footer">
<div <div
v-if="bottomedOut" v-if="bottomedOut"
class="new-status-notification text-center panel-footer faint" class="new-status-notification text-center faint"
> >
{{ $t('notifications.no_more_notifications') }} {{ $t('notifications.no_more_notifications') }}
</div> </div>
@ -46,13 +47,13 @@
class="button-unstyled -link -fullwidth" class="button-unstyled -link -fullwidth"
@click.prevent="fetchOlderNotifications()" @click.prevent="fetchOlderNotifications()"
> >
<div class="new-status-notification text-center panel-footer"> <div class="new-status-notification text-center">
{{ minimalMode ? $t('interactions.load_older') : $t('notifications.load_older') }} {{ minimalMode ? $t('interactions.load_older') : $t('notifications.load_older') }}
</div> </div>
</button> </button>
<div <div
v-else v-else
class="new-status-notification text-center panel-footer" class="new-status-notification text-center"
> >
<FAIcon <FAIcon
icon="circle-notch" icon="circle-notch"

View file

@ -53,7 +53,7 @@
type="submit" type="submit"
class="btn button-default btn-block" class="btn button-default btn-block"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
</div> </div>
</div> </div>

View file

@ -56,6 +56,9 @@ const Popover = {
// Popover will be anchored around this element, trigger ref is the container, so // Popover will be anchored around this element, trigger ref is the container, so
// its children are what are inside the slot. Expect only one slot="trigger". // its children are what are inside the slot. Expect only one slot="trigger".
const anchorEl = (this.$refs.trigger && this.$refs.trigger.children[0]) || this.$el const anchorEl = (this.$refs.trigger && this.$refs.trigger.children[0]) || this.$el
// SVGs don't have offsetWidth/Height, use fallback
const anchorWidth = anchorEl.offsetWidth || anchorEl.clientWidth
const anchorHeight = anchorEl.offsetHeight || anchorEl.clientHeight
const screenBox = anchorEl.getBoundingClientRect() const screenBox = anchorEl.getBoundingClientRect()
// Screen position of the origin point for popover // Screen position of the origin point for popover
const origin = { x: screenBox.left + screenBox.width * 0.5, y: screenBox.top } const origin = { x: screenBox.left + screenBox.width * 0.5, y: screenBox.top }
@ -114,11 +117,11 @@ const Popover = {
const yOffset = (this.offset && this.offset.y) || 0 const yOffset = (this.offset && this.offset.y) || 0
const translateY = usingTop const translateY = usingTop
? -anchorEl.offsetHeight + vPadding - yOffset - content.offsetHeight ? -anchorHeight + vPadding - yOffset - content.offsetHeight
: yOffset : yOffset
const xOffset = (this.offset && this.offset.x) || 0 const xOffset = (this.offset && this.offset.x) || 0
const translateX = (anchorEl.offsetWidth * 0.5) - content.offsetWidth * 0.5 + horizOffset + xOffset const translateX = anchorWidth * 0.5 - content.offsetWidth * 0.5 + horizOffset + xOffset
// Note, separate translateX and translateY avoids blurry text on chromium, // Note, separate translateX and translateY avoids blurry text on chromium,
// single translate or translate3d resulted in blurry text. // single translate or translate3d resulted in blurry text.

View file

@ -263,7 +263,7 @@
disabled disabled
class="btn button-default" class="btn button-default"
> >
{{ $t('general.submit') }} {{ $t('post_status.post') }}
</button> </button>
<!-- touchstart is used to keep the OSK at the same position after a message send --> <!-- touchstart is used to keep the OSK at the same position after a message send -->
<button <button
@ -273,7 +273,7 @@
@touchstart.stop.prevent="postStatus($event, newStatus)" @touchstart.stop.prevent="postStatus($event, newStatus)"
@click.stop.prevent="postStatus($event, newStatus)" @click.stop.prevent="postStatus($event, newStatus)"
> >
{{ $t('general.submit') }} {{ $t('post_status.post') }}
</button> </button>
</div> </div>
<div <div

View file

@ -230,7 +230,7 @@
type="submit" type="submit"
class="btn button-default" class="btn button-default"
> >
{{ $t('general.submit') }} {{ $t('registration.register') }}
</button> </button>
</div> </div>
</div> </div>

View file

@ -2,10 +2,55 @@ import Modal from 'src/components/modal/modal.vue'
import PanelLoading from 'src/components/panel_loading/panel_loading.vue' import PanelLoading from 'src/components/panel_loading/panel_loading.vue'
import AsyncComponentError from 'src/components/async_component_error/async_component_error.vue' import AsyncComponentError from 'src/components/async_component_error/async_component_error.vue'
import getResettableAsyncComponent from 'src/services/resettable_async_component.js' import getResettableAsyncComponent from 'src/services/resettable_async_component.js'
import Popover from '../popover/popover.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import { cloneDeep } from 'lodash'
import {
newImporter,
newExporter
} from 'src/services/export_import/export_import.js'
import {
faTimes,
faFileUpload,
faFileDownload,
faChevronDown
} from '@fortawesome/free-solid-svg-icons'
import {
faWindowMinimize
} from '@fortawesome/free-regular-svg-icons'
const PLEROMAFE_SETTINGS_MAJOR_VERSION = 1
const PLEROMAFE_SETTINGS_MINOR_VERSION = 0
library.add(
faTimes,
faWindowMinimize,
faFileUpload,
faFileDownload,
faChevronDown
)
const SettingsModal = { const SettingsModal = {
data () {
return {
dataImporter: newImporter({
validator: this.importValidator,
onImport: this.onImport,
onImportFailure: this.onImportFailure
}),
dataThemeExporter: newExporter({
filename: 'pleromafe_settings.full',
getExportedObject: () => this.generateExport(true)
}),
dataExporter: newExporter({
filename: 'pleromafe_settings',
getExportedObject: () => this.generateExport()
})
}
},
components: { components: {
Modal, Modal,
Popover,
SettingsModalContent: getResettableAsyncComponent( SettingsModalContent: getResettableAsyncComponent(
() => import('./settings_modal_content.vue'), () => import('./settings_modal_content.vue'),
{ {
@ -21,6 +66,85 @@ const SettingsModal = {
}, },
peekModal () { peekModal () {
this.$store.dispatch('togglePeekSettingsModal') this.$store.dispatch('togglePeekSettingsModal')
},
importValidator (data) {
if (!Array.isArray(data._pleroma_settings_version)) {
return {
messageKey: 'settings.file_import_export.invalid_file'
}
}
const [major, minor] = data._pleroma_settings_version
if (major > PLEROMAFE_SETTINGS_MAJOR_VERSION) {
return {
messageKey: 'settings.file_export_import.errors.file_too_new',
messageArgs: {
fileMajor: major,
feMajor: PLEROMAFE_SETTINGS_MAJOR_VERSION
}
}
}
if (major < PLEROMAFE_SETTINGS_MAJOR_VERSION) {
return {
messageKey: 'settings.file_export_import.errors.file_too_old',
messageArgs: {
fileMajor: major,
feMajor: PLEROMAFE_SETTINGS_MAJOR_VERSION
}
}
}
if (minor > PLEROMAFE_SETTINGS_MINOR_VERSION) {
this.$store.dispatch('pushGlobalNotice', {
level: 'warning',
messageKey: 'settings.file_export_import.errors.file_slightly_new'
})
}
return true
},
onImportFailure (result) {
if (result.error) {
this.$store.dispatch('pushGlobalNotice', { messageKey: 'settings.invalid_settings_imported', level: 'error' })
} else {
this.$store.dispatch('pushGlobalNotice', { ...result.validationResult, level: 'error' })
}
},
onImport (data) {
if (data) { this.$store.dispatch('loadSettings', data) }
},
restore () {
this.dataImporter.importData()
},
backup () {
this.dataExporter.exportData()
},
backupWithTheme () {
this.dataThemeExporter.exportData()
},
generateExport (theme = false) {
const { config } = this.$store.state
let sample = config
if (!theme) {
const ignoreList = new Set([
'customTheme',
'customThemeSource',
'colors'
])
sample = Object.fromEntries(
Object
.entries(sample)
.filter(([key]) => !ignoreList.has(key))
)
}
const clone = cloneDeep(sample)
clone._pleroma_settings_version = [
PLEROMAFE_SETTINGS_MAJOR_VERSION,
PLEROMAFE_SETTINGS_MINOR_VERSION
]
return clone
} }
}, },
computed: { computed: {

View file

@ -31,20 +31,86 @@
</transition> </transition>
<button <button
class="btn button-default" class="btn button-default"
:title="$t('general.peek')"
@click="peekModal" @click="peekModal"
> >
{{ $t('general.peek') }} <FAIcon
:icon="['far', 'window-minimize']"
fixed-width
/>
</button> </button>
<button <button
class="btn button-default" class="btn button-default"
:title="$t('general.close')"
@click="closeModal" @click="closeModal"
> >
{{ $t('general.close') }} <FAIcon
icon="times"
fixed-width
/>
</button> </button>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<SettingsModalContent v-if="modalOpenedOnce" /> <SettingsModalContent v-if="modalOpenedOnce" />
</div> </div>
<div class="panel-footer">
<Popover
class="export"
trigger="click"
placement="top"
:offset="{ y: 5, x: 5 }"
:bound-to="{ x: 'container' }"
remove-padding
>
<button
slot="trigger"
class="btn button-default"
:title="$t('general.close')"
>
<span>{{ $t("settings.file_export_import.backup_restore") }}</span>
<FAIcon
icon="chevron-down"
/>
</button>
<div
slot="content"
slot-scope="{close}"
>
<div class="dropdown-menu">
<button
class="button-default dropdown-item dropdown-item-icon"
@click.prevent="backup"
@click="close"
>
<FAIcon
icon="file-download"
fixed-width
/><span>{{ $t("settings.file_export_import.backup_settings") }}</span>
</button>
<button
class="button-default dropdown-item dropdown-item-icon"
@click.prevent="backupWithTheme"
@click="close"
>
<FAIcon
icon="file-download"
fixed-width
/><span>{{ $t("settings.file_export_import.backup_settings_theme") }}</span>
</button>
<button
class="button-default dropdown-item dropdown-item-icon"
@click.prevent="restore"
@click="close"
>
<FAIcon
icon="file-upload"
fixed-width
/><span>{{ $t("settings.file_export_import.restore_settings") }}</span>
</button>
</div>
</div>
</Popover>
</div>
</div> </div>
</Modal> </Modal>
</template> </template>

View file

@ -24,7 +24,7 @@
class="btn button-default" class="btn button-default"
@click="updateNotificationSettings" @click="updateNotificationSettings"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
</div> </div>
</div> </div>

View file

@ -153,7 +153,7 @@
class="btn button-default" class="btn button-default"
@click="updateProfile" @click="updateProfile"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
</div> </div>
<div class="setting-item"> <div class="setting-item">
@ -227,7 +227,7 @@
class="btn button-default" class="btn button-default"
@click="submitBanner(banner)" @click="submitBanner(banner)"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
</div> </div>
<div class="setting-item"> <div class="setting-item">
@ -266,7 +266,7 @@
class="btn button-default" class="btn button-default"
@click="submitBackground(background)" @click="submitBackground(background)"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
</div> </div>
</div> </div>

View file

@ -22,7 +22,7 @@
class="btn button-default" class="btn button-default"
@click="changeEmail" @click="changeEmail"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
<p v-if="changedEmail"> <p v-if="changedEmail">
{{ $t('settings.changed_email') }} {{ $t('settings.changed_email') }}
@ -60,7 +60,7 @@
class="btn button-default" class="btn button-default"
@click="changePassword" @click="changePassword"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
<p v-if="changedPassword"> <p v-if="changedPassword">
{{ $t('settings.changed_password') }} {{ $t('settings.changed_password') }}
@ -133,7 +133,7 @@
class="btn button-default" class="btn button-default"
@click="confirmDelete" @click="confirmDelete"
> >
{{ $t('general.submit') }} {{ $t('settings.save') }}
</button> </button>
</div> </div>
</div> </div>

View file

@ -15,6 +15,10 @@ import {
shadows2to3, shadows2to3,
colors2to3 colors2to3
} from 'src/services/style_setter/style_setter.js' } from 'src/services/style_setter/style_setter.js'
import {
newImporter,
newExporter
} from 'src/services/export_import/export_import.js'
import { import {
SLOT_INHERITANCE SLOT_INHERITANCE
} from 'src/services/theme_data/pleromafe.js' } from 'src/services/theme_data/pleromafe.js'
@ -31,7 +35,6 @@ import ShadowControl from 'src/components/shadow_control/shadow_control.vue'
import FontControl from 'src/components/font_control/font_control.vue' import FontControl from 'src/components/font_control/font_control.vue'
import ContrastRatio from 'src/components/contrast_ratio/contrast_ratio.vue' import ContrastRatio from 'src/components/contrast_ratio/contrast_ratio.vue'
import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js' import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'
import ExportImport from 'src/components/export_import/export_import.vue'
import Checkbox from 'src/components/checkbox/checkbox.vue' import Checkbox from 'src/components/checkbox/checkbox.vue'
import Select from 'src/components/select/select.vue' import Select from 'src/components/select/select.vue'
@ -60,6 +63,15 @@ const colorConvert = (color) => {
export default { export default {
data () { data () {
return { return {
themeImporter: newImporter({
validator: this.importValidator,
onImport: this.onImport,
onImportFailure: this.onImportFailure
}),
themeExporter: newExporter({
filename: 'pleroma_theme',
getExportedObject: () => this.exportedTheme
}),
availableStyles: [], availableStyles: [],
selected: this.$store.getters.mergedConfig.theme, selected: this.$store.getters.mergedConfig.theme,
themeWarning: undefined, themeWarning: undefined,
@ -376,7 +388,6 @@ export default {
FontControl, FontControl,
TabSwitcher, TabSwitcher,
Preview, Preview,
ExportImport,
Checkbox, Checkbox,
Select Select
}, },
@ -522,10 +533,15 @@ export default {
this.previewColors.mod this.previewColors.mod
) )
}, },
importTheme () { this.themeImporter.importData() },
exportTheme () { this.themeExporter.exportData() },
onImport (parsed, forceSource = false) { onImport (parsed, forceSource = false) {
this.tempImportFile = parsed this.tempImportFile = parsed
this.loadTheme(parsed, 'file', forceSource) this.loadTheme(parsed, 'file', forceSource)
}, },
onImportFailure (result) {
this.$store.dispatch('pushGlobalNotice', { messageKey: 'settings.invalid_theme_imported', level: 'error' })
},
importValidator (parsed) { importValidator (parsed) {
const version = parsed._pleroma_theme_version const version = parsed._pleroma_theme_version
return version >= 1 || version <= 2 return version >= 1 || version <= 2

View file

@ -48,17 +48,13 @@
</template> </template>
</div> </div>
</div> </div>
<ExportImport <div class="top">
:export-object="exportedTheme" <div class="presets">
:export-label="$t(&quot;settings.export_theme&quot;)" {{ $t('settings.presets') }}
:import-label="$t(&quot;settings.import_theme&quot;)" <label
:import-failed-text="$t(&quot;settings.invalid_theme_imported&quot;)" for="preset-switcher"
:on-import="onImport" class="select"
:validator="importValidator" >
>
<template slot="before">
<div class="presets">
{{ $t('settings.presets') }}
<Select <Select
id="preset-switcher" id="preset-switcher"
v-model="selected" v-model="selected"
@ -76,9 +72,27 @@
{{ style[0] || style.name }} {{ style[0] || style.name }}
</option> </option>
</Select> </Select>
</div> <FAIcon
</template> class="select-down-icon"
</ExportImport> icon="chevron-down"
/>
</label>
</div>
<div class="export-import">
<button
class="btn button-default"
@click="importTheme"
>
{{ $t(&quot;settings.import_theme&quot;) }}
</button>
<button
class="btn button-default"
@click="exportTheme"
>
{{ $t(&quot;settings.export_theme&quot;) }}
</button>
</div>
</div>
</div> </div>
<div class="save-load-options"> <div class="save-load-options">
<span class="keep-option"> <span class="keep-option">

View file

@ -0,0 +1,31 @@
@import '../../_variables.scss';
.Timeline {
.loadmore-text {
opacity: 1;
}
&.-blocked {
cursor: progress;
}
.timeline-heading {
max-width: 100%;
flex-wrap: nowrap;
align-items: center;
position: relative;
.loadmore-button {
flex-shrink: 0;
}
.loadmore-text {
flex-shrink: 0;
line-height: 1em;
}
}
.timeline-footer {
border: none;
}
}

View file

@ -52,13 +52,13 @@
<div :class="classes.footer"> <div :class="classes.footer">
<div <div
v-if="count===0" v-if="count===0"
class="new-status-notification text-center panel-footer faint" class="new-status-notification text-center faint"
> >
{{ $t('timeline.no_statuses') }} {{ $t('timeline.no_statuses') }}
</div> </div>
<div <div
v-else-if="bottomedOut" v-else-if="bottomedOut"
class="new-status-notification text-center panel-footer faint" class="new-status-notification text-center faint"
> >
{{ $t('timeline.no_more_statuses') }} {{ $t('timeline.no_more_statuses') }}
</div> </div>
@ -67,13 +67,13 @@
class="button-unstyled -link -fullwidth" class="button-unstyled -link -fullwidth"
@click.prevent="fetchOlderStatuses()" @click.prevent="fetchOlderStatuses()"
> >
<div class="new-status-notification text-center panel-footer"> <div class="new-status-notification text-center">
{{ $t('timeline.load_older') }} {{ $t('timeline.load_older') }}
</div> </div>
</button> </button>
<div <div
v-else v-else
class="new-status-notification text-center panel-footer" class="new-status-notification text-center"
> >
<FAIcon <FAIcon
icon="circle-notch" icon="circle-notch"
@ -87,32 +87,4 @@
<script src="./timeline.js"></script> <script src="./timeline.js"></script>
<style lang="scss"> <style src="./timeline.scss" lang="scss"> </style>
@import '../../_variables.scss';
.Timeline {
.loadmore-text {
opacity: 1;
}
&.-blocked {
cursor: progress;
}
}
.timeline-heading {
max-width: 100%;
flex-wrap: nowrap;
align-items: center;
position: relative;
.loadmore-button {
flex-shrink: 0;
}
.loadmore-text {
flex-shrink: 0;
line-height: 1em;
}
}
</style>

View file

@ -1,5 +1,4 @@
import Popover from '../popover/popover.vue' import Popover from '../popover/popover.vue'
import BooleanSetting from '../settings_modal/helpers/boolean_setting.vue'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { faFilter, faFont, faWrench } from '@fortawesome/free-solid-svg-icons' import { faFilter, faFont, faWrench } from '@fortawesome/free-solid-svg-icons'
@ -12,8 +11,7 @@ library.add(
const TimelineQuickSettings = { const TimelineQuickSettings = {
components: { components: {
Popover, Popover
BooleanSetting
}, },
methods: { methods: {
setReplyVisibility (visibility) { setReplyVisibility (visibility) {

View file

@ -6,7 +6,7 @@
> >
<div <div
slot="content" slot="content"
class="timeline-settings-menu dropdown-menu" class="dropdown-menu"
> >
<div v-if="loggedIn"> <div v-if="loggedIn">
<button <button
@ -96,12 +96,6 @@
.dropdown-item { .dropdown-item {
margin: 0; margin: 0;
} }
.timeline-settings-menu {
display: flex;
min-width: 12em;
flex-direction: column;
}
} }
</style> </style>

View file

@ -1,29 +1,17 @@
import Popover from '../popover/popover.vue' import Popover from '../popover/popover.vue'
import { mapState } from 'vuex' import TimelineMenuContent from './timeline_menu_content.vue'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faUsers,
faGlobe,
faBookmark,
faEnvelope,
faHome,
faChevronDown faChevronDown
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
library.add( library.add(faChevronDown)
faUsers,
faGlobe,
faBookmark,
faEnvelope,
faHome,
faChevronDown
)
// Route -> i18n key mapping, exported and not in the computed // Route -> i18n key mapping, exported and not in the computed
// because nav panel benefits from the same information. // because nav panel benefits from the same information.
export const timelineNames = () => { export const timelineNames = () => {
return { return {
'friends': 'nav.timeline', 'friends': 'nav.home_timeline',
'bookmarks': 'nav.bookmarks', 'bookmarks': 'nav.bookmarks',
'dms': 'nav.dms', 'dms': 'nav.dms',
'public-timeline': 'nav.public_tl', 'public-timeline': 'nav.public_tl',
@ -33,7 +21,8 @@ export const timelineNames = () => {
const TimelineMenu = { const TimelineMenu = {
components: { components: {
Popover Popover,
TimelineMenuContent
}, },
data () { data () {
return { return {
@ -41,9 +30,6 @@ const TimelineMenu = {
} }
}, },
created () { created () {
if (this.currentUser && this.currentUser.locked) {
this.$store.dispatch('startFetchingFollowRequests')
}
if (timelineNames()[this.$route.name]) { if (timelineNames()[this.$route.name]) {
this.$store.dispatch('setLastTimeline', this.$route.name) this.$store.dispatch('setLastTimeline', this.$route.name)
} }
@ -75,13 +61,6 @@ const TimelineMenu = {
const i18nkey = timelineNames()[this.$route.name] const i18nkey = timelineNames()[this.$route.name]
return i18nkey ? this.$t(i18nkey) : route return i18nkey ? this.$t(i18nkey) : route
} }
},
computed: {
...mapState({
currentUser: state => state.users.currentUser,
privateMode: state => state.instance.private,
federating: state => state.instance.federating
})
} }
} }

View file

@ -13,53 +13,7 @@
slot="content" slot="content"
class="timeline-menu-popover panel panel-default" class="timeline-menu-popover panel panel-default"
> >
<ul> <TimelineMenuContent />
<li v-if="currentUser">
<router-link :to="{ name: 'friends' }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="home"
/>{{ $t("nav.timeline") }}
</router-link>
</li>
<li v-if="currentUser">
<router-link :to="{ name: 'bookmarks'}">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="bookmark"
/>{{ $t("nav.bookmarks") }}
</router-link>
</li>
<li v-if="currentUser">
<router-link :to="{ name: 'dms', params: { username: currentUser.screen_name } }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="envelope"
/>{{ $t("nav.dms") }}
</router-link>
</li>
<li v-if="currentUser || !privateMode">
<router-link :to="{ name: 'public-timeline' }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="users"
/>{{ $t("nav.public_tl") }}
</router-link>
</li>
<li v-if="federating && (currentUser || !privateMode)">
<router-link :to="{ name: 'public-external-timeline' }">
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="globe"
/>{{ $t("nav.twkn") }}
</router-link>
</li>
</ul>
</div> </div>
<div <div
slot="trigger" slot="trigger"

View file

@ -0,0 +1,29 @@
import { mapState } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faUsers,
faGlobe,
faBookmark,
faEnvelope,
faHome
} from '@fortawesome/free-solid-svg-icons'
library.add(
faUsers,
faGlobe,
faBookmark,
faEnvelope,
faHome
)
const TimelineMenuContent = {
computed: {
...mapState({
currentUser: state => state.users.currentUser,
privateMode: state => state.instance.private,
federating: state => state.instance.federating
})
}
}
export default TimelineMenuContent

View file

@ -0,0 +1,66 @@
<template>
<ul>
<li v-if="currentUser">
<router-link
class="menu-item"
:to="{ name: 'friends' }"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="home"
/>{{ $t("nav.home_timeline") }}
</router-link>
</li>
<li v-if="currentUser || !privateMode">
<router-link
class="menu-item"
:to="{ name: 'public-timeline' }"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="users"
/>{{ $t("nav.public_tl") }}
</router-link>
</li>
<li v-if="federating && (currentUser || !privateMode)">
<router-link
class="menu-item"
:to="{ name: 'public-external-timeline' }"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="globe"
/>{{ $t("nav.twkn") }}
</router-link>
</li>
<li v-if="currentUser">
<router-link
class="menu-item"
:to="{ name: 'bookmarks'}"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="bookmark"
/>{{ $t("nav.bookmarks") }}
</router-link>
</li>
<li v-if="currentUser">
<router-link
class="menu-item"
:to="{ name: 'dms', params: { username: currentUser.screen_name } }"
>
<FAIcon
fixed-width
class="fa-scale-110 fa-old-padding "
icon="envelope"
/>{{ $t("nav.dms") }}
</router-link>
</li>
</ul>
</template>
<script src="./timeline_menu_content.js" ></script>

View file

@ -3,27 +3,27 @@
"mrf": { "mrf": {
"federation": "Federation", "federation": "Federation",
"keyword": { "keyword": {
"keyword_policies": "Keyword Policies", "keyword_policies": "Keyword policies",
"ftl_removal": "Removal from \"The Whole Known Network\" Timeline", "ftl_removal": "Removal from \"The Whole Known Network\" Timeline",
"reject": "Reject", "reject": "Reject",
"replace": "Replace", "replace": "Replace",
"is_replaced_by": "→" "is_replaced_by": "→"
}, },
"mrf_policies": "Enabled MRF Policies", "mrf_policies": "Enabled MRF policies",
"mrf_policies_desc": "MRF policies manipulate the federation behaviour of the instance. The following policies are enabled:", "mrf_policies_desc": "MRF policies manipulate the federation behaviour of the instance. The following policies are enabled:",
"simple": { "simple": {
"simple_policies": "Instance-specific Policies", "simple_policies": "Instance-specific policies",
"accept": "Accept", "accept": "Accept",
"accept_desc": "This instance only accepts messages from the following instances:", "accept_desc": "This instance only accepts messages from the following instances:",
"reject": "Reject", "reject": "Reject",
"reject_desc": "This instance will not accept messages from the following instances:", "reject_desc": "This instance will not accept messages from the following instances:",
"quarantine": "Quarantine", "quarantine": "Quarantine",
"quarantine_desc": "This instance will send only public posts to the following instances:", "quarantine_desc": "This instance will send only public posts to the following instances:",
"ftl_removal": "Removal from \"The Whole Known Network\" Timeline", "ftl_removal": "Removal from \"Known Network\" Timeline",
"ftl_removal_desc": "This instance removes these instances from \"The Whole Known Network\" timeline:", "ftl_removal_desc": "This instance removes these instances from \"Known Network\" timeline:",
"media_removal": "Media Removal", "media_removal": "Media Removal",
"media_removal_desc": "This instance removes media from posts on the following instances:", "media_removal_desc": "This instance removes media from posts on the following instances:",
"media_nsfw": "Media Force-set As Sensitive", "media_nsfw": "Media force-set as sensitive",
"media_nsfw_desc": "This instance forces media to be set sensitive in posts on the following instances:" "media_nsfw_desc": "This instance forces media to be set sensitive in posts on the following instances:"
} }
}, },
@ -118,12 +118,13 @@
"about": "About", "about": "About",
"administration": "Administration", "administration": "Administration",
"back": "Back", "back": "Back",
"friend_requests": "Follow Requests", "friend_requests": "Follow requests",
"mentions": "Mentions", "mentions": "Mentions",
"interactions": "Interactions", "interactions": "Interactions",
"dms": "Direct Messages", "dms": "Direct messages",
"public_tl": "Public Timeline", "public_tl": "Public timeline",
"timeline": "Timeline", "timeline": "Timeline",
"home_timeline": "Home timeline",
"twkn": "Known Network", "twkn": "Known Network",
"bookmarks": "Bookmarks", "bookmarks": "Bookmarks",
"user_search": "User Search", "user_search": "User Search",
@ -148,8 +149,8 @@
"reacted_with": "reacted with {0}" "reacted_with": "reacted with {0}"
}, },
"polls": { "polls": {
"add_poll": "Add Poll", "add_poll": "Add poll",
"add_option": "Add Option", "add_option": "Add option",
"option": "Option", "option": "Option",
"votes": "votes", "votes": "votes",
"people_voted_count": "{count} person voted | {count} people voted", "people_voted_count": "{count} person voted | {count} people voted",
@ -178,7 +179,7 @@
"storage_unavailable": "Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies." "storage_unavailable": "Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies."
}, },
"interactions": { "interactions": {
"favs_repeats": "Repeats and Favorites", "favs_repeats": "Repeats and favorites",
"follows": "New follows", "follows": "New follows",
"moves": "User migrates", "moves": "User migrates",
"load_older": "Load older interactions" "load_older": "Load older interactions"
@ -200,6 +201,7 @@
"direct_warning_to_all": "This post will be visible to all the mentioned users.", "direct_warning_to_all": "This post will be visible to all the mentioned users.",
"direct_warning_to_first_only": "This post will only be visible to the mentioned users at the beginning of the message.", "direct_warning_to_first_only": "This post will only be visible to the mentioned users at the beginning of the message.",
"posting": "Posting", "posting": "Posting",
"post": "Post",
"preview": "Preview", "preview": "Preview",
"preview_empty": "Empty", "preview_empty": "Empty",
"empty_status_error": "Can't post an empty status with no files", "empty_status_error": "Can't post an empty status with no files",
@ -210,10 +212,10 @@
"unlisted": "This post will not be visible in Public Timeline and The Whole Known Network" "unlisted": "This post will not be visible in Public Timeline and The Whole Known Network"
}, },
"scope": { "scope": {
"direct": "Direct - Post to mentioned users only", "direct": "Direct - post to mentioned users only",
"private": "Followers-only - Post to followers only", "private": "Followers-only - post to followers only",
"public": "Public - Post to public timelines", "public": "Public - post to public timelines",
"unlisted": "Unlisted - Do not post to public timelines" "unlisted": "Unlisted - do not post to public timelines"
} }
}, },
"registration": { "registration": {
@ -230,6 +232,7 @@
"bio_placeholder": "e.g.\nHi, I'm Lain.\nIm an anime girl living in suburban Japan. You may know me from the Wired.", "bio_placeholder": "e.g.\nHi, I'm Lain.\nIm an anime girl living in suburban Japan. You may know me from the Wired.",
"reason": "Reason to register", "reason": "Reason to register",
"reason_placeholder": "This instance approves registrations manually.\nLet the administration know why you want to register.", "reason_placeholder": "This instance approves registrations manually.\nLet the administration know why you want to register.",
"register": "Register",
"validations": { "validations": {
"username_required": "cannot be left blank", "username_required": "cannot be left blank",
"fullname_required": "cannot be left blank", "fullname_required": "cannot be left blank",
@ -249,6 +252,7 @@
}, },
"settings": { "settings": {
"app_name": "App name", "app_name": "App name",
"save": "Save changes",
"security": "Security", "security": "Security",
"setting_changed": "Setting is different from default", "setting_changed": "Setting is different from default",
"enter_current_password_to_confirm": "Enter your current password to confirm your identity", "enter_current_password_to_confirm": "Enter your current password to confirm your identity",
@ -277,7 +281,7 @@
"attachmentRadius": "Attachments", "attachmentRadius": "Attachments",
"attachments": "Attachments", "attachments": "Attachments",
"avatar": "Avatar", "avatar": "Avatar",
"avatarAltRadius": "Avatars (Notifications)", "avatarAltRadius": "Avatars (notifications)",
"avatarRadius": "Avatars", "avatarRadius": "Avatars",
"background": "Background", "background": "Background",
"bio": "Bio", "bio": "Bio",
@ -299,10 +303,10 @@
"cGreen": "Green (Retweet)", "cGreen": "Green (Retweet)",
"cOrange": "Orange (Favorite)", "cOrange": "Orange (Favorite)",
"cRed": "Red (Cancel)", "cRed": "Red (Cancel)",
"change_email": "Change Email", "change_email": "Change email",
"change_email_error": "There was an issue changing your email.", "change_email_error": "There was an issue changing your email.",
"changed_email": "Email changed successfully!", "changed_email": "Email changed successfully!",
"change_password": "Change Password", "change_password": "Change password",
"change_password_error": "There was an issue changing your password.", "change_password_error": "There was an issue changing your password.",
"changed_password": "Password changed successfully!", "changed_password": "Password changed successfully!",
"chatMessageRadius": "Chat message", "chatMessageRadius": "Chat message",
@ -311,9 +315,9 @@
"confirm_new_password": "Confirm new password", "confirm_new_password": "Confirm new password",
"current_password": "Current password", "current_password": "Current password",
"mutes_and_blocks": "Mutes and Blocks", "mutes_and_blocks": "Mutes and Blocks",
"data_import_export_tab": "Data Import / Export", "data_import_export_tab": "Data import / export",
"default_vis": "Default visibility scope", "default_vis": "Default visibility scope",
"delete_account": "Delete Account", "delete_account": "Delete account",
"delete_account_description": "Permanently delete your data and deactivate your account.", "delete_account_description": "Permanently delete your data and deactivate your account.",
"delete_account_error": "There was an issue deleting your account. If this persists please contact your instance administrator.", "delete_account_error": "There was an issue deleting your account. If this persists please contact your instance administrator.",
"delete_account_instructions": "Type your password in the input below to confirm account deletion.", "delete_account_instructions": "Type your password in the input below to confirm account deletion.",
@ -364,20 +368,32 @@
"loop_video_silent_only": "Loop only videos without sound (i.e. Mastodon's \"gifs\")", "loop_video_silent_only": "Loop only videos without sound (i.e. Mastodon's \"gifs\")",
"mutes_tab": "Mutes", "mutes_tab": "Mutes",
"play_videos_in_modal": "Play videos in a popup frame", "play_videos_in_modal": "Play videos in a popup frame",
"file_export_import": {
"backup_restore": "Settings backup",
"backup_settings": "Backup settings to file",
"backup_settings_theme": "Backup settings and theme to file",
"restore_settings": "Restore settings from file",
"errors": {
"invalid_file": "The selected file is not a supported Pleroma settings backup. No changes were made.",
"file_too_new": "Incompatile major version: {fileMajor}, this PleromaFE (settings ver {feMajor}) is too old to handle it",
"file_too_old": "Incompatile major version: {fileMajor}, file version is too old and not supported (min. set. ver. {feMajor})",
"file_slightly_new": "File minor version is different, some settings might not load"
}
},
"profile_fields": { "profile_fields": {
"label": "Profile metadata", "label": "Profile metadata",
"add_field": "Add Field", "add_field": "Add field",
"name": "Label", "name": "Label",
"value": "Content" "value": "Content"
}, },
"use_contain_fit": "Don't crop the attachment in thumbnails", "use_contain_fit": "Don't crop the attachment in thumbnails",
"name": "Name", "name": "Name",
"name_bio": "Name & Bio", "name_bio": "Name & bio",
"new_email": "New Email", "new_email": "New email",
"new_password": "New password", "new_password": "New password",
"notification_visibility": "Types of notifications to show", "notification_visibility": "Types of notifications to show",
"notification_visibility_follows": "Follows", "notification_visibility_follows": "Follows",
"notification_visibility_likes": "Likes", "notification_visibility_likes": "Favorites",
"notification_visibility_mentions": "Mentions", "notification_visibility_mentions": "Mentions",
"notification_visibility_repeats": "Repeats", "notification_visibility_repeats": "Repeats",
"notification_visibility_moves": "User Migrates", "notification_visibility_moves": "User Migrates",
@ -389,19 +405,19 @@
"hide_followers_description": "Don't show who's following me", "hide_followers_description": "Don't show who's following me",
"hide_follows_count_description": "Don't show follow count", "hide_follows_count_description": "Don't show follow count",
"hide_followers_count_description": "Don't show follower count", "hide_followers_count_description": "Don't show follower count",
"show_admin_badge": "Show Admin badge in my profile", "show_admin_badge": "Show \"Admin\" badge in my profile",
"show_moderator_badge": "Show Moderator badge in my profile", "show_moderator_badge": "Show \"Moderator\" badge in my profile",
"nsfw_clickthrough": "Enable clickthrough attachment and link preview image hiding for NSFW statuses", "nsfw_clickthrough": "Enable clickthrough attachment and link preview image hiding for NSFW statuses",
"oauth_tokens": "OAuth tokens", "oauth_tokens": "OAuth tokens",
"token": "Token", "token": "Token",
"refresh_token": "Refresh Token", "refresh_token": "Refresh token",
"valid_until": "Valid Until", "valid_until": "Valid until",
"revoke_token": "Revoke", "revoke_token": "Revoke",
"panelRadius": "Panels", "panelRadius": "Panels",
"pause_on_unfocused": "Pause streaming when tab is not focused", "pause_on_unfocused": "Pause streaming when tab is not focused",
"presets": "Presets", "presets": "Presets",
"profile_background": "Profile Background", "profile_background": "Profile background",
"profile_banner": "Profile Banner", "profile_banner": "Profile banner",
"profile_tab": "Profile", "profile_tab": "Profile",
"radii_help": "Set up interface edge rounding (in pixels)", "radii_help": "Set up interface edge rounding (in pixels)",
"replies_in_timeline": "Replies in timeline", "replies_in_timeline": "Replies in timeline",
@ -613,8 +629,8 @@
}, },
"version": { "version": {
"title": "Version", "title": "Version",
"backend_version": "Backend Version", "backend_version": "Backend version",
"frontend_version": "Frontend Version" "frontend_version": "Frontend version"
} }
}, },
"time": { "time": {
@ -662,7 +678,9 @@
"reload": "Reload", "reload": "Reload",
"up_to_date": "Up-to-date", "up_to_date": "Up-to-date",
"no_more_statuses": "No more statuses", "no_more_statuses": "No more statuses",
"no_statuses": "No statuses" "no_statuses": "No statuses",
"socket_reconnected": "Realtime connection established",
"socket_broke": "Realtime connection lost: CloseEvent code {0}"
}, },
"status": { "status": {
"favorites": "Favorites", "favorites": "Favorites",
@ -755,7 +773,7 @@
} }
}, },
"user_profile": { "user_profile": {
"timeline_title": "User Timeline", "timeline_title": "User timeline",
"profile_does_not_exist": "Sorry, this profile does not exist.", "profile_does_not_exist": "Sorry, this profile does not exist.",
"profile_loading_error": "Sorry, there was an error loading this profile." "profile_loading_error": "Sorry, there was an error loading this profile."
}, },
@ -773,7 +791,7 @@
"who_to_follow": "Who to follow" "who_to_follow": "Who to follow"
}, },
"tool_tip": { "tool_tip": {
"media_upload": "Upload Media", "media_upload": "Upload media",
"repeat": "Repeat", "repeat": "Repeat",
"reply": "Reply", "reply": "Reply",
"favorite": "Favorite", "favorite": "Favorite",

View file

@ -156,7 +156,9 @@
"password_required": "ne povas resti malplena", "password_required": "ne povas resti malplena",
"password_confirmation_required": "ne povas resti malplena", "password_confirmation_required": "ne povas resti malplena",
"password_confirmation_match": "samu la pasvorton" "password_confirmation_match": "samu la pasvorton"
} },
"reason_placeholder": "Ĉi-node oni aprobas registriĝojn permane.\nSciigu la administrantojn kial vi volas registriĝi.",
"reason": "Kialo registriĝi"
}, },
"settings": { "settings": {
"app_name": "Nomo de aplikaĵo", "app_name": "Nomo de aplikaĵo",
@ -523,7 +525,14 @@
"mute_export_button": "Elportu viajn silentigojn al CSV-dosiero", "mute_export_button": "Elportu viajn silentigojn al CSV-dosiero",
"mute_export": "Elporto de silentigoj", "mute_export": "Elporto de silentigoj",
"hide_wallpaper": "Kaŝi fonbildon de nodo", "hide_wallpaper": "Kaŝi fonbildon de nodo",
"setting_changed": "Agordo malsamas de la implicita" "setting_changed": "Agordo malsamas de la implicita",
"more_settings": "Pliaj agordoj",
"sensitive_by_default": "Implicite marki afiŝojn konsternaj",
"reply_visibility_following_short": "Montri respondojn por miaj abonatoj",
"hide_all_muted_posts": "Kaŝi silentigitajn afiŝojn",
"hide_media_previews": "Kaŝi antaŭrigardojn al vidaŭdaĵoj",
"word_filter": "Vortofiltro",
"reply_visibility_self_short": "Montri nur respondojn por mi"
}, },
"timeline": { "timeline": {
"collapse": "Maletendi", "collapse": "Maletendi",
@ -594,7 +603,13 @@
"hide_repeats": "Kaŝi ripetojn", "hide_repeats": "Kaŝi ripetojn",
"unsubscribe": "Ne ricevi sciigojn", "unsubscribe": "Ne ricevi sciigojn",
"subscribe": "Ricevi sciigojn", "subscribe": "Ricevi sciigojn",
"bot": "Roboto" "bot": "Roboto",
"highlight": {
"side": "Flanka strio",
"striped": "Stria fono",
"solid": "Unueca fono",
"disabled": "Senemfaze"
}
}, },
"user_profile": { "user_profile": {
"timeline_title": "Historio de uzanto", "timeline_title": "Historio de uzanto",

View file

@ -39,7 +39,11 @@
"dismiss": "Descartar", "dismiss": "Descartar",
"retry": "Inténtalo de nuevo", "retry": "Inténtalo de nuevo",
"error_retry": "Por favor, inténtalo de nuevo", "error_retry": "Por favor, inténtalo de nuevo",
"loading": "Cargando…" "loading": "Cargando…",
"role": {
"admin": "Administrador/a",
"moderator": "Moderador/a"
}
}, },
"image_cropper": { "image_cropper": {
"crop_picture": "Recortar la foto", "crop_picture": "Recortar la foto",
@ -82,8 +86,8 @@
"friend_requests": "Solicitudes de seguimiento", "friend_requests": "Solicitudes de seguimiento",
"mentions": "Menciones", "mentions": "Menciones",
"interactions": "Interacciones", "interactions": "Interacciones",
"dms": "Mensajes Directos", "dms": "Mensajes directos",
"public_tl": "Línea Temporal Pública", "public_tl": "Línea temporal pública",
"timeline": "Línea Temporal", "timeline": "Línea Temporal",
"twkn": "Red Conocida", "twkn": "Red Conocida",
"user_search": "Búsqueda de Usuarios", "user_search": "Búsqueda de Usuarios",
@ -92,7 +96,8 @@
"preferences": "Preferencias", "preferences": "Preferencias",
"chats": "Chats", "chats": "Chats",
"timelines": "Líneas de Tiempo", "timelines": "Líneas de Tiempo",
"bookmarks": "Marcadores" "bookmarks": "Marcadores",
"home_timeline": "Línea temporal personal"
}, },
"notifications": { "notifications": {
"broken_favorite": "Estado desconocido, buscándolo…", "broken_favorite": "Estado desconocido, buscándolo…",
@ -120,7 +125,9 @@
"expiry": "Tiempo de vida de la encuesta", "expiry": "Tiempo de vida de la encuesta",
"expires_in": "La encuesta termina en {0}", "expires_in": "La encuesta termina en {0}",
"expired": "La encuesta terminó hace {0}", "expired": "La encuesta terminó hace {0}",
"not_enough_options": "Muy pocas opciones únicas en la encuesta" "not_enough_options": "Muy pocas opciones únicas en la encuesta",
"people_voted_count": "{count} persona votó | {count} personas votaron",
"votes_count": "{count} voto | {count} votos"
}, },
"emoji": { "emoji": {
"stickers": "Pegatinas", "stickers": "Pegatinas",
@ -137,14 +144,14 @@
"add_sticker": "Añadir Pegatina" "add_sticker": "Añadir Pegatina"
}, },
"interactions": { "interactions": {
"favs_repeats": "Favoritos y Repetidos", "favs_repeats": "Favoritos y repetidos",
"follows": "Nuevos seguidores", "follows": "Nuevos seguidores",
"load_older": "Cargar interacciones más antiguas", "load_older": "Cargar interacciones más antiguas",
"moves": "Usuario Migrado" "moves": "Usuario Migrado"
}, },
"post_status": { "post_status": {
"new_status": "Publicar un nuevo estado", "new_status": "Publicar un nuevo estado",
"account_not_locked_warning": "Tu cuenta no está {0}. Cualquiera puede seguirte y leer las entradas para Solo-Seguidores.", "account_not_locked_warning": "Tu cuenta no está {0}. Cualquiera puede seguirte y leer las publicaciones para Solo-Seguidores.",
"account_not_locked_warning_link": "bloqueada", "account_not_locked_warning_link": "bloqueada",
"attachments_sensitive": "Contenido sensible", "attachments_sensitive": "Contenido sensible",
"content_type": { "content_type": {
@ -164,16 +171,17 @@
"unlisted": "Esta publicación no será visible en la Línea Temporal Pública ni en Toda La Red Conocida" "unlisted": "Esta publicación no será visible en la Línea Temporal Pública ni en Toda La Red Conocida"
}, },
"scope": { "scope": {
"direct": "Directo - Solo para los usuarios mencionados", "direct": "Directo - solo para los usuarios mencionados",
"private": "Solo-seguidores - Solo tus seguidores leerán la publicación", "private": "Solo-seguidores - solo tus seguidores leerán la publicación",
"public": "Público - Entradas visibles en las Líneas Temporales Públicas", "public": "Público - publicaciones visibles en las líneas temporales públicas",
"unlisted": "Sin listar - Entradas no visibles en las Líneas Temporales Públicas" "unlisted": "Sin listar -publicaciones no visibles en las líneas temporales públicas"
}, },
"media_description_error": "Error al actualizar el archivo, inténtalo de nuevo", "media_description_error": "Error al actualizar el archivo, inténtalo de nuevo",
"empty_status_error": "No se puede publicar un estado vacío y sin archivos adjuntos", "empty_status_error": "No se puede publicar un estado vacío y sin archivos adjuntos",
"preview_empty": "Vacío", "preview_empty": "Vacío",
"preview": "Vista previa", "preview": "Vista previa",
"media_description": "Descripción multimedia" "media_description": "Descripción multimedia",
"post": "Publicación"
}, },
"registration": { "registration": {
"bio": "Biografía", "bio": "Biografía",
@ -194,7 +202,10 @@
"password_required": "no puede estar vacío", "password_required": "no puede estar vacío",
"password_confirmation_required": "no puede estar vacío", "password_confirmation_required": "no puede estar vacío",
"password_confirmation_match": "la contraseña no coincide" "password_confirmation_match": "la contraseña no coincide"
} },
"reason_placeholder": "Los registros de esta instancia son aprobados manualmente.\nComéntanos por qué quieres registrarte aquí.",
"reason": "Razón para registrarse",
"register": "Registrarse"
}, },
"selectable_list": { "selectable_list": {
"select_all": "Seleccionar todo" "select_all": "Seleccionar todo"
@ -227,7 +238,7 @@
"attachmentRadius": "Adjuntos", "attachmentRadius": "Adjuntos",
"attachments": "Adjuntos", "attachments": "Adjuntos",
"avatar": "Avatar", "avatar": "Avatar",
"avatarAltRadius": "Avatares (Notificaciones)", "avatarAltRadius": "Avatares (notificaciones)",
"avatarRadius": "Avatares", "avatarRadius": "Avatares",
"background": "Fondo", "background": "Fondo",
"bio": "Biografía", "bio": "Biografía",
@ -245,19 +256,19 @@
"change_password": "Cambiar contraseña", "change_password": "Cambiar contraseña",
"change_password_error": "Hubo un problema cambiando la contraseña.", "change_password_error": "Hubo un problema cambiando la contraseña.",
"changed_password": "¡Contraseña cambiada correctamente!", "changed_password": "¡Contraseña cambiada correctamente!",
"collapse_subject": "Colapsar entradas con tema", "collapse_subject": "Colapsar publicaciones con tema",
"composing": "Redactando", "composing": "Redactando",
"confirm_new_password": "Confirmar la nueva contraseña", "confirm_new_password": "Confirmar la nueva contraseña",
"current_avatar": "Tu avatar actual", "current_avatar": "Tu avatar actual",
"current_password": "Contraseña actual", "current_password": "Contraseña actual",
"current_profile_banner": "Tu cabecera actual", "current_profile_banner": "Tu cabecera actual",
"data_import_export_tab": "Importar / Exportar Datos", "data_import_export_tab": "Importar / Exportar datos",
"default_vis": "Alcance de visibilidad por defecto", "default_vis": "Alcance de visibilidad por defecto",
"delete_account": "Eliminar la cuenta", "delete_account": "Eliminar la cuenta",
"discoverable": "Permitir la aparición de esta cuenta en los resultados de búsqueda y otros servicios", "discoverable": "Permitir la aparición de esta cuenta en los resultados de búsqueda y otros servicios",
"delete_account_description": "Eliminar para siempre los datos y desactivar la cuenta.", "delete_account_description": "Eliminar para siempre los datos y desactivar la cuenta.",
"pad_emoji": "Rellenar con espacios al agregar emojis desde el selector", "pad_emoji": "Rellenar con espacios al agregar emojis desde el selector",
"delete_account_error": "Hubo un error al eliminar tu cuenta. Si el fallo persiste, ponte en contacto con el administrador de tu instancia.", "delete_account_error": "Hubo un error al eliminar tu cuenta. Si el fallo persiste, ponte en contacto con el/la administrador/a de tu instancia.",
"delete_account_instructions": "Escribe tu contraseña para confirmar la eliminación de tu cuenta.", "delete_account_instructions": "Escribe tu contraseña para confirmar la eliminación de tu cuenta.",
"avatar_size_instruction": "El tamaño mínimo recomendado para el avatar es de 150X150 píxeles.", "avatar_size_instruction": "El tamaño mínimo recomendado para el avatar es de 150X150 píxeles.",
"export_theme": "Exportar tema", "export_theme": "Exportar tema",
@ -277,7 +288,7 @@
"hide_isp": "Ocultar el panel específico de la instancia", "hide_isp": "Ocultar el panel específico de la instancia",
"preload_images": "Precargar las imágenes", "preload_images": "Precargar las imágenes",
"use_one_click_nsfw": "Abrir los adjuntos NSFW con un solo click", "use_one_click_nsfw": "Abrir los adjuntos NSFW con un solo click",
"hide_post_stats": "Ocultar las estadísticas de las entradas (p.ej. el número de favoritos)", "hide_post_stats": "Ocultar las estadísticas de las publicaciones (p.ej. el número de favoritos)",
"hide_user_stats": "Ocultar las estadísticas del usuario (p.ej. el número de seguidores)", "hide_user_stats": "Ocultar las estadísticas del usuario (p.ej. el número de seguidores)",
"hide_filtered_statuses": "Ocultar estados filtrados", "hide_filtered_statuses": "Ocultar estados filtrados",
"import_blocks_from_a_csv_file": "Importar lista de usuarios bloqueados dese un archivo csv", "import_blocks_from_a_csv_file": "Importar lista de usuarios bloqueados dese un archivo csv",
@ -299,22 +310,22 @@
"play_videos_in_modal": "Reproducir los vídeos en un marco emergente", "play_videos_in_modal": "Reproducir los vídeos en un marco emergente",
"use_contain_fit": "No recortar los adjuntos en miniaturas", "use_contain_fit": "No recortar los adjuntos en miniaturas",
"name": "Nombre", "name": "Nombre",
"name_bio": "Nombre y Biografía", "name_bio": "Nombre y biografía",
"new_password": "Nueva contraseña", "new_password": "Nueva contraseña",
"notification_visibility": "Tipos de notificaciones a mostrar", "notification_visibility": "Tipos de notificaciones a mostrar",
"notification_visibility_follows": "Nuevos seguidores", "notification_visibility_follows": "Nuevos seguidores",
"notification_visibility_likes": "Me gustan (Likes)", "notification_visibility_likes": "Favoritos",
"notification_visibility_mentions": "Menciones", "notification_visibility_mentions": "Menciones",
"notification_visibility_repeats": "Repeticiones (Repeats)", "notification_visibility_repeats": "Repeticiones (Repeats)",
"no_rich_text_description": "Eliminar el formato de texto enriquecido de todas las entradas", "no_rich_text_description": "Eliminar el formato de texto enriquecido de todas las publicaciones",
"no_blocks": "No hay usuarios bloqueados", "no_blocks": "No hay usuarios bloqueados",
"no_mutes": "No hay usuarios silenciados", "no_mutes": "No hay usuarios silenciados",
"hide_follows_description": "No mostrar a quién sigo", "hide_follows_description": "No mostrar a quién sigo",
"hide_followers_description": "No mostrar quién me sigue", "hide_followers_description": "No mostrar quién me sigue",
"hide_follows_count_description": "No mostrar el número de cuentas que sigo", "hide_follows_count_description": "No mostrar el número de cuentas que sigo",
"hide_followers_count_description": "No mostrar el número de cuentas que me siguen", "hide_followers_count_description": "No mostrar el número de cuentas que me siguen",
"show_admin_badge": "Mostrar la insignia de Administrador en mi perfil", "show_admin_badge": "Mostrar la insignia de \"Administrador/a\" en mi perfil",
"show_moderator_badge": "Mostrar la insignia de Moderador en mi perfil", "show_moderator_badge": "Mostrar la insignia de \"Moderador/a\" en mi perfil",
"nsfw_clickthrough": "Habilitar la ocultación de la imagen de vista previa del enlace y el adjunto para los estados NSFW por defecto", "nsfw_clickthrough": "Habilitar la ocultación de la imagen de vista previa del enlace y el adjunto para los estados NSFW por defecto",
"oauth_tokens": "Tokens de OAuth", "oauth_tokens": "Tokens de OAuth",
"token": "Token", "token": "Token",
@ -324,8 +335,8 @@
"panelRadius": "Paneles", "panelRadius": "Paneles",
"pause_on_unfocused": "Parar la transmisión cuando no estés en foco", "pause_on_unfocused": "Parar la transmisión cuando no estés en foco",
"presets": "Por defecto", "presets": "Por defecto",
"profile_background": "Fondo del Perfil", "profile_background": "Imagen de fondo del perfil",
"profile_banner": "Cabecera del Perfil", "profile_banner": "Imagen de cabecera del perfil",
"profile_tab": "Perfil", "profile_tab": "Perfil",
"radii_help": "Establezca el redondeo de las esquinas de la interfaz (en píxeles)", "radii_help": "Establezca el redondeo de las esquinas de la interfaz (en píxeles)",
"replies_in_timeline": "Réplicas en la línea temporal", "replies_in_timeline": "Réplicas en la línea temporal",
@ -356,7 +367,7 @@
"theme": "Tema", "theme": "Tema",
"theme_help": "Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.", "theme_help": "Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.",
"theme_help_v2_1": "También puede invalidar los colores y la opacidad de ciertos componentes si activa la casilla de verificación. Use el botón \"Borrar todo\" para deshacer los cambios.", "theme_help_v2_1": "También puede invalidar los colores y la opacidad de ciertos componentes si activa la casilla de verificación. Use el botón \"Borrar todo\" para deshacer los cambios.",
"theme_help_v2_2": "Los iconos debajo de algunas entradas son indicadores de contraste de fondo/texto, desplace el ratón por encima para obtener información más detallada. Tenga en cuenta que cuando se utilizan indicadores de contraste de transparencia se muestra el peor caso posible.", "theme_help_v2_2": "Los iconos debajo de algunas publicaciones son indicadores de contraste de fondo/texto, desplace el ratón por encima para obtener información más detallada. Tenga en cuenta que cuando se utilizan indicadores de contraste de transparencia se muestra el peor caso posible.",
"tooltipRadius": "Información/alertas", "tooltipRadius": "Información/alertas",
"upload_a_photo": "Subir una foto", "upload_a_photo": "Subir una foto",
"user_settings": "Ajustes del Usuario", "user_settings": "Ajustes del Usuario",
@ -476,7 +487,7 @@
"panelHeader": "Cabecera del panel", "panelHeader": "Cabecera del panel",
"topBar": "Barra superior", "topBar": "Barra superior",
"avatar": "Avatar del usuario (en la vista del perfil)", "avatar": "Avatar del usuario (en la vista del perfil)",
"avatarStatus": "Avatar del usuario (en la vista de la entrada)", "avatarStatus": "Avatar del usuario (en la vista de la publicación)",
"popup": "Ventanas y textos emergentes (popups & tooltips)", "popup": "Ventanas y textos emergentes (popups & tooltips)",
"button": "Botones", "button": "Botones",
"buttonHover": "Botón (encima)", "buttonHover": "Botón (encima)",
@ -517,8 +528,8 @@
}, },
"version": { "version": {
"title": "Versión", "title": "Versión",
"backend_version": "Versión del Backend", "backend_version": "Versión del backend",
"frontend_version": "Versión del Frontend" "frontend_version": "Versión del frontend"
}, },
"notification_visibility_moves": "Usuario Migrado", "notification_visibility_moves": "Usuario Migrado",
"greentext": "Texto verde (meme arrows)", "greentext": "Texto verde (meme arrows)",
@ -529,7 +540,7 @@
"fun": "Divertido", "fun": "Divertido",
"type_domains_to_mute": "Buscar dominios para silenciar", "type_domains_to_mute": "Buscar dominios para silenciar",
"useStreamingApiWarning": "(no recomendado, experimental, puede omitir publicaciones)", "useStreamingApiWarning": "(no recomendado, experimental, puede omitir publicaciones)",
"useStreamingApi": "Recibir entradas y notificaciones en tiempo real", "useStreamingApi": "Recibir publicaciones y notificaciones en tiempo real",
"user_mutes": "Usuarios", "user_mutes": "Usuarios",
"reset_profile_background": "Restablecer el fondo de pantalla", "reset_profile_background": "Restablecer el fondo de pantalla",
"reset_background_confirm": "¿Estás seguro de restablecer el fondo de pantalla?", "reset_background_confirm": "¿Estás seguro de restablecer el fondo de pantalla?",
@ -563,7 +574,15 @@
"mute_export_button": "Exportar los silenciados a un archivo csv", "mute_export_button": "Exportar los silenciados a un archivo csv",
"mute_export": "Exportar silenciados", "mute_export": "Exportar silenciados",
"hide_wallpaper": "Ocultar el fondo de pantalla de la instancia", "hide_wallpaper": "Ocultar el fondo de pantalla de la instancia",
"setting_changed": "La configuración es diferente a la predeterminada" "setting_changed": "La configuración es diferente a la predeterminada",
"hide_all_muted_posts": "Ocultar las publicaciones silenciadas",
"more_settings": "Más opciones",
"sensitive_by_default": "Identificar las publicaciones como sensibles de forma predeterminada",
"reply_visibility_self_short": "Mostrar respuestas solo a uno mismo",
"reply_visibility_following_short": "Mostrar las réplicas a mis seguidores",
"hide_media_previews": "Ocultar la vista previa multimedia",
"word_filter": "Filtro de palabras",
"save": "Guardar los cambios"
}, },
"time": { "time": {
"day": "{0} día", "day": "{0} día",
@ -611,7 +630,9 @@
"no_more_statuses": "No hay más estados", "no_more_statuses": "No hay más estados",
"no_statuses": "Sin estados", "no_statuses": "Sin estados",
"reload": "Recargar", "reload": "Recargar",
"error": "Error obteniendo la linea de tiempo:{0}" "error": "Error obteniendo la linea de tiempo:{0}",
"socket_broke": "Conexión en timpo real perdida: código del motivo {0}",
"socket_reconnected": "Establecida la conexión en tiempo real"
}, },
"status": { "status": {
"favorites": "Favoritos", "favorites": "Favoritos",
@ -635,7 +656,7 @@
"status_unavailable": "Estado no disponible", "status_unavailable": "Estado no disponible",
"bookmark": "Marcar", "bookmark": "Marcar",
"unbookmark": "Desmarcar", "unbookmark": "Desmarcar",
"status_deleted": "Esta entrada ha sido eliminada", "status_deleted": "Esta publicación ha sido eliminada",
"nsfw": "NSFW (No apropiado para el trabajo)", "nsfw": "NSFW (No apropiado para el trabajo)",
"expand": "Expandir", "expand": "Expandir",
"external_source": "Fuente externa" "external_source": "Fuente externa"
@ -674,10 +695,10 @@
"mute_progress": "Silenciando…", "mute_progress": "Silenciando…",
"admin_menu": { "admin_menu": {
"moderation": "Moderación", "moderation": "Moderación",
"grant_admin": "Conceder permisos de Administrador", "grant_admin": "Conceder permisos de Administrador/a",
"revoke_admin": "Revocar permisos de Administrador", "revoke_admin": "Revocar permisos de Administrador/a",
"grant_moderator": "Conceder permisos de Moderador", "grant_moderator": "Conceder permisos de Moderador/a",
"revoke_moderator": "Revocar permisos de Moderador", "revoke_moderator": "Revocar permisos de Moderador/a",
"activate_account": "Activar cuenta", "activate_account": "Activar cuenta",
"deactivate_account": "Desactivar cuenta", "deactivate_account": "Desactivar cuenta",
"delete_account": "Eliminar cuenta", "delete_account": "Eliminar cuenta",
@ -698,16 +719,23 @@
"roles": { "roles": {
"moderator": "Moderador", "moderator": "Moderador",
"admin": "Administrador" "admin": "Administrador"
} },
"highlight": {
"striped": "Fondo rayado",
"side": "Raya lateral",
"solid": "Fondo sólido",
"disabled": "Sin resaltado"
},
"bot": "Bot"
}, },
"user_profile": { "user_profile": {
"timeline_title": "Linea Temporal del Usuario", "timeline_title": "Línea temporal del usuario",
"profile_does_not_exist": "Lo sentimos, este perfil no existe.", "profile_does_not_exist": "Lo sentimos, este perfil no existe.",
"profile_loading_error": "Lo sentimos, hubo un error al cargar este perfil." "profile_loading_error": "Lo sentimos, hubo un error al cargar este perfil."
}, },
"user_reporting": { "user_reporting": {
"title": "Reportando a {0}", "title": "Reportando a {0}",
"add_comment_description": "El informe será enviado a los moderadores de su instancia. Puedes proporcionar una explicación de por qué estás reportando esta cuenta a continuación:", "add_comment_description": "El informe será enviado a los/las moderadores/as de su instancia. Puedes proporcionar una explicación de por qué estás reportando esta cuenta a continuación:",
"additional_comments": "Comentarios adicionales", "additional_comments": "Comentarios adicionales",
"forward_description": "La cuenta es de otro servidor. ¿Enviar una copia del informe allí también?", "forward_description": "La cuenta es de otro servidor. ¿Enviar una copia del informe allí también?",
"forward_to": "Reenviar a {0}", "forward_to": "Reenviar a {0}",
@ -719,7 +747,7 @@
"who_to_follow": "A quién seguir" "who_to_follow": "A quién seguir"
}, },
"tool_tip": { "tool_tip": {
"media_upload": "Subir Medios", "media_upload": "Subir multimedia",
"repeat": "Repetir", "repeat": "Repetir",
"reply": "Contestar", "reply": "Contestar",
"favorite": "Favorito", "favorite": "Favorito",
@ -777,12 +805,12 @@
"simple": { "simple": {
"accept_desc": "Esta instancia solo acepta mensajes de las siguientes instancias:", "accept_desc": "Esta instancia solo acepta mensajes de las siguientes instancias:",
"media_nsfw_desc": "Esta instancia obliga a que los archivos multimedia se establezcan como sensibles en las publicaciones de las siguientes instancias:", "media_nsfw_desc": "Esta instancia obliga a que los archivos multimedia se establezcan como sensibles en las publicaciones de las siguientes instancias:",
"media_nsfw": "Forzar Multimedia Como Sensible", "media_nsfw": "Forzar contenido multimedia como sensible",
"media_removal_desc": "Esta instancia elimina los archivos multimedia de las publicaciones de las siguientes instancias:", "media_removal_desc": "Esta instancia elimina los archivos multimedia de las publicaciones de las siguientes instancias:",
"media_removal": "Eliminar Multimedia", "media_removal": "Eliminar Multimedia",
"quarantine": "Cuarentena", "quarantine": "Cuarentena",
"ftl_removal_desc": "Esta instancia elimina las siguientes instancias de la línea de tiempo \"Toda la red conocida\":", "ftl_removal_desc": "Esta instancia elimina las siguientes instancias de la línea de tiempo \"Red Conocida\":",
"ftl_removal": "Eliminar de la línea de tiempo \"Toda La Red Conocida\"", "ftl_removal": "Eliminar de la línea de tiempo \"Red Conocida\"",
"quarantine_desc": "Esta instancia enviará solo publicaciones públicas a las siguientes instancias:", "quarantine_desc": "Esta instancia enviará solo publicaciones públicas a las siguientes instancias:",
"simple_policies": "Políticas específicas de la instancia", "simple_policies": "Políticas específicas de la instancia",
"reject_desc": "Esta instancia no aceptará mensajes de las siguientes instancias:", "reject_desc": "Esta instancia no aceptará mensajes de las siguientes instancias:",

View file

@ -14,7 +14,8 @@
"text_limit": "Testu limitea", "text_limit": "Testu limitea",
"title": "Ezaugarriak", "title": "Ezaugarriak",
"who_to_follow": "Nori jarraitu", "who_to_follow": "Nori jarraitu",
"pleroma_chat_messages": "Pleroma Txata" "pleroma_chat_messages": "Pleroma Txata",
"upload_limit": "Kargatzeko muga"
}, },
"finder": { "finder": {
"error_fetching_user": "Errorea erabiltzailea eskuratzen", "error_fetching_user": "Errorea erabiltzailea eskuratzen",
@ -38,7 +39,11 @@
"dismiss": "Baztertu", "dismiss": "Baztertu",
"retry": "Saiatu berriro", "retry": "Saiatu berriro",
"error_retry": "Saiatu berriro mesedez", "error_retry": "Saiatu berriro mesedez",
"loading": "Kargatzen…" "loading": "Kargatzen…",
"role": {
"moderator": "Moderatzailea",
"admin": "Administratzailea"
}
}, },
"image_cropper": { "image_cropper": {
"crop_picture": "Moztu argazkia", "crop_picture": "Moztu argazkia",
@ -81,8 +86,8 @@
"friend_requests": "Jarraitzeko eskaerak", "friend_requests": "Jarraitzeko eskaerak",
"mentions": "Aipamenak", "mentions": "Aipamenak",
"interactions": "Interakzioak", "interactions": "Interakzioak",
"dms": "Zuzeneko Mezuak", "dms": "Zuzeneko mezuak",
"public_tl": "Denbora-lerro Publikoa", "public_tl": "Denbora-lerro publikoa",
"timeline": "Denbora-lerroa", "timeline": "Denbora-lerroa",
"twkn": "Ezagutzen den Sarea", "twkn": "Ezagutzen den Sarea",
"user_search": "Erabiltzailea Bilatu", "user_search": "Erabiltzailea Bilatu",
@ -104,7 +109,8 @@
"no_more_notifications": "Ez dago jakinarazpen gehiago", "no_more_notifications": "Ez dago jakinarazpen gehiago",
"reacted_with": "{0}kin erreakzionatu zuen", "reacted_with": "{0}kin erreakzionatu zuen",
"migrated_to": "hona migratua:", "migrated_to": "hona migratua:",
"follow_request": "jarraitu nahi zaitu" "follow_request": "jarraitu nahi zaitu",
"error": "Errorea jakinarazpenak eskuratzean: {0}"
}, },
"polls": { "polls": {
"add_poll": "Inkesta gehitu", "add_poll": "Inkesta gehitu",
@ -118,7 +124,9 @@
"expiry": "Inkestaren iraupena", "expiry": "Inkestaren iraupena",
"expires_in": "Inkesta {0} bukatzen da", "expires_in": "Inkesta {0} bukatzen da",
"expired": "Inkesta {0} bukatu zen", "expired": "Inkesta {0} bukatu zen",
"not_enough_options": "Aukera gutxiegi inkestan" "not_enough_options": "Aukera gutxiegi inkestan",
"votes_count": "{count} boto| {count} boto",
"people_voted_count": "Pertsona batek bozkatu du | {count} pertsonak bozkatu dute"
}, },
"emoji": { "emoji": {
"stickers": "Pegatinak", "stickers": "Pegatinak",
@ -160,9 +168,9 @@
"unlisted": "Mezu hau ez da argitaratuko Denbora-lerro Publikoan ezta Ezagutzen den Sarean" "unlisted": "Mezu hau ez da argitaratuko Denbora-lerro Publikoan ezta Ezagutzen den Sarean"
}, },
"scope": { "scope": {
"direct": "Zuzena: Bidali aipatutako erabiltzaileei besterik ez", "direct": "Zuzena: bidali aipatutako erabiltzaileei besterik ez",
"private": "Jarraitzaileentzako bakarrik: Bidali jarraitzaileentzat bakarrik", "private": "Jarraitzaileentzako bakarrik: bidali jarraitzaileentzat bakarrik",
"public": "Publikoa: Bistaratu denbora-lerro publikoetan", "public": "Publikoa: bistaratu denbora-lerro publikoetan",
"unlisted": "Zerrendatu gabea: ez bidali denbora-lerro publikoetara" "unlisted": "Zerrendatu gabea: ez bidali denbora-lerro publikoetara"
} }
}, },
@ -218,7 +226,7 @@
"attachmentRadius": "Eranskinak", "attachmentRadius": "Eranskinak",
"attachments": "Eranskinak", "attachments": "Eranskinak",
"avatar": "Avatarra", "avatar": "Avatarra",
"avatarAltRadius": "Avatarra (Aipamenak)", "avatarAltRadius": "Abatarra (aipamenak)",
"avatarRadius": "Avatarrak", "avatarRadius": "Avatarrak",
"background": "Atzeko planoa", "background": "Atzeko planoa",
"bio": "Biografia", "bio": "Biografia",
@ -242,7 +250,7 @@
"current_avatar": "Zure uneko avatarra", "current_avatar": "Zure uneko avatarra",
"current_password": "Indarrean dagoen pasahitza", "current_password": "Indarrean dagoen pasahitza",
"current_profile_banner": "Zure profilaren banner-a", "current_profile_banner": "Zure profilaren banner-a",
"data_import_export_tab": "Datuak Inportatu / Esportatu", "data_import_export_tab": "Datuak inportatu / esportatu",
"default_vis": "Lehenetsitako ikusgaitasunak", "default_vis": "Lehenetsitako ikusgaitasunak",
"delete_account": "Ezabatu kontua", "delete_account": "Ezabatu kontua",
"discoverable": "Baimendu zure kontua kanpo bilaketa-emaitzetan eta bestelako zerbitzuetan agertzea", "discoverable": "Baimendu zure kontua kanpo bilaketa-emaitzetan eta bestelako zerbitzuetan agertzea",
@ -304,19 +312,19 @@
"hide_followers_description": "Ez erakutsi nor ari den ni jarraitzen", "hide_followers_description": "Ez erakutsi nor ari den ni jarraitzen",
"hide_follows_count_description": "Ez erakutsi jarraitzen ari naizen kontuen kopurua", "hide_follows_count_description": "Ez erakutsi jarraitzen ari naizen kontuen kopurua",
"hide_followers_count_description": "Ez erakutsi nire jarraitzaileen kontuen kopurua", "hide_followers_count_description": "Ez erakutsi nire jarraitzaileen kontuen kopurua",
"show_admin_badge": "Erakutsi Administratzaile etiketa nire profilan", "show_admin_badge": "Erakutsi \"Administratzaile\" etiketa nire profilan",
"show_moderator_badge": "Erakutsi Moderatzaile etiketa nire profilan", "show_moderator_badge": "Erakutsi \"Moderatzaile\" etiketa nire profilan",
"nsfw_clickthrough": "Gaitu klika hunkigarri eranskinak ezkutatzeko", "nsfw_clickthrough": "Gaitu klika hunkigarri eranskinak ezkutatzeko",
"oauth_tokens": "OAuth tokenak", "oauth_tokens": "OAuth tokenak",
"token": "Tokena", "token": "Tokena",
"refresh_token": "Berrgin Tokena", "refresh_token": "Berrgin tokena",
"valid_until": "Baliozkoa Arte", "valid_until": "Baliozkoa arte",
"revoke_token": "Ezeztatu", "revoke_token": "Ezeztatu",
"panelRadius": "Panelak", "panelRadius": "Panelak",
"pause_on_unfocused": "Eguneraketa automatikoa gelditu fitxatik kanpo", "pause_on_unfocused": "Eguneraketa automatikoa gelditu fitxatik kanpo",
"presets": "Aurrezarpenak", "presets": "Aurrezarpenak",
"profile_background": "Profilaren atzeko planoa", "profile_background": "Profilaren atzeko planoa",
"profile_banner": "Profilaren Banner-a", "profile_banner": "Profilaren banner-a",
"profile_tab": "Profila", "profile_tab": "Profila",
"radii_help": "Konfiguratu interfazearen ertzen biribiltzea (pixeletan)", "radii_help": "Konfiguratu interfazearen ertzen biribiltzea (pixeletan)",
"replies_in_timeline": "Denbora-lerroko erantzunak", "replies_in_timeline": "Denbora-lerroko erantzunak",
@ -470,8 +478,8 @@
}, },
"version": { "version": {
"title": "Bertsioa", "title": "Bertsioa",
"backend_version": "Backend Bertsioa", "backend_version": "Backend bertsioa",
"frontend_version": "Frontend Bertsioa" "frontend_version": "Frontend bertsioa"
} }
}, },
"time": { "time": {
@ -657,7 +665,7 @@
"federation": "Federazioa", "federation": "Federazioa",
"simple": { "simple": {
"media_nsfw_desc": "Instantzia honek hurrengo instantzien multimediak sentikorrak izatera behartzen ditu:", "media_nsfw_desc": "Instantzia honek hurrengo instantzien multimediak sentikorrak izatera behartzen ditu:",
"media_nsfw": "Behartu Multimedia Sentikor", "media_nsfw": "Behartu multimedia sentikor moduan",
"media_removal_desc": "Instantzia honek atxikitutako multimedia hurrengo instantzietatik ezabatzen ditu:", "media_removal_desc": "Instantzia honek atxikitutako multimedia hurrengo instantzietatik ezabatzen ditu:",
"media_removal": "Multimedia Ezabatu", "media_removal": "Multimedia Ezabatu",
"ftl_removal_desc": "Instantzia honek hurrengo instantziak ezabatzen ditu \"Ezagutzen den Sarea\" denbora-lerrotik:", "ftl_removal_desc": "Instantzia honek hurrengo instantziak ezabatzen ditu \"Ezagutzen den Sarea\" denbora-lerrotik:",

View file

@ -9,16 +9,17 @@
"features_panel": { "features_panel": {
"chat": "Chat", "chat": "Chat",
"gopher": "Gopher", "gopher": "Gopher",
"media_proxy": "Proxy média", "media_proxy": "Proxy pièce-jointes",
"scope_options": "Options de visibilité", "scope_options": "Options de visibilité",
"text_limit": "Limite de texte", "text_limit": "Limite du texte",
"title": "Caractéristiques", "title": "Fonctionnalités",
"who_to_follow": "Personnes à suivre", "who_to_follow": "Suggestions de suivis",
"pleroma_chat_messages": "Chat Pleroma" "pleroma_chat_messages": "Chat Pleroma",
"upload_limit": "Limite de téléversement"
}, },
"finder": { "finder": {
"error_fetching_user": "Erreur lors de la recherche de l'utilisateur·ice", "error_fetching_user": "Erreur lors de la recherche du compte",
"find_user": "Chercher un-e utilisateur·ice" "find_user": "Rechercher un compte"
}, },
"general": { "general": {
"apply": "Appliquer", "apply": "Appliquer",
@ -26,19 +27,23 @@
"more": "Plus", "more": "Plus",
"generic_error": "Une erreur s'est produite", "generic_error": "Une erreur s'est produite",
"optional": "optionnel", "optional": "optionnel",
"show_more": "Montrer plus", "show_more": "Afficher plus",
"show_less": "Montrer moins", "show_less": "Afficher moins",
"cancel": "Annuler", "cancel": "Annuler",
"disable": "Désactiver", "disable": "Désactiver",
"enable": "Activer", "enable": "Activer",
"confirm": "Confirmer", "confirm": "Confirmer",
"verify": "Vérifier", "verify": "Vérifier",
"dismiss": "Rejeter", "dismiss": "Ignorer",
"peek": "Jeter un coup d'œil", "peek": "Jeter un coup d'œil",
"close": "Fermer", "close": "Fermer",
"retry": "Réessayez", "retry": "Réessayez",
"error_retry": "Veuillez réessayer", "error_retry": "Veuillez réessayer",
"loading": "Chargement…" "loading": "Chargement…",
"role": {
"moderator": "Modo'",
"admin": "Admin"
}
}, },
"image_cropper": { "image_cropper": {
"crop_picture": "Rogner l'image", "crop_picture": "Rogner l'image",
@ -47,7 +52,7 @@
"cancel": "Annuler" "cancel": "Annuler"
}, },
"importer": { "importer": {
"submit": "Soumettre", "submit": "Envoyer",
"success": "Importé avec succès.", "success": "Importé avec succès.",
"error": "Une erreur est survenue pendant l'import de ce fichier." "error": "Une erreur est survenue pendant l'import de ce fichier."
}, },
@ -56,17 +61,17 @@
"description": "Connexion avec OAuth", "description": "Connexion avec OAuth",
"logout": "Déconnexion", "logout": "Déconnexion",
"password": "Mot de passe", "password": "Mot de passe",
"placeholder": "p.e. lain", "placeholder": "ex. lain",
"register": "S'inscrire", "register": "S'inscrire",
"username": "Identifiant", "username": "Identifiant",
"hint": "Connectez-vous pour rejoindre la discussion", "hint": "Connectez-vous pour rejoindre la discussion",
"authentication_code": "Code d'authentification", "authentication_code": "Code d'authentification",
"enter_recovery_code": "Entrez un code de récupération", "enter_recovery_code": "Entrez un code de récupération",
"enter_two_factor_code": "Entrez un code à double authentification", "enter_two_factor_code": "Entrez un code double-facteur",
"recovery_code": "Code de récupération", "recovery_code": "Code de récupération",
"heading": { "heading": {
"totp": "Authentification à double authentification", "totp": "Authentification à double-facteur",
"recovery": "Récuperation de la double authentification" "recovery": "Récupération de l'authentification à double-facteur"
} }
}, },
"media_modal": { "media_modal": {
@ -78,24 +83,26 @@
"back": "Retour", "back": "Retour",
"chat": "Chat local", "chat": "Chat local",
"friend_requests": "Demandes de suivi", "friend_requests": "Demandes de suivi",
"mentions": "Notifications", "mentions": "Mentions",
"interactions": "Interactions", "interactions": "Interactions",
"dms": "Messages directs", "dms": "Messages directs",
"public_tl": "Fil d'actualité public", "public_tl": "Flux publique",
"timeline": "Fil d'actualité", "timeline": "Flux personnel",
"twkn": "Réseau connu", "twkn": "Réseau connu",
"user_search": "Recherche d'utilisateur·ice", "user_search": "Recherche de comptes",
"who_to_follow": "Qui suivre", "who_to_follow": "Suggestion de suivit",
"preferences": "Préférences", "preferences": "Préférences",
"search": "Recherche", "search": "Recherche",
"administration": "Administration", "administration": "Administration",
"chats": "Chats", "chats": "Chats",
"bookmarks": "Marques-Pages" "bookmarks": "Marques-Pages",
"timelines": "Flux",
"home_timeline": "Flux personnel"
}, },
"notifications": { "notifications": {
"broken_favorite": "Message inconnu, chargement…", "broken_favorite": "Message inconnu, recherche en cours…",
"favorited_you": "a aimé votre statut", "favorited_you": "a aimé votre statut",
"followed_you": "a commencé à vous suivre", "followed_you": "vous suit",
"load_older": "Charger les notifications précédentes", "load_older": "Charger les notifications précédentes",
"notifications": "Notifications", "notifications": "Notifications",
"read": "Lu !", "read": "Lu !",
@ -103,7 +110,8 @@
"no_more_notifications": "Aucune notification supplémentaire", "no_more_notifications": "Aucune notification supplémentaire",
"migrated_to": "a migré à", "migrated_to": "a migré à",
"reacted_with": "a réagi avec {0}", "reacted_with": "a réagi avec {0}",
"follow_request": "veut vous suivre" "follow_request": "veut vous suivre",
"error": "Erreur de chargement des notifications: {0}"
}, },
"interactions": { "interactions": {
"favs_repeats": "Partages et favoris", "favs_repeats": "Partages et favoris",
@ -115,7 +123,7 @@
"new_status": "Poster un nouveau statut", "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": "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é", "account_not_locked_warning_link": "verrouillé",
"attachments_sensitive": "Marquer le média comme sensible", "attachments_sensitive": "Marquer les pièce-jointes comme sensible",
"content_type": { "content_type": {
"text/plain": "Texte brut", "text/plain": "Texte brut",
"text/html": "HTML", "text/html": "HTML",
@ -130,32 +138,33 @@
"scope_notice": { "scope_notice": {
"public": "Ce statut sera visible par tout le monde", "public": "Ce statut sera visible par tout le monde",
"private": "Ce statut sera visible par seulement vos abonné⋅e⋅s", "private": "Ce statut sera visible par seulement vos abonné⋅e⋅s",
"unlisted": "Ce statut ne sera pas visible dans le Fil d'actualité public et l'Ensemble du réseau connu" "unlisted": "Ce statut ne sera pas visible dans le Flux Public et le Flux Fédéré"
}, },
"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 billets", "private": "Abonné·e·s uniquement - Seul·e·s vos abonné·e·s verront vos status",
"public": "Publique - Afficher dans les fils publics", "public": "Publique - Afficher dans les flux publics",
"unlisted": "Non-Listé - Ne pas afficher dans les fils 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",
"empty_status_error": "Impossible de poster un statut vide sans attachements", "empty_status_error": "Impossible de poster un statut vide sans pièces-jointes",
"preview_empty": "Vide", "preview_empty": "Vide",
"preview": "Prévisualisation", "preview": "Prévisualisation",
"media_description": "Description de l'attachement" "media_description": "Description de la pièce-jointe",
"post": "Post"
}, },
"registration": { "registration": {
"bio": "Biographie", "bio": "Biographie",
"email": "Adresse mail", "email": "Courriel",
"fullname": "Pseudonyme", "fullname": "Pseudonyme",
"password_confirm": "Confirmation du mot de passe", "password_confirm": "Confirmation du mot de passe",
"registration": "Inscription", "registration": "Inscription",
"token": "Jeton d'invitation", "token": "Jeton d'invitation",
"captcha": "CAPTCHA", "captcha": "CAPTCHA",
"new_captcha": "Cliquez sur l'image pour avoir un nouveau captcha", "new_captcha": "Cliquez sur l'image pour avoir un nouveau captcha",
"username_placeholder": "p.e. lain", "username_placeholder": "ex. lain",
"fullname_placeholder": "p.e. Lain Iwakura", "fullname_placeholder": "ex. Lain Iwakura",
"bio_placeholder": "p.e.\nSalut, je suis Lain\nJe suis une héroïne d'animé qui vit dans une banlieue japonaise. Vous me connaissez peut-être du Wired.", "bio_placeholder": "ex.\nSalut, je suis Lain\nJe suis une héroïne d'animation qui vit dans une banlieue japonaise. Vous me connaissez peut-être du Wired.",
"validations": { "validations": {
"username_required": "ne peut pas être laissé vide", "username_required": "ne peut pas être laissé vide",
"fullname_required": "ne peut pas être laissé vide", "fullname_required": "ne peut pas être laissé vide",
@ -163,7 +172,10 @@
"password_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_required": "ne peut pas être laissé vide",
"password_confirmation_match": "doit être identique au mot de passe" "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"
}, },
"selectable_list": { "selectable_list": {
"select_all": "Tout selectionner" "select_all": "Tout selectionner"
@ -177,20 +189,20 @@
"setup_otp": "Configurer OTP", "setup_otp": "Configurer OTP",
"wait_pre_setup_otp": "préconfiguration OTP", "wait_pre_setup_otp": "préconfiguration OTP",
"confirm_and_enable": "Confirmer & activer OTP", "confirm_and_enable": "Confirmer & activer OTP",
"title": "Double authentification", "title": "Authentification double-facteur",
"generate_new_recovery_codes": "Générer de nouveaux codes de récupération", "generate_new_recovery_codes": "Générer de nouveaux codes de récupération",
"warning_of_generate_new_codes": "Quand vous générez de nouveauc codes de récupération, vos anciens codes ne fonctionnerons plus.", "warning_of_generate_new_codes": "Quand vous générez de nouveaux codes de récupération, vos anciens codes ne fonctionnerons plus.",
"recovery_codes": "Codes de récupération.", "recovery_codes": "Codes de récupération.",
"waiting_a_recovery_codes": "Réception des codes de récupération…", "waiting_a_recovery_codes": "Réception des codes de récupération…",
"recovery_codes_warning": "Écrivez les codes ou sauvez les quelquepart sécurisé - sinon vous ne les verrez plus jamais. Si vous perdez l'accès à votre application de double authentification et codes de récupération vous serez vérouillé en dehors de votre compte.", "recovery_codes_warning": "Écrivez ces codes ou sauvegardez les dans un endroit sécurisé - sinon vous ne les verrez plus jamais. Si vous perdez l'accès à votre application de double authentification et codes de récupération vous serez verrouillé en dehors de votre compte.",
"authentication_methods": "Methodes d'authentification", "authentication_methods": "Méthodes d'authentification",
"scan": { "scan": {
"title": "Scanner", "title": "Scanner",
"desc": "En utilisant votre application de double authentification, scannez ce QR code ou entrez la clé textuelle :", "desc": "En utilisant votre application d'authentification à double-facteur, scannez ce QR code ou entrez la clé textuelle :",
"secret_code": "Clé" "secret_code": "Clé"
}, },
"verify": { "verify": {
"desc": "Pour activer la double authentification, entrez le code depuis votre application:" "desc": "Pour activer l'authentification à double-facteur, entrez le code donné par votre application :"
} }
}, },
"attachmentRadius": "Pièces jointes", "attachmentRadius": "Pièces jointes",
@ -201,10 +213,10 @@
"background": "Arrière-plan", "background": "Arrière-plan",
"bio": "Biographie", "bio": "Biographie",
"block_export": "Export des comptes bloqués", "block_export": "Export des comptes bloqués",
"block_export_button": "Export des comptes bloqués vers un fichier csv", "block_export_button": "Export des comptes bloqués vers un fichier CSV",
"block_import": "Import des comptes bloqués", "block_import": "Import des comptes bloqués",
"block_import_error": "Erreur lors de l'import des comptes bloqués", "block_import_error": "Erreur lors de l'import des comptes bloqués",
"blocks_imported": "Blocks importés! Le traitement va prendre un moment.", "blocks_imported": "Blocages importés! Le traitement va prendre un moment.",
"blocks_tab": "Bloqué·e·s", "blocks_tab": "Bloqué·e·s",
"btnRadius": "Boutons", "btnRadius": "Boutons",
"cBlue": "Bleu (répondre, suivre)", "cBlue": "Bleu (répondre, suivre)",
@ -224,31 +236,31 @@
"default_vis": "Visibilité par défaut", "default_vis": "Visibilité par défaut",
"delete_account": "Supprimer le compte", "delete_account": "Supprimer le compte",
"delete_account_description": "Supprimer définitivement vos données et désactiver votre compte.", "delete_account_description": "Supprimer définitivement vos données et désactiver votre compte.",
"delete_account_error": "Il y a eu un problème lors de la tentative de suppression de votre compte. Si le problème persiste, contactez l'administrateur⋅ice de cette instance.", "delete_account_error": "Il y a eu un problème lors de la tentative de suppression de votre compte. Si le problème persiste, contactez l'administration de cette instance.",
"delete_account_instructions": "Indiquez votre mot de passe ci-dessous pour confirmer la suppression de votre compte.", "delete_account_instructions": "Indiquez votre mot de passe ci-dessous pour confirmer la suppression de votre compte.",
"avatar_size_instruction": "La taille minimale recommandée pour l'image de l'avatar est de 150x150 pixels.", "avatar_size_instruction": "La taille minimale recommandée pour l'image de l'avatar est de 150x150 pixels.",
"export_theme": "Enregistrer le thème", "export_theme": "Enregistrer le thème",
"filtering": "Filtre", "filtering": "Filtrage",
"filtering_explanation": "Tous les statuts contenant ces mots seront masqués. Un mot par ligne", "filtering_explanation": "Tous les statuts contenant ces mots seront masqués. Un mot par ligne",
"follow_export": "Exporter les abonnements", "follow_export": "Exporter les suivis",
"follow_export_button": "Exporter les abonnements en csv", "follow_export_button": "Exporter les suivis dans un fichier CSV",
"follow_import": "Importer des abonnements", "follow_import": "Import des suivis",
"follow_import_error": "Erreur lors de l'importation des abonnements", "follow_import_error": "Erreur lors de l'importation des suivis",
"follows_imported": "Abonnements importés ! Le traitement peut prendre un moment.", "follows_imported": "Suivis importés ! Le traitement peut prendre un moment.",
"foreground": "Premier plan", "foreground": "Premier plan",
"general": "Général", "general": "Général",
"hide_attachments_in_convo": "Masquer les pièces jointes dans les conversations", "hide_attachments_in_convo": "Masquer les pièces jointes dans les conversations",
"hide_attachments_in_tl": "Masquer les pièces jointes dans le journal", "hide_attachments_in_tl": "Masquer les pièces jointes dans le flux",
"hide_muted_posts": "Masquer les statuts des utilisateurs masqués", "hide_muted_posts": "Masquer les statuts des comptes masqués",
"max_thumbnails": "Nombre maximum de miniatures par statuts", "max_thumbnails": "Nombre maximum de miniatures par statuts",
"hide_isp": "Masquer le panneau spécifique a l'instance", "hide_isp": "Masquer le panneau de l'instance",
"preload_images": "Précharger les images", "preload_images": "Précharger les images",
"use_one_click_nsfw": "Ouvrir les pièces-jointes NSFW avec un seul clic", "use_one_click_nsfw": "Ouvrir les pièces-jointes sensibles avec un seul clic",
"hide_post_stats": "Masquer les statistiques de publication (le nombre de favoris)", "hide_post_stats": "Masquer les statistiques des messages (ex. le nombre de favoris)",
"hide_user_stats": "Masquer les statistiques de profil (le nombre d'amis)", "hide_user_stats": "Masquer les statistiques de compte (ex. le nombre de suivis)",
"hide_filtered_statuses": "Masquer les statuts filtrés", "hide_filtered_statuses": "Masquer les statuts filtrés",
"import_blocks_from_a_csv_file": "Importer les blocages depuis un fichier csv", "import_blocks_from_a_csv_file": "Import de blocages depuis un fichier CSV",
"import_followers_from_a_csv_file": "Importer des abonnements depuis un fichier csv", "import_followers_from_a_csv_file": "Import de suivis depuis un fichier CSV",
"import_theme": "Charger le thème", "import_theme": "Charger le thème",
"inputRadius": "Champs de texte", "inputRadius": "Champs de texte",
"checkboxRadius": "Cases à cocher", "checkboxRadius": "Cases à cocher",
@ -269,7 +281,7 @@
"name_bio": "Nom & Bio", "name_bio": "Nom & Bio",
"new_password": "Nouveau mot de passe", "new_password": "Nouveau mot de passe",
"notification_visibility": "Types de notifications à afficher", "notification_visibility": "Types de notifications à afficher",
"notification_visibility_follows": "Abonnements", "notification_visibility_follows": "Suivis",
"notification_visibility_likes": "J'aime", "notification_visibility_likes": "J'aime",
"notification_visibility_mentions": "Mentionnés", "notification_visibility_mentions": "Mentionnés",
"notification_visibility_repeats": "Partages", "notification_visibility_repeats": "Partages",
@ -278,8 +290,8 @@
"no_mutes": "Aucun masqués", "no_mutes": "Aucun masqués",
"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'Administrateur⋅ice sur mon profil", "show_admin_badge": "Afficher le badge d'Admin sur mon profil",
"show_moderator_badge": "Afficher le badge de Modérateur⋅ice sur mon profil", "show_moderator_badge": "Afficher le badge de Modo' sur mon profil",
"nsfw_clickthrough": "Activer le clic pour dévoiler les pièces jointes et cacher l'aperçu des liens pour les statuts marqués comme sensibles", "nsfw_clickthrough": "Activer le clic pour dévoiler les pièces jointes et cacher l'aperçu des liens pour les statuts marqués comme sensibles",
"oauth_tokens": "Jetons OAuth", "oauth_tokens": "Jetons OAuth",
"token": "Jeton", "token": "Jeton",
@ -289,11 +301,11 @@
"panelRadius": "Fenêtres", "panelRadius": "Fenêtres",
"pause_on_unfocused": "Suspendre le streaming lorsque l'onglet n'est pas actif", "pause_on_unfocused": "Suspendre le streaming lorsque l'onglet n'est pas actif",
"presets": "Thèmes prédéfinis", "presets": "Thèmes prédéfinis",
"profile_background": "Image de fond", "profile_background": "Image de fond de profil",
"profile_banner": "Bannière de profil", "profile_banner": "Bannière de profil",
"profile_tab": "Profil", "profile_tab": "Profil",
"radii_help": "Vous pouvez ici choisir le niveau d'arrondi des angles de l'interface (en pixels)", "radii_help": "Vous pouvez ici choisir le niveau d'arrondi des angles de l'interface (en pixels)",
"replies_in_timeline": "Réponses au journal", "replies_in_timeline": "Réponses dans le flux",
"reply_visibility_all": "Montrer toutes les réponses", "reply_visibility_all": "Montrer toutes les réponses",
"reply_visibility_following": "Afficher uniquement les réponses adressées à moi ou aux personnes que je suis", "reply_visibility_following": "Afficher uniquement les réponses adressées à moi ou aux personnes que je suis",
"reply_visibility_self": "Afficher uniquement les réponses adressées à moi", "reply_visibility_self": "Afficher uniquement les réponses adressées à moi",
@ -309,7 +321,7 @@
"set_new_profile_background": "Changer d'image de fond", "set_new_profile_background": "Changer d'image de fond",
"set_new_profile_banner": "Changer de bannière", "set_new_profile_banner": "Changer de bannière",
"settings": "Paramètres", "settings": "Paramètres",
"subject_input_always_show": "Toujours copier le champ de sujet", "subject_input_always_show": "Toujours afficher le champ Sujet",
"subject_line_behavior": "Copier le sujet en répondant", "subject_line_behavior": "Copier le sujet en répondant",
"subject_line_email": "Similaire au courriel: « re: sujet »", "subject_line_email": "Similaire au courriel: « re: sujet »",
"subject_line_mastodon": "Comme mastodon: copier tel quel", "subject_line_mastodon": "Comme mastodon: copier tel quel",
@ -348,7 +360,7 @@
"use_snapshot": "Ancienne version", "use_snapshot": "Ancienne version",
"help": { "help": {
"upgraded_from_v2": "PleromaFE à été mis à jour, le thème peut être un peu différent que dans vos souvenirs.", "upgraded_from_v2": "PleromaFE à été mis à jour, le thème peut être un peu différent que dans vos souvenirs.",
"v2_imported": "Le fichier que vous avez importé vient d'un version antérieure. Nous essayons de maximizer la compatibilité mais il peu y avoir quelques incohérences.", "v2_imported": "Le fichier que vous avez importé vient d'une version antérieure. Nous essayons de maximizer la compatibilité mais il peut y avoir quelques incohérences.",
"future_version_imported": "Le fichier importé viens d'une version postérieure de PleromaFE.", "future_version_imported": "Le fichier importé viens d'une version postérieure de PleromaFE.",
"older_version_imported": "Le fichier importé viens d'une version antérieure de PleromaFE.", "older_version_imported": "Le fichier importé viens d'une version antérieure de PleromaFE.",
"snapshot_source_mismatch": "Conflict de version : Probablement due à un retour arrière puis remise à jour de la version de PleromaFE, si vous avez charger le thème en utilisant une version antérieure vous voulez probablement utiliser la version antérieure, autrement utiliser la version postérieure.", "snapshot_source_mismatch": "Conflict de version : Probablement due à un retour arrière puis remise à jour de la version de PleromaFE, si vous avez charger le thème en utilisant une version antérieure vous voulez probablement utiliser la version antérieure, autrement utiliser la version postérieure.",
@ -432,7 +444,7 @@
"filter_hint": { "filter_hint": {
"always_drop_shadow": "Attention, cette ombre utilise toujours {0} quand le navigateur le supporte.", "always_drop_shadow": "Attention, cette ombre utilise toujours {0} quand le navigateur le supporte.",
"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 a la fois les ombres internes et non-internes sur les avatars peut fournir des résultats innatendus 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}"
}, },
@ -487,15 +499,15 @@
}, },
"change_email": "Changer de courriel", "change_email": "Changer de courriel",
"domain_mutes": "Domaines", "domain_mutes": "Domaines",
"pad_emoji": "Rajouter un espace autour de l'émoji après lavoir choisit", "pad_emoji": "Entourer les émoji d'espaces après leur sélections",
"notification_visibility_emoji_reactions": "Réactions", "notification_visibility_emoji_reactions": "Réactions",
"hide_follows_count_description": "Masquer le nombre de suivis", "hide_follows_count_description": "Masquer le nombre de suivis",
"useStreamingApiWarning": "(Non recommandé, expérimental, connu pour rater des messages)", "useStreamingApiWarning": "(Non recommandé, expérimental, connu pour rater des messages)",
"type_domains_to_mute": "Chercher les domaines à masquer", "type_domains_to_mute": "Chercher les domaines à masquer",
"fun": "Rigolo", "fun": "Rigolo",
"greentext": "greentexting", "greentext": "greentexting",
"allow_following_move": "Suivre automatiquement quand ce compte migre", "allow_following_move": "Activer le suivit automatique à la migration des comptes",
"change_email_error": "Il y a eu un problème pour charger votre courriel.", "change_email_error": "Il y a eu un problème pour changer votre courriel.",
"changed_email": "Courriel changé avec succès !", "changed_email": "Courriel changé avec succès !",
"discoverable": "Permettre de découvrir ce compte dans les résultats de recherche web et autres services", "discoverable": "Permettre de découvrir ce compte dans les résultats de recherche web et autres services",
"emoji_reactions_on_timeline": "Montrer les émojis-réactions dans le flux", "emoji_reactions_on_timeline": "Montrer les émojis-réactions dans le flux",
@ -510,7 +522,7 @@
"accent": "Accent", "accent": "Accent",
"chatMessageRadius": "Message de chat", "chatMessageRadius": "Message de chat",
"bot": "Ce compte est un robot", "bot": "Ce compte est un robot",
"import_mutes_from_a_csv_file": "Importer les masquages depuis un fichier CSV", "import_mutes_from_a_csv_file": "Import de masquages depuis un fichier CSV",
"mutes_imported": "Masquages importés! Leur application peut prendre du temps.", "mutes_imported": "Masquages importés! Leur application peut prendre du temps.",
"mute_import_error": "Erreur à l'import des masquages", "mute_import_error": "Erreur à l'import des masquages",
"mute_import": "Import des masquages", "mute_import": "Import des masquages",
@ -518,24 +530,36 @@
"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": "Cacher l'expé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 du fil d'actualité", "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 ?",
"reset_banner_confirm": "Voulez-vraiment réinitialiser la bannière ?", "reset_banner_confirm": "Voulez-vraiment réinitialiser la bannière ?",
"reset_avatar_confirm": "Voulez-vraiment réinitialiser l'avatar ?", "reset_avatar_confirm": "Voulez-vraiment réinitialiser l'avatar ?",
"reset_profile_banner": "Réinitialiser la bannière du profil", "reset_profile_banner": "Réinitialiser la bannière du profil",
"reset_profile_background": "Réinitialiser l'arrière-plan du profil", "reset_profile_background": "Réinitialiser le fond du profil",
"reset_avatar": "Réinitialiser l'avatar", "reset_avatar": "Réinitialiser l'avatar",
"profile_fields": { "profile_fields": {
"value": "Contenu", "value": "Contenu",
"name": "Étiquette", "name": "Nom du champ",
"add_field": "Ajouter un champ" "add_field": "Ajouter un champ",
} "label": "Champs du profil"
},
"hide_media_previews": "Cacher la prévisualisation des pièces jointes",
"mutes_and_blocks": "Masquage et Blocages",
"setting_changed": "Préférence modifiée",
"more_settings": "Plus de préférences",
"sensitive_by_default": "Marquer les messages comme sensible par défaut",
"reply_visibility_self_short": "Uniquement les réponses à moi",
"reply_visibility_following_short": "Montrer les réponses à mes suivis",
"hide_wallpaper": "Cacher le fond d'écran",
"hide_all_muted_posts": "Cacher les messages masqués",
"word_filter": "Filtrage par mots",
"save": "Enregistrer les changements"
}, },
"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 plus", "load_older": "Afficher des status plus ancien",
"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",
@ -543,14 +567,16 @@
"no_more_statuses": "Pas plus de statuts", "no_more_statuses": "Pas plus de statuts",
"no_statuses": "Aucun statuts", "no_statuses": "Aucun statuts",
"reload": "Recharger", "reload": "Recharger",
"error": "Erreur lors de l'affichage du fil d'actualité : {0}" "error": "Erreur lors de l'affichage du flux : {0}",
"socket_broke": "Connexion temps-réel perdue : CloseEvent code {0}",
"socket_reconnected": "Connexion temps-réel établie"
}, },
"status": { "status": {
"favorites": "Favoris", "favorites": "Favoris",
"repeats": "Partages", "repeats": "Partages",
"delete": "Supprimer statuts", "delete": "Supprimer statuts",
"pin": "Agraffer sur le profil", "pin": "Agrafer sur le profil",
"unpin": "Dégraffer du profil", "unpin": "Dégrafer du profil",
"pinned": "Agraffé", "pinned": "Agraffé",
"delete_confirm": "Voulez-vous vraiment supprimer ce statuts ?", "delete_confirm": "Voulez-vous vraiment supprimer ce statuts ?",
"reply_to": "Réponse à", "reply_to": "Réponse à",
@ -630,10 +656,17 @@
"moderator": "Modérateur⋅ice", "moderator": "Modérateur⋅ice",
"admin": "Administrateur⋅ice" "admin": "Administrateur⋅ice"
}, },
"message": "Message" "message": "Message",
"highlight": {
"disabled": "Sans mise-en-valeur",
"solid": "Fond uni",
"side": "Coté rayé",
"striped": "Fond rayé"
},
"bot": "Robot"
}, },
"user_profile": { "user_profile": {
"timeline_title": "Journal de l'utilisateur⋅ice", "timeline_title": "Flux du compte",
"profile_does_not_exist": "Désolé, ce profil n'existe pas.", "profile_does_not_exist": "Désolé, ce profil n'existe pas.",
"profile_loading_error": "Désolé, il y a eu une erreur au chargement du profil." "profile_loading_error": "Désolé, il y a eu une erreur au chargement du profil."
}, },
@ -669,45 +702,45 @@
"message": "Envoi échoué : {0}" "message": "Envoi échoué : {0}"
}, },
"file_size_units": { "file_size_units": {
"B": "O", "B": "o",
"KiB": "KiO", "KiB": "Ko",
"MiB": "MiO", "MiB": "Mo",
"GiB": "GiO", "GiB": "Go",
"TiB": "TiO" "TiB": "To"
} }
}, },
"about": { "about": {
"mrf": { "mrf": {
"keyword": { "keyword": {
"reject": "Rejeté", "reject": "Rejette",
"replace": "Remplacer", "replace": "Remplace",
"keyword_policies": "Politiques par mot-clés", "keyword_policies": "Filtrage par mots-clés",
"ftl_removal": "Suppression du flux fédéré", "ftl_removal": "Suppression du flux fédéré",
"is_replaced_by": "→" "is_replaced_by": "→"
}, },
"simple": { "simple": {
"simple_policies": "Politiques par instances", "simple_policies": "Politiques par instances",
"accept": "Accepter", "accept": "Acceptées",
"accept_desc": "Cette instance accepte des messages seulement depuis ces instances :", "accept_desc": "Cette instance accepte les messages seulement depuis ces instances :",
"reject": "Rejeter", "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 enverras seulement des messages publics à ces instances :", "quarantine_desc": "Cette instance enverra seulement des messages publics à ces instances :",
"ftl_removal_desc": "Cette instance supprime ces instance du flux fédéré :", "ftl_removal_desc": "Cette instance supprime les instance suivantes du flux fédéré :",
"media_removal": "Suppression multimédia", "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 :",
"media_nsfw": "Force le contenu multimédia comme sensible", "media_nsfw": "Force le contenu multimédia comme sensible",
"ftl_removal": "Suppression du flux fédéré", "ftl_removal": "Supprimées du flux fédéré",
"media_nsfw_desc": "Cette instance force le contenu multimédia comme sensible pour les messages des instances suivantes :" "media_nsfw_desc": "Cette instance force les pièce-jointes comme sensible pour les messages des instances suivantes :"
}, },
"federation": "Fédération", "federation": "Fédération",
"mrf_policies": "Politiques MRF activées", "mrf_policies": "Politiques MRF actives",
"mrf_policies_desc": "Les politiques MRF modifient la fédération entre les instances. Les politiques suivantes sont activées :" "mrf_policies_desc": "Les politiques MRF modifient la fédération entre les instances. Les politiques suivantes sont activées :"
}, },
"staff": "Staff" "staff": "Staff"
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Muet", "mute": "Masqué",
"mute_progress": "Masquage…", "mute_progress": "Masquage…",
"unmute": "Démasquer", "unmute": "Démasquer",
"unmute_progress": "Démasquage…" "unmute_progress": "Démasquage…"
@ -724,7 +757,9 @@
"expires_in": "Fin du sondage dans {0}", "expires_in": "Fin du sondage dans {0}",
"not_enough_options": "Trop peu d'options unique au sondage", "not_enough_options": "Trop peu d'options unique au sondage",
"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",
"votes_count": "{count} vote | {count} votes"
}, },
"emoji": { "emoji": {
"emoji": "Émoji", "emoji": "Émoji",
@ -735,11 +770,11 @@
"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": "Stickers",
"keep_open": "Garder le sélecteur ouvert" "keep_open": "Garder ouvert"
}, },
"remote_user_resolver": { "remote_user_resolver": {
"error": "Non trouvé.", "error": "Non trouvé.",
"searching_for": "Rechercher", "searching_for": "Recherche pour",
"remote_user_resolver": "Résolution de compte distant" "remote_user_resolver": "Résolution de compte distant"
}, },
"time": { "time": {

View file

@ -27,7 +27,7 @@
"mentions": "Menzioni", "mentions": "Menzioni",
"public_tl": "Sequenza pubblica", "public_tl": "Sequenza pubblica",
"timeline": "Sequenza personale", "timeline": "Sequenza personale",
"twkn": "Sequenza globale", "twkn": "Sequenza federale",
"chat": "Chat della stanza", "chat": "Chat della stanza",
"friend_requests": "Vogliono seguirti", "friend_requests": "Vogliono seguirti",
"about": "Informazioni", "about": "Informazioni",
@ -41,14 +41,15 @@
"preferences": "Preferenze", "preferences": "Preferenze",
"bookmarks": "Segnalibri", "bookmarks": "Segnalibri",
"chats": "Conversazioni", "chats": "Conversazioni",
"timelines": "Sequenze" "timelines": "Sequenze",
"home_timeline": "Sequenza personale"
}, },
"notifications": { "notifications": {
"followed_you": "ti segue", "followed_you": "ti segue",
"notifications": "Notifiche", "notifications": "Notifiche",
"read": "Letto!", "read": "Letto!",
"broken_favorite": "Stato sconosciuto, lo sto cercando…", "broken_favorite": "Stato sconosciuto, lo sto cercando…",
"favorited_you": "gradisce il tuo messaggio", "favorited_you": "ha gradito",
"load_older": "Carica notifiche precedenti", "load_older": "Carica notifiche precedenti",
"repeated_you": "ha condiviso il tuo messaggio", "repeated_you": "ha condiviso il tuo messaggio",
"follow_request": "vuole seguirti", "follow_request": "vuole seguirti",
@ -71,10 +72,10 @@
"name_bio": "Nome ed introduzione", "name_bio": "Nome ed introduzione",
"nsfw_clickthrough": "Fai click per visualizzare gli allegati offuscati", "nsfw_clickthrough": "Fai click per visualizzare gli allegati offuscati",
"profile_background": "Sfondo della tua pagina", "profile_background": "Sfondo della tua pagina",
"profile_banner": "Stendardo del tuo profilo", "profile_banner": "Gonfalone del tuo profilo",
"set_new_avatar": "Scegli una nuova icona", "set_new_avatar": "Scegli una nuova icona",
"set_new_profile_background": "Scegli un nuovo sfondo per la tua pagina", "set_new_profile_background": "Scegli un nuovo sfondo",
"set_new_profile_banner": "Scegli un nuovo stendardo per il tuo profilo", "set_new_profile_banner": "Scegli un nuovo gonfalone",
"settings": "Impostazioni", "settings": "Impostazioni",
"theme": "Tema", "theme": "Tema",
"user_settings": "Impostazioni Utente", "user_settings": "Impostazioni Utente",
@ -83,9 +84,9 @@
"avatarRadius": "Icone utente", "avatarRadius": "Icone utente",
"background": "Sfondo", "background": "Sfondo",
"btnRadius": "Pulsanti", "btnRadius": "Pulsanti",
"cBlue": "Blu (risposte, seguire)", "cBlue": "Blu (rispondi, segui)",
"cGreen": "Verde (ripeti)", "cGreen": "Verde (ripeti)",
"cOrange": "Arancione (gradire)", "cOrange": "Arancione (gradisci)",
"cRed": "Rosso (annulla)", "cRed": "Rosso (annulla)",
"change_password": "Cambia password", "change_password": "Cambia password",
"change_password_error": "C'è stato un problema durante il cambiamento della password.", "change_password_error": "C'è stato un problema durante il cambiamento della password.",
@ -98,7 +99,7 @@
"delete_account": "Elimina profilo", "delete_account": "Elimina profilo",
"delete_account_description": "Elimina definitivamente i tuoi dati e disattiva il tuo profilo.", "delete_account_description": "Elimina definitivamente i tuoi dati e disattiva il tuo profilo.",
"delete_account_error": "C'è stato un problema durante l'eliminazione del tuo profilo. Se il problema persiste contatta l'amministratore della tua stanza.", "delete_account_error": "C'è stato un problema durante l'eliminazione del tuo profilo. Se il problema persiste contatta l'amministratore della tua stanza.",
"delete_account_instructions": "Digita la tua password nel campo sottostante per confermare l'eliminazione del tuo profilo.", "delete_account_instructions": "Digita la tua password nel campo sottostante per eliminare il tuo profilo.",
"export_theme": "Salva impostazioni", "export_theme": "Salva impostazioni",
"follow_export": "Esporta la lista di chi segui", "follow_export": "Esporta la lista di chi segui",
"follow_export_button": "Esporta la lista di chi segui in un file CSV", "follow_export_button": "Esporta la lista di chi segui in un file CSV",
@ -109,7 +110,7 @@
"foreground": "Primo piano", "foreground": "Primo piano",
"general": "Generale", "general": "Generale",
"hide_post_stats": "Nascondi statistiche dei messaggi (es. il numero di preferenze)", "hide_post_stats": "Nascondi statistiche dei messaggi (es. il numero di preferenze)",
"hide_user_stats": "Nascondi statistiche dell'utente (es. il numero dei tuoi seguaci)", "hide_user_stats": "Nascondi statistiche dell'utente (es. il numero di seguaci)",
"import_followers_from_a_csv_file": "Importa una lista di chi segui da un file CSV", "import_followers_from_a_csv_file": "Importa una lista di chi segui da un file CSV",
"import_theme": "Carica impostazioni", "import_theme": "Carica impostazioni",
"inputRadius": "Campi di testo", "inputRadius": "Campi di testo",
@ -118,12 +119,12 @@
"invalid_theme_imported": "Il file selezionato non è un tema supportato da Pleroma. Il tuo tema non è stato modificato.", "invalid_theme_imported": "Il file selezionato non è un tema supportato da Pleroma. Il tuo tema non è stato modificato.",
"limited_availability": "Non disponibile nel tuo browser", "limited_availability": "Non disponibile nel tuo browser",
"links": "Collegamenti", "links": "Collegamenti",
"lock_account_description": "Limita il tuo account solo a seguaci approvati", "lock_account_description": "Vaglia manualmente i nuovi seguaci",
"loop_video": "Riproduci video in ciclo continuo", "loop_video": "Riproduci video in ciclo continuo",
"loop_video_silent_only": "Riproduci solo video senza audio in ciclo continuo (es. le \"gif\" di Mastodon)", "loop_video_silent_only": "Riproduci solo video muti in ciclo continuo (es. le \"gif\" di Mastodon)",
"new_password": "Nuova password", "new_password": "Nuova password",
"notification_visibility": "Tipi di notifiche da mostrare", "notification_visibility": "Tipi di notifiche da mostrare",
"notification_visibility_follows": "Nuove persone ti seguono", "notification_visibility_follows": "Nuovi seguaci",
"notification_visibility_likes": "Preferiti", "notification_visibility_likes": "Preferiti",
"notification_visibility_mentions": "Menzioni", "notification_visibility_mentions": "Menzioni",
"notification_visibility_repeats": "Condivisioni", "notification_visibility_repeats": "Condivisioni",
@ -138,7 +139,7 @@
"presets": "Valori predefiniti", "presets": "Valori predefiniti",
"profile_tab": "Profilo", "profile_tab": "Profilo",
"radii_help": "Imposta il raggio degli angoli (in pixel)", "radii_help": "Imposta il raggio degli angoli (in pixel)",
"replies_in_timeline": "Risposte nella sequenza personale", "replies_in_timeline": "Risposte nelle sequenze",
"reply_visibility_all": "Mostra tutte le risposte", "reply_visibility_all": "Mostra tutte le risposte",
"reply_visibility_following": "Mostra solo le risposte rivolte a me o agli utenti che seguo", "reply_visibility_following": "Mostra solo le risposte rivolte a me o agli utenti che seguo",
"reply_visibility_self": "Mostra solo risposte rivolte a me", "reply_visibility_self": "Mostra solo risposte rivolte a me",
@ -148,7 +149,7 @@
"stop_gifs": "Riproduci GIF al passaggio del cursore", "stop_gifs": "Riproduci GIF al passaggio del cursore",
"streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina", "streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina",
"text": "Testo", "text": "Testo",
"theme_help": "Usa codici colore esadecimali (#rrggbb) per personalizzare il tuo schema di colori.", "theme_help": "Usa colori esadecimali (#rrggbb) per personalizzare il tuo schema di colori.",
"tooltipRadius": "Suggerimenti/avvisi", "tooltipRadius": "Suggerimenti/avvisi",
"values": { "values": {
"false": "no", "false": "no",
@ -156,7 +157,7 @@
}, },
"avatar_size_instruction": "La taglia minima per l'icona personale è 150x150 pixel.", "avatar_size_instruction": "La taglia minima per l'icona personale è 150x150 pixel.",
"domain_mutes": "Domini", "domain_mutes": "Domini",
"discoverable": "Permetti la scoperta di questo profilo da servizi di ricerca ed altro", "discoverable": "Permetti la scoperta di questo profilo a servizi di ricerca ed altro",
"composing": "Composizione", "composing": "Composizione",
"changed_email": "Email cambiata con successo!", "changed_email": "Email cambiata con successo!",
"change_email_error": "C'è stato un problema nel cambiare la tua email.", "change_email_error": "C'è stato un problema nel cambiare la tua email.",
@ -167,18 +168,18 @@
"block_import": "Importa blocchi", "block_import": "Importa blocchi",
"block_export_button": "Esporta i tuoi blocchi in un file CSV", "block_export_button": "Esporta i tuoi blocchi in un file CSV",
"block_export": "Esporta blocchi", "block_export": "Esporta blocchi",
"allow_following_move": "Consenti", "allow_following_move": "Consenti l'iscrizione automatica ai profili traslocati",
"mfa": { "mfa": {
"verify": { "verify": {
"desc": "Per abilitare l'autenticazione bifattoriale, inserisci il codice fornito dalla tua applicazione:" "desc": "Per abilitare l'autenticazione bifattoriale, inserisci il codice fornito dalla tua applicazione:"
}, },
"scan": { "scan": {
"secret_code": "Codice", "secret_code": "Codice",
"desc": "Con la tua applicazione bifattoriale, acquisisci questo QR o inserisci il codice manualmente:", "desc": "Con la tua applicazione bifattoriale, acquisisci il QR o inserisci il codice:",
"title": "Acquisisci" "title": "Acquisisci"
}, },
"authentication_methods": "Metodi di accesso", "authentication_methods": "Metodi di accesso",
"recovery_codes_warning": "Appuntati i codici o salvali in un posto sicuro, altrimenti rischi di non rivederli mai più. Se perderai l'accesso sia alla tua applicazione bifattoriale che ai codici di recupero non potrai più accedere al tuo profilo.", "recovery_codes_warning": "Metti i codici al sicuro, perché non potrai più visualizzarli. Se perderai l'accesso sia alla tua applicazione bifattoriale che ai codici di recupero non potrai più accedere al tuo profilo.",
"waiting_a_recovery_codes": "Ricevo codici di recupero…", "waiting_a_recovery_codes": "Ricevo codici di recupero…",
"recovery_codes": "Codici di recupero.", "recovery_codes": "Codici di recupero.",
"warning_of_generate_new_codes": "Alla generazione di nuovi codici di recupero, quelli vecchi saranno disattivati.", "warning_of_generate_new_codes": "Alla generazione di nuovi codici di recupero, quelli vecchi saranno disattivati.",
@ -197,14 +198,14 @@
"help": { "help": {
"older_version_imported": "Il tema importato è stato creato per una versione precedente dell'interfaccia.", "older_version_imported": "Il tema importato è stato creato per una versione precedente dell'interfaccia.",
"future_version_imported": "Il tema importato è stato creato per una versione più recente dell'interfaccia.", "future_version_imported": "Il tema importato è stato creato per una versione più recente dell'interfaccia.",
"v2_imported": "Il tema importato è stato creato per una vecchia interfaccia. Non tutto potrebbe essere come prima.", "v2_imported": "Il tema importato è stato creato per una vecchia interfaccia. Non tutto potrebbe essere come inteso.",
"upgraded_from_v2": "L'interfaccia è stata aggiornata, il tema potrebbe essere diverso da come lo intendevi.", "upgraded_from_v2": "L'interfaccia è stata aggiornata, il tema potrebbe essere diverso da come lo ricordi.",
"migration_snapshot_ok": "Ho caricato l'anteprima del tema. Puoi provare a caricarne i contenuti.", "migration_snapshot_ok": "Ho caricato l'anteprima del tema. Puoi provare a caricarne i contenuti.",
"fe_downgraded": "L'interfaccia è stata portata ad una versione precedente.", "fe_downgraded": "L'interfaccia è stata portata ad una versione precedente.",
"fe_upgraded": "Lo schema dei temi è stato aggiornato insieme all'interfaccia.", "fe_upgraded": "Lo schema dei temi è stato aggiornato insieme all'interfaccia.",
"snapshot_missing": "Il tema non è provvisto di anteprima, quindi potrebbe essere diverso da come appare.", "snapshot_missing": "Il tema non è provvisto di anteprima, quindi potrebbe essere diverso da come appare.",
"snapshot_present": "Tutti i valori sono sostituiti dall'anteprima del tema. Puoi invece caricare i suoi contenuti.", "snapshot_present": "Tutti i valori sono sostituiti dall'anteprima del tema. Puoi invece caricare i suoi contenuti.",
"snapshot_source_mismatch": "Conflitto di versione: probabilmente l'interfaccia è stata portata ad una versione precedente e poi aggiornata di nuovo. Se hai modificato il tema con una versione precedente dell'interfaccia, usa la vecchia versione del tema, altrimenti puoi usare la nuova.", "snapshot_source_mismatch": "Conflitto di versione: probabilmente l'interfaccia è stata portata indietro e poi aggiornata di nuovo. Se hai modificato il tema con una vecchia versione usa il tema precedente, altrimenti puoi usare il nuovo.",
"migration_napshot_gone": "Anteprima del tema non trovata, non tutto potrebbe essere come ricordi." "migration_napshot_gone": "Anteprima del tema non trovata, non tutto potrebbe essere come ricordi."
}, },
"use_source": "Nuova versione", "use_source": "Nuova versione",
@ -227,7 +228,7 @@
"contrast": { "contrast": {
"context": { "context": {
"text": "per il testo", "text": "per il testo",
"18pt": "per il testo grande (oltre 17pt)" "18pt": "per il testo oltre 17pt"
}, },
"level": { "level": {
"bad": "non soddisfa le linee guida di alcun livello", "bad": "non soddisfa le linee guida di alcun livello",
@ -250,7 +251,7 @@
"selectedMenu": "Voce menù selezionata", "selectedMenu": "Voce menù selezionata",
"selectedPost": "Messaggio selezionato", "selectedPost": "Messaggio selezionato",
"pressed": "Premuto", "pressed": "Premuto",
"highlight": "Elementi evidenziati", "highlight": "Elementi in risalto",
"icons": "Icone", "icons": "Icone",
"poll": "Grafico sondaggi", "poll": "Grafico sondaggi",
"underlay": "Sottostante", "underlay": "Sottostante",
@ -312,8 +313,8 @@
"fonts": { "fonts": {
"_tab_label": "Font", "_tab_label": "Font",
"custom": "Personalizzato", "custom": "Personalizzato",
"weight": "Peso (grassettatura)", "weight": "Grassettatura",
"size": "Dimensione (in pixel)", "size": "Dimensione in pixel",
"family": "Nome font", "family": "Nome font",
"components": { "components": {
"postCode": "Font a spaziatura fissa incluso in un messaggio", "postCode": "Font a spaziatura fissa incluso in un messaggio",
@ -348,7 +349,7 @@
"greentext": "Frecce da meme", "greentext": "Frecce da meme",
"upload_a_photo": "Carica un'immagine", "upload_a_photo": "Carica un'immagine",
"type_domains_to_mute": "Cerca domini da zittire", "type_domains_to_mute": "Cerca domini da zittire",
"theme_help_v2_2": "Le icone dietro alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se si usano delle trasparenze, questi indicatori mostrano il peggior caso possibile.", "theme_help_v2_2": "Le icone vicino alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se usani trasparenze, questi indicatori mostrano il peggior caso possibile.",
"theme_help_v2_1": "Puoi anche forzare colore ed opacità di alcuni elementi selezionando la casella. Usa il pulsante \"Azzera\" per azzerare tutte le forzature.", "theme_help_v2_1": "Puoi anche forzare colore ed opacità di alcuni elementi selezionando la casella. Usa il pulsante \"Azzera\" per azzerare tutte le forzature.",
"useStreamingApiWarning": "(Sconsigliato, sperimentale, può saltare messaggi)", "useStreamingApiWarning": "(Sconsigliato, sperimentale, può saltare messaggi)",
"useStreamingApi": "Ricevi messaggi e notifiche in tempo reale", "useStreamingApi": "Ricevi messaggi e notifiche in tempo reale",
@ -387,60 +388,70 @@
"preload_images": "Precarica immagini", "preload_images": "Precarica immagini",
"hide_isp": "Nascondi pannello della stanza", "hide_isp": "Nascondi pannello della stanza",
"max_thumbnails": "Numero massimo di anteprime per messaggio", "max_thumbnails": "Numero massimo di anteprime per messaggio",
"hide_muted_posts": "Nascondi messaggi degli utenti zilenziati", "hide_muted_posts": "Nascondi messaggi degli utenti silenziati",
"accent": "Accento", "accent": "Accento",
"emoji_reactions_on_timeline": "Mostra emoji di reazione sulle sequenze", "emoji_reactions_on_timeline": "Mostra reazioni nelle sequenze",
"pad_emoji": "Affianca spazi agli emoji inseriti tramite selettore", "pad_emoji": "Affianca spazi agli emoji inseriti tramite selettore",
"notification_blocks": "Bloccando un utente non riceverai più le sue notifiche né lo seguirai più.", "notification_blocks": "Bloccando un utente non riceverai più le sue notifiche né lo seguirai più.",
"mutes_and_blocks": "Zittiti e bloccati", "mutes_and_blocks": "Silenziati e bloccati",
"profile_fields": { "profile_fields": {
"value": "Contenuto", "value": "Contenuto",
"name": "Etichetta", "name": "Descrizione",
"add_field": "Aggiungi campo", "add_field": "Aggiungi campo",
"label": "Metadati profilo" "label": "Metadati profilo"
}, },
"bot": "Questo profilo è di un robot", "bot": "Questo è un robot",
"version": { "version": {
"frontend_version": "Versione interfaccia", "frontend_version": "Versione interfaccia",
"backend_version": "Versione backend", "backend_version": "Versione backend",
"title": "Versione" "title": "Versione"
}, },
"reset_avatar": "Azzera icona", "reset_avatar": "Azzera icona",
"reset_profile_background": "Azzera sfondo profilo", "reset_profile_background": "Azzera sfondo",
"reset_profile_banner": "Azzera stendardo profilo", "reset_profile_banner": "Azzera gonfalone",
"reset_avatar_confirm": "Vuoi veramente azzerare l'icona?", "reset_avatar_confirm": "Vuoi veramente azzerare l'icona?",
"reset_banner_confirm": "Vuoi veramente azzerare lo stendardo?", "reset_banner_confirm": "Vuoi veramente azzerare il gonfalone?",
"reset_background_confirm": "Vuoi veramente azzerare lo sfondo?", "reset_background_confirm": "Vuoi veramente azzerare lo sfondo?",
"chatMessageRadius": "Messaggi istantanei", "chatMessageRadius": "Messaggi istantanei",
"notification_setting_hide_notification_contents": "Nascondi mittente e contenuti delle notifiche push", "notification_setting_hide_notification_contents": "Nascondi mittente e contenuti delle notifiche push",
"notification_setting_block_from_strangers": "Blocca notifiche da utenti che non segui", "notification_setting_block_from_strangers": "Blocca notifiche da utenti che non segui",
"virtual_scrolling": "Velocizza l'elaborazione delle sequenze", "virtual_scrolling": "Velocizza l'elaborazione delle sequenze",
"import_mutes_from_a_csv_file": "Importa silenziati da un file CSV", "import_mutes_from_a_csv_file": "Importa silenziati da un file CSV",
"mutes_imported": "Silenziati importati! Saranno elaborati a breve.", "mutes_imported": "Silenziati importati! Elaborazione in corso.",
"mute_import_error": "Errore nell'importazione", "mute_import_error": "Errore nell'importazione",
"mute_import": "Importa silenziati", "mute_import": "Carica silenziati",
"mute_export_button": "Esporta la tua lista di silenziati in un file CSV", "mute_export_button": "Esporta i silenziati in un file CSV",
"mute_export": "Esporta silenziati", "mute_export": "Esporta silenziati",
"hide_wallpaper": "Nascondi sfondo della stanza", "hide_wallpaper": "Nascondi sfondo della stanza",
"setting_changed": "Valore personalizzato" "setting_changed": "Valore personalizzato",
"more_settings": "Altre impostazioni",
"sensitive_by_default": "Tutti i miei messaggi sono scabrosi",
"reply_visibility_self_short": "Vedi solo risposte a te",
"reply_visibility_following_short": "Vedi risposte a messaggi di altri",
"hide_all_muted_posts": "Nascondi messaggi silenziati",
"hide_media_previews": "Nascondi anteprime",
"word_filter": "Parole filtrate",
"save": "Salva modifiche"
}, },
"timeline": { "timeline": {
"error_fetching": "Errore nell'aggiornamento", "error_fetching": "Errore nell'aggiornamento",
"load_older": "Carica messaggi più vecchi", "load_older": "Carica messaggi più vecchi",
"show_new": "Mostra nuovi", "show_new": "Mostra nuovi",
"up_to_date": "Aggiornato", "up_to_date": "Aggiornato",
"collapse": "Riduci", "collapse": "Ripiega",
"conversation": "Conversazione", "conversation": "Conversazione",
"no_retweet_hint": "Il messaggio è diretto o solo per seguaci e non può essere condiviso", "no_retweet_hint": "Il messaggio è diretto o solo per seguaci e non può essere condiviso",
"repeated": "condiviso", "repeated": "ha condiviso",
"no_statuses": "Nessun messaggio", "no_statuses": "Nessun messaggio",
"no_more_statuses": "Fine dei messaggi", "no_more_statuses": "Fine dei messaggi",
"reload": "Ricarica", "reload": "Ricarica",
"error": "Errore nel caricare la sequenza: {0}" "error": "Errore nel caricare la sequenza: {0}",
"socket_broke": "Connessione tempo reale interrotta: codice {0}",
"socket_reconnected": "Connesso in tempo reale"
}, },
"user_card": { "user_card": {
"follow": "Segui", "follow": "Segui",
"followees": "Chi stai seguendo", "followees": "Segue",
"followers": "Seguaci", "followers": "Seguaci",
"following": "Seguìto!", "following": "Seguìto!",
"follows_you": "Ti segue!", "follows_you": "Ti segue!",
@ -454,13 +465,13 @@
"deny": "Nega", "deny": "Nega",
"remote_follow": "Segui da remoto", "remote_follow": "Segui da remoto",
"admin_menu": { "admin_menu": {
"delete_user_confirmation": "Ne sei completamente sicuro? Quest'azione non può essere annullata.", "delete_user_confirmation": "Ne sei completamente sicuro? Non potrai tornare indietro.",
"delete_user": "Elimina utente", "delete_user": "Elimina utente",
"quarantine": "I messaggi non arriveranno alle altre stanze", "quarantine": "I messaggi non arriveranno alle altre stanze",
"disable_any_subscription": "Rendi utente non seguibile", "disable_any_subscription": "Rendi utente non seguibile",
"disable_remote_subscription": "Blocca i tentativi di seguirlo da altre stanze", "disable_remote_subscription": "Blocca i tentativi di seguirlo da altre stanze",
"sandbox": "Rendi tutti i messaggi solo per seguaci", "sandbox": "Rendi tutti i messaggi solo per seguaci",
"force_unlisted": "Rendi tutti i messaggi invisibili", "force_unlisted": "Nascondi tutti i messaggi",
"strip_media": "Rimuovi ogni allegato ai messaggi", "strip_media": "Rimuovi ogni allegato ai messaggi",
"force_nsfw": "Oscura tutti i messaggi", "force_nsfw": "Oscura tutti i messaggi",
"delete_account": "Elimina profilo", "delete_account": "Elimina profilo",
@ -474,7 +485,7 @@
}, },
"show_repeats": "Mostra condivisioni", "show_repeats": "Mostra condivisioni",
"hide_repeats": "Nascondi condivisioni", "hide_repeats": "Nascondi condivisioni",
"mute_progress": "Zittisco…", "mute_progress": "Silenzio…",
"unmute_progress": "Riabilito…", "unmute_progress": "Riabilito…",
"unmute": "Riabilita", "unmute": "Riabilita",
"block_progress": "Blocco…", "block_progress": "Blocco…",
@ -483,7 +494,7 @@
"unsubscribe": "Disdici", "unsubscribe": "Disdici",
"subscribe": "Abbònati", "subscribe": "Abbònati",
"report": "Segnala", "report": "Segnala",
"mention": "Menzioni", "mention": "Menziona",
"media": "Media", "media": "Media",
"its_you": "Sei tu!", "its_you": "Sei tu!",
"hidden": "Nascosto", "hidden": "Nascosto",
@ -493,7 +504,13 @@
"follow_sent": "Richiesta inviata!", "follow_sent": "Richiesta inviata!",
"favorites": "Preferiti", "favorites": "Preferiti",
"message": "Contatta", "message": "Contatta",
"bot": "Bot" "bot": "Bot",
"highlight": {
"side": "Nastro a lato",
"striped": "A righe",
"solid": "Un colore",
"disabled": "Nessun risalto"
}
}, },
"chat": { "chat": {
"title": "Chat" "title": "Chat"
@ -549,21 +566,22 @@
"direct": "Diretto - Visibile solo agli utenti menzionati", "direct": "Diretto - Visibile solo agli utenti menzionati",
"private": "Solo per seguaci - Visibile solo dai tuoi seguaci", "private": "Solo per seguaci - Visibile solo dai tuoi seguaci",
"public": "Pubblico - Visibile sulla sequenza pubblica", "public": "Pubblico - Visibile sulla sequenza pubblica",
"unlisted": "Non elencato - Non visibile sulla sequenza pubblica" "unlisted": "Nascosto - Non visibile sulla sequenza pubblica"
}, },
"scope_notice": { "scope_notice": {
"unlisted": "Questo messaggio non sarà visibile sulla sequenza locale né su quella pubblica", "unlisted": "Questo messaggio non sarà visibile sulla sequenza locale né su quella pubblica",
"private": "Questo messaggio sarà visibile solo ai tuoi seguaci", "private": "Questo messaggio sarà visibile solo ai tuoi seguaci",
"public": "Questo messaggio sarà visibile a tutti" "public": "Questo messaggio sarà visibile a tutti"
}, },
"direct_warning_to_first_only": "Questo messaggio sarà visibile solo agli utenti menzionati all'inizio.", "direct_warning_to_first_only": "Questo messaggio sarà visibile solo agli utenti menzionati in testa.",
"direct_warning_to_all": "Questo messaggio sarà visibile a tutti i menzionati.", "direct_warning_to_all": "Questo messaggio sarà visibile a tutti i menzionati.",
"new_status": "Nuovo messaggio", "new_status": "Nuovo messaggio",
"empty_status_error": "Non puoi pubblicare messaggi vuoti senza allegati", "empty_status_error": "Aggiungi del testo o degli allegati",
"preview_empty": "Vuoto", "preview_empty": "Vuoto",
"preview": "Anteprima", "preview": "Anteprima",
"media_description_error": "Allegati non caricati, riprova", "media_description_error": "Allegati non caricati, riprova",
"media_description": "Descrizione allegati" "media_description": "Descrizione allegati",
"post": "Pubblica"
}, },
"registration": { "registration": {
"bio": "Introduzione", "bio": "Introduzione",
@ -583,13 +601,14 @@
"bio_placeholder": "es.\nCiao, sono Lupo Lucio.\nSono un lupo fantastico che vive nel Fantabosco. Forse mi hai visto alla Melevisione.", "bio_placeholder": "es.\nCiao, sono Lupo Lucio.\nSono un lupo fantastico che vive nel Fantabosco. Forse mi hai visto alla Melevisione.",
"fullname_placeholder": "es. Lupo Lucio", "fullname_placeholder": "es. Lupo Lucio",
"username_placeholder": "es. mister_wolf", "username_placeholder": "es. mister_wolf",
"new_captcha": "Clicca l'immagine per avere un altro captcha", "new_captcha": "Clicca il captcha per averne uno nuovo",
"captcha": "CAPTCHA", "captcha": "CAPTCHA",
"reason_placeholder": "L'amministratore esamina ciascuna richiesta.\nFornisci il motivo della tua iscrizione.", "reason_placeholder": "L'amministratore esamina ciascuna richiesta.\nFornisci il motivo della tua iscrizione.",
"reason": "Motivo dell'iscrizione" "reason": "Motivo dell'iscrizione",
"register": "Registrati"
}, },
"user_profile": { "user_profile": {
"timeline_title": "Sequenza dell'Utente", "timeline_title": "Sequenza dell'utente",
"profile_loading_error": "Spiacente, c'è stato un errore nel caricamento del profilo.", "profile_loading_error": "Spiacente, c'è stato un errore nel caricamento del profilo.",
"profile_does_not_exist": "Spiacente, questo profilo non esiste." "profile_does_not_exist": "Spiacente, questo profilo non esiste."
}, },
@ -605,7 +624,7 @@
"replace": "Sostituisci", "replace": "Sostituisci",
"is_replaced_by": "→", "is_replaced_by": "→",
"keyword_policies": "Regole per parole chiave", "keyword_policies": "Regole per parole chiave",
"ftl_removal": "Rimozione dalla sequenza globale" "ftl_removal": "Rimozione dalla sequenza federale"
}, },
"simple": { "simple": {
"reject": "Rifiuta", "reject": "Rifiuta",
@ -615,8 +634,8 @@
"reject_desc": "Questa stanza rifiuterà i messaggi provenienti dalle seguenti:", "reject_desc": "Questa stanza rifiuterà i messaggi provenienti dalle seguenti:",
"quarantine": "Quarantena", "quarantine": "Quarantena",
"quarantine_desc": "Questa stanza inoltrerà solo messaggi pubblici alle seguenti:", "quarantine_desc": "Questa stanza inoltrerà solo messaggi pubblici alle seguenti:",
"ftl_removal": "Rimozione dalla sequenza globale", "ftl_removal": "Rimozione dalla sequenza federale",
"ftl_removal_desc": "Questa stanza rimuove le seguenti dalla sequenza globale:", "ftl_removal_desc": "Questa stanza rimuove le seguenti dalla sequenza federale:",
"media_removal": "Rimozione multimedia", "media_removal": "Rimozione multimedia",
"media_removal_desc": "Questa istanza rimuove gli allegati dalle seguenti stanze:", "media_removal_desc": "Questa istanza rimuove gli allegati dalle seguenti stanze:",
"media_nsfw": "Allegati oscurati d'ufficio", "media_nsfw": "Allegati oscurati d'ufficio",
@ -705,8 +724,8 @@
"favorites": "Preferiti", "favorites": "Preferiti",
"hide_content": "Nascondi contenuti", "hide_content": "Nascondi contenuti",
"show_content": "Mostra contenuti", "show_content": "Mostra contenuti",
"hide_full_subject": "Nascondi intero oggetto", "hide_full_subject": "Nascondi oggetto intero",
"show_full_subject": "Mostra intero oggetto", "show_full_subject": "Mostra oggetto intero",
"thread_muted_and_words": ", contiene:", "thread_muted_and_words": ", contiene:",
"thread_muted": "Discussione silenziata", "thread_muted": "Discussione silenziata",
"copy_link": "Copia collegamento", "copy_link": "Copia collegamento",
@ -714,46 +733,46 @@
"unmute_conversation": "Riabilita conversazione", "unmute_conversation": "Riabilita conversazione",
"mute_conversation": "Silenzia conversazione", "mute_conversation": "Silenzia conversazione",
"replies_list": "Risposte:", "replies_list": "Risposte:",
"reply_to": "Rispondi a", "reply_to": "In risposta a",
"delete_confirm": "Vuoi veramente eliminare questo messaggio?", "delete_confirm": "Vuoi veramente eliminare questo messaggio?",
"unbookmark": "Rimuovi segnalibro", "unbookmark": "Rimuovi segnalibro",
"bookmark": "Aggiungi segnalibro", "bookmark": "Aggiungi segnalibro",
"status_deleted": "Questo messagio è stato cancellato", "status_deleted": "Questo messagio è stato cancellato",
"nsfw": "Pruriginoso", "nsfw": "DISDICEVOLE",
"external_source": "Vai al sito", "external_source": "Vai al sito",
"expand": "Espandi" "expand": "Espandi"
}, },
"time": { "time": {
"years_short": "{0}a", "years_short": "{0} a",
"year_short": "{0}a", "year_short": "{0} a",
"years": "{0} anni", "years": "{0} anni",
"year": "{0} anno", "year": "{0} anno",
"weeks_short": "{0}set", "weeks_short": "{0} set",
"week_short": "{0}set", "week_short": "{0} set",
"seconds_short": "{0}sec", "seconds_short": "{0} sec",
"second_short": "{0}sec", "second_short": "{0} sec",
"weeks": "{0} settimane", "weeks": "{0} settimane",
"week": "{0} settimana", "week": "{0} settimana",
"seconds": "{0} secondi", "seconds": "{0} secondi",
"second": "{0} secondo", "second": "{0} secondo",
"now_short": "ora", "now_short": "adesso",
"now": "adesso", "now": "adesso",
"months_short": "{0}me", "months_short": "{0} ms",
"month_short": "{0}me", "month_short": "{0} ms",
"months": "{0} mesi", "months": "{0} mesi",
"month": "{0} mese", "month": "{0} mese",
"minutes_short": "{0}min", "minutes_short": "{0} min",
"minute_short": "{0}min", "minute_short": "{0} min",
"minutes": "{0} minuti", "minutes": "{0} minuti",
"minute": "{0} minuto", "minute": "{0} minuto",
"in_past": "{0} fa", "in_past": "{0} fa",
"in_future": "fra {0}", "in_future": "fra {0}",
"hours_short": "{0}h", "hours_short": "{0} h",
"days_short": "{0}g", "days_short": "{0} g",
"hour_short": "{0}h", "hour_short": "{0} h",
"hours": "{0} ore", "hours": "{0} ore",
"hour": "{0} ora", "hour": "{0} ora",
"day_short": "{0}g", "day_short": "{0} g",
"days": "{0} giorni", "days": "{0} giorni",
"day": "{0} giorno" "day": "{0} giorno"
}, },
@ -767,7 +786,7 @@
"add_comment_description": "La segnalazione sarà inviata ai moderatori della tua stanza. Puoi motivarla qui sotto:" "add_comment_description": "La segnalazione sarà inviata ai moderatori della tua stanza. Puoi motivarla qui sotto:"
}, },
"password_reset": { "password_reset": {
"password_reset_required_but_mailer_is_disabled": "Devi reimpostare la tua password, ma non puoi farlo. Contatta il tuo amministratore.", "password_reset_required_but_mailer_is_disabled": "Devi reimpostare la tua password, ma non puoi farlo. Contatta l'amministratore.",
"password_reset_required": "Devi reimpostare la tua password per poter continuare.", "password_reset_required": "Devi reimpostare la tua password per poter continuare.",
"password_reset_disabled": "Non puoi azzerare la tua password. Contatta il tuo amministratore.", "password_reset_disabled": "Non puoi azzerare la tua password. Contatta il tuo amministratore.",
"too_many_requests": "Hai raggiunto il numero massimo di tentativi, riprova più tardi.", "too_many_requests": "Hai raggiunto il numero massimo di tentativi, riprova più tardi.",
@ -808,7 +827,7 @@
"add_reaction": "Reagisci", "add_reaction": "Reagisci",
"favorite": "Gradisci", "favorite": "Gradisci",
"reply": "Rispondi", "reply": "Rispondi",
"repeat": "Ripeti", "repeat": "Condividi",
"media_upload": "Carica allegati" "media_upload": "Carica allegati"
}, },
"display_date": { "display_date": {

View file

@ -574,7 +574,13 @@
"allow_following_move": "フォロー中のアカウントが引っ越したとき、自動フォローを許可する", "allow_following_move": "フォロー中のアカウントが引っ越したとき、自動フォローを許可する",
"setting_changed": "規定の設定と異なっています", "setting_changed": "規定の設定と異なっています",
"greentext": "引用を緑色で表示", "greentext": "引用を緑色で表示",
"sensitive_by_default": "はじめから投稿をセンシティブとして設定" "sensitive_by_default": "はじめから投稿をセンシティブとして設定",
"more_settings": "その他の設定",
"reply_visibility_self_short": "自分宛のリプライを見る",
"reply_visibility_following_short": "フォローしている人に宛てられたリプライを見る",
"hide_all_muted_posts": "ミュートした投稿を隠す",
"hide_media_previews": "メディアのプレビューを隠す",
"word_filter": "単語フィルタ"
}, },
"time": { "time": {
"day": "{0}日", "day": "{0}日",
@ -710,7 +716,13 @@
"hide_repeats": "リピートを隠す", "hide_repeats": "リピートを隠す",
"message": "メッセージ", "message": "メッセージ",
"hidden": "隠す", "hidden": "隠す",
"bot": "bot" "bot": "bot",
"highlight": {
"solid": "背景を単色にする",
"striped": "背景を縞模様にする",
"side": "端に線を付ける",
"disabled": "強調しない"
}
}, },
"user_profile": { "user_profile": {
"timeline_title": "ユーザータイムライン", "timeline_title": "ユーザータイムライン",

View file

@ -405,7 +405,8 @@
"change_email": "전자메일 주소 바꾸기", "change_email": "전자메일 주소 바꾸기",
"changed_email": "메일주소가 갱신되었습니다!", "changed_email": "메일주소가 갱신되었습니다!",
"bot": "이 계정은 bot입니다", "bot": "이 계정은 bot입니다",
"mutes_tab": "침묵" "mutes_tab": "침묵",
"app_name": "앱 이름"
}, },
"timeline": { "timeline": {
"collapse": "접기", "collapse": "접기",
@ -468,7 +469,8 @@
}, },
"interactions": { "interactions": {
"follows": "새 팔로워", "follows": "새 팔로워",
"favs_repeats": "반복과 즐겨찾기" "favs_repeats": "반복과 즐겨찾기",
"moves": "계정 통합"
}, },
"emoji": { "emoji": {
"load_all": "전체 {emojiAmount} 이모지 불러오기", "load_all": "전체 {emojiAmount} 이모지 불러오기",
@ -581,6 +583,10 @@
"day": "{0} 일" "day": "{0} 일"
}, },
"remote_user_resolver": { "remote_user_resolver": {
"error": "찾을 수 없습니다." "error": "찾을 수 없습니다.",
"searching_for": "검색중"
},
"selectable_list": {
"select_all": "모두 선택"
} }
} }

View file

@ -41,8 +41,8 @@
}, },
"importer": { "importer": {
"submit": "Send", "submit": "Send",
"success": "Importering fullført", "success": "Importering fullført.",
"error": "Det oppsto en feil under importering av denne filen" "error": "Det oppsto en feil under importering av denne filen."
}, },
"login": { "login": {
"login": "Logg inn", "login": "Logg inn",
@ -85,7 +85,7 @@
"bookmarks": "Bokmerker" "bookmarks": "Bokmerker"
}, },
"notifications": { "notifications": {
"broken_favorite": "Ukjent status, leter etter den...", "broken_favorite": "Ukjent status, leter etter den",
"favorited_you": "likte din status", "favorited_you": "likte din status",
"followed_you": "fulgte deg", "followed_you": "fulgte deg",
"load_older": "Last eldre varsler", "load_older": "Last eldre varsler",
@ -447,7 +447,8 @@
"title": "Versjon", "title": "Versjon",
"backend_version": "Backend Versjon", "backend_version": "Backend Versjon",
"frontend_version": "Frontend Versjon" "frontend_version": "Frontend Versjon"
} },
"hide_wallpaper": "Skjul instansens bakgrunnsbilde"
}, },
"time": { "time": {
"day": "{0} dag", "day": "{0} dag",
@ -602,5 +603,22 @@
"person_talking": "{count} person snakker om dette", "person_talking": "{count} person snakker om dette",
"people_talking": "{count} personer snakker om dette", "people_talking": "{count} personer snakker om dette",
"no_results": "Ingen resultater" "no_results": "Ingen resultater"
},
"about": {
"mrf": {
"simple": {
"quarantine": "Karantene",
"reject_desc": "Denne instansen vil ikke godta meldinger fra følgende instanser:",
"reject": "Avvis",
"accept_desc": "Denne instansen godtar kun meldinger fra følgende instanser:",
"accept": "Aksepter"
},
"keyword": {
"is_replaced_by": "→",
"replace": "Erstatt",
"reject": "Avvis",
"ftl_removal": "Fjerning fra \"Det hele kjente nettverket\" Tidslinjen"
}
}
} }
} }

View file

@ -13,7 +13,7 @@
"disable": "Оключить", "disable": "Оключить",
"enable": "Включить", "enable": "Включить",
"confirm": "Подтвердить", "confirm": "Подтвердить",
"verify": роверить", "verify": одтверждение",
"more": "Больше", "more": "Больше",
"generic_error": "Произошла ошибка", "generic_error": "Произошла ошибка",
"optional": "не обязательно", "optional": "не обязательно",
@ -44,8 +44,8 @@
"heading": { "heading": {
"TotpForm": "Двухфакторная аутентификация", "TotpForm": "Двухфакторная аутентификация",
"RecoveryForm": "Two-factor recovery", "RecoveryForm": "Two-factor recovery",
"totp": "Двухфакторная аутентификация", "totp": "Двухэтапная аутентификация",
"recovery": "Двухфакторное возвращение аккаунта" "recovery": "Восстановление двухэтапной аутентификации"
}, },
"hint": "Войдите чтобы присоединиться к дискуссии", "hint": "Войдите чтобы присоединиться к дискуссии",
"description": "Войти с помощью OAuth" "description": "Войти с помощью OAuth"
@ -55,8 +55,8 @@
"chat": "Локальный чат", "chat": "Локальный чат",
"mentions": "Упоминания", "mentions": "Упоминания",
"interactions": "Взаимодействия", "interactions": "Взаимодействия",
"public_tl": "Публичная лента", "public_tl": "Локальная лента",
"timeline": "Лента", "timeline": "Главная",
"twkn": "Федеративная лента", "twkn": "Федеративная лента",
"search": "Поиск", "search": "Поиск",
"friend_requests": "Запросы на чтение", "friend_requests": "Запросы на чтение",
@ -65,10 +65,11 @@
"timelines": "Ленты", "timelines": "Ленты",
"preferences": "Настройки", "preferences": "Настройки",
"who_to_follow": "Кого читать", "who_to_follow": "Кого читать",
"dms": "Личные Сообщения", "dms": "Личные сообщения",
"administration": "Панель администратора", "administration": "Панель администратора",
"about": "О сервере", "about": "Об узле",
"user_search": "Поиск пользователей" "user_search": "Поиск пользователей",
"home_timeline": "Главная"
}, },
"notifications": { "notifications": {
"broken_favorite": "Неизвестный статус, ищем…", "broken_favorite": "Неизвестный статус, ищем…",
@ -79,35 +80,35 @@
"read": "Прочесть", "read": "Прочесть",
"repeated_you": "повторил(а) ваш статус", "repeated_you": "повторил(а) ваш статус",
"follow_request": "хочет читать вас", "follow_request": "хочет читать вас",
"reacted_with": "добавил реакцию: {0}", "reacted_with": "добавил(а) реакцию: {0}",
"migrated_to": "мигрировал на", "migrated_to": "перехал на",
"no_more_notifications": "Нет дальнейших уведомлений", "no_more_notifications": "Нет дальнейших уведомлений",
"error": "Ошибка при обновлении уведомлений: {0}" "error": "Ошибка при обновлении уведомлений: {0}"
}, },
"interactions": { "interactions": {
"favs_repeats": "Повторы и фавориты", "favs_repeats": "Повторы и отметки «Нравится»",
"follows": "Новые читатели", "follows": "Новые читатели",
"load_older": "Загрузить старые взаимодействия", "load_older": "Загрузить старые взаимодействия",
"moves": "Миграции пользователей" "moves": "Переезды"
}, },
"post_status": { "post_status": {
"account_not_locked_warning": "Ваш аккаунт не {0}. Кто угодно может начать читать вас чтобы видеть посты только для подписчиков.", "account_not_locked_warning": "Ваша учетная запись не {0}. Кто угодно может начать читать вас чтобы видеть статусы только для читателей.",
"account_not_locked_warning_link": "залочен", "account_not_locked_warning_link": "закрыт",
"attachments_sensitive": "Вложения содержат чувствительный контент", "attachments_sensitive": "Вложения имеют щекотливый характер",
"content_warning": "Тема (не обязательно)", "content_warning": "Тема (не обязательно)",
"default": "Что нового?", "default": "Что нового?",
"direct_warning": "Этот пост будет виден только упомянутым пользователям", "direct_warning": "Этот пост будет виден только упомянутым пользователям",
"posting": "Отправляется", "posting": "Отправляется",
"scope_notice": { "scope_notice": {
"public": "Этот пост будет виден всем", "public": "Этот статус будет виден всем",
"private": "Этот пост будет виден только вашим подписчикам", "private": "Этот статус будет виден только вашим читателям",
"unlisted": "Этот пост не будет виден в публичной и федеративной ленте" "unlisted": "Этот статус не будет виден в локальной и федеративной ленте"
}, },
"scope": { "scope": {
"direct": "Личное - этот пост видят только те кто в нём упомянут", "direct": "Личное сообщение - этот статус видят только те, кто в нём упомянут",
"private": "Для подписчиков - этот пост видят только подписчики", "private": "Для читателей - этот статус видят только ваши читатели",
"public": "Публичный - этот пост виден всем", "public": "Публичный - этот статус виден всем",
"unlisted": "Непубличный - этот пост не виден на публичных лентах" "unlisted": "Тихий - этот пост виден всем, но не отображается в публичных лентах"
}, },
"preview_empty": "Пустой предпросмотр", "preview_empty": "Пустой предпросмотр",
"media_description_error": "Не удалось обновить вложение, попробуйте еще раз", "media_description_error": "Не удалось обновить вложение, попробуйте еще раз",
@ -122,11 +123,12 @@
"text/plain": "Простой текст" "text/plain": "Простой текст"
}, },
"media_description": "Описание вложения", "media_description": "Описание вложения",
"new_status": "Написать новый статус" "new_status": "Написать новый статус",
"post": "Опубликовать"
}, },
"registration": { "registration": {
"bio": "Описание", "bio": "О себе",
"email": "Email", "email": "Электронная почта",
"fullname": "Отображаемое имя", "fullname": "Отображаемое имя",
"password_confirm": "Подтверждение пароля", "password_confirm": "Подтверждение пароля",
"registration": "Регистрация", "registration": "Регистрация",
@ -143,7 +145,10 @@
"fullname_placeholder": "например: Почтальон Печкин", "fullname_placeholder": "например: Почтальон Печкин",
"username_placeholder": "например: pechkin", "username_placeholder": "например: pechkin",
"captcha": "Код подтверждения", "captcha": "Код подтверждения",
"new_captcha": "Нажмите на изображение чтобы получить новый код" "new_captcha": "Нажмите на изображение чтобы получить новый код",
"reason_placeholder": "Данный узел обрабатывает запросы на регистрацию вручную.\nРасскажите администрации почему вы хотите зарегистрироваться.",
"reason": "Причина регистрации",
"register": "Зарегистрироваться"
}, },
"settings": { "settings": {
"enter_current_password_to_confirm": "Введите свой текущий пароль", "enter_current_password_to_confirm": "Введите свой текущий пароль",
@ -152,7 +157,7 @@
"setup_otp": "Настройка OTP", "setup_otp": "Настройка OTP",
"wait_pre_setup_otp": "предварительная настройка OTP", "wait_pre_setup_otp": "предварительная настройка OTP",
"confirm_and_enable": "Подтвердить и включить OTP", "confirm_and_enable": "Подтвердить и включить OTP",
"title": "Двухфакторная аутентификация", "title": "Двухэтапная аутентификация",
"generate_new_recovery_codes": "Получить новые коды востановления", "generate_new_recovery_codes": "Получить новые коды востановления",
"warning_of_generate_new_codes": "После получения новых кодов восстановления, старые больше не будут работать.", "warning_of_generate_new_codes": "После получения новых кодов восстановления, старые больше не будут работать.",
"recovery_codes": "Коды восстановления.", "recovery_codes": "Коды восстановления.",
@ -161,11 +166,11 @@
"authentication_methods": "Методы аутентификации", "authentication_methods": "Методы аутентификации",
"scan": { "scan": {
"title": "Сканирование", "title": "Сканирование",
"desc": "Используйте приложение для двухэтапной аутентификации для сканирования этого QR-код или введите текстовый ключ:", "desc": "Отсканируйте QR-код приложением для двухэтапной аутентификации или введите текстовый ключ:",
"secret_code": "Ключ" "secret_code": "Ключ"
}, },
"verify": { "verify": {
"desc": "Чтобы включить двухэтапную аутентификации, введите код из вашего приложение для двухэтапной аутентификации:" "desc": "Чтобы включить двухэтапную аутентификацию, введите код из приложения-аутентификатора:"
} }
}, },
"attachmentRadius": "Прикреплённые файлы", "attachmentRadius": "Прикреплённые файлы",
@ -174,16 +179,16 @@
"avatarAltRadius": "Аватары в уведомлениях", "avatarAltRadius": "Аватары в уведомлениях",
"avatarRadius": "Аватары", "avatarRadius": "Аватары",
"background": "Фон", "background": "Фон",
"bio": "Описание", "bio": "О себе",
"btnRadius": "Кнопки", "btnRadius": "Кнопки",
"bot": "Это аккаунт бота", "bot": "Это учётная запись бота",
"cBlue": "Ответить, читать", "cBlue": "Ответить, читать",
"cGreen": "Повторить", "cGreen": "Повторить",
"cOrange": "Нравится", "cOrange": "Нравится",
"cRed": "Отменить", "cRed": "Отменить",
"change_email": "Сменить email", "change_email": "Сменить адрес электронной почты",
"change_email_error": "Произошла ошибка при попытке изменить email.", "change_email_error": "Произошла ошибка при попытке изменить электронную почту.",
"changed_email": "Email изменён успешно!", "changed_email": "Электронная почта изменена успешно!",
"change_password": "Сменить пароль", "change_password": "Сменить пароль",
"change_password_error": "Произошла ошибка при попытке изменить пароль.", "change_password_error": "Произошла ошибка при попытке изменить пароль.",
"changed_password": "Пароль изменён успешно!", "changed_password": "Пароль изменён успешно!",
@ -193,9 +198,9 @@
"current_password": "Текущий пароль", "current_password": "Текущий пароль",
"current_profile_banner": "Текущий баннер профиля", "current_profile_banner": "Текущий баннер профиля",
"data_import_export_tab": "Импорт / Экспорт данных", "data_import_export_tab": "Импорт / Экспорт данных",
"delete_account": "Удалить аккаунт", "delete_account": "Удалить учетную запись",
"delete_account_description": "Удалить вашу учётную запись и все ваши сообщения.", "delete_account_description": "Навсегда удалить вашу учётную запись и ваши статусы.",
"delete_account_error": "Возникла ошибка в процессе удаления вашего аккаунта. Если это повторяется, свяжитесь с администратором вашего сервера.", "delete_account_error": "Возникла ошибка в процессе удаления вашей учетной записи. Если это повторяется, свяжитесь с администратором данного узла.",
"delete_account_instructions": "Введите ваш пароль в поле ниже для подтверждения удаления.", "delete_account_instructions": "Введите ваш пароль в поле ниже для подтверждения удаления.",
"export_theme": "Сохранить Тему", "export_theme": "Сохранить Тему",
"filtering": "Фильтрация", "filtering": "Фильтрация",
@ -221,28 +226,28 @@
"interfaceLanguage": "Язык интерфейса", "interfaceLanguage": "Язык интерфейса",
"limited_availability": "Не доступно в вашем браузере", "limited_availability": "Не доступно в вашем браузере",
"links": "Ссылки", "links": "Ссылки",
"lock_account_description": "Аккаунт доступен только подтверждённым подписчикам", "lock_account_description": "Сделать учетную запись закрытой — подтверждать читателей вручную",
"loop_video": "Зациливать видео", "loop_video": "Зациливать видео",
"loop_video_silent_only": "Зацикливать только беззвучные видео (т.е. \"гифки\" с Mastodon)", "loop_video_silent_only": "Зацикливать только беззвучные видео (т.е. \"гифки\" с Mastodon)",
"name": "Имя", "name": "Имя",
"name_bio": "Имя и описание", "name_bio": "Личные данные",
"new_email": "Новый email", "new_email": "Новый адрес электронной почты",
"new_password": "Новый пароль", "new_password": "Новый пароль",
"fun": "Потешное", "fun": "Потешное",
"greentext": "Мемные стрелочки", "greentext": "Мемные стрелочки",
"notification_visibility": "Показывать уведомления", "notification_visibility": "Показывать уведомления",
"notification_visibility_follows": "Подписки", "notification_visibility_follows": "Новые читатели",
"notification_visibility_likes": "Лайки", "notification_visibility_likes": "Лайки",
"notification_visibility_mentions": "Упоминания", "notification_visibility_mentions": "Упоминания",
"notification_visibility_repeats": "Повторы", "notification_visibility_repeats": "Повторы",
"no_rich_text_description": "Убрать форматирование из всех постов", "no_rich_text_description": "Убрать форматирование из всех статусов",
"hide_follows_description": "Не показывать кого я читаю", "hide_follows_description": "Не показывать кого я читаю",
"hide_followers_description": "Не показывать кто читает меня", "hide_followers_description": "Не показывать кто читает меня",
"hide_follows_count_description": "Не показывать число читаемых пользователей", "hide_follows_count_description": "Не показывать число читаемых пользователей",
"hide_followers_count_description": "Не показывать число моих подписчиков", "hide_followers_count_description": "Не показывать число моих читателей",
"show_admin_badge": "Показывать значок администратора в моем профиле", "show_admin_badge": "Показывать значок администратора в моем профиле",
"show_moderator_badge": "Показывать значок модератора в моем профиле", "show_moderator_badge": "Показывать значок модератора в моем профиле",
"nsfw_clickthrough": "Включить скрытие вложений и предпросмотра ссылок для NSFW статусов", "nsfw_clickthrough": "Включить скрытие вложений и предпросмотра ссылок для статусов щекотливого характера",
"oauth_tokens": "OAuth токены", "oauth_tokens": "OAuth токены",
"token": "Токен", "token": "Токен",
"refresh_token": "Рефреш токен", "refresh_token": "Рефреш токен",
@ -257,14 +262,14 @@
"radii_help": "Скругление углов элементов интерфейса (в пикселях)", "radii_help": "Скругление углов элементов интерфейса (в пикселях)",
"replies_in_timeline": "Ответы в ленте", "replies_in_timeline": "Ответы в ленте",
"reply_visibility_all": "Показывать все ответы", "reply_visibility_all": "Показывать все ответы",
"reply_visibility_following": "Показывать только ответы мне или тех на кого я подписан", "reply_visibility_following": "Показывать только ответы мне или тем кого я читаю",
"reply_visibility_self": "Показывать только ответы мне", "reply_visibility_self": "Показывать только ответы мне",
"autohide_floating_post_button": "Автоматически скрывать кнопку постинга (в мобильной версии)", "autohide_floating_post_button": "Автоматически скрывать кнопку \"Написать новый статус\" (в мобильной версии)",
"saving_err": "Не удалось сохранить настройки", "saving_err": "Не удалось сохранить настройки",
"saving_ok": "Сохранено", "saving_ok": "Сохранено",
"security_tab": "Безопасность", "security_tab": "Безопасность",
"scope_copy": "Копировать видимость поста при ответе (всегда включено для Личных Сообщений)", "scope_copy": "Копировать видимость поста при ответе (всегда включено для личных сообщений)",
"minimal_scopes_mode": "Минимизировать набор опций видимости поста", "minimal_scopes_mode": "Показывать только личное сообщение и публичный статус в опциях видимости",
"set_new_avatar": "Загрузить новый аватар", "set_new_avatar": "Загрузить новый аватар",
"set_new_profile_background": "Загрузить новый фон профиля", "set_new_profile_background": "Загрузить новый фон профиля",
"set_new_profile_banner": "Загрузить новый баннер профиля", "set_new_profile_banner": "Загрузить новый баннер профиля",
@ -273,7 +278,7 @@
"stop_gifs": "Проигрывать GIF анимации только при наведении", "stop_gifs": "Проигрывать GIF анимации только при наведении",
"streaming": "Включить автоматическую загрузку новых сообщений при прокрутке вверх", "streaming": "Включить автоматическую загрузку новых сообщений при прокрутке вверх",
"useStreamingApi": "Получать сообщения и уведомления в реальном времени", "useStreamingApi": "Получать сообщения и уведомления в реальном времени",
"useStreamingApiWarning": "(Не рекомендуется, экспериментально, сообщения могут пропадать)", "useStreamingApiWarning": "(Не рекомендуется, экспериментально, статусы могут пропадать)",
"text": "Текст", "text": "Текст",
"theme": "Тема", "theme": "Тема",
"theme_help": "Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.", "theme_help": "Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.",
@ -305,7 +310,8 @@
"older_version_imported": "Файл, который вы импортировали, был сделан в старой версии фронт-энда.", "older_version_imported": "Файл, который вы импортировали, был сделан в старой версии фронт-энда.",
"future_version_imported": "Файл, который вы импортировали, был сделан в новой версии фронт-энда.", "future_version_imported": "Файл, который вы импортировали, был сделан в новой версии фронт-энда.",
"v2_imported": "Файл, который вы импортировали, был сделан под старый фронт-энд. Мы стараемся улучшить совместимость, но все еще возможны несостыковки.", "v2_imported": "Файл, который вы импортировали, был сделан под старый фронт-энд. Мы стараемся улучшить совместимость, но все еще возможны несостыковки.",
"upgraded_from_v2": "Фронт-энд Pleroma был изменен. Выбранная тема может выглядеть слегка по-другому." "upgraded_from_v2": "Фронт-энд Pleroma был изменен. Выбранная тема может выглядеть слегка по-другому.",
"fe_downgraded": "Версия фронт-энда Pleroma была откачена."
} }
}, },
"common": { "common": {
@ -337,13 +343,29 @@
"badge": "Фон значков", "badge": "Фон значков",
"badge_notification": "Уведомления", "badge_notification": "Уведомления",
"panel_header": "Заголовок панели", "panel_header": "Заголовок панели",
"top_bar": "Верняя полоска", "top_bar": "Верхняя полоска",
"borders": "Границы", "borders": "Границы",
"buttons": "Кнопки", "buttons": "Кнопки",
"inputs": "Поля ввода", "inputs": "Поля ввода",
"faint_text": "Маловажный текст", "faint_text": "Маловажный текст",
"post": "Сообщения и описание пользователя", "post": "Статусы и раздел \"О себе\"",
"alert_neutral": "Нейтральный" "alert_neutral": "Нейтральный",
"alert_warning": "Предупреждение",
"selectedPost": "Выбранный статус",
"pressed": "Нажатие",
"highlight": "Выделенные элементы",
"icons": "Иконки",
"poll": "График результатов опроса",
"wallpaper": "Фон",
"chat": {
"border": "Границы",
"outgoing": "Исходящие",
"incoming": "Входящие"
},
"tabs": "Вкладки",
"toggled": "Включено",
"disabled": "Отключено",
"selectedMenu": "Выбранный пункт меню"
}, },
"radii": { "radii": {
"_tab_label": "Скругление" "_tab_label": "Скругление"
@ -368,8 +390,8 @@
"panel": "Панель", "panel": "Панель",
"panelHeader": "Заголовок панели", "panelHeader": "Заголовок панели",
"topBar": "Верхняя полоска", "topBar": "Верхняя полоска",
"avatar": "Аватарка (профиль)", "avatar": "Аватар (профиль)",
"avatarStatus": "Аватарка (в ленте)", "avatarStatus": "Аватар (в ленте)",
"popup": "Всплывающие подсказки", "popup": "Всплывающие подсказки",
"button": "Кнопки", "button": "Кнопки",
"buttonHover": "Кнопки (наведен курсор)", "buttonHover": "Кнопки (наведен курсор)",
@ -385,7 +407,7 @@
"interface": "Интерфейс", "interface": "Интерфейс",
"input": "Поля ввода", "input": "Поля ввода",
"post": "Текст постов", "post": "Текст постов",
"postCode": "Моноширинный текст в посте (форматирование)" "postCode": "Моноширинный текст в статусе (форматирование)"
}, },
"family": "Шрифт", "family": "Шрифт",
"size": "Размер (в пикселях)", "size": "Размер (в пикселях)",
@ -407,12 +429,12 @@
"link": "ссылка" "link": "ссылка"
} }
}, },
"allow_following_move": "Разрешить автоматически читать новый аккаунт при перемещении на другой сервер", "allow_following_move": "Автоматически начать читать новый профиль при переезде",
"hide_user_stats": "Не показывать статистику пользователей (например количество читателей)", "hide_user_stats": "Не показывать статистику пользователей (например количество читателей)",
"discoverable": "Разрешить показ аккаунта в поисковиках и других сервисах", "discoverable": "Разрешить показывать учетную запись в поисковых системах и прочих сервисах",
"default_vis": "Видимость постов по умолчанию", "default_vis": "Видимость статусов по умолчанию",
"mutes_and_blocks": "Блокировки и игнорируемые", "mutes_and_blocks": "Блокировки и игнорируемые",
"composing": "Составление постов", "composing": "Составление статусов",
"chatMessageRadius": "Сообщения в беседе", "chatMessageRadius": "Сообщения в беседе",
"blocks_tab": "Блокировки", "blocks_tab": "Блокировки",
"import_mutes_from_a_csv_file": "Импортировать игнорируемых из CSV файла", "import_mutes_from_a_csv_file": "Импортировать игнорируемых из CSV файла",
@ -432,12 +454,12 @@
"post_status_content_type": "Формат составляемых статусов по умолчанию", "post_status_content_type": "Формат составляемых статусов по умолчанию",
"subject_line_noop": "Не копировать", "subject_line_noop": "Не копировать",
"subject_line_mastodon": "Как в Mastodon: скопировать как есть", "subject_line_mastodon": "Как в Mastodon: скопировать как есть",
"subject_line_email": "Как в e-mail: \"re: тема\"", "subject_line_email": "Как в электронной почте: \"re: тема\"",
"subject_line_behavior": "Копировать тему в ответах", "subject_line_behavior": "Копировать тему в ответах",
"no_mutes": "Нет игнорируемых", "no_mutes": "Нет игнорируемых",
"no_blocks": "Нет блокировок", "no_blocks": "Нет блокировок",
"notification_visibility_emoji_reactions": "Реакции", "notification_visibility_emoji_reactions": "Реакции",
"notification_visibility_moves": "Миграции пользователей", "notification_visibility_moves": "Переезды",
"use_contain_fit": "Не обрезать вложения в миниатюрах", "use_contain_fit": "Не обрезать вложения в миниатюрах",
"profile_fields": { "profile_fields": {
"value": "Значение", "value": "Значение",
@ -452,7 +474,7 @@
"hide_filtered_statuses": "Не показывать отфильтрованные статусы", "hide_filtered_statuses": "Не показывать отфильтрованные статусы",
"hide_muted_posts": "Не показывать статусы игнорируемых пользователей", "hide_muted_posts": "Не показывать статусы игнорируемых пользователей",
"hide_post_stats": "Не показывать статистику статусов (например количество отметок «Нравится»)", "hide_post_stats": "Не показывать статистику статусов (например количество отметок «Нравится»)",
"use_one_click_nsfw": "Открывать NSFW вложения одним кликом", "use_one_click_nsfw": "Открывать вложения имеющие щекотливый характер одним кликом",
"preload_images": "Предварительно загружать изображения", "preload_images": "Предварительно загружать изображения",
"max_thumbnails": "Максимальное число миниатюр показываемых в статусе", "max_thumbnails": "Максимальное число миниатюр показываемых в статусе",
"emoji_reactions_on_timeline": "Показывать эмодзи реакции в ленте", "emoji_reactions_on_timeline": "Показывать эмодзи реакции в ленте",
@ -464,26 +486,43 @@
"virtual_scrolling": "Оптимизировать рендеринг ленты", "virtual_scrolling": "Оптимизировать рендеринг ленты",
"hide_wallpaper": "Скрыть обои узла", "hide_wallpaper": "Скрыть обои узла",
"accent": "Акцент", "accent": "Акцент",
"upload_a_photo": "Загрузить фото", "upload_a_photo": "Загрузить изображение",
"notification_mutes": "Чтобы не получать уведомления от определённого пользователя, заглушите его.", "notification_mutes": "Чтобы не получать уведомления от конкретного пользователя, заглушите его.",
"reset_avatar_confirm": "Вы действительно хотите сбросить личный образ?", "reset_avatar_confirm": "Вы точно хотите сбросить аватар?",
"reset_profile_banner": "Сбросить личный баннер", "reset_profile_banner": "Сбросить баннер профиля",
"reset_profile_background": "Сбросить личные обои", "reset_profile_background": "Сбросить фон профиля",
"reset_avatar": "Сбросить личный образ", "reset_avatar": "Сбросить аватар",
"search_user_to_mute": "Искать, кого вы хотите заглушить", "search_user_to_mute": "Поиск того, кого вы хотите заглушить",
"search_user_to_block": "Искать, кого вы хотите заблокировать", "search_user_to_block": "Поиск того, кого вы хотите заблокировать",
"pad_emoji": "Выделять эмодзи пробелами при добавлении из панели", "pad_emoji": "Разделять эмодзи пробелами, когда они добавляются из меню",
"avatar_size_instruction": "Желательный наименьший размер личного образа 150 на 150 пикселей.", "avatar_size_instruction": "Рекомендуется использовать изображение больше чем 150 на 150 пикселей в качестве аватара.",
"enable_web_push_notifications": "Включить web push-уведомления", "enable_web_push_notifications": "Включить web push-уведомления",
"notification_blocks": "Блокировка пользователя выключает все уведомления от него, а также отписывает вас от него.", "notification_blocks": "Блокировка пользователя выключает все уведомления от него, а также отписывает вас от него.",
"notification_setting_hide_notification_contents": "Скрыть отправителя и содержимое push-уведомлений" "notification_setting_hide_notification_contents": "Скрыть отправителя и содержимое push-уведомлений",
"version": {
"title": "Версия",
"frontend_version": "Версия фронт-энда",
"backend_version": "Версия бэк-энда"
},
"word_filter": "Фильтр слов",
"sensitive_by_default": "Помечать статусы как имеющие щекотливый характер по умолчанию",
"reply_visibility_self_short": "Показывать ответы только вам",
"reply_visibility_following_short": "Показывать ответы тем кого вы читаете",
"hide_all_muted_posts": "Не показывать игнорируемые статусы",
"hide_media_previews": "Не показывать вложения в ленте",
"setting_changed": "Отличается от значения по умолчанию",
"reset_background_confirm": "Вы точно хотите сбросить фон?",
"reset_banner_confirm": "Вы точно хотите сбросить баннер?",
"type_domains_to_mute": "Поиск узлов, которые вы хотите заглушить",
"more_settings": "Остальные настройки",
"save": "Сохранить изменения"
}, },
"timeline": { "timeline": {
"collapse": "Свернуть", "collapse": "Свернуть",
"conversation": "Разговор", "conversation": "Разговор",
"error_fetching": "Ошибка при обновлении", "error_fetching": "Ошибка при обновлении",
"load_older": "Загрузить старые статусы", "load_older": "Загрузить старые статусы",
"no_retweet_hint": "Пост помечен как \"только для подписчиков\" или \"личное\" и поэтому не может быть повторён", "no_retweet_hint": "Статус помечен как \"только для читателей\" или \"личное сообщение\" и потому не может быть повторён",
"repeated": "повторил(а)", "repeated": "повторил(а)",
"show_new": "Показать новые", "show_new": "Показать новые",
"up_to_date": "Обновлено", "up_to_date": "Обновлено",
@ -492,7 +531,7 @@
"status": { "status": {
"bookmark": "Добавить в закладки", "bookmark": "Добавить в закладки",
"unbookmark": "Удалить из закладок", "unbookmark": "Удалить из закладок",
"status_deleted": "Пост удален", "status_deleted": "Статус удален",
"reply_to": "Ответ", "reply_to": "Ответ",
"repeats": "Повторы", "repeats": "Повторы",
"favorites": "Понравилось", "favorites": "Понравилось",
@ -528,16 +567,16 @@
"revoke_admin": "Забрать права администратора", "revoke_admin": "Забрать права администратора",
"grant_moderator": "Сделать модератором", "grant_moderator": "Сделать модератором",
"revoke_moderator": "Забрать права модератора", "revoke_moderator": "Забрать права модератора",
"activate_account": "Активировать аккаунт", "activate_account": "Активировать учетную запись",
"deactivate_account": "Деактивировать аккаунт", "deactivate_account": "Деактивировать учетную запись",
"delete_account": "Удалить аккаунт", "delete_account": "Удалить учетную запись",
"force_nsfw": "Отмечать посты пользователя как NSFW", "force_nsfw": "Отмечать статусы пользователя как имеющие щекотливый характер",
"strip_media": "Убирать вложения из постов пользователя", "strip_media": "Убирать вложения из статусов пользователя",
"force_unlisted": "Не добавлять посты в публичные ленты", "force_unlisted": "Не показывать статусы в публичных лентах",
"sandbox": "Принудить видимость постов только читателям", "sandbox": "Принудить видимость постов только читателям",
"disable_remote_subscription": "Запретить читать с удаленных серверов", "disable_remote_subscription": "Запретить читать с других узлов",
"disable_any_subscription": "Запретить читать пользователя", "disable_any_subscription": "Запретить читать пользователя",
"quarantine": "Не федерировать посты пользователя", "quarantine": "Не федерировать статусы пользователя",
"delete_user": "Удалить пользователя", "delete_user": "Удалить пользователя",
"delete_user_confirmation": "Вы уверены? Это действие нельзя отменить." "delete_user_confirmation": "Вы уверены? Это действие нельзя отменить."
}, },
@ -545,7 +584,14 @@
"mention": "Упомянуть", "mention": "Упомянуть",
"show_repeats": "Показывать повторы", "show_repeats": "Показывать повторы",
"hide_repeats": "Скрыть повторы", "hide_repeats": "Скрыть повторы",
"report": "Пожаловаться" "report": "Пожаловаться",
"message": "Написать сообщение",
"highlight": {
"side": "Полоска сбоку",
"striped": "Фон в полоску",
"solid": "Сплошной фон",
"disabled": "Нет выделения"
}
}, },
"user_profile": { "user_profile": {
"timeline_title": "Лента пользователя" "timeline_title": "Лента пользователя"
@ -560,30 +606,31 @@
"password_reset": { "password_reset": {
"forgot_password": "Забыли пароль?", "forgot_password": "Забыли пароль?",
"password_reset": "Сброс пароля", "password_reset": "Сброс пароля",
"instruction": "Введите ваш email или имя пользователя, и мы отправим вам ссылку для сброса пароля.", "instruction": "Введите ваш адрес электронной почты или имя пользователя: на вашу электронную почту будет отправлена ссылка для сброса пароля.",
"placeholder": "Ваш email или имя пользователя", "placeholder": "Ваш адрес электронной почты или имя пользователя",
"check_email": "Проверьте ваш email и перейдите по ссылке для сброса пароля.", "check_email": "Проверьте вашу электронную почту и перейдите по ссылке для сброса пароля.",
"return_home": "Вернуться на главную страницу", "return_home": "Вернуться на главную страницу",
"too_many_requests": "Вы исчерпали допустимое количество попыток, попробуйте позже.", "too_many_requests": "Вы исчерпали допустимое количество попыток, попробуйте позже.",
"password_reset_disabled": "Сброс пароля отключен. Cвяжитесь с администратором вашего сервера." "password_reset_disabled": "Автоматический сброс пароля отключен. Свяжитесь с администратором данного узла для сброса пароля.",
"password_reset_required_but_mailer_is_disabled": "Вы должны сбросить свой пароль, однако автоматический сброс пароля отключен. Пожалуйста свяжитесь с администратором данного узла."
}, },
"about": { "about": {
"mrf": { "mrf": {
"federation": "Федерация", "federation": "Федерация",
"simple": { "simple": {
"accept_desc": "Данный сервер принимает сообщения только со следующих серверов:", "accept_desc": "Данный узел принимает сообщения только со следующих узлов:",
"ftl_removal_desc": "Данный сервер скрывает следующие сервера с федеративной ленты:", "ftl_removal_desc": "Данный узел скрывает следующие узлы с федеративной ленты:",
"media_nsfw_desc": "Данный сервер принужденно помечает вложения со следущих серверов как NSFW:", "media_nsfw_desc": "Данный узел принужденно помечает вложения со следующих узлов как имеющие щекотливый характер:",
"simple_policies": "Правила для определенных серверов", "simple_policies": "Правила для определенных узлов",
"accept": "Принимаемые сообщения", "accept": "Белый список",
"reject": "Отклоняемые сообщения", "reject": "Черный список",
"reject_desc": "Данный сервер не принимает сообщения со следующих серверов:", "reject_desc": "Данный узел не принимает сообщения со следующих узлов:",
"quarantine": "Зона карантина", "quarantine": "Зона карантина",
"quarantine_desc": "Данный сервер отправляет только публичные посты следующим серверам:", "quarantine_desc": "Данный узел отправляет только публичные статусы следующим узлам:",
"ftl_removal": "Скрытие с федеративной ленты", "ftl_removal": "Скрытие с федеративной ленты",
"media_removal": "Удаление вложений", "media_removal": "Удаление вложений",
"media_removal_desc": "Данный сервер удаляет вложения со следующих серверов:", "media_removal_desc": "Данный узел удаляет вложения со следующих узлов:",
"media_nsfw": "Принужденно помеченно как NSFW" "media_nsfw": "Принужденно помеченно как имеющее щекотливый характер"
}, },
"keyword": { "keyword": {
"ftl_removal": "Убрать из федеративной ленты", "ftl_removal": "Убрать из федеративной ленты",
@ -593,7 +640,7 @@
"is_replaced_by": "→" "is_replaced_by": "→"
}, },
"mrf_policies": "Активные правила MRF (модуль переписывания сообщений)", "mrf_policies": "Активные правила MRF (модуль переписывания сообщений)",
"mrf_policies_desc": "Правила MRF (модуль переписывания сообщений) влияют на федерацию данного сервера. Следующие правила активны:" "mrf_policies_desc": "Правила MRF (модуль переписывания сообщений) влияют на федерацию данного узла. Следующие правила активны:"
}, },
"staff": "Администрация" "staff": "Администрация"
}, },
@ -644,7 +691,9 @@
"votes": "голосов", "votes": "голосов",
"option": "Вариант", "option": "Вариант",
"add_option": "Добавить вариант", "add_option": "Добавить вариант",
"add_poll": "Прикрепить опрос" "add_poll": "Прикрепить опрос",
"votes_count": "{count} голос | {count} голосов",
"people_voted_count": "{count} человек проголосовал | {count} человек проголосовали"
}, },
"media_modal": { "media_modal": {
"next": "Следующая", "next": "Следующая",
@ -702,10 +751,26 @@
"chats": "Беседы", "chats": "Беседы",
"delete": "Удалить", "delete": "Удалить",
"message_user": "Напишите {nickname}", "message_user": "Напишите {nickname}",
"you": "Вы:" "you": "Вы:",
"error_sending_message": "Произошла ошибка при отправке сообщения."
}, },
"remote_user_resolver": { "remote_user_resolver": {
"error": "Не найдено.", "error": "Не найдено.",
"searching_for": "Ищем" "searching_for": "Ищем"
},
"upload": {
"error": {
"message": "Произошла ошибка при загрузке: {0}"
}
},
"user_reporting": {
"add_comment_description": "Жалоба будет направлена модераторам вашего узла. Вы можете указать причину жалобы ниже:",
"forward_description": "Данный пользователь находится на другом узле. Отослать туда копию вашей жалобы?"
},
"file_type": {
"file": "Файл",
"video": "Видеозапись",
"audio": "Аудиозапись",
"image": "Изображение"
} }
} }

View file

@ -168,7 +168,8 @@
"preview": "预览", "preview": "预览",
"media_description": "媒体描述", "media_description": "媒体描述",
"media_description_error": "更新媒体失败,请重试", "media_description_error": "更新媒体失败,请重试",
"empty_status_error": "不能发布没有内容、没有附件的发文" "empty_status_error": "不能发布没有内容、没有附件的发文",
"post": "发送"
}, },
"registration": { "registration": {
"bio": "简介", "bio": "简介",
@ -191,7 +192,8 @@
"password_confirmation_match": "密码不一致" "password_confirmation_match": "密码不一致"
}, },
"reason_placeholder": "此实例的注册需要手动批准。\n请让管理员知道您为什么想要注册。", "reason_placeholder": "此实例的注册需要手动批准。\n请让管理员知道您为什么想要注册。",
"reason": "注册理由" "reason": "注册理由",
"register": "注册"
}, },
"selectable_list": { "selectable_list": {
"select_all": "选择全部" "select_all": "选择全部"
@ -306,8 +308,8 @@
"no_mutes": "没有隐藏", "no_mutes": "没有隐藏",
"hide_follows_description": "不要显示我所关注的人", "hide_follows_description": "不要显示我所关注的人",
"hide_followers_description": "不要显示关注我的人", "hide_followers_description": "不要显示关注我的人",
"show_admin_badge": "在我的个人资料中显示管理员徽章", "show_admin_badge": "在我的个人资料中显示管理员徽章",
"show_moderator_badge": "在我的个人资料中显示监察员徽章", "show_moderator_badge": "在我的个人资料中显示监察员徽章",
"nsfw_clickthrough": "将不和谐附件和链接预览隐藏,点击才会显示", "nsfw_clickthrough": "将不和谐附件和链接预览隐藏,点击才会显示",
"oauth_tokens": "OAuth令牌", "oauth_tokens": "OAuth令牌",
"token": "令牌", "token": "令牌",
@ -561,7 +563,15 @@
"mute_export_button": "导出你的隐藏名单到一个 csv 文件", "mute_export_button": "导出你的隐藏名单到一个 csv 文件",
"mute_export": "隐藏名单导出", "mute_export": "隐藏名单导出",
"hide_wallpaper": "隐藏实例壁纸", "hide_wallpaper": "隐藏实例壁纸",
"setting_changed": "与默认设置不同" "setting_changed": "与默认设置不同",
"more_settings": "更多设置",
"sensitive_by_default": "默认标记发文为敏感内容",
"reply_visibility_self_short": "只显示对我本人的回复",
"reply_visibility_following_short": "显示对我关注的人的回复",
"hide_all_muted_posts": "不显示已隐藏的发文",
"hide_media_previews": "隐藏媒体预览",
"word_filter": "词语过滤",
"save": "保存更改"
}, },
"time": { "time": {
"day": "{0} 天", "day": "{0} 天",
@ -609,7 +619,9 @@
"no_more_statuses": "没有更多的状态", "no_more_statuses": "没有更多的状态",
"no_statuses": "没有状态更新", "no_statuses": "没有状态更新",
"reload": "重新载入", "reload": "重新载入",
"error": "取得时间轴时发生错误:{0}" "error": "取得时间轴时发生错误:{0}",
"socket_broke": "丢失实时连接CloseEvent code {0}",
"socket_reconnected": "已建立实时连接"
}, },
"status": { "status": {
"favorites": "喜欢", "favorites": "喜欢",
@ -693,7 +705,13 @@
"hide_repeats": "隐藏转发", "hide_repeats": "隐藏转发",
"message": "消息", "message": "消息",
"mention": "提及", "mention": "提及",
"bot": "机器人" "bot": "机器人",
"highlight": {
"side": "侧边条纹",
"striped": "条纹背景",
"solid": "单一颜色背景",
"disabled": "不突出显示"
}
}, },
"user_profile": { "user_profile": {
"timeline_title": "用户时间线", "timeline_title": "用户时间线",
@ -788,8 +806,8 @@
"media_nsfw_desc": "本实例将来自以下实例的媒体内容强制设置为敏感内容:", "media_nsfw_desc": "本实例将来自以下实例的媒体内容强制设置为敏感内容:",
"media_nsfw": "强制设置媒体为敏感内容", "media_nsfw": "强制设置媒体为敏感内容",
"media_removal_desc": "本实例移除来自以下实例的媒体内容:", "media_removal_desc": "本实例移除来自以下实例的媒体内容:",
"ftl_removal_desc": "该实例在从“全部已知网络”时间线上移除了下列实例:", "ftl_removal_desc": "该实例在从“已知网络”时间线上移除了下列实例:",
"ftl_removal": "从“全部已知网络”时间线上移除" "ftl_removal": "从“已知网络”时间线上移除"
}, },
"mrf_policies_desc": "MRF 策略会影响本实例的互通行为。以下策略已启用:", "mrf_policies_desc": "MRF 策略会影响本实例的互通行为。以下策略已启用:",
"mrf_policies": "已启用的 MRF 策略", "mrf_policies": "已启用的 MRF 策略",

View file

@ -22,7 +22,9 @@
"votes": "票", "votes": "票",
"option": "選項", "option": "選項",
"add_option": "增加選項", "add_option": "增加選項",
"add_poll": "增加投票" "add_poll": "增加投票",
"votes_count": "{count} 票 | {count} 票",
"people_voted_count": "{count} 人已投票 | {count} 人已投票"
}, },
"notifications": { "notifications": {
"reacted_with": "作出了 {0} 的反應", "reacted_with": "作出了 {0} 的反應",
@ -108,7 +110,11 @@
"loading": "載入中…", "loading": "載入中…",
"more": "更多", "more": "更多",
"submit": "提交", "submit": "提交",
"apply": "應用" "apply": "應用",
"role": {
"moderator": "主持人",
"admin": "管理員"
}
}, },
"finder": { "finder": {
"find_user": "尋找用戶", "find_user": "尋找用戶",
@ -424,7 +430,7 @@
"notification_blocks": "封鎖一個用戶會停掉所有他的通知,等同於取消關注。", "notification_blocks": "封鎖一個用戶會停掉所有他的通知,等同於取消關注。",
"enable_web_push_notifications": "啟用 web 推送通知", "enable_web_push_notifications": "啟用 web 推送通知",
"presets": "預置", "presets": "預置",
"profile_background": "個人背景圖", "profile_background": "配置文件背景圖",
"profile_banner": "橫幅圖片", "profile_banner": "橫幅圖片",
"profile_tab": "個人資料", "profile_tab": "個人資料",
"radii_help": "設置界面邊緣的圓角 (單位:像素)", "radii_help": "設置界面邊緣的圓角 (單位:像素)",
@ -512,7 +518,7 @@
"show_moderator_badge": "顯示主持人徽章", "show_moderator_badge": "顯示主持人徽章",
"oauth_tokens": "OAuth代幣", "oauth_tokens": "OAuth代幣",
"token": "代幣", "token": "代幣",
"refresh_token": "刷新代幣", "refresh_token": "刷新token",
"useStreamingApiWarning": "(不推薦使用,實驗性的,已知跳過文章)", "useStreamingApiWarning": "(不推薦使用,實驗性的,已知跳過文章)",
"fun": "有趣", "fun": "有趣",
"notification_setting_hide_notification_contents": "隱藏推送通知中的發送者與內容信息", "notification_setting_hide_notification_contents": "隱藏推送通知中的發送者與內容信息",
@ -528,7 +534,14 @@
"mute_import_error": "導入靜音時出錯", "mute_import_error": "導入靜音時出錯",
"mute_export_button": "將靜音導出到csv文件", "mute_export_button": "將靜音導出到csv文件",
"mute_export": "靜音導出", "mute_export": "靜音導出",
"hide_wallpaper": "隱藏實例桌布" "hide_wallpaper": "隱藏實例桌布",
"reply_visibility_self_short": "只顯示對我本人的回复",
"reply_visibility_following_short": "顯示對我關注的人的回复",
"hide_all_muted_posts": "不顯示已隱藏的帖子",
"hide_media_previews": "隱藏媒體預覽",
"word_filter": "詞過濾",
"setting_changed": "與默認設置不同",
"more_settings": "更多設置"
}, },
"chats": { "chats": {
"more": "更多", "more": "更多",
@ -667,7 +680,7 @@
"load_older": "載入更早的互動", "load_older": "載入更早的互動",
"moves": "用戶遷移", "moves": "用戶遷移",
"follows": "新的關注者", "follows": "新的關注者",
"favs_repeats": "轉發和收藏" "favs_repeats": "轉發和喜歡"
}, },
"selectable_list": { "selectable_list": {
"select_all": "選擇全部" "select_all": "選擇全部"
@ -696,7 +709,9 @@
"registration": "註冊", "registration": "註冊",
"password_confirm": "確認密碼", "password_confirm": "確認密碼",
"email": "電子郵箱", "email": "電子郵箱",
"bio": "簡介" "bio": "簡介",
"reason_placeholder": "此實例的註冊需要手動批准。\n請讓管理知道您為什麼想要註冊。",
"reason": "註冊理由"
}, },
"user_card": { "user_card": {
"its_you": "就是你!!", "its_you": "就是你!!",
@ -756,7 +771,14 @@
"roles": { "roles": {
"moderator": "主持人", "moderator": "主持人",
"admin": "管理員" "admin": "管理員"
} },
"highlight": {
"disabled": "無突出顯示",
"solid": "單色背景",
"striped": "條紋背景",
"side": "彩條"
},
"bot": "機器人"
}, },
"user_profile": { "user_profile": {
"timeline_title": "用戶時間線", "timeline_title": "用戶時間線",

View file

@ -3,8 +3,11 @@ import { WSConnectionStatus } from '../services/api/api.service.js'
import { maybeShowChatNotification } from '../services/chat_utils/chat_utils.js' import { maybeShowChatNotification } from '../services/chat_utils/chat_utils.js'
import { Socket } from 'phoenix' import { Socket } from 'phoenix'
const retryTimeout = (multiplier) => 1000 * multiplier
const api = { const api = {
state: { state: {
retryMultiplier: 1,
backendInteractor: backendInteractorService(), backendInteractor: backendInteractorService(),
fetchers: {}, fetchers: {},
socket: null, socket: null,
@ -34,18 +37,43 @@ const api = {
}, },
setMastoUserSocketStatus (state, value) { setMastoUserSocketStatus (state, value) {
state.mastoUserSocketStatus = value state.mastoUserSocketStatus = value
},
incrementRetryMultiplier (state) {
state.retryMultiplier = Math.max(++state.retryMultiplier, 3)
},
resetRetryMultiplier (state) {
state.retryMultiplier = 1
} }
}, },
actions: { actions: {
// Global MastoAPI socket control, in future should disable ALL sockets/(re)start relevant sockets /**
enableMastoSockets (store) { * Global MastoAPI socket control, in future should disable ALL sockets/(re)start relevant sockets
const { state, dispatch } = store *
if (state.mastoUserSocket) return * @param {Boolean} [initial] - whether this enabling happened at boot time or not
*/
enableMastoSockets (store, initial) {
const { state, dispatch, commit } = store
// Do not initialize unless nonexistent or closed
if (
state.mastoUserSocket &&
![
WebSocket.CLOSED,
WebSocket.CLOSING
].includes(state.mastoUserSocket.getState())
) {
return
}
if (initial) {
commit('setMastoUserSocketStatus', WSConnectionStatus.STARTING_INITIAL)
} else {
commit('setMastoUserSocketStatus', WSConnectionStatus.STARTING)
}
return dispatch('startMastoUserSocket') return dispatch('startMastoUserSocket')
}, },
disableMastoSockets (store) { disableMastoSockets (store) {
const { state, dispatch } = store const { state, dispatch, commit } = store
if (!state.mastoUserSocket) return if (!state.mastoUserSocket) return
commit('setMastoUserSocketStatus', WSConnectionStatus.DISABLED)
return dispatch('stopMastoUserSocket') return dispatch('stopMastoUserSocket')
}, },
@ -91,11 +119,29 @@ const api = {
} }
) )
state.mastoUserSocket.addEventListener('open', () => { state.mastoUserSocket.addEventListener('open', () => {
// Do not show notification when we just opened up the page
if (state.mastoUserSocketStatus !== WSConnectionStatus.STARTING_INITIAL) {
dispatch('pushGlobalNotice', {
level: 'success',
messageKey: 'timeline.socket_reconnected',
timeout: 5000
})
}
// Stop polling if we were errored or disabled
if (new Set([
WSConnectionStatus.ERROR,
WSConnectionStatus.DISABLED
]).has(state.mastoUserSocketStatus)) {
dispatch('stopFetchingTimeline', { timeline: 'friends' })
dispatch('stopFetchingNotifications')
dispatch('stopFetchingChats')
}
commit('resetRetryMultiplier')
commit('setMastoUserSocketStatus', WSConnectionStatus.JOINED) commit('setMastoUserSocketStatus', WSConnectionStatus.JOINED)
}) })
state.mastoUserSocket.addEventListener('error', ({ detail: error }) => { state.mastoUserSocket.addEventListener('error', ({ detail: error }) => {
console.error('Error in MastoAPI websocket:', error) console.error('Error in MastoAPI websocket:', error)
commit('setMastoUserSocketStatus', WSConnectionStatus.ERROR) // TODO is this needed?
dispatch('clearOpenedChats') dispatch('clearOpenedChats')
}) })
state.mastoUserSocket.addEventListener('close', ({ detail: closeEvent }) => { state.mastoUserSocket.addEventListener('close', ({ detail: closeEvent }) => {
@ -106,14 +152,26 @@ const api = {
const { code } = closeEvent const { code } = closeEvent
if (ignoreCodes.has(code)) { if (ignoreCodes.has(code)) {
console.debug(`Not restarting socket becasue of closure code ${code} is in ignore list`) console.debug(`Not restarting socket becasue of closure code ${code} is in ignore list`)
commit('setMastoUserSocketStatus', WSConnectionStatus.CLOSED)
} else { } else {
console.warn(`MastoAPI websocket disconnected, restarting. CloseEvent code: ${code}`) console.warn(`MastoAPI websocket disconnected, restarting. CloseEvent code: ${code}`)
dispatch('startFetchingTimeline', { timeline: 'friends' }) setTimeout(() => {
dispatch('startFetchingNotifications') dispatch('startMastoUserSocket')
dispatch('startFetchingChats') }, retryTimeout(state.retryMultiplier))
dispatch('restartMastoUserSocket') commit('incrementRetryMultiplier')
if (state.mastoUserSocketStatus !== WSConnectionStatus.ERROR) {
dispatch('startFetchingTimeline', { timeline: 'friends' })
dispatch('startFetchingNotifications')
dispatch('startFetchingChats')
dispatch('pushGlobalNotice', {
level: 'error',
messageKey: 'timeline.socket_broke',
messageArgs: [code],
timeout: 5000
})
}
commit('setMastoUserSocketStatus', WSConnectionStatus.ERROR)
} }
commit('setMastoUserSocketStatus', WSConnectionStatus.CLOSED)
dispatch('clearOpenedChats') dispatch('clearOpenedChats')
}) })
resolve() resolve()
@ -122,15 +180,6 @@ const api = {
} }
}) })
}, },
restartMastoUserSocket ({ dispatch }) {
// This basically starts MastoAPI user socket and stops conventional
// fetchers when connection reestablished
return dispatch('startMastoUserSocket').then(() => {
dispatch('stopFetchingTimeline', { timeline: 'friends' })
dispatch('stopFetchingNotifications')
dispatch('stopFetchingChats')
})
},
stopMastoUserSocket ({ state, dispatch }) { stopMastoUserSocket ({ state, dispatch }) {
dispatch('startFetchingTimeline', { timeline: 'friends' }) dispatch('startFetchingTimeline', { timeline: 'friends' })
dispatch('startFetchingNotifications') dispatch('startFetchingNotifications')
@ -156,6 +205,13 @@ const api = {
if (!fetcher) return if (!fetcher) return
store.commit('removeFetcher', { fetcherName: timeline, fetcher }) store.commit('removeFetcher', { fetcherName: timeline, fetcher })
}, },
fetchTimeline (store, timeline, { ...rest }) {
store.state.backendInteractor.fetchTimeline({
store,
timeline,
...rest
})
},
// Notifications // Notifications
startFetchingNotifications (store) { startFetchingNotifications (store) {
@ -168,6 +224,12 @@ const api = {
if (!fetcher) return if (!fetcher) return
store.commit('removeFetcher', { fetcherName: 'notifications', fetcher }) store.commit('removeFetcher', { fetcherName: 'notifications', fetcher })
}, },
fetchNotifications (store, { ...rest }) {
store.state.backendInteractor.fetchNotifications({
store,
...rest
})
},
// Follow requests // Follow requests
startFetchingFollowRequests (store) { startFetchingFollowRequests (store) {

View file

@ -44,7 +44,7 @@ export const defaultState = {
likes: true, likes: true,
repeats: true, repeats: true,
moves: true, moves: true,
emojiReactions: false, emojiReactions: true,
followRequest: true, followRequest: true,
chatMention: true chatMention: true
}, },
@ -110,6 +110,20 @@ const config = {
} }
}, },
actions: { actions: {
loadSettings ({ dispatch }, data) {
const knownKeys = new Set(Object.keys(defaultState))
const presentKeys = new Set(Object.keys(data))
const intersection = new Set()
for (let elem of presentKeys) {
if (knownKeys.has(elem)) {
intersection.add(elem)
}
}
intersection.forEach(
name => dispatch('setOption', { name, value: data[name] })
)
},
setHighlight ({ commit, dispatch }, { user, color, type }) { setHighlight ({ commit, dispatch }, { user, color, type }) {
commit('setHighlight', { user, color, type }) commit('setHighlight', { user, color, type })
}, },

View file

@ -547,9 +547,10 @@ const users = {
} }
if (store.getters.mergedConfig.useStreamingApi) { if (store.getters.mergedConfig.useStreamingApi) {
store.dispatch('enableMastoSockets').catch((error) => { store.dispatch('fetchTimeline', 'friends', { since: null })
store.dispatch('fetchNotifications', { since: null })
store.dispatch('enableMastoSockets', true).catch((error) => {
console.error('Failed initializing MastoAPI Streaming socket', error) console.error('Failed initializing MastoAPI Streaming socket', error)
startPolling()
}).then(() => { }).then(() => {
store.dispatch('fetchChats', { latest: true }) store.dispatch('fetchChats', { latest: true })
setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000) setTimeout(() => store.dispatch('setNotificationsSilence', false), 10000)

View file

@ -1152,6 +1152,7 @@ export const ProcessedWS = ({
// 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
return eventTarget return eventTarget
} }
@ -1183,7 +1184,10 @@ export const handleMastoWS = (wsEvent) => {
export const WSConnectionStatus = Object.freeze({ export const WSConnectionStatus = Object.freeze({
'JOINED': 1, 'JOINED': 1,
'CLOSED': 2, 'CLOSED': 2,
'ERROR': 3 'ERROR': 3,
'DISABLED': 4,
'STARTING': 5,
'STARTING_INITIAL': 6
}) })
const chats = ({ credentials }) => { const chats = ({ credentials }) => {

View file

@ -1,17 +1,25 @@
import apiService, { getMastodonSocketURI, ProcessedWS } from '../api/api.service.js' import apiService, { getMastodonSocketURI, ProcessedWS } from '../api/api.service.js'
import timelineFetcherService from '../timeline_fetcher/timeline_fetcher.service.js' import timelineFetcher from '../timeline_fetcher/timeline_fetcher.service.js'
import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js' import notificationsFetcher from '../notifications_fetcher/notifications_fetcher.service.js'
import followRequestFetcher from '../../services/follow_request_fetcher/follow_request_fetcher.service' import followRequestFetcher from '../../services/follow_request_fetcher/follow_request_fetcher.service'
const backendInteractorService = credentials => ({ const backendInteractorService = credentials => ({
startFetchingTimeline ({ timeline, store, userId = false, tag }) { startFetchingTimeline ({ timeline, store, userId = false, tag }) {
return timelineFetcherService.startFetching({ timeline, store, credentials, userId, tag }) return timelineFetcher.startFetching({ timeline, store, credentials, userId, tag })
},
fetchTimeline (args) {
return timelineFetcher.fetchAndUpdate({ ...args, credentials })
}, },
startFetchingNotifications ({ store }) { startFetchingNotifications ({ store }) {
return notificationsFetcher.startFetching({ store, credentials }) return notificationsFetcher.startFetching({ store, credentials })
}, },
fetchNotifications (args) {
return notificationsFetcher.fetchAndUpdate({ ...args, credentials })
},
startFetchingFollowRequests ({ store }) { startFetchingFollowRequests ({ store }) {
return followRequestFetcher.startFetching({ store, credentials }) return followRequestFetcher.startFetching({ store, credentials })
}, },

View file

@ -0,0 +1,55 @@
export const newExporter = ({
filename = 'data',
getExportedObject
}) => ({
exportData () {
const stringified = JSON.stringify(getExportedObject(), null, 2) // Pretty-print and indent with 2 spaces
// Create an invisible link with a data url and simulate a click
const e = document.createElement('a')
e.setAttribute('download', `${filename}.json`)
e.setAttribute('href', 'data:application/json;base64,' + window.btoa(stringified))
e.style.display = 'none'
document.body.appendChild(e)
e.click()
document.body.removeChild(e)
}
})
export const newImporter = ({
onImport,
onImportFailure,
validator = () => true
}) => ({
importData () {
const filePicker = document.createElement('input')
filePicker.setAttribute('type', 'file')
filePicker.setAttribute('accept', '.json')
filePicker.addEventListener('change', event => {
if (event.target.files[0]) {
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({ target }) => {
try {
const parsed = JSON.parse(target.result)
const validationResult = validator(parsed)
if (validationResult === true) {
onImport(parsed)
} else {
onImportFailure({ validationResult })
}
} catch (error) {
onImportFailure({ error })
}
}
reader.readAsText(event.target.files[0])
}
})
document.body.appendChild(filePicker)
filePicker.click()
document.body.removeChild(filePicker)
}
})

View file

@ -5,7 +5,7 @@ const update = ({ store, notifications, older }) => {
store.dispatch('addNewNotifications', { notifications, older }) store.dispatch('addNewNotifications', { notifications, older })
} }
const fetchAndUpdate = ({ store, credentials, older = false }) => { const fetchAndUpdate = ({ store, credentials, older = false, since }) => {
const args = { credentials } const args = { credentials }
const { getters } = store const { getters } = store
const rootState = store.rootState || store.state const rootState = store.rootState || store.state
@ -22,8 +22,10 @@ const fetchAndUpdate = ({ store, credentials, older = false }) => {
return fetchNotifications({ store, args, older }) return fetchNotifications({ store, args, older })
} else { } else {
// fetch new notifications // fetch new notifications
if (timelineData.maxId !== Number.POSITIVE_INFINITY) { if (since === undefined && timelineData.maxId !== Number.POSITIVE_INFINITY) {
args['since'] = timelineData.maxId args['since'] = timelineData.maxId
} else if (since !== null) {
args['since'] = since
} }
const result = fetchNotifications({ store, args, older }) const result = fetchNotifications({ store, args, older })

View file

@ -380,7 +380,7 @@ export const colors2to3 = (colors) => {
*/ */
export const shadows2to3 = (shadows, opacity) => { export const shadows2to3 = (shadows, opacity) => {
return Object.entries(shadows).reduce((shadowsAcc, [slotName, shadowDefs]) => { return Object.entries(shadows).reduce((shadowsAcc, [slotName, shadowDefs]) => {
const isDynamic = ({ color }) => color.startsWith('--') const isDynamic = ({ color = '#000000' }) => color.startsWith('--')
const getOpacity = ({ color }) => opacity[getOpacitySlot(color.substring(2).split(',')[0])] const getOpacity = ({ color }) => opacity[getOpacitySlot(color.substring(2).split(',')[0])]
const newShadow = shadowDefs.reduce((shadowAcc, def) => [ const newShadow = shadowDefs.reduce((shadowAcc, def) => [
...shadowAcc, ...shadowAcc,

View file

@ -616,6 +616,23 @@ export const SLOT_INHERITANCE = {
textColor: true textColor: true
}, },
alertSuccess: {
depends: ['cGreen'],
opacity: 'alert'
},
alertSuccessText: {
depends: ['text'],
layer: 'alert',
variant: 'alertSuccess',
textColor: true
},
alertSuccessPanelText: {
depends: ['panelText'],
layer: 'alertPanel',
variant: 'alertSuccess',
textColor: true
},
alertNeutral: { alertNeutral: {
depends: ['text'], depends: ['text'],
opacity: 'alert' opacity: 'alert'
@ -656,6 +673,17 @@ export const SLOT_INHERITANCE = {
textColor: true textColor: true
}, },
alertPopupSuccess: {
depends: ['alertSuccess'],
opacity: 'alertPopup'
},
alertPopupSuccessText: {
depends: ['alertSuccessText'],
layer: 'popover',
variant: 'alertPopupSuccess',
textColor: true
},
alertPopupNeutral: { alertPopupNeutral: {
depends: ['alertNeutral'], depends: ['alertNeutral'],
opacity: 'alertPopup' opacity: 'alertPopup'

View file

@ -23,7 +23,8 @@ const fetchAndUpdate = ({
showImmediately = false, showImmediately = false,
userId = false, userId = false,
tag = false, tag = false,
until until,
since
}) => { }) => {
const args = { timeline, credentials } const args = { timeline, credentials }
const rootState = store.rootState || store.state const rootState = store.rootState || store.state
@ -35,7 +36,11 @@ const fetchAndUpdate = ({
if (older) { if (older) {
args['until'] = until || timelineData.minId args['until'] = until || timelineData.minId
} else { } else {
args['since'] = timelineData.maxId if (since === undefined) {
args['since'] = timelineData.maxId
} else if (since !== null) {
args['since'] = since
}
} }
args['userId'] = userId args['userId'] = userId