Merge remote-tracking branch 'origin/develop' into settings-modal

* origin/develop: (95 commits)
  Translated using Weblate (Italian)
  Translated using Weblate (Chinese (Simplified))
  Translated using Weblate (Russian)
  Translated using Weblate (Polish)
  Translated using Weblate (Dutch)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  Translated using Weblate (German)
  ...
This commit is contained in:
Henry Jameson 2020-05-25 03:29:48 +03:00
commit 138ec85003
51 changed files with 5250 additions and 3716 deletions

View file

@ -6,6 +6,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Changed
- Removed the use of with_move parameters when fetching notifications
## [Unreleased patch]
### Add
- Added private notifications option for push notifications
- 'Copy link' button for statuses (in the ellipsis menu)
### Changed
- Registration page no longer requires email if the server is configured not to require it
### Fixed
- Status ellipsis menu closes properly when selecting certain options
## [2.0.3] - 2020-05-02
### Fixed
- Show more/less works correctly with auto-collapsed subjects and long posts

View file

@ -19,32 +19,69 @@ There's currently no mechanism for user-settings synchronization across several
## Options
### `theme`
Default theme used for new users. De-facto instance-default, user can change theme.
### `alwaysShowSubjectInput`
`true` - will always show subject line input, `false` - only show when it's not empty (i.e. replying). To hide subject line input completely, set it to `false` and `subjectLineBehavior` to `"noop"`
### `background`
Default image background. Be aware of using too big images as they may take longer to load. Currently image is fitted with `background-size: cover` which means "scaled and cropped", currently left-aligned. De-facto instance default, user can choose their own background, if they remove their own background, instance default will be used instead.
### `collapseMessageWithSubject`
Collapse post content when post has a subject line (content warning). Instance-default.
### `disableChat`
hides the chat (TODO: even if it's enabled on backend)
### `greentext`
Changes lines prefixed with the `>` character to have a green text color
### `hideFilteredStatuses`
Removes filtered statuses from timelines.
### `hideMutedPosts`
Removes muted statuses from timelines.
### `hidePostStats`
Hide repeats/favorites counters for posts.
### `hideSitename`
Hide instance name in header.
### `hideUserStats`
Hide followers/friends counters for users.
### `loginMethod`
`"password"` - show simple password field
`"token"` - show button to log in with external method (will redirect to login form, more details in BE documentation)
### `logo`, `logoMask`, `logoMargin`
Instance `logo`, could be any image, including svg. By default it assumes logo used will be monochrome-with-alpha one, this is done to be compatible with both light and dark themes, so that white logo designed with dark theme in mind won't be invisible over light theme, this is done via [CSS3 Masking](https://www.html5rocks.com/en/tutorials/masking/adobe/). Basically - it will take alpha channel of the image and fill non-transparent areas of it with solid color. If you really want colorful logo - it can be done by setting `logoMask` to `false`.
`logoMargin` allows you to adjust vertical margins between logo boundary and navbar borders. The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout.
### `minimalScopesMode`
Limit scope selection to *Direct*, *User default* and *Scope of post replying to*. This also makes it impossible to reply to a DM with a non-DM post from PleromaFE.
### `nsfwCensorImage`
Use custom image for NSFW'd images
### `postContentType`
Default post formatting option (markdown/bbcode/plaintext/etc...)
### `redirectRootNoLogin`, `redirectRootLogin`
These two settings should point to where FE should redirect visitor when they login/open up website root
### `chatDisabled`
hides the chat (TODO: even if it's enabled on backend)
### `scopeCopy`
Copy post scope (visibility) when replying to a post. Instance-default.
### `sidebarRight`
Change alignment of sidebar and panels to the right. Defaults to `false`.
### `showFeaturesPanel`
Show panel showcasing instance features/settings to logged-out visitors
### `showInstanceSpecificPanel`
This allows you to include arbitrary HTML content in a panel below navigation menu. PleromaFE looks for an html page `instance/panel.html`, by default it's not provided in FE, but BE bundles some [default one](https://git.pleroma.social/pleroma/pleroma/blob/develop/priv/static/instance/panel.html). De-facto instance-defaults, since user can hide instance-specific panel.
### `collapseMessageWithSubject`
Collapse post content when post has a subject line (content warning). Instance-default.
### `scopeCopy`
Copy post scope (visibility) when replying to a post. Instance-default.
### `subjectLineBehavior`
How to handle subject line (CW) when replying to a post.
* `"email"` - like EMail - prepend `re: ` to subject line if it doesn't already start with it.
@ -52,39 +89,22 @@ How to handle subject line (CW) when replying to a post.
* `"noop"` - do not copy
Instance-default.
### `postContentType`
Default post formatting option (markdown/bbcode/plaintext/etc...)
### `alwaysShowSubjectInput`
`true` - will always show subject line input, `false` - only show when it's not empty (i.e. replying). To hide subject line input completely, set it to `false` and `subjectLineBehavior` to `"noop"`
### `hidePostStats` and `hideUserStats`
Hide counters for posts and users respectively, i.e. hiding repeats/favorites counts for posts, hiding followers/friends counts for users. This is just cosmetic and aimed to ease pressure and bias imposed by stat numbers of people and/or posts. (as an example: so that people care less about how many followers someone has since they can't see that info)
### `loginMethod`
`"password"` - show simple password field
`"token"` - show button to log in with external method (will redirect to login form, more details in BE documentation)
### `theme`
Default theme used for new users. De-facto instance-default, user can change theme.
### `webPushNotifications`
Enables [PushAPI](https://developer.mozilla.org/en-US/docs/Web/API/Push_API) - based notifications for users. Instance-default.
### `noAttachmentLinks`
**TODO Currently doesn't seem to be doing anything code-wise**, but implication is to disable adding links for attachments, which looks nicer but breaks compatibility with old GNU/Social servers.
### `nsfwCensorImage`
Use custom image for NSFW'd images
### `showFeaturesPanel`
Show panel showcasing instance features/settings to logged-out visitors
### `hideSitename`
Hide instance name in header
## Indirect configuration
Some features are configured depending on how backend is configured. In general the approach is "if backend allows it there's no need to hide it, if backend doesn't allow it there's no need to show it.
### Chat
**TODO somewhat broken, see: chatDisabled** chat can be disabled by disabling it in backend
**TODO somewhat broken, see: disableChat** chat can be disabled by disabling it in backend
### Private Mode
If the `private` instance setting is enabled in the backend, features that are not accessible without authentication, such as the timelines and search will be disabled for unauthenticated users.
### Rich text formatting in post formatting
Rich text formatting options are displayed depending on how many formatting options are enabled on backend, if you don't want your users to use rich text at all you can only allow "text/plain" one, frontend then will only display post text format as a label instead of dropdown (just so that users know for example if you only allow Markdown, only BBCode or only Plain text)
@ -92,13 +112,3 @@ Rich text formatting options are displayed depending on how many formatting opti
### Who to follow
This is a panel intended for users to find people to follow based on randomness or on post contents. Being potentially privacy unfriendly feature it needs to be enabled and configured in backend to be enabled.
### Safe DM message display
Setting this will change the warning text that is displayed for direct messages.
ATTENTION: If you actually want the behavior to change. You will need to set the appropriate option at the backend. See the backend documentation for information about that.
DO NOT activate this without checking the backend configuration first!
### Private Mode
If the `private` instance setting is enabled in the backend, features that are not accessible without authentication, such as the timelines and search will be disabled for unauthenticated users.

View file

@ -101,7 +101,12 @@ export default {
},
showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel },
isMobileLayout () { return this.$store.state.interface.mobileLayout },
privateMode () { return this.$store.state.instance.private }
privateMode () { return this.$store.state.instance.private },
sidebarAlign () {
return {
'order': this.$store.state.instance.sidebarRight ? 99 : 0
}
}
},
methods: {
scrollToTop () {

View file

@ -80,7 +80,10 @@
id="content"
class="container underlay"
>
<div class="sidebar-flexer mobile-hidden">
<div
class="sidebar-flexer mobile-hidden"
:style="sidebarAlign"
>
<div class="sidebar-bounds">
<div class="sidebar-scroller">
<div class="sidebar">

View file

@ -108,7 +108,6 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
copyInstanceOption('subjectLineBehavior')
copyInstanceOption('postContentType')
copyInstanceOption('alwaysShowSubjectInput')
copyInstanceOption('noAttachmentLinks')
copyInstanceOption('showFeaturesPanel')
copyInstanceOption('hideSitename')
@ -241,6 +240,9 @@ const getNodeInfo = async ({ store }) => {
: federation.enabled
})
const accountActivationRequired = metadata.accountActivationRequired
store.dispatch('setInstanceOption', { name: 'accountActivationRequired', value: accountActivationRequired })
const accounts = metadata.staffAccounts
resolveStaffAccounts({ store, accounts })
} else {
@ -304,6 +306,9 @@ const afterStoreSetup = async ({ store, i18n }) => {
getNodeInfo({ store })
])
// Start fetching things that don't need to block the UI
store.dispatch('fetchMutes')
const router = new VueRouter({
mode: 'history',
routes: routes(store),

View file

@ -3,7 +3,7 @@ import Popover from '../popover/popover.vue'
const AccountActions = {
props: [
'user'
'user', 'relationship'
],
data () {
return { }

View file

@ -9,16 +9,16 @@
class="account-tools-popover"
>
<div class="dropdown-menu">
<template v-if="user.following">
<template v-if="relationship.following">
<button
v-if="user.showing_reblogs"
v-if="relationship.showing_reblogs"
class="btn btn-default dropdown-item"
@click="hideRepeats"
>
{{ $t('user_card.hide_repeats') }}
</button>
<button
v-if="!user.showing_reblogs"
v-if="!relationship.showing_reblogs"
class="btn btn-default dropdown-item"
@click="showRepeats"
>
@ -30,7 +30,7 @@
/>
</template>
<button
v-if="user.statusnet_blocking"
v-if="relationship.blocking"
class="btn btn-default btn-block dropdown-item"
@click="unblockUser"
>

View file

@ -12,7 +12,7 @@
class="basic-user-card-expanded-content"
>
<UserCard
:user="user"
:user-id="user.id"
:rounded="true"
:bordered="true"
/>

View file

@ -11,8 +11,11 @@ const BlockCard = {
user () {
return this.$store.getters.findUser(this.userId)
},
relationship () {
return this.$store.getters.relationship(this.userId)
},
blocked () {
return this.user.statusnet_blocking
return this.relationship.blocking
}
},
components: {

View file

@ -29,6 +29,11 @@ const ExtraButtons = {
this.$store.dispatch('unmuteConversation', this.status.id)
.then(() => this.$emit('onSuccess'))
.catch(err => this.$emit('onError', err.error.error))
},
copyLink () {
navigator.clipboard.writeText(this.statusLink)
.then(() => this.$emit('onSuccess'))
.catch(err => this.$emit('onError', err.error.error))
}
},
computed: {
@ -46,6 +51,9 @@ const ExtraButtons = {
},
canMute () {
return !!this.currentUser
},
statusLink () {
return `${this.$store.state.instance.server}${this.$router.resolve({ name: 'conversation', params: { id: this.status.id } }).href}`
}
}
}

View file

@ -1,11 +1,13 @@
<template>
<Popover
v-if="canDelete || canMute || canPin"
trigger="click"
placement="top"
class="extra-button-popover"
>
<div slot="content">
<div
slot="content"
slot-scope="{close}"
>
<div class="dropdown-menu">
<button
v-if="canMute && !status.thread_muted"
@ -23,28 +25,35 @@
</button>
<button
v-if="!status.pinned && canPin"
v-close-popover
class="dropdown-item dropdown-item-icon"
@click.prevent="pinStatus"
@click="close"
>
<i class="icon-pin" /><span>{{ $t("status.pin") }}</span>
</button>
<button
v-if="status.pinned && canPin"
v-close-popover
class="dropdown-item dropdown-item-icon"
@click.prevent="unpinStatus"
@click="close"
>
<i class="icon-pin" /><span>{{ $t("status.unpin") }}</span>
</button>
<button
v-if="canDelete"
v-close-popover
class="dropdown-item dropdown-item-icon"
@click.prevent="deleteStatus"
@click="close"
>
<i class="icon-cancel" /><span>{{ $t("status.delete") }}</span>
</button>
<button
class="dropdown-item dropdown-item-icon"
@click.prevent="copyLink"
@click="close"
>
<i class="icon-share" /><span>{{ $t("status.copy_link") }}</span>
</button>
</div>
</div>
<i

View file

@ -1,6 +1,6 @@
import { requestFollow, requestUnfollow } from '../../services/follow_manipulate/follow_manipulate'
export default {
props: ['user', 'labelFollowing', 'buttonClass'],
props: ['relationship', 'labelFollowing', 'buttonClass'],
data () {
return {
inProgress: false
@ -8,12 +8,12 @@ export default {
},
computed: {
isPressed () {
return this.inProgress || this.user.following
return this.inProgress || this.relationship.following
},
title () {
if (this.inProgress || this.user.following) {
if (this.inProgress || this.relationship.following) {
return this.$t('user_card.follow_unfollow')
} else if (this.user.requested) {
} else if (this.relationship.requested) {
return this.$t('user_card.follow_again')
} else {
return this.$t('user_card.follow')
@ -22,9 +22,9 @@ export default {
label () {
if (this.inProgress) {
return this.$t('user_card.follow_progress')
} else if (this.user.following) {
} else if (this.relationship.following) {
return this.labelFollowing || this.$t('user_card.following')
} else if (this.user.requested) {
} else if (this.relationship.requested) {
return this.$t('user_card.follow_sent')
} else {
return this.$t('user_card.follow')
@ -33,20 +33,20 @@ export default {
},
methods: {
onClick () {
this.user.following ? this.unfollow() : this.follow()
this.relationship.following ? this.unfollow() : this.follow()
},
follow () {
this.inProgress = true
requestFollow(this.user, this.$store).then(() => {
requestFollow(this.relationship.id, this.$store).then(() => {
this.inProgress = false
})
},
unfollow () {
const store = this.$store
this.inProgress = true
requestUnfollow(this.user, store).then(() => {
requestUnfollow(this.relationship.id, store).then(() => {
this.inProgress = false
store.commit('removeStatus', { timeline: 'friends', userId: this.user.id })
store.commit('removeStatus', { timeline: 'friends', userId: this.relationship.id })
})
}
}

View file

@ -18,6 +18,9 @@ const FollowCard = {
},
loggedIn () {
return this.$store.state.users.currentUser
},
relationship () {
return this.$store.getters.relationship(this.user.id)
}
}
}

View file

@ -2,24 +2,24 @@
<basic-user-card :user="user">
<div class="follow-card-content-container">
<span
v-if="!noFollowsYou && user.follows_you"
v-if="isMe || (!noFollowsYou && relationship.followed_by)"
class="faint"
>
{{ isMe ? $t('user_card.its_you') : $t('user_card.follows_you') }}
</span>
<template v-if="!loggedIn">
<div
v-if="!user.following"
v-if="!relationship.following"
class="follow-card-follow-button"
>
<RemoteFollow :user="user" />
</div>
</template>
<template v-else>
<template v-else-if="!isMe">
<FollowButton
:user="user"
class="follow-card-follow-button"
:relationship="relationship"
:label-following="$t('user_card.follow_unfollow')"
class="follow-card-follow-button"
/>
</template>
</div>

View file

@ -11,8 +11,11 @@ const MuteCard = {
user () {
return this.$store.getters.findUser(this.userId)
},
relationship () {
return this.$store.getters.relationship(this.userId)
},
muted () {
return this.user.muted
return this.relationship.muting
}
},
components: {
@ -21,13 +24,13 @@ const MuteCard = {
methods: {
unmuteUser () {
this.progress = true
this.$store.dispatch('unmuteUser', this.user.id).then(() => {
this.$store.dispatch('unmuteUser', this.userId).then(() => {
this.progress = false
})
},
muteUser () {
this.progress = true
this.$store.dispatch('muteUser', this.user.id).then(() => {
this.$store.dispatch('muteUser', this.userId).then(() => {
this.progress = false
})
}

View file

@ -75,7 +75,7 @@ const Notification = {
return this.generateUserProfileLink(this.targetUser)
},
needMute () {
return this.user.muted
return this.$store.getters.relationship(this.user.id).muting
},
isStatusNotification () {
return isStatusNotification(this.notification.type)

View file

@ -40,7 +40,7 @@
<div class="notification-right">
<UserCard
v-if="userExpanded"
:user="getUser(notification)"
:user-id="getUser(notification).id"
:rounded="true"
:bordered="true"
/>

View file

@ -102,7 +102,7 @@ const PostStatusForm = {
...this.$store.state.instance.customEmoji
],
users: this.$store.state.users.users,
updateUsersList: (input) => this.$store.dispatch('searchUsers', input)
updateUsersList: (query) => this.$store.dispatch('searchUsers', { query })
})
},
emojiSuggestor () {

View file

@ -2,7 +2,7 @@ import Popover from '../popover/popover.vue'
import { mapGetters } from 'vuex'
const ReactButton = {
props: ['status', 'loggedIn'],
props: ['status'],
data () {
return {
filterWord: ''

View file

@ -37,7 +37,6 @@
</div>
</div>
<i
v-if="loggedIn"
slot="trigger"
class="icon-smile button-icon add-reaction-button"
:title="$t('tool_tip.add_reaction')"

View file

@ -1,5 +1,5 @@
import { validationMixin } from 'vuelidate'
import { required, sameAs } from 'vuelidate/lib/validators'
import { required, requiredIf, sameAs } from 'vuelidate/lib/validators'
import { mapActions, mapState } from 'vuex'
const registration = {
@ -14,9 +14,10 @@ const registration = {
},
captcha: {}
}),
validations: {
validations () {
return {
user: {
email: { required },
email: { required: requiredIf(() => this.accountActivationRequired) },
username: { required },
fullname: { required },
password: { required },
@ -25,6 +26,7 @@ const registration = {
sameAsPassword: sameAs('password')
}
}
}
},
created () {
if ((!this.registrationOpen && !this.token) || this.signedIn) {
@ -43,7 +45,8 @@ const registration = {
signedIn: (state) => !!state.users.currentUser,
isPending: (state) => state.users.signUpPending,
serverValidationErrors: (state) => state.users.signUpErrors,
termsOfService: (state) => state.instance.tos
termsOfService: (state) => state.instance.tos,
accountActivationRequired: (state) => state.instance.accountActivationRequired
})
},
methods: {

View file

@ -85,18 +85,18 @@ const MutesAndBlocks = {
},
filterUnblockedUsers (userIds) {
return reject(userIds, (userId) => {
const user = this.$store.getters.findUser(userId)
return !user || user.statusnet_blocking || user.id === this.$store.state.users.currentUser.id
const relationship = this.$store.getters.relationship(this.userId)
return relationship.blocking || userId === this.$store.state.users.currentUser.id
})
},
filterUnMutedUsers (userIds) {
return reject(userIds, (userId) => {
const user = this.$store.getters.findUser(userId)
return !user || user.muted || user.id === this.$store.state.users.currentUser.id
const relationship = this.$store.getters.relationship(this.userId)
return relationship.muting || userId === this.$store.state.users.currentUser.id
})
},
queryUserIds (query) {
return this.$store.dispatch('searchUsers', query)
return this.$store.dispatch('searchUsers', { query })
.then((users) => map(users, 'id'))
},
blockUsers (ids) {

View file

@ -1,6 +1,7 @@
<template>
<div :label="$t('settings.notifications')">
<div class="setting-item">
<h2>{{ $t('settings.notification_setting_filters') }}</h2>
<div class="select-multiple">
<span class="label">{{ $t('settings.notification_setting') }}</span>
<ul class="option-list">
@ -26,6 +27,17 @@
</li>
</ul>
</div>
</div>
<div class="setting-item">
<h2>{{ $t('settings.notification_setting_privacy') }}</h2>
<p>
<Checkbox v-model="notificationSettings.privacy_option">
{{ $t('settings.notification_setting_privacy_option') }}
</Checkbox>
</p>
</div>
<div class="setting-item">
<p>{{ $t('settings.notification_mutes') }}</p>
<p>{{ $t('settings.notification_blocks') }}</p>
<button

View file

@ -54,7 +54,7 @@ const ProfileTab = {
...this.$store.state.instance.customEmoji
],
users: this.$store.state.users.users,
updateUsersList: (input) => this.$store.dispatch('searchUsers', input)
updateUsersList: (query) => this.$store.dispatch('searchUsers', { query })
})
},
emojiSuggestor () {

View file

@ -19,7 +19,7 @@
>
<UserCard
v-if="currentUser"
:user="currentUser"
:user-id="currentUser.id"
:hide-bio="true"
/>
<div

View file

@ -1,23 +1,17 @@
import Attachment from '../attachment/attachment.vue'
import FavoriteButton from '../favorite_button/favorite_button.vue'
import ReactButton from '../react_button/react_button.vue'
import RetweetButton from '../retweet_button/retweet_button.vue'
import Poll from '../poll/poll.vue'
import ExtraButtons from '../extra_buttons/extra_buttons.vue'
import PostStatusForm from '../post_status_form/post_status_form.vue'
import UserCard from '../user_card/user_card.vue'
import UserAvatar from '../user_avatar/user_avatar.vue'
import Gallery from '../gallery/gallery.vue'
import LinkPreview from '../link-preview/link-preview.vue'
import AvatarList from '../avatar_list/avatar_list.vue'
import Timeago from '../timeago/timeago.vue'
import StatusContent from '../status_content/status_content.vue'
import StatusPopover from '../status_popover/status_popover.vue'
import EmojiReactions from '../emoji_reactions/emoji_reactions.vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import fileType from 'src/services/file_type/file_type.service'
import { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js'
import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
import { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js'
import { filter, unescape, uniqBy } from 'lodash'
import { mapGetters, mapState } from 'vuex'
@ -43,17 +37,10 @@ const Status = {
replying: false,
unmuted: false,
userExpanded: false,
showingTall: this.inConversation && this.focused,
showingLongSubject: false,
error: null,
// not as computed because it sets the initial state which will be changed later
expandingSubject: !this.$store.getters.mergedConfig.collapseMessageWithSubject
error: null
}
},
computed: {
localCollapseSubjectDefault () {
return this.mergedConfig.collapseMessageWithSubject
},
muteWords () {
return this.mergedConfig.muteWords
},
@ -79,10 +66,6 @@ const Status = {
const highlight = this.mergedConfig.highlight
return highlightStyle(highlight[user.screen_name])
},
hideAttachments () {
return (this.mergedConfig.hideAttachments && !this.inConversation) ||
(this.mergedConfig.hideAttachmentsInConv && this.inConversation)
},
userProfileLink () {
return this.generateUserProfileLink(this.status.user.id, this.status.user.screen_name)
},
@ -118,7 +101,13 @@ const Status = {
return hits
},
muted () { return !this.unmuted && ((!(this.inProfile && this.status.user.id === this.profileUserId) && this.status.user.muted) || (!this.inConversation && this.status.thread_muted) || this.muteWordHits.length > 0) },
muted () {
const relationship = this.$store.getters.relationship(this.status.user.id)
return !this.unmuted && (
(!(this.inProfile && this.status.user.id === this.profileUserId) && relationship.muting) ||
(!this.inConversation && this.status.thread_muted) ||
this.muteWordHits.length > 0)
},
hideFilteredStatuses () {
return this.mergedConfig.hideFilteredStatuses
},
@ -135,20 +124,6 @@ const Status = {
// use conversation highlight only when in conversation
return this.status.id === this.highlight
},
// This is a bit hacky, but we want to approximate post height before rendering
// so we count newlines (masto uses <p> for paragraphs, GS uses <br> between them)
// as well as approximate line count by counting characters and approximating ~80
// per line.
//
// Using max-height + overflow: auto for status components resulted in false positives
// very often with japanese characters, and it was very annoying.
tallStatus () {
const lengthScore = this.status.statusnet_html.split(/<p|<br/).length + this.status.text.length / 80
return lengthScore > 20
},
longSubject () {
return this.status.summary.length > 900
},
isReply () {
return !!(this.status.in_reply_to_status_id && this.status.in_reply_to_user_id)
},
@ -178,8 +153,11 @@ const Status = {
if (this.status.user.id === this.status.attentions[i].id) {
continue
}
const taggedUser = this.$store.getters.findUser(this.status.attentions[i].id)
if (checkFollowing && taggedUser && taggedUser.following) {
// There's zero guarantee of this working. If we happen to have that user and their
// relationship in store then it will work, but there's kinda little chance of having
// them for people you're not following.
const relationship = this.$store.state.users.relationships[this.status.attentions[i].id]
if (checkFollowing && relationship && relationship.following) {
return false
}
if (this.status.attentions[i].id === this.currentUser.id) {
@ -188,32 +166,6 @@ const Status = {
}
return this.status.attentions.length > 0
},
// When a status has a subject and is also tall, we should only have one show more/less button. If the default is to collapse statuses with subjects, we just treat it like a status with a subject; otherwise, we just treat it like a tall status.
mightHideBecauseSubject () {
return this.status.summary && (!this.tallStatus || this.localCollapseSubjectDefault)
},
mightHideBecauseTall () {
return this.tallStatus && (!this.status.summary || !this.localCollapseSubjectDefault)
},
hideSubjectStatus () {
return this.mightHideBecauseSubject && !this.expandingSubject
},
hideTallStatus () {
return this.mightHideBecauseTall && !this.showingTall
},
showingMore () {
return (this.mightHideBecauseTall && this.showingTall) || (this.mightHideBecauseSubject && this.expandingSubject)
},
nsfwClickthrough () {
if (!this.status.nsfw) {
return false
}
if (this.status.summary && this.localCollapseSubjectDefault) {
return false
}
return true
},
replySubject () {
if (!this.status.summary) return ''
const decodedSummary = unescape(this.status.summary)
@ -227,83 +179,6 @@ const Status = {
return ''
}
},
attachmentSize () {
if ((this.mergedConfig.hideAttachments && !this.inConversation) ||
(this.mergedConfig.hideAttachmentsInConv && this.inConversation) ||
(this.status.attachments.length > this.maxThumbnails)) {
return 'hide'
} else if (this.compact) {
return 'small'
}
return 'normal'
},
galleryTypes () {
if (this.attachmentSize === 'hide') {
return []
}
return this.mergedConfig.playVideosInModal
? ['image', 'video']
: ['image']
},
galleryAttachments () {
return this.status.attachments.filter(
file => fileType.fileMatchesSomeType(this.galleryTypes, file)
)
},
nonGalleryAttachments () {
return this.status.attachments.filter(
file => !fileType.fileMatchesSomeType(this.galleryTypes, file)
)
},
hasImageAttachments () {
return this.status.attachments.some(
file => fileType.fileType(file.mimetype) === 'image'
)
},
hasVideoAttachments () {
return this.status.attachments.some(
file => fileType.fileType(file.mimetype) === 'video'
)
},
maxThumbnails () {
return this.mergedConfig.maxThumbnails
},
postBodyHtml () {
const html = this.status.statusnet_html
if (this.mergedConfig.greentext) {
try {
if (html.includes('&gt;')) {
// This checks if post has '>' at the beginning, excluding mentions so that @mention >impying works
return processHtml(html, (string) => {
if (string.includes('&gt;') &&
string
.replace(/<[^>]+?>/gi, '') // remove all tags
.replace(/@\w+/gi, '') // remove mentions (even failed ones)
.trim()
.startsWith('&gt;')) {
return `<span class='greentext'>${string}</span>`
} else {
return string
}
})
} else {
return html
}
} catch (e) {
console.err('Failed to process status html', e)
return html
}
} else {
return html
}
},
contentHtml () {
if (!this.status.summary_html) {
return this.postBodyHtml
}
return this.status.summary_html + '<br />' + this.postBodyHtml
},
combinedFavsAndRepeatsUsers () {
// Use the status from the global status repository since favs and repeats are saved in it
const combinedUsers = [].concat(
@ -312,9 +187,6 @@ const Status = {
)
return uniqBy(combinedUsers, 'id')
},
ownStatus () {
return this.status.user.id === this.currentUser.id
},
tags () {
return this.status.tags.filter(tagObj => tagObj.hasOwnProperty('name')).map(tagObj => tagObj.name).join(' ')
},
@ -328,21 +200,18 @@ const Status = {
})
},
components: {
Attachment,
FavoriteButton,
ReactButton,
RetweetButton,
ExtraButtons,
PostStatusForm,
Poll,
UserCard,
UserAvatar,
Gallery,
LinkPreview,
AvatarList,
Timeago,
StatusPopover,
EmojiReactions
EmojiReactions,
StatusContent
},
methods: {
visibilityIcon (visibility) {
@ -363,32 +232,6 @@ const Status = {
clearError () {
this.error = undefined
},
linkClicked (event) {
const target = event.target.closest('.status-content a')
if (target) {
if (target.className.match(/mention/)) {
const href = target.href
const attn = this.status.attentions.find(attn => mentionMatchesUrl(attn, href))
if (attn) {
event.stopPropagation()
event.preventDefault()
const link = this.generateUserProfileLink(attn.id, attn.screen_name)
this.$router.push(link)
return
}
}
if (target.rel.match(/(?:^|\s)tag(?:$|\s)/) || target.className.match(/hashtag/)) {
// Extract tag name from link url
const tag = extractTagFromUrl(target.href)
if (tag) {
const link = this.generateTagLink(tag)
this.$router.push(link)
return
}
}
window.open(target.href, '_blank')
}
},
toggleReplying () {
this.replying = !this.replying
},
@ -406,22 +249,8 @@ const Status = {
toggleUserExpanded () {
this.userExpanded = !this.userExpanded
},
toggleShowMore () {
if (this.mightHideBecauseTall) {
this.showingTall = !this.showingTall
} else if (this.mightHideBecauseSubject) {
this.expandingSubject = !this.expandingSubject
}
},
generateUserProfileLink (id, name) {
return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)
},
generateTagLink (tag) {
return `/tag/${tag}`
},
setMedia () {
const attachments = this.attachmentSize === 'hide' ? this.status.attachments : this.galleryAttachments
return () => this.$store.dispatch('setMedia', attachments)
}
},
watch: {

View file

@ -94,7 +94,7 @@
<div class="status-body">
<UserCard
v-if="userExpanded"
:user="status.user"
:user-id="status.user.id"
:rounded="true"
:bordered="true"
class="status-usercard"
@ -226,118 +226,12 @@
</div>
</div>
<div
v-if="longSubject"
class="status-content-wrapper"
:class="{ 'tall-status': !showingLongSubject }"
>
<a
v-if="!showingLongSubject"
class="tall-status-hider"
:class="{ 'tall-status-hider_focused': isFocused }"
href="#"
@click.prevent="showingLongSubject=true"
>{{ $t("general.show_more") }}</a>
<div
class="status-content media-body"
@click.prevent="linkClicked"
v-html="contentHtml"
<StatusContent
:status="status"
:no-heading="noHeading"
:highlight="highlight"
:focused="isFocused"
/>
<a
v-if="showingLongSubject"
href="#"
class="status-unhider"
@click.prevent="showingLongSubject=false"
>{{ $t("general.show_less") }}</a>
</div>
<div
v-else
:class="{'tall-status': hideTallStatus}"
class="status-content-wrapper"
>
<a
v-if="hideTallStatus"
class="tall-status-hider"
:class="{ 'tall-status-hider_focused': isFocused }"
href="#"
@click.prevent="toggleShowMore"
>{{ $t("general.show_more") }}</a>
<div
v-if="!hideSubjectStatus"
class="status-content media-body"
@click.prevent="linkClicked"
v-html="contentHtml"
/>
<div
v-else
class="status-content media-body"
@click.prevent="linkClicked"
v-html="status.summary_html"
/>
<a
v-if="hideSubjectStatus"
href="#"
class="cw-status-hider"
@click.prevent="toggleShowMore"
>
{{ $t("general.show_more") }}
<span
v-if="hasImageAttachments"
class="icon-picture"
/>
<span
v-if="hasVideoAttachments"
class="icon-video"
/>
<span
v-if="status.card"
class="icon-link"
/>
</a>
<a
v-if="showingMore"
href="#"
class="status-unhider"
@click.prevent="toggleShowMore"
>{{ $t("general.show_less") }}</a>
</div>
<div v-if="status.poll && status.poll.options">
<poll :base-poll="status.poll" />
</div>
<div
v-if="status.attachments && (!hideSubjectStatus || showingLongSubject)"
class="attachments media-body"
>
<attachment
v-for="attachment in nonGalleryAttachments"
:key="attachment.id"
class="non-gallery"
:size="attachmentSize"
:nsfw="nsfwClickthrough"
:attachment="attachment"
:allow-play="true"
:set-media="setMedia()"
/>
<gallery
v-if="galleryAttachments.length > 0"
:nsfw="nsfwClickthrough"
:attachments="galleryAttachments"
:set-media="setMedia()"
/>
</div>
<div
v-if="status.card && !hideSubjectStatus && !noHeading"
class="link-preview media-body"
>
<link-preview
:card="status.card"
:size="attachmentSize"
:nsfw="nsfwClickthrough"
/>
</div>
<transition name="fade">
<div
@ -404,7 +298,7 @@
:status="status"
/>
<ReactButton
:logged-in="loggedIn"
v-if="loggedIn"
:status="status"
/>
<extra-buttons
@ -630,105 +524,6 @@ $status-margin: 0.75em;
}
}
.tall-status {
position: relative;
height: 220px;
overflow-x: hidden;
overflow-y: hidden;
z-index: 1;
.status-content {
height: 100%;
mask: linear-gradient(to top, white, transparent) bottom/100% 70px no-repeat,
linear-gradient(to top, white, white);
/* Autoprefixed seem to ignore this one, and also syntax is different */
-webkit-mask-composite: xor;
mask-composite: exclude;
}
}
.tall-status-hider {
display: inline-block;
word-break: break-all;
position: absolute;
height: 70px;
margin-top: 150px;
width: 100%;
text-align: center;
line-height: 110px;
z-index: 2;
}
.status-unhider, .cw-status-hider {
width: 100%;
text-align: center;
display: inline-block;
word-break: break-all;
}
.status-content {
font-family: var(--postFont, sans-serif);
line-height: 1.4em;
white-space: pre-wrap;
a {
color: $fallback--link;
color: var(--postLink, $fallback--link);
}
img, video {
max-width: 100%;
max-height: 400px;
vertical-align: middle;
object-fit: contain;
&.emoji {
width: 32px;
height: 32px;
}
}
blockquote {
margin: 0.2em 0 0.2em 2em;
font-style: italic;
}
pre {
overflow: auto;
}
code, samp, kbd, var, pre {
font-family: var(--postCodeFont, monospace);
}
p {
margin: 0 0 1em 0;
}
p:last-child {
margin: 0 0 0 0;
}
h1 {
font-size: 1.1em;
line-height: 1.2em;
margin: 1.4em 0;
}
h2 {
font-size: 1.1em;
margin: 1.0em 0;
}
h3 {
font-size: 1em;
margin: 1.2em 0;
}
h4 {
margin: 1.1em 0;
}
}
.retweet-info {
padding: 0.4em $status-margin;
margin: 0;
@ -790,11 +585,6 @@ $status-margin: 0.75em;
}
}
.greentext {
color: $fallback--cGreen;
color: var(--cGreen, $fallback--cGreen);
}
.status-conversation {
border-left-style: solid;
}
@ -866,14 +656,6 @@ a.unmute {
flex: 1;
}
.timeline :not(.panel-disabled) > {
.status-el:last-child {
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
border-bottom: none;
}
}
.favs-repeated-users {
margin-top: $status-margin;

View file

@ -0,0 +1,210 @@
import Attachment from '../attachment/attachment.vue'
import Poll from '../poll/poll.vue'
import Gallery from '../gallery/gallery.vue'
import LinkPreview from '../link-preview/link-preview.vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import fileType from 'src/services/file_type/file_type.service'
import { processHtml } from 'src/services/tiny_post_html_processor/tiny_post_html_processor.service.js'
import { mentionMatchesUrl, extractTagFromUrl } from 'src/services/matcher/matcher.service.js'
import { mapGetters, mapState } from 'vuex'
const StatusContent = {
name: 'StatusContent',
props: [
'status',
'focused',
'noHeading',
'fullContent'
],
data () {
return {
showingTall: this.inConversation && this.focused,
showingLongSubject: false,
// not as computed because it sets the initial state which will be changed later
expandingSubject: !this.$store.getters.mergedConfig.collapseMessageWithSubject
}
},
computed: {
localCollapseSubjectDefault () {
return this.mergedConfig.collapseMessageWithSubject
},
hideAttachments () {
return (this.mergedConfig.hideAttachments && !this.inConversation) ||
(this.mergedConfig.hideAttachmentsInConv && this.inConversation)
},
// This is a bit hacky, but we want to approximate post height before rendering
// so we count newlines (masto uses <p> for paragraphs, GS uses <br> between them)
// as well as approximate line count by counting characters and approximating ~80
// per line.
//
// Using max-height + overflow: auto for status components resulted in false positives
// very often with japanese characters, and it was very annoying.
tallStatus () {
const lengthScore = this.status.statusnet_html.split(/<p|<br/).length + this.status.text.length / 80
return lengthScore > 20
},
longSubject () {
return this.status.summary.length > 900
},
// When a status has a subject and is also tall, we should only have one show more/less button. If the default is to collapse statuses with subjects, we just treat it like a status with a subject; otherwise, we just treat it like a tall status.
mightHideBecauseSubject () {
return this.status.summary && (!this.tallStatus || this.localCollapseSubjectDefault)
},
mightHideBecauseTall () {
return this.tallStatus && (!this.status.summary || !this.localCollapseSubjectDefault)
},
hideSubjectStatus () {
return this.mightHideBecauseSubject && !this.expandingSubject
},
hideTallStatus () {
return this.mightHideBecauseTall && !this.showingTall
},
showingMore () {
return (this.mightHideBecauseTall && this.showingTall) || (this.mightHideBecauseSubject && this.expandingSubject)
},
nsfwClickthrough () {
if (!this.status.nsfw) {
return false
}
if (this.status.summary && this.localCollapseSubjectDefault) {
return false
}
return true
},
attachmentSize () {
if ((this.mergedConfig.hideAttachments && !this.inConversation) ||
(this.mergedConfig.hideAttachmentsInConv && this.inConversation) ||
(this.status.attachments.length > this.maxThumbnails)) {
return 'hide'
} else if (this.compact) {
return 'small'
}
return 'normal'
},
galleryTypes () {
if (this.attachmentSize === 'hide') {
return []
}
return this.mergedConfig.playVideosInModal
? ['image', 'video']
: ['image']
},
galleryAttachments () {
return this.status.attachments.filter(
file => fileType.fileMatchesSomeType(this.galleryTypes, file)
)
},
nonGalleryAttachments () {
return this.status.attachments.filter(
file => !fileType.fileMatchesSomeType(this.galleryTypes, file)
)
},
hasImageAttachments () {
return this.status.attachments.some(
file => fileType.fileType(file.mimetype) === 'image'
)
},
hasVideoAttachments () {
return this.status.attachments.some(
file => fileType.fileType(file.mimetype) === 'video'
)
},
maxThumbnails () {
return this.mergedConfig.maxThumbnails
},
postBodyHtml () {
const html = this.status.statusnet_html
if (this.mergedConfig.greentext) {
try {
if (html.includes('&gt;')) {
// This checks if post has '>' at the beginning, excluding mentions so that @mention >impying works
return processHtml(html, (string) => {
if (string.includes('&gt;') &&
string
.replace(/<[^>]+?>/gi, '') // remove all tags
.replace(/@\w+/gi, '') // remove mentions (even failed ones)
.trim()
.startsWith('&gt;')) {
return `<span class='greentext'>${string}</span>`
} else {
return string
}
})
} else {
return html
}
} catch (e) {
console.err('Failed to process status html', e)
return html
}
} else {
return html
}
},
contentHtml () {
if (!this.status.summary_html) {
return this.postBodyHtml
}
return this.status.summary_html + '<br />' + this.postBodyHtml
},
...mapGetters(['mergedConfig']),
...mapState({
betterShadow: state => state.interface.browserSupport.cssFilter,
currentUser: state => state.users.currentUser
})
},
components: {
Attachment,
Poll,
Gallery,
LinkPreview
},
methods: {
linkClicked (event) {
const target = event.target.closest('.status-content a')
if (target) {
if (target.className.match(/mention/)) {
const href = target.href
const attn = this.status.attentions.find(attn => mentionMatchesUrl(attn, href))
if (attn) {
event.stopPropagation()
event.preventDefault()
const link = this.generateUserProfileLink(attn.id, attn.screen_name)
this.$router.push(link)
return
}
}
if (target.rel.match(/(?:^|\s)tag(?:$|\s)/) || target.className.match(/hashtag/)) {
// Extract tag name from link url
const tag = extractTagFromUrl(target.href)
if (tag) {
const link = this.generateTagLink(tag)
this.$router.push(link)
return
}
}
window.open(target.href, '_blank')
}
},
toggleShowMore () {
if (this.mightHideBecauseTall) {
this.showingTall = !this.showingTall
} else if (this.mightHideBecauseSubject) {
this.expandingSubject = !this.expandingSubject
}
},
generateUserProfileLink (id, name) {
return generateProfileLink(id, name, this.$store.state.instance.restrictedNicknames)
},
generateTagLink (tag) {
return `/tag/${tag}`
},
setMedia () {
const attachments = this.attachmentSize === 'hide' ? this.status.attachments : this.galleryAttachments
return () => this.$store.dispatch('setMedia', attachments)
}
}
}
export default StatusContent

View file

@ -0,0 +1,240 @@
<template>
<!-- eslint-disable vue/no-v-html -->
<div class="status-body">
<slot name="header" />
<div
v-if="longSubject"
class="status-content-wrapper"
:class="{ 'tall-status': !showingLongSubject }"
>
<a
v-if="!showingLongSubject"
class="tall-status-hider"
:class="{ 'tall-status-hider_focused': focused }"
href="#"
@click.prevent="showingLongSubject=true"
>
{{ $t("general.show_more") }}
<span
v-if="hasImageAttachments"
class="icon-picture"
/>
<span
v-if="hasVideoAttachments"
class="icon-video"
/>
<span
v-if="status.card"
class="icon-link"
/>
</a>
<div
class="status-content media-body"
@click.prevent="linkClicked"
v-html="contentHtml"
/>
<a
v-if="showingLongSubject"
href="#"
class="status-unhider"
@click.prevent="showingLongSubject=false"
>{{ $t("general.show_less") }}</a>
</div>
<div
v-else
:class="{'tall-status': hideTallStatus}"
class="status-content-wrapper"
>
<a
v-if="hideTallStatus"
class="tall-status-hider"
:class="{ 'tall-status-hider_focused': focused }"
href="#"
@click.prevent="toggleShowMore"
>{{ $t("general.show_more") }}</a>
<div
v-if="!hideSubjectStatus"
class="status-content media-body"
@click.prevent="linkClicked"
v-html="contentHtml"
/>
<div
v-else
class="status-content media-body"
@click.prevent="linkClicked"
v-html="status.summary_html"
/>
<a
v-if="hideSubjectStatus"
href="#"
class="cw-status-hider"
@click.prevent="toggleShowMore"
>{{ $t("general.show_more") }}</a>
<a
v-if="showingMore"
href="#"
class="status-unhider"
@click.prevent="toggleShowMore"
>{{ $t("general.show_less") }}</a>
</div>
<div v-if="status.poll && status.poll.options">
<poll :base-poll="status.poll" />
</div>
<div
v-if="status.attachments.length !== 0 && (!hideSubjectStatus || showingLongSubject)"
class="attachments media-body"
>
<attachment
v-for="attachment in nonGalleryAttachments"
:key="attachment.id"
class="non-gallery"
:size="attachmentSize"
:nsfw="nsfwClickthrough"
:attachment="attachment"
:allow-play="true"
:set-media="setMedia()"
/>
<gallery
v-if="galleryAttachments.length > 0"
:nsfw="nsfwClickthrough"
:attachments="galleryAttachments"
:set-media="setMedia()"
/>
</div>
<div
v-if="status.card && !hideSubjectStatus && !noHeading"
class="link-preview media-body"
>
<link-preview
:card="status.card"
:size="attachmentSize"
:nsfw="nsfwClickthrough"
/>
</div>
<slot name="footer" />
</div>
<!-- eslint-enable vue/no-v-html -->
</template>
<script src="./status_content.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
$status-margin: 0.75em;
.status-body {
flex: 1;
min-width: 0;
.tall-status {
position: relative;
height: 220px;
overflow-x: hidden;
overflow-y: hidden;
z-index: 1;
.status-content {
height: 100%;
mask: linear-gradient(to top, white, transparent) bottom/100% 70px no-repeat,
linear-gradient(to top, white, white);
/* Autoprefixed seem to ignore this one, and also syntax is different */
-webkit-mask-composite: xor;
mask-composite: exclude;
}
}
.tall-status-hider {
display: inline-block;
word-break: break-all;
position: absolute;
height: 70px;
margin-top: 150px;
width: 100%;
text-align: center;
line-height: 110px;
z-index: 2;
}
.status-unhider, .cw-status-hider {
width: 100%;
text-align: center;
display: inline-block;
word-break: break-all;
}
.status-content {
font-family: var(--postFont, sans-serif);
line-height: 1.4em;
white-space: pre-wrap;
img, video {
max-width: 100%;
max-height: 400px;
vertical-align: middle;
object-fit: contain;
&.emoji {
width: 32px;
height: 32px;
}
}
blockquote {
margin: 0.2em 0 0.2em 2em;
font-style: italic;
}
pre {
overflow: auto;
}
code, samp, kbd, var, pre {
font-family: var(--postCodeFont, monospace);
}
p {
margin: 0 0 1em 0;
}
p:last-child {
margin: 0 0 0 0;
}
h1 {
font-size: 1.1em;
line-height: 1.2em;
margin: 1.4em 0;
}
h2 {
font-size: 1.1em;
margin: 1.0em 0;
}
h3 {
font-size: 1em;
margin: 1.2em 0;
}
h4 {
margin: 1.1em 0;
}
}
}
.greentext {
color: $fallback--cGreen;
color: var(--cGreen, $fallback--cGreen);
}
.timeline :not(.panel-disabled) > {
.status-el:last-child {
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
border-bottom: none;
}
}
</style>

View file

@ -9,7 +9,7 @@ import { mapGetters } from 'vuex'
export default {
props: [
'user', 'switcher', 'selected', 'hideBio', 'rounded', 'bordered', 'allowZoomingAvatar'
'userId', 'switcher', 'selected', 'hideBio', 'rounded', 'bordered', 'allowZoomingAvatar'
],
data () {
return {
@ -21,6 +21,12 @@ export default {
this.$store.dispatch('fetchUserRelationship', this.user.id)
},
computed: {
user () {
return this.$store.getters.findUser(this.userId)
},
relationship () {
return this.$store.getters.relationship(this.userId)
},
classes () {
return [{
'user-card-rounded-t': this.rounded === 'top', // set border-top-left-radius and border-top-right-radius

View file

@ -60,6 +60,7 @@
<AccountActions
v-if="isOtherUser && loggedIn"
:user="user"
:relationship="relationship"
/>
</div>
<div class="bottom-line">
@ -83,7 +84,7 @@
</div>
<div class="user-meta">
<div
v-if="user.follows_you && loggedIn && isOtherUser"
v-if="relationship.followed_by && loggedIn && isOtherUser"
class="following"
>
{{ $t('user_card.follows_you') }}
@ -130,10 +131,10 @@
class="user-interactions"
>
<div class="btn-group">
<FollowButton :user="user" />
<template v-if="user.following">
<FollowButton :relationship="relationship" />
<template v-if="relationship.following">
<ProgressButton
v-if="!user.subscribed"
v-if="!relationship.subscribing"
class="btn btn-default"
:click="subscribeUser"
:title="$t('user_card.subscribe')"
@ -152,7 +153,7 @@
</div>
<div>
<button
v-if="user.muted"
v-if="relationship.muting"
class="btn btn-default btn-block toggled"
@click="unmuteUser"
>

View file

@ -6,7 +6,7 @@
class="panel panel-default signed-in"
>
<UserCard
:user="user"
:user-id="user.id"
:hide-bio="true"
rounded="top"
/>

View file

@ -5,7 +5,7 @@
class="user-profile panel panel-default"
>
<UserCard
:user="user"
:user-id="userId"
:switcher="true"
:selected="timeline.viewing"
:allow-zooming-avatar="true"

View file

@ -7,8 +7,8 @@
"gopher": "Gopher",
"media_proxy": "Medienproxy",
"scope_options": "Reichweitenoptionen",
"text_limit": "Textlimit",
"title": "Features",
"text_limit": "Zeichenlimit",
"title": "Funktionen",
"who_to_follow": "Wem folgen?"
},
"finder": {
@ -17,7 +17,18 @@
},
"general": {
"apply": "Anwenden",
"submit": "Absenden"
"submit": "Absenden",
"more": "Mehr",
"generic_error": "Ein Fehler ist aufgetreten",
"optional": "Optional",
"show_more": "Zeige mehr",
"show_less": "Zeige weniger",
"dismiss": "Ablehnen",
"cancel": "Abbrechen",
"disable": "Deaktivieren",
"enable": "Aktivieren",
"confirm": "Bestätigen",
"verify": "Verifizieren"
},
"login": {
"login": "Anmelden",
@ -26,7 +37,16 @@
"password": "Passwort",
"placeholder": "z.B. lain",
"register": "Registrieren",
"username": "Benutzername"
"username": "Benutzername",
"authentication_code": "Authentifizierungscode",
"enter_recovery_code": "Gebe einen Wiederherstellungscode ein",
"recovery_code": "Wiederherstellungscode",
"heading": {
"totp": "Zwei-Faktor Authentifizierung",
"recovery": "Zwei-Faktor Wiederherstellung"
},
"hint": "Anmelden um an der Diskussion teilzunehmen",
"enter_two_factor_code": "Gebe einen Zwei-Faktor-Code ein"
},
"nav": {
"about": "Über",
@ -41,7 +61,9 @@
"twkn": "Das gesamte bekannte Netzwerk",
"user_search": "Benutzersuche",
"search": "Suche",
"preferences": "Voreinstellungen"
"preferences": "Voreinstellungen",
"administration": "Administration",
"who_to_follow": "Wem folgen"
},
"notifications": {
"broken_favorite": "Unbekannte Nachricht, suche danach...",
@ -50,7 +72,11 @@
"load_older": "Ältere Benachrichtigungen laden",
"notifications": "Benachrichtigungen",
"read": "Gelesen!",
"repeated_you": "wiederholte deine Nachricht"
"repeated_you": "wiederholte deine Nachricht",
"follow_request": "möchte dir folgen",
"migrated_to": "migrierte zu",
"reacted_with": "reagierte mit {0}",
"no_more_notifications": "Keine Benachrichtigungen mehr"
},
"post_status": {
"new_status": "Neuen Status veröffentlichen",
@ -58,7 +84,10 @@
"account_not_locked_warning_link": "gesperrt",
"attachments_sensitive": "Anhänge als heikel markieren",
"content_type": {
"text/plain": "Nur Text"
"text/plain": "Nur Text",
"text/bbcode": "BBCode",
"text/markdown": "Markdown",
"text/html": "HTML"
},
"content_warning": "Betreff (optional)",
"default": "Sitze gerade im Hofbräuhaus.",
@ -69,6 +98,13 @@
"private": "Nur Follower - Beitrag nur für Follower sichtbar",
"public": "Öffentlich - Beitrag an öffentliche Zeitleisten",
"unlisted": "Nicht gelistet - Nicht in öffentlichen Zeitleisten anzeigen"
},
"direct_warning_to_all": "Dieser Beitrag wird für alle erwähnten Benutzer sichtbar sein.",
"direct_warning_to_first_only": "Dieser Beitrag wird für alle Benutzer, die am Anfang der Nachricht erwähnt wurden, sichtbar sein.",
"scope_notice": {
"public": "Dieser Beitrag wird für alle sichtbar sein",
"private": "Dieser Beitrag wird nur für deine Follower sichtbar sein",
"unlisted": "Dieser Beitrag wird weder in der öffentlichen Zeitleiste noch im gesamten bekannten Netzwerk sichtbar sein"
}
},
"registration": {
@ -86,8 +122,11 @@
"email_required": "darf nicht leer sein",
"password_required": "darf nicht leer sein",
"password_confirmation_required": "darf nicht leer sein",
"password_confirmation_match": "sollte mit dem Passwort identisch sein."
}
"password_confirmation_match": "sollte mit dem Passwort identisch sein"
},
"bio_placeholder": "z.B.\nHallo, ich bin Lain.\nIch bin ein Anime Mödchen aus dem vorstädtischen Japan. Du kennst mich vielleicht vom Wired.",
"fullname_placeholder": "z.B. Lain Iwakura",
"username_placeholder": "z.B. lain"
},
"settings": {
"attachmentRadius": "Anhänge",
@ -99,7 +138,7 @@
"background": "Hintergrund",
"bio": "Bio",
"btnRadius": "Buttons",
"cBlue": "Blau (Antworten, Folgt dir)",
"cBlue": "Blau (Antworten, folgt dir)",
"cGreen": "Grün (Retweet)",
"cOrange": "Orange (Favorisieren)",
"cRed": "Rot (Abbrechen)",
@ -115,21 +154,21 @@
"data_import_export_tab": "Datenimport/-export",
"default_vis": "Standard-Sichtbarkeitsumfang",
"delete_account": "Account löschen",
"delete_account_description": "Lösche deinen Account und alle deine Nachrichten unwiderruflich.",
"delete_account_description": "Lösche deine Daten und deaktiviere deinen Account unwiderruflich.",
"delete_account_error": "Es ist ein Fehler beim Löschen deines Accounts aufgetreten. Tritt dies weiterhin auf, wende dich an den Administrator der Instanz.",
"delete_account_instructions": "Tippe dein Passwort unten in das Feld ein, um die Löschung deines Accounts zu bestätigen.",
"discoverable": "Erlaubnis für automatisches Suchen nach diesem Account",
"discoverable": "Erlaube, dass dieser Account in Suchergebnissen auftaucht",
"avatar_size_instruction": "Die empfohlene minimale Größe für Avatare ist 150x150 Pixel.",
"pad_emoji": "Emojis mit Leerzeichen umrahmen",
"export_theme": "Farbschema speichern",
"filtering": "Filtern",
"filtering_explanation": "Alle Beiträge die diese Wörter enthalten werden ausgeblendet. Ein Wort pro Zeile.",
"filtering_explanation": "Alle Beiträge, welche diese Wörter enthalten, werden ausgeblendet. Ein Wort pro Zeile.",
"follow_export": "Follower exportieren",
"follow_export_button": "Exportiere deine Follows in eine csv-Datei",
"follow_export_processing": "In Bearbeitung. Die Liste steht gleich zum herunterladen bereit.",
"follow_import": "Followers importieren",
"follow_import_error": "Fehler beim importieren der Follower",
"follows_imported": "Followers importiert! Die Bearbeitung kann eine Zeit lang dauern.",
"follow_import": "Follower importieren",
"follow_import_error": "Fehler beim Importieren der Follower",
"follows_imported": "Follower importiert! Die Bearbeitung kann einen Moment dauern.",
"foreground": "Vordergrund",
"general": "Allgemein",
"hide_attachments_in_convo": "Anhänge in Unterhaltungen ausblenden",
@ -142,7 +181,7 @@
"hide_post_stats": "Beitragsstatistiken verbergen (z.B. die Anzahl der Favoriten)",
"hide_user_stats": "Benutzerstatistiken verbergen (z.B. die Anzahl der Follower)",
"hide_filtered_statuses": "Gefilterte Beiträge verbergen",
"import_followers_from_a_csv_file": "Importiere Follower, denen du folgen möchtest, aus einer CSV-Datei",
"import_followers_from_a_csv_file": "Importiere Follower aus einer CSV-Datei",
"import_theme": "Farbschema laden",
"inputRadius": "Eingabefelder",
"checkboxRadius": "Auswahlfelder",
@ -156,7 +195,7 @@
"lock_account_description": "Sperre deinen Account, um neue Follower zu genehmigen oder abzulehnen",
"loop_video": "Videos wiederholen",
"loop_video_silent_only": "Nur Videos ohne Ton wiederholen (z.B. Mastodons \"gifs\")",
"mutes_tab": "Mutes",
"mutes_tab": "Stummschaltungen",
"play_videos_in_modal": "Videos in größerem Medienfenster abspielen",
"use_contain_fit": "Vorschaubilder nicht zuschneiden",
"name": "Name",
@ -329,8 +368,44 @@
"checkbox": "Ich habe die Allgemeinen Geschäftsbedingungen überflogen",
"link": "ein netter kleiner Link"
}
},
"app_name": "Anwendungsname",
"mfa": {
"otp": "OTP",
"recovery_codes_warning": "Schreibe dir die Codes auf oder speichere sie an einem sicheren Ort - ansonsten wirst du sie nicht wiederfinden. Wenn du den Zugriff zu deiner 2FA App und die Wiederherstellungs-Codes verlierst, wirst du aus deinem Account ausgeschlossen sein.",
"recovery_codes": "Wiederherstellungs-Codes.",
"warning_of_generate_new_codes": "Wenn du neue Wiederherstellungs-Codes generierst, werden die alten Codes nicht mehr funktionieren.",
"generate_new_recovery_codes": "Generiere neue Wiederherstellungs-Codes",
"title": "Zwei-Faktor Authentifizierung",
"waiting_a_recovery_codes": "Erhalte Wiederherstellungscodes...",
"authentication_methods": "Authentifizierungsmethoden",
"scan": {
"title": "Scan",
"secret_code": "Schlüssel",
"desc": "Wenn du deine 2FA App verwendest, scanne diesen QR Code oder gebe den Schlüssel ein:"
},
"verify": {
"desc": "Um 2FA zu aktivieren, gib den Code von deiner 2FA-App ein:"
}
},
"enter_current_password_to_confirm": "Gib dein aktuelles Passwort ein, um deine Identität zu bestätigen",
"security": "Sicherheit",
"allow_following_move": "Erlaube automatisches Folgen, sobald ein gefolgter Nutzer umzieht",
"blocks_imported": "Blocks importiert! Die Verarbeitung wird einen Moment brauchen.",
"block_import_error": "Fehler beim Importieren der Blocks",
"block_import": "Block Import",
"block_export_button": "Exportiere deine Blocks in eine csv Datei",
"block_export": "Block Export",
"emoji_reactions_on_timeline": "Zeige Emoji-Reaktionen auf der Zeitleiste",
"domain_mutes": "Domains",
"changed_email": "Email Adresse erfolgreich geändert!",
"change_email_error": "Es trat ein Problem auf beim Versuch, deine Email Adresse zu ändern.",
"change_email": "Ändere Email",
"notification_setting_non_followers": "Nutzer, die dir nicht folgen",
"notification_setting_followers": "Nutzer, die dir folgen",
"import_blocks_from_a_csv_file": "Importiere Blocks von einer CSV Datei",
"accent": "Akzent"
},
"timeline": {
"collapse": "Einklappen",
"conversation": "Unterhaltung",
@ -352,7 +427,7 @@
"follow_again": "Anfrage erneut senden?",
"follow_unfollow": "Folgen beenden",
"followees": "Folgt",
"followers": "Followers",
"followers": "Folgende",
"following": "Folgst du!",
"follows_you": "Folgt dir!",
"its_you": "Das bist du!",
@ -360,7 +435,10 @@
"muted": "Stummgeschaltet",
"per_day": "pro Tag",
"remote_follow": "Folgen",
"statuses": "Beiträge"
"statuses": "Beiträge",
"admin_menu": {
"sandbox": "Erzwinge Beiträge nur für Follower sichtbar zu sein"
}
},
"user_profile": {
"timeline_title": "Beiträge"
@ -409,5 +487,98 @@
"password_reset_disabled": "Passwortzurücksetzen deaktiviert. Bitte Administrator kontaktieren.",
"password_reset_required": "Passwortzurücksetzen erforderlich",
"password_reset_required_but_mailer_is_disabled": "Passwortzurücksetzen wäre erforderlich, ist aber deaktiviert. Bitte Administrator kontaktieren."
},
"about": {
"mrf": {
"federation": "Föderation",
"mrf_policies": "Aktivierte MRF Richtlinien",
"simple": {
"simple_policies": "Instanzspezifische Richtlinien",
"accept": "Akzeptieren",
"reject": "Ablehnen",
"reject_desc": "Diese Instanz akzeptiert keine Nachrichten der folgenden Instanzen:",
"quarantine": "Quarantäne",
"ftl_removal": "Von der Zeitleiste \"Das gesamte bekannte Netzwerk\" entfernen",
"media_removal": "Medienentfernung",
"media_removal_desc": "Diese Instanz entfernt Medien von den Beiträgen der folgenden Instanzen:",
"media_nsfw": "Erzwingen Medien als heikel zu makieren",
"media_nsfw_desc": "Diese Instanz makiert die Medien in Beiträgen der folgenden Instanzen als heikel:",
"accept_desc": "Diese Instanz akzeptiert nur Nachrichten von den folgenden Instanzen:",
"quarantine_desc": "Diese Instanz sendet nur öffentliche Beiträge zu den folgenden Instanzen:",
"ftl_removal_desc": "Dieser Instanz entfernt folgende Instanzen von der \"Das gesamte bekannte Netzwerk\" Zeitleiste:"
},
"keyword": {
"keyword_policies": "Keyword Richtlinien",
"reject": "Ablehnen",
"replace": "Ersetzen",
"is_replaced_by": "→",
"ftl_removal": "Von der Zeitleiste \"Das gesamte bekannte Netzwerk\" entfernen"
},
"mrf_policies_desc": "MRF Richtlinien manipulieren das Föderationsverhalten dieser Instanz. Die folgenden Richtlinien sind aktiv:"
},
"staff": "Mitarbeiter"
},
"domain_mute_card": {
"mute": "Stummschalten",
"mute_progress": "Wird stummgeschaltet..",
"unmute": "Stummschaltung aufheben",
"unmute_progress": "Stummschaltung wird aufgehoben.."
},
"exporter": {
"export": "Exportieren",
"processing": "Verarbeitung läuft, bald wird Du dazu aufgefordert, deine Datei herunterzuladen"
},
"image_cropper": {
"crop_picture": "Bild zuschneiden",
"save": "Speichern",
"cancel": "Abbrechen",
"save_without_cropping": "Ohne Zuschneiden speichern"
},
"importer": {
"submit": "Absenden",
"success": "Erfolgreich importiert.",
"error": "Ein Fehler ist beim Verabeiten der Datei aufgetreten."
},
"media_modal": {
"previous": "Zurück",
"next": "Weiter"
},
"polls": {
"add_poll": "Umfrage hinzufügen",
"add_option": "Option hinzufügen",
"option": "Option",
"votes": "Stimmen",
"vote": "Abstimmen",
"type": "Umfragetyp",
"multiple_choices": "Mehrere Auswahlmöglichkeiten",
"single_choice": "Eine Auswahlmöglichkeit",
"expiry": "Alter der Umfrage",
"expired": "Die Umfrage endete vor {0}",
"not_enough_options": "Zu wenig einzigartige Auswahlmöglichkeiten in der Umfrage",
"expires_in": "Die Umfrage endet in {0}"
},
"emoji": {
"stickers": "Sticker",
"emoji": "Emoji",
"search_emoji": "Nach einem Emoji suchen",
"custom": "Benutzerdefinierter Emoji",
"keep_open": "Auswahlfenster offen halten",
"add_emoji": "Emoji einfügen",
"load_all": "Lade alle {emojiAmount} Emoji",
"load_all_hint": "Erfolgreich erste {saneAmount} Emoji geladen, alle Emojis zu laden würde Leistungsprobleme hervorrufen.",
"unicode": "Unicode Emoji"
},
"interactions": {
"load_older": "Lade ältere Interaktionen",
"follows": "Neue Follows",
"favs_repeats": "Wiederholungen und Favoriten",
"moves": "Benutzer migriert zu"
},
"selectable_list": {
"select_all": "Wähle alle"
},
"remote_user_resolver": {
"searching_for": "Suche nach",
"error": "Nicht gefunden."
}
}

View file

@ -284,7 +284,7 @@
"data_import_export_tab": "Data Import / Export",
"default_vis": "Default visibility scope",
"delete_account": "Delete Account",
"delete_account_description": "Permanently delete your account and all your messages.",
"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_instructions": "Type your password in the input below to confirm account deletion.",
"discoverable": "Allow discovery of this account in search results and other services",
@ -408,11 +408,14 @@
"fun": "Fun",
"greentext": "Meme arrows",
"notifications": "Notifications",
"notification_setting_filters": "Filters",
"notification_setting": "Receive notifications from:",
"notification_setting_follows": "Users you follow",
"notification_setting_non_follows": "Users you do not follow",
"notification_setting_followers": "Users who follow you",
"notification_setting_non_followers": "Users who do not follow you",
"notification_setting_privacy": "Privacy",
"notification_setting_privacy_option": "Hide the sender and contents of push notifications",
"notification_mutes": "To stop receiving notifications from a specific user, use a mute.",
"notification_blocks": "Blocking a user stops all notifications as well as unsubscribes them.",
"enable_web_push_notifications": "Enable web push notifications",
@ -433,7 +436,7 @@
"use_source": "New version",
"help": {
"upgraded_from_v2": "PleromaFE has been upgraded, theme could look a little bit different than you remember.",
"v2_imported": "File you imported was made for older FE. We try to maximize compatibility but there still could be inconsitencies.",
"v2_imported": "File you imported was made for older FE. We try to maximize compatibility but there still could be inconsistencies.",
"future_version_imported": "File you imported was made in newer version of FE.",
"older_version_imported": "File you imported was made in older version of FE.",
"snapshot_present": "Theme snapshot is loaded, so all values are overriden. You can load theme's actual data instead.",
@ -620,7 +623,8 @@
"replies_list": "Replies:",
"mute_conversation": "Mute conversation",
"unmute_conversation": "Unmute conversation",
"status_unavailable": "Status unavailable"
"status_unavailable": "Status unavailable",
"copy_link": "Copy link to status"
},
"user_card": {
"approve": "Approve",

View file

@ -19,7 +19,16 @@
"apply": "Aseta",
"submit": "Lähetä",
"more": "Lisää",
"generic_error": "Virhe tapahtui"
"generic_error": "Virhe tapahtui",
"optional": "valinnainen",
"show_more": "Näytä lisää",
"show_less": "Näytä vähemmän",
"dismiss": "Sulje",
"cancel": "Peruuta",
"disable": "Poista käytöstä",
"confirm": "Hyväksy",
"verify": "Varmenna",
"enable": "Ota käyttöön"
},
"login": {
"login": "Kirjaudu sisään",
@ -28,7 +37,16 @@
"password": "Salasana",
"placeholder": "esim. Seppo",
"register": "Rekisteröidy",
"username": "Käyttäjänimi"
"username": "Käyttäjänimi",
"hint": "Kirjaudu sisään liittyäksesi keskusteluun",
"authentication_code": "Todennuskoodi",
"enter_recovery_code": "Syötä palautuskoodi",
"recovery_code": "Palautuskoodi",
"heading": {
"totp": "Monivaihetodennus",
"recovery": "Monivaihepalautus"
},
"enter_two_factor_code": "Syötä monivaihetodennuskoodi"
},
"nav": {
"about": "Tietoja",
@ -43,7 +61,9 @@
"twkn": "Koko Tunnettu Verkosto",
"user_search": "Käyttäjähaku",
"who_to_follow": "Seurausehdotukset",
"preferences": "Asetukset"
"preferences": "Asetukset",
"administration": "Ylläpito",
"search": "Haku"
},
"notifications": {
"broken_favorite": "Viestiä ei löydetty...",
@ -54,7 +74,9 @@
"read": "Lue!",
"repeated_you": "toisti viestisi",
"no_more_notifications": "Ei enempää ilmoituksia",
"reacted_with": "lisäsi reaktion {0}"
"reacted_with": "lisäsi reaktion {0}",
"migrated_to": "siirtyi sivulle",
"follow_request": "haluaa seurata sinua"
},
"polls": {
"add_poll": "Lisää äänestys",
@ -68,12 +90,14 @@
"expiry": "Äänestyksen kesto",
"expires_in": "Päättyy {0} päästä",
"expired": "Päättyi {0} sitten",
"not_enough_option": "Liian vähän uniikkeja vaihtoehtoja äänestyksessä"
"not_enough_option": "Liian vähän uniikkeja vaihtoehtoja äänestyksessä",
"not_enough_options": "Liian vähän ainutkertaisia vaihtoehtoja"
},
"interactions": {
"favs_repeats": "Toistot ja tykkäykset",
"follows": "Uudet seuraukset",
"load_older": "Lataa vanhempia interaktioita"
"load_older": "Lataa vanhempia interaktioita",
"moves": "Käyttäjien siirtymiset"
},
"post_status": {
"new_status": "Uusi viesti",
@ -81,7 +105,10 @@
"account_not_locked_warning_link": "lukittu",
"attachments_sensitive": "Merkkaa liitteet arkaluonteisiksi",
"content_type": {
"text/plain": "Tavallinen teksti"
"text/plain": "Tavallinen teksti",
"text/html": "HTML",
"text/markdown": "Markdown",
"text/bbcode": "BBCode"
},
"content_warning": "Aihe (valinnainen)",
"default": "Tulin juuri saunasta.",
@ -92,6 +119,13 @@
"private": "Vain-seuraajille - Näkyy vain seuraajillesi",
"public": "Julkinen - Näkyy julkisilla aikajanoilla",
"unlisted": "Listaamaton - Ei näy julkisilla aikajanoilla"
},
"direct_warning_to_all": "Tämä viesti näkyy vain viestissä mainituille käyttäjille.",
"direct_warning_to_first_only": "Tämä viesti näkyy vain viestin alussa mainituille käyttäjille.",
"scope_notice": {
"public": "Tämä viesti näkyy kaikille",
"private": "Tämä viesti näkyy vain sinun seuraajillesi",
"unlisted": "Tämä viesti ei näy Julkisella Aikajanalla tai Koko Tunnettu Verkosto -aikajanalla"
}
},
"registration": {
@ -110,7 +144,10 @@
"password_required": "ei voi olla tyhjä",
"password_confirmation_required": "ei voi olla tyhjä",
"password_confirmation_match": "pitää vastata salasanaa"
}
},
"username_placeholder": "esim. peke",
"fullname_placeholder": "esim. Pekka Postaaja",
"bio_placeholder": "esim.\nHei, olen Pekka.\nOlen esimerkkikäyttäjä tässä verkostossa."
},
"settings": {
"attachmentRadius": "Liitteet",
@ -151,7 +188,7 @@
"follow_import": "Seurausten tuonti",
"follow_import_error": "Virhe tuodessa seuraksia",
"follows_imported": "Seuraukset tuotu! Niiden käsittely vie hetken.",
"foreground": "Korostus",
"foreground": "Etuala",
"general": "Yleinen",
"hide_attachments_in_convo": "Piilota liitteet keskusteluissa",
"hide_attachments_in_tl": "Piilota liitteet aikajanalla",
@ -186,14 +223,14 @@
"notification_visibility_mentions": "Maininnat",
"notification_visibility_repeats": "Toistot",
"notification_visibility_emoji_reactions": "Reaktiot",
"no_rich_text_description": "Älä näytä tekstin muotoilua.",
"no_rich_text_description": "Älä näytä tekstin muotoilua",
"hide_network_description": "Älä näytä seurauksiani tai seuraajiani",
"nsfw_clickthrough": "Piilota NSFW liitteet klikkauksen taakse",
"oauth_tokens": "OAuth-merkit",
"token": "Token",
"refresh_token": "Päivitä token",
"valid_until": "Voimassa asti",
"revoke_token": "Peruuttaa",
"revoke_token": "Peruuta",
"panelRadius": "Ruudut",
"pause_on_unfocused": "Pysäytä automaattinen viestien näyttö välilehden ollessa pois fokuksesta",
"presets": "Valmiit teemat",
@ -231,6 +268,228 @@
"values": {
"false": "pois päältä",
"true": "päällä"
},
"hide_follows_description": "Älä näytä ketä seuraan",
"show_moderator_badge": "Näytä Moderaattori-merkki profiilissani",
"useStreamingApi": "Vastaanota viestiejä ja ilmoituksia reaaliajassa",
"notification_setting_filters": "Suodattimet",
"notification_setting": "Vastaanota ilmoituksia seuraavista:",
"notification_setting_privacy_option": "Piilota lähettäjä ja sisältö sovelluksen ulkopuolisista ilmoituksista",
"enable_web_push_notifications": "Ota käyttöön sovelluksen ulkopuoliset ilmoitukset",
"app_name": "Sovelluksen nimi",
"security": "Turvallisuus",
"mfa": {
"otp": "OTP",
"setup_otp": "OTP-asetukset",
"wait_pre_setup_otp": "esiasetetaan OTP:ta",
"confirm_and_enable": "Hyväksy ja käytä OTP",
"title": "Monivaihetodennus",
"generate_new_recovery_codes": "Luo uudet palautuskoodit",
"authentication_methods": "Todennus",
"warning_of_generate_new_codes": "Luodessasi uudet palautuskoodit, vanhat koodisi lakkaavat toimimasta.",
"recovery_codes": "Palautuskoodit.",
"waiting_a_recovery_codes": "Odotetaan palautuskoodeja...",
"recovery_codes_warning": "Kirjoita koodit ylös tai tallenna ne turvallisesti, muuten et näe niitä uudestaan. Jos et voi käyttää monivaihetodennusta ja sinulla ei ole palautuskoodeja, et voi enää kirjautua sisään tilillesi.",
"scan": {
"title": "Skannaa",
"secret_code": "Avain",
"desc": "Käytä monivaihetodennus-sovellusta skannakksesi tämän QR-kooding, tai syötä avain:"
},
"verify": {
"desc": "Kytkeäksesi päälle monivaihetodennuksen, syötä koodi monivaihetodennussovellksesta:"
}
},
"allow_following_move": "Salli automaattinen seuraaminen kun käyttäjä siirtää tilinsä",
"block_export": "Estojen vienti",
"block_export_button": "Vie estosi CSV-tiedostoon",
"block_import": "Estojen tuonti",
"block_import_error": "Virhe tuodessa estoja",
"blocks_imported": "Estot tuotu! Käsittely vie hetken.",
"blocks_tab": "Estot",
"change_email": "Vaihda sähköpostiosoite",
"change_email_error": "Virhe vaihtaessa sähköpostiosoitetta.",
"changed_email": "Sähköpostiosoite vaihdettu!",
"domain_mutes": "Sivut",
"avatar_size_instruction": "Suositeltu vähimmäiskoko profiilikuville on 150x150 pikseliä.",
"accent": "Korostus",
"hide_muted_posts": "Piilota mykistettyjen käyttäjien viestit",
"hide_filtered_statuses": "Piilota mykistetyt viestit",
"import_blocks_from_a_csv_file": "Tuo estot CSV-tiedostosta",
"no_blocks": "Ei estoja",
"no_mutes": "Ei mykistyksiä",
"notification_visibility_moves": "Käyttäjien siirtymiset",
"hide_followers_description": "Älä näytä ketkä seuraavat minua",
"hide_follows_count_description": "Älä näytä seurauksien määrää",
"hide_followers_count_description": "Älä näytä seuraajien määrää",
"show_admin_badge": "Näytä Ylläpitäjä-merkki proofilissani",
"autohide_floating_post_button": "Piilota Uusi Viesti -nappi automaattisesti (mobiili)",
"search_user_to_block": "Hae estettäviä käyttäjiä",
"search_user_to_mute": "Hae mykistettäviä käyttäjiä",
"minimal_scopes_mode": "Yksinkertaista näkyvyydenrajauksen vaihtoehdot",
"post_status_content_type": "Uuden viestin sisällön muoto",
"user_mutes": "Käyttäjät",
"useStreamingApiWarning": "(Kokeellinen)",
"type_domains_to_mute": "Syötä mykistettäviä sivustoja",
"upload_a_photo": "Lataa kuva",
"fun": "Hupi",
"greentext": "Meeminuolet",
"notifications": "Ilmoitukset",
"style": {
"switcher": {
"save_load_hint": "\"Säilytä\" asetukset säilyttävät tällä hetkellä asetetut asetukset valittaessa tai ladatessa teemaa, se myös tallentaa kyseiset asetukset viedessä teemaa. Kun kaikki laatikot ovat tyhjänä, viety teema tallentaa kaiken.",
"help": {
"older_version_imported": "Tuomasi tiedosto on luotu vanhemmalla versiolla.",
"fe_upgraded": "PleromaFE:n teemaus päivitetty versiopäivityksen yhteydessä.",
"migration_snapshot_ok": "Varmuuden vuoksi teeman kaappaus ladattu. Voit koittaa ladata teeman sisällön.",
"migration_napshot_gone": "Jostain syystä teeman kaappaus puuttuu, kaikki asiat eivät välttämättä näytä oikealta.",
"snapshot_source_mismatch": "Versiot eivät täsmää: todennäköisesti versio vaihdettu vanhempaan ja päivitetty uudestaan, jos vaihdoit teemaa vanhalla versiolla, sinun tulisi käyttää vanhaa versiota, muutoin uutta.",
"upgraded_from_v2": "PleromaFE on päivitetty, teemasi saattaa näyttää erilaiselta kuin muistat.",
"v2_imported": "Tuomasi tiedosto on luotu vanhemmalla versiolla. Yhteensopivuus ei välttämättä ole täydellinen.",
"future_version_imported": "Tuomasi tiedosto on luotu uudemmalla versiolla.",
"snapshot_present": "Teeman kaappaus ladattu, joten kaikki arvot ovat ylikirjoitettu. Voit sen sijaan ladata teeman sisällön.",
"snapshot_missing": "Teeman kaappausta ei tiedostossa, joten se voi näyttää erilaiselta kuin suunniteltu.",
"fe_downgraded": "PleromaFE:n versio vaihtunut vanhempaan."
},
"keep_color": "Säilytä värit",
"keep_shadows": "Säilytä varjot",
"keep_opacity": "Säilytä läpinäkyvyys",
"keep_roundness": "Säilytä pyöristys",
"keep_fonts": "Säilytä fontit",
"reset": "Palauta",
"clear_all": "Tyhjennä kaikki",
"clear_opacity": "Tyhjennä läpinäkyvyys",
"load_theme": "Lataa teema",
"keep_as_is": "Pidä sellaisenaan",
"use_snapshot": "Vanha",
"use_source": "Uusi"
},
"advanced_colors": {
"selectedPost": "Valittu viesti",
"_tab_label": "Edistynyt",
"alert": "Varoituksen tausta",
"alert_error": "Virhe",
"alert_warning": "Varoitus",
"alert_neutral": "Neutraali",
"post": "Viestit/Käyttäjien kuvaukset",
"badge": "Merkin tausta",
"badge_notification": "Ilmoitus",
"panel_header": "Ruudun otsikko",
"top_bar": "Yläpalkki",
"borders": "Reunat",
"buttons": "Napit",
"inputs": "Syöttökentät",
"faint_text": "Häivytetty teksti",
"underlay": "Taustapeite",
"poll": "Äänestyksen kuvaaja",
"icons": "Ikonit",
"highlight": "Korostetut elementit",
"pressed": "Painettu",
"selectedMenu": "Valikon valinta",
"disabled": "Pois käytöstä",
"toggled": "Kytketty",
"tabs": "Välilehdet",
"popover": "Työkaluvinkit, valikot, ponnahdusviestit"
},
"common": {
"color": "Väri",
"opacity": "Läpinäkyvyys",
"contrast": {
"level": {
"aaa": "saavuttaa AAA-tason (suositeltu)",
"aa": "saavuttaa AA-tason (minimi)",
"bad": "ei saavuta mitään helppokäyttöisyyssuosituksia"
},
"hint": "Kontrastisuhde on {ratio}, se {level} {context}",
"context": {
"18pt": "suurella (18pt+) tekstillä",
"text": "tekstillä"
}
}
},
"common_colors": {
"_tab_label": "Yleinen",
"main": "Yleiset värit",
"foreground_hint": "Löydät \"Edistynyt\"-välilehdeltä tarkemmat asetukset",
"rgbo": "Ikonit, korostukset, merkit"
},
"shadows": {
"filter_hint": {
"always_drop_shadow": "Varoitus, tämä varjo käyttää aina {0} kun selain tukee sitä.",
"avatar_inset": "Huom. sisennettyjen ja ei-sisennettyjen varjojen yhdistelmät saattavat luoda ei-odotettuja lopputuloksia läpinäkyvillä profiilikuvilla.",
"drop_shadow_syntax": "{0} ei tue {1} parametria ja {2} avainsanaa.",
"spread_zero": "Varjot joiden levitys > 0 näyttävät samalta kuin se olisi nolla",
"inset_classic": "Sisennetyt varjot käyttävät {0}"
},
"components": {
"buttonPressedHover": "Nappi (painettu ja kohdistettu)",
"panel": "Ruutu",
"panelHeader": "Ruudun otsikko",
"topBar": "Yläpalkki",
"avatar": "Profiilikuva (profiilinäkymässä)",
"avatarStatus": "Profiilikuva (viestin yhtyedessä)",
"popup": "Ponnahdusviestit ja työkaluvinkit",
"button": "Nappi",
"buttonHover": "Nappi (kohdistus)",
"buttonPressed": "Nappi (painettu)",
"input": "Syöttökenttä"
},
"hintV3": "Voit käyttää {0} merkintää varjoille käyttääksesi väriä toisesta asetuksesta.",
"_tab_label": "Valo ja varjostus",
"component": "Komponentti",
"override": "Ylikirjoita",
"shadow_id": "Varjo #{value}",
"blur": "Sumennus",
"spread": "Levitys",
"inset": "Sisennys"
},
"fonts": {
"help": "Valitse fontti käyttöliittymälle. \"Oma\"-vaihtohdolle on syötettävä fontin nimi tarkalleen samana kuin se on järjestelmässäsi.",
"_tab_label": "Fontit",
"components": {
"interface": "Käyttöliittymä",
"input": "Syöttökentät",
"post": "Viestin teksti",
"postCode": "Tasavälistetty teksti viestissä"
},
"family": "Fontin nimi",
"size": "Koko (pikseleissä)",
"weight": "Painostus (paksuus)",
"custom": "Oma"
},
"preview": {
"input": "Tulin juuri saunasta.",
"header": "Esikatselu",
"content": "Sisältö",
"error": "Esimerkkivirhe",
"button": "Nappi",
"text": "Vähän lisää {0} ja {1}",
"mono": "sisältöä",
"faint_link": "manuaali",
"fine_print": "Lue meidän {0} vaikka huvin vuoksi!",
"header_faint": "Tämä on OK",
"checkbox": "Olen silmäillyt käyttöehdot",
"link": "kiva linkki"
},
"radii": {
"_tab_label": "Pyöristys"
}
},
"enter_current_password_to_confirm": "Syötä nykyinen salasanasi todentaaksesi henkilöllisyytesi",
"discoverable": "Salli tilisi näkyvyys hakukoneisiin ja muihin palveluihin",
"pad_emoji": "Välistä emojit välilyönneillä lisätessäsi niitä valitsimesta",
"mutes_tab": "Mykistykset",
"new_email": "Uusi sähköpostiosoite",
"notification_setting_follows": "Käyttäjät joita seuraat",
"notification_setting_non_follows": "Käyttäjät joita et seuraa",
"notification_setting_followers": "Käyttäjät jotka seuraavat sinua",
"notification_setting_non_followers": "Käyttäjät jotka eivät seuraa sinua",
"notification_setting_privacy": "Yksityisyys",
"notification_mutes": "Jos et halua ilmoituksia joltain käyttäjältä, käytä mykistystä.",
"notification_blocks": "Estäminen pysäyttää kaikki ilmoitukset käyttäjältä ja poistaa seurauksen.",
"version": {
"title": "Versio",
"backend_version": "Palvelimen versio",
"frontend_version": "Käyttöliittymän versio"
}
},
"time": {
@ -252,8 +511,8 @@
"months": "{0} kuukautta",
"month_short": "{0}kk",
"months_short": "{0}kk",
"now": "nyt",
"now_short": "juuri nyt",
"now": "juuri nyt",
"now_short": "nyt",
"second": "{0} sekunti",
"seconds": "{0} sekuntia",
"second_short": "{0}s",
@ -276,7 +535,8 @@
"repeated": "toisti",
"show_new": "Näytä uudet",
"up_to_date": "Ajantasalla",
"no_more_statuses": "Ei enempää viestejä"
"no_more_statuses": "Ei enempää viestejä",
"no_statuses": "Ei viestejä"
},
"status": {
"favorites": "Tykkäykset",
@ -288,9 +548,10 @@
"delete_confirm": "Haluatko varmasti postaa viestin?",
"reply_to": "Vastaus",
"replies_list": "Vastaukset:",
"mute_conversation": "Hiljennä keskustelu",
"unmute_conversation": "Poista hiljennys",
"status_unavailable": "Viesti ei saatavissa"
"mute_conversation": "Mykistä keskustelu",
"unmute_conversation": "Poista mykistys",
"status_unavailable": "Viesti ei saatavissa",
"copy_link": "Kopioi linkki"
},
"user_card": {
"approve": "Hyväksy",
@ -299,7 +560,7 @@
"deny": "Älä hyväksy",
"follow": "Seuraa",
"follow_sent": "Pyyntö lähetetty!",
"follow_progress": "Pyydetään...",
"follow_progress": "Pyydetään",
"follow_again": "Lähetä pyyntö uudestaan",
"follow_unfollow": "Älä seuraa",
"followees": "Seuraa",
@ -307,14 +568,50 @@
"following": "Seuraat!",
"follows_you": "Seuraa sinua!",
"its_you": "Sinun tili!",
"mute": "Hiljennä",
"muted": "Hiljennetty",
"mute": "Mykistä",
"muted": "Mykistetty",
"per_day": "päivässä",
"remote_follow": "Seuraa muualta",
"statuses": "Viestit"
"statuses": "Viestit",
"hidden": "Piilotettu",
"media": "Media",
"block_progress": "Estetään...",
"admin_menu": {
"grant_admin": "Anna Ylläpitöoikeudet",
"force_nsfw": "Merkitse kaikki viestit NSFW:nä",
"disable_any_subscription": "Estä käyttäjän seuraaminen",
"moderation": "Moderaatio",
"revoke_admin": "Poista Ylläpitöoikeudet",
"grant_moderator": "Anna Moderaattorioikeudet",
"revoke_moderator": "Poista Moderaattorioikeudet",
"activate_account": "Aktivoi tili",
"deactivate_account": "Deaktivoi tili",
"delete_account": "Poista tili",
"strip_media": "Poista media viesteistä",
"force_unlisted": "Pakota viestit listaamattomiksi",
"sandbox": "Pakota viestit vain seuraajille",
"disable_remote_subscription": "Estä seuraaminen ulkopuolisilta sivuilta",
"quarantine": "Estä käyttäjän viestin federoituminen",
"delete_user": "Poista käyttäjä",
"delete_user_confirmation": "Oletko aivan varma? Tätä ei voi kumota."
},
"favorites": "Tykkäykset",
"mention": "Mainitse",
"report": "Ilmianna",
"subscribe": "Tilaa",
"unsubscribe": "Poista tilaus",
"unblock": "Poista esto",
"unblock_progress": "Postetaan estoa...",
"unmute": "Poista mykistys",
"unmute_progress": "Poistetaan mykistystä...",
"mute_progress": "Mykistetään...",
"hide_repeats": "Piilota toistot",
"show_repeats": "Näytä toistot"
},
"user_profile": {
"timeline_title": "Käyttäjän aikajana"
"timeline_title": "Käyttäjän aikajana",
"profile_does_not_exist": "Tätä profiilia ei ole.",
"profile_loading_error": "Virhe ladatessa profiilia."
},
"who_to_follow": {
"more": "Lisää",
@ -325,7 +622,10 @@
"repeat": "Toista",
"reply": "Vastaa",
"favorite": "Tykkää",
"user_settings": "Käyttäjäasetukset"
"user_settings": "Käyttäjäasetukset",
"add_reaction": "Lisää Reaktio",
"accept_follow_request": "Hyväksy seurauspyyntö",
"reject_follow_request": "Hylkää seurauspyyntö"
},
"upload": {
"error": {
@ -340,5 +640,108 @@
"GiB": "Gt",
"TiB": "Tt"
}
},
"about": {
"mrf": {
"keyword": {
"keyword_policies": "Avainsanasäännöt",
"ftl_removal": "Poistettu \"Koko Tunnettu Verkosto\" -aikajanalta",
"reject": "Hylkää",
"replace": "Korvaa",
"is_replaced_by": "→"
},
"simple": {
"accept": "Hyväksy",
"reject": "Hylkää",
"quarantine": "Karanteeni",
"ftl_removal": "Poisto \"Koko Tunnettu Verkosto\" -aikajanalta",
"media_removal": "Media-tiedostojen poisto",
"simple_policies": "Palvelinkohtaiset Säännöt",
"accept_desc": "Tämä palvelin hyväksyy viestit vain seuraavilta palvelimilta:",
"reject_desc": "Tämä palvelin ei hyväksy viestejä seuraavilta palvelimilta:",
"quarantine_desc": "Tämä palvelin lähettää vain julkisia viestejä seuraaville palvelimille:",
"ftl_removal_desc": "Tämä palvelin poistaa nämä palvelimet \"Koko Tunnettu Verkosto\"-aikajanalta:",
"media_removal_desc": "Tämä palvelin postaa mediatiedostot viesteistä seuraavilta palvelimilta:",
"media_nsfw": "Pakota Media Arkaluontoiseksi",
"media_nsfw_desc": "Tämä palvelin pakottaa mediatiedostot arkaluonteisiksi seuraavilta palvelimilta:"
},
"federation": "Federaatio",
"mrf_policies": "Aktivoidut MRF-säännöt",
"mrf_policies_desc": "MRF-säännöt muuttavat federaation toimintaa sivulla. Seuraavat säännöt ovat kytketty päälle:"
},
"staff": "Henkilökunta"
},
"domain_mute_card": {
"mute": "Mykistä",
"unmute": "Poista mykistys",
"mute_progress": "Mykistetään...",
"unmute_progress": "Poistetaan mykistyst..."
},
"exporter": {
"export": "Vie",
"processing": "Käsitellään, hetken päästä voit tallentaa tiedoston"
},
"image_cropper": {
"crop_picture": "Rajaa kuva",
"save": "Tallenna",
"save_without_cropping": "Tallenna rajaamatta",
"cancel": "Peruuta"
},
"importer": {
"submit": "Hyväksy",
"error": "Virhe tapahtui tietoja tuodessa.",
"success": "Tuonti onnistui."
},
"media_modal": {
"previous": "Edellinen",
"next": "Seuraava"
},
"emoji": {
"stickers": "Tarrat",
"emoji": "Emoji",
"keep_open": "Pidä valitsin auki",
"search_emoji": "Hae emojia",
"add_emoji": "Lisää emoji",
"custom": "Custom-emoji",
"load_all": "Ladataan kaikkia {emojiAmount} emojia",
"unicode": "Unicode-emoji",
"load_all_hint": "Ensimmäiset {saneAmount} emojia ladattu, kaikkien emojien lataaminen voi aiheuttaa hidastelua."
},
"remote_user_resolver": {
"remote_user_resolver": "Ulkopuolinen käyttäjä",
"searching_for": "Etsitään käyttäjää",
"error": "Ei löytynyt."
},
"selectable_list": {
"select_all": "Valitse kaikki"
},
"password_reset": {
"check_email": "Tarkista sähköpostisi salasanannollausta varten.",
"instruction": "Syötä sähköpostiosoite tai käyttäjänimi. Lähetämme linkin salasanan nollausta varten.",
"password_reset_disabled": "Salasanan nollaus ei käytössä. Ota yhteyttä sivun ylläpitäjään.",
"password_reset_required_but_mailer_is_disabled": "Sinun täytyy vaihtaa salasana, mutta salasanan nollaus on pois käytöstä. Ota yhteyttä sivun ylläpitäjään.",
"forgot_password": "Unohditko salasanan?",
"password_reset": "Salasanan nollaus",
"placeholder": "Sähköpostiosoite tai käyttäjänimi",
"return_home": "Palaa etusivulle",
"not_found": "Sähköpostiosoitetta tai käyttäjänimeä ei löytynyt.",
"too_many_requests": "Olet käyttänyt kaikki yritykset, yritä uudelleen myöhemmin.",
"password_reset_required": "Sinun täytyy vaihtaa salasana kirjautuaksesi."
},
"user_reporting": {
"add_comment_description": "Tämä raportti lähetetään sivun moderaattoreille. Voit antaa selityksen miksi ilmiannoit tilin:",
"title": "Ilmiannetaan {0}",
"additional_comments": "Lisäkommentit",
"forward_description": "Tämä tili on toiselta palvelimelta. Lähetä kopio ilmiannosta sinnekin?",
"forward_to": "Lähetä eteenpäin: {0}",
"submit": "Lähetä",
"generic_error": "Virhe käsitellessä pyyntöä."
},
"search": {
"people": "Käyttäjät",
"hashtags": "Aihetunnisteet",
"people_talking": "{0} käyttäjää puhuvat",
"person_talking": "{0} käyttäjä puhuu",
"no_results": "Ei tuloksia"
}
}

View file

@ -79,7 +79,9 @@
"twkn": "Ensemble du réseau connu",
"user_search": "Recherche d'utilisateur·ice",
"who_to_follow": "Qui suivre",
"preferences": "Préférences"
"preferences": "Préférences",
"search": "Recherche",
"administration": "Administration"
},
"notifications": {
"broken_favorite": "Chargement d'un message inconnu…",
@ -89,12 +91,16 @@
"notifications": "Notifications",
"read": "Lu !",
"repeated_you": "a partagé votre statut",
"no_more_notifications": "Aucune notification supplémentaire"
"no_more_notifications": "Aucune notification supplémentaire",
"migrated_to": "a migré à",
"reacted_with": "a réagi avec {0}",
"follow_request": "veut vous suivre"
},
"interactions": {
"favs_repeats": "Partages et favoris",
"follows": "Nouveaux⋅elles abonné⋅e⋅s ?",
"load_older": "Chargez d'anciennes interactions"
"follows": "Nouveaux suivis",
"load_older": "Chargez d'anciennes interactions",
"moves": "Migrations de comptes"
},
"post_status": {
"new_status": "Poster un nouveau statut",
@ -170,7 +176,7 @@
"secret_code": "Clé"
},
"verify": {
"desc": "Pour activer la double authentification, entrez le code depuis votre application:"
"desc": "Pour activer la double authentification, entrez le code depuis votre application:"
}
},
"attachmentRadius": "Pièces jointes",
@ -185,7 +191,7 @@
"block_export_button": "Export des comptes bloqués vers un fichier csv",
"block_import": "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": "Blocks importés! Le traitement va prendre un moment.",
"blocks_tab": "Bloqué·e·s",
"btnRadius": "Boutons",
"cBlue": "Bleu (répondre, suivre)",
@ -233,7 +239,7 @@
"import_theme": "Charger le thème",
"inputRadius": "Champs de texte",
"checkboxRadius": "Cases à cocher",
"instance_default": "(default: {value})",
"instance_default": "(default: {value})",
"instance_default_simple": "(default)",
"interface": "Interface",
"interfaceLanguage": "Langue de l'interface",
@ -264,7 +270,7 @@
"nsfw_clickthrough": "Masquer les images marquées comme contenu adulte ou sensible",
"oauth_tokens": "Jetons OAuth",
"token": "Jeton",
"refresh_token": "Refresh Token",
"refresh_token": "Rafraichir le jeton",
"valid_until": "Valable jusque",
"revoke_token": "Révoquer",
"panelRadius": "Fenêtres",
@ -293,8 +299,8 @@
"settings": "Paramètres",
"subject_input_always_show": "Toujours copier le champ de sujet",
"subject_line_behavior": "Copier le sujet en répondant",
"subject_line_email": "Comme les mails: « re: sujet »",
"subject_line_mastodon": "Comme mastodon: copier tel quel",
"subject_line_email": "Similaire au courriel: « re: sujet »",
"subject_line_mastodon": "Comme mastodon: copier tel quel",
"subject_line_noop": "Ne pas copier",
"post_status_content_type": "Type de contenu du statuts",
"stop_gifs": "N'animer les GIFS que lors du survol du curseur de la souris",
@ -312,7 +318,7 @@
"true": "oui"
},
"notifications": "Notifications",
"notification_setting": "Reçevoir les notifications de:",
"notification_setting": "Reçevoir les notifications de:",
"notification_setting_follows": "Utilisateurs que vous suivez",
"notification_setting_non_follows": "Utilisateurs que vous ne suivez pas",
"notification_setting_followers": "Utilisateurs qui vous suivent",
@ -330,7 +336,17 @@
"save_load_hint": "L'option « Garder » préserve les options activés en cours lors de la séléction ou chargement des thèmes, il sauve aussi les dites options lors de l'export d'un thème. Quand toutes les cases sont décochés, exporter un thème sauvera tout.",
"reset": "Remise à zéro",
"clear_all": "Tout vider",
"clear_opacity": "Vider la transparence"
"clear_opacity": "Vider la transparence",
"load_theme": "Charger le thème",
"use_snapshot": "Ancienne version",
"help": {
"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.",
"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."
},
"keep_as_is": "Garder tel-quel",
"use_source": "Nouvelle version"
},
"common": {
"color": "Couleur",
@ -365,7 +381,18 @@
"borders": "Bordures",
"buttons": "Boutons",
"inputs": "Champs de saisie",
"faint_text": "Texte en fondu"
"faint_text": "Texte en fondu",
"underlay": "sous-calque",
"pressed": "Appuyé",
"alert_warning": "Avertissement",
"alert_neutral": "Neutre",
"post": "Messages/Bios des comptes",
"poll": "Graphique de Sondage",
"icons": "Icônes",
"selectedPost": "Message sélectionné",
"selectedMenu": "Objet sélectionné du menu",
"disabled": "Désactivé",
"tabs": "Onglets"
},
"radii": {
"_tab_label": "Rondeur"
@ -398,7 +425,8 @@
"buttonPressed": "Bouton (cliqué)",
"buttonPressedHover": "Bouton (cliqué+survol)",
"input": "Champ de saisie"
}
},
"hintV3": "Pour les ombres vous pouvez aussi utiliser la notation {0} pour utiliser un autre emplacement de couleur."
},
"fonts": {
"_tab_label": "Polices",
@ -433,7 +461,28 @@
"title": "Version",
"backend_version": "Version du Backend",
"frontend_version": "Version du Frontend"
}
},
"change_email": "Changer de courriel",
"domain_mutes": "Domaines",
"pad_emoji": "Rajouter un espace autour de l'émoji après lavoir choisit",
"notification_visibility_emoji_reactions": "Réactions",
"hide_follows_count_description": "Masquer le nombre de suivis",
"useStreamingApiWarning": "(Non recommandé, expérimental, connu pour rater des messages)",
"type_domains_to_mute": "Écrire les domaines à masquer",
"fun": "Rigolo",
"greentext": "greentexting",
"allow_following_move": "Suivre automatiquement quand ce compte migre",
"change_email_error": "Il y a eu un problème pour charger votre courriel.",
"changed_email": "Courriel changé avec succès !",
"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",
"new_email": "Nouveau courriel",
"notification_visibility_moves": "Migrations de compte",
"user_mutes": "Comptes",
"useStreamingApi": "Recevoir les messages et notifications en temps réel",
"notification_setting_filters": "Filtres",
"notification_setting_privacy_option": "Masquer l'expéditeur et le contenu des notifications push",
"notification_setting_privacy": "Intimité"
},
"timeline": {
"collapse": "Fermer",
@ -456,7 +505,11 @@
"pinned": "Agraffé",
"delete_confirm": "Voulez-vous vraiment supprimer ce statuts ?",
"reply_to": "Réponse à",
"replies_list": "Réponses:"
"replies_list": "Réponses:",
"mute_conversation": "Masquer la conversation",
"unmute_conversation": "Démasquer la conversation",
"status_unavailable": "Status indisponible",
"copy_link": "Copier le lien au status"
},
"user_card": {
"approve": "Accepter",
@ -505,7 +558,13 @@
"quarantine": "Interdir les statuts de l'utilisateur à fédérer",
"delete_user": "Supprimer l'utilisateur",
"delete_user_confirmation": "Êtes-vous absolument-sûr⋅e ? Cette action ne peut être annulée."
}
},
"mention": "Mention",
"hidden": "Caché",
"subscribe": "Abonner",
"unsubscribe": "Désabonner",
"hide_repeats": "Cacher les partages",
"show_repeats": "Montrer les partages"
},
"user_profile": {
"timeline_title": "Journal de l'utilisateur⋅ice",
@ -530,7 +589,10 @@
"repeat": "Répéter",
"reply": "Répondre",
"favorite": "Favoriser",
"user_settings": "Paramètres utilisateur"
"user_settings": "Paramètres utilisateur",
"add_reaction": "Ajouter une réaction",
"accept_follow_request": "Accepter la demande de suivit",
"reject_follow_request": "Rejeter la demande de suivit"
},
"upload": {
"error": {
@ -545,5 +607,122 @@
"GiB": "GiO",
"TiB": "TiO"
}
},
"about": {
"mrf": {
"keyword": {
"reject": "Rejeté",
"replace": "Remplacer",
"keyword_policies": "Politiques par mot-clés",
"ftl_removal": "Suppression du flux \"Ensemble du réseau connu\"",
"is_replaced_by": "→"
},
"simple": {
"simple_policies": "Politiques par instances",
"accept": "Accepter",
"accept_desc": "Cette instance accepte des messages seulement depuis ces instances :",
"reject": "Rejeter",
"reject_desc": "Cette instance n'acceptera pas de message de ces instances :",
"quarantine": "Quarantaine",
"quarantine_desc": "Cette instance enverras seulement des messages publics à ces instances :",
"ftl_removal_desc": "Cette instance supprime ces instance du flux fédéré :",
"media_removal": "Suppression multimédia",
"media_removal_desc": "Cette instance supprime le contenu multimédia des instances suivantes :",
"media_nsfw": "Force le contenu multimédia comme sensible",
"ftl_removal": "Suppression du flux fédéré",
"media_nsfw_desc": "Cette instance force le contenu multimédia comme sensible pour les messages des instances suivantes :"
},
"federation": "Fédération",
"mrf_policies": "Politiques MRF activées",
"mrf_policies_desc": "Les politiques MRF modifient la fédération entre les instances. Les politiques suivantes sont activées :"
},
"staff": "Staff"
},
"domain_mute_card": {
"mute": "Muet",
"mute_progress": "Masquage…",
"unmute": "Démasquer",
"unmute_progress": "Démasquage…"
},
"polls": {
"add_poll": "Ajouter un Sondage",
"add_option": "Ajouter une option",
"option": "Option",
"votes": "votes",
"type": "Type de Sondage",
"single_choice": "Choix unique",
"multiple_choices": "Choix multiples",
"expiry": "Age du sondage",
"expires_in": "Fin du sondage dans {0}",
"not_enough_options": "Trop peu d'options unique au sondage",
"vote": "Voter",
"expired": "Sondage terminé il y a {0}"
},
"emoji": {
"emoji": "Émoji",
"search_emoji": "Rechercher un émoji",
"add_emoji": "Insérer un émoji",
"custom": "émoji personnalisé",
"unicode": "émoji unicode",
"load_all": "Charger tout les {emojiAmount} émojis",
"load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.",
"stickers": "Stickers"
},
"remote_user_resolver": {
"error": "Non trouvé."
},
"time": {
"minutes_short": "{0}min",
"second_short": "{0}s",
"day": "{0} jour",
"days": "{0} jours",
"months": "{0} mois",
"month_short": "{0}m",
"months_short": "{0}m",
"now": "tout de suite",
"now_short": "maintenant",
"second": "{0} seconde",
"seconds": "{0} secondes",
"seconds_short": "{0}s",
"day_short": "{0}j",
"days_short": "{0}j",
"hour": "{0} heure",
"hours": "{0} heures",
"hour_short": "{0}h",
"hours_short": "{0}h",
"in_future": "dans {0}",
"in_past": "il y a {0}",
"minute": "{0} minute",
"minutes": "{0} minutes",
"minute_short": "{0}min",
"month": "{0} mois",
"week": "{0} semaine",
"weeks": "{0} semaines",
"week_short": "{0}s",
"weeks_short": "{0}s",
"year": "{0} année",
"years": "{0} années",
"year_short": "{0}a",
"years_short": "{0}a"
},
"search": {
"people": "Comptes",
"person_talking": "{count} personnes discutant",
"hashtags": "Mot-dièses",
"people_talking": "{count} personnes discutant",
"no_results": "Aucun résultats"
},
"password_reset": {
"forgot_password": "Mot de passe oublié ?",
"check_email": "Vérifiez vos courriels pour le lien permettant de changer votre mot de passe.",
"password_reset_disabled": "Le changement de mot de passe est désactivé. Veuillez contacter l'administration de votre instance.",
"password_reset_required_but_mailer_is_disabled": "Vous devez changer votre mot de passe mais sont changement est désactivé. Veuillez contacter ladministration de votre instance.",
"password_reset": "Nouveau mot de passe",
"instruction": "Entrer votre address de courriel ou votre nom utilisateur. Nous enverrons un lien pour changer votre mot de passe.",
"placeholder": "Votre email ou nom d'utilisateur",
"return_home": "Retourner à la page d'accueil",
"not_found": "Email ou nom d'utilisateur inconnu.",
"too_many_requests": "Vos avez atteint la limite d'essais, essayez plus tard.",
"password_reset_required": "Vous devez changer votre mot de passe pour vous authentifier."
}
}

View file

@ -1,140 +1,164 @@
{
"general": {
"submit": "Invia",
"apply": "Applica"
"apply": "Applica",
"more": "Altro",
"generic_error": "Errore",
"optional": "facoltativo",
"show_more": "Mostra tutto",
"show_less": "Ripiega",
"dismiss": "Chiudi",
"cancel": "Annulla",
"disable": "Disabilita",
"enable": "Abilita",
"confirm": "Conferma",
"verify": "Verifica"
},
"nav": {
"mentions": "Menzioni",
"public_tl": "Sequenza temporale pubblica",
"timeline": "Sequenza temporale",
"twkn": "L'intera rete conosciuta",
"chat": "Chat Locale",
"friend_requests": "Richieste di Seguirti"
"public_tl": "Sequenza pubblica",
"timeline": "Sequenza personale",
"twkn": "Sequenza globale",
"chat": "Chat della stanza",
"friend_requests": "Vogliono seguirti",
"about": "Informazioni",
"administration": "Amministrazione",
"back": "Indietro",
"interactions": "Interazioni",
"dms": "Messaggi diretti",
"user_search": "Ricerca utenti",
"search": "Ricerca",
"who_to_follow": "Chi seguire",
"preferences": "Preferenze"
},
"notifications": {
"followed_you": "ti segue",
"notifications": "Notifiche",
"read": "Leggi!",
"read": "Letto!",
"broken_favorite": "Stato sconosciuto, lo sto cercando...",
"favorited_you": "ha messo mi piace al tuo stato",
"load_older": "Carica notifiche più vecchie",
"repeated_you": "ha condiviso il tuo stato"
"favorited_you": "ha gradito il tuo messaggio",
"load_older": "Carica notifiche precedenti",
"repeated_you": "ha condiviso il tuo messaggio",
"follow_request": "vuole seguirti",
"no_more_notifications": "Fine delle notifiche",
"migrated_to": "è migrato verso",
"reacted_with": "ha reagito con"
},
"settings": {
"attachments": "Allegati",
"autoload": "Abilita caricamento automatico quando si raggiunge fondo pagina",
"avatar": "Avatar",
"autoload": "Abilita caricamento automatico quando raggiungi il fondo pagina",
"avatar": "Icona utente",
"bio": "Introduzione",
"current_avatar": "Il tuo avatar attuale",
"current_profile_banner": "Il tuo banner attuale",
"current_avatar": "La tua icona attuale",
"current_profile_banner": "Il tuo stendardo attuale",
"filtering": "Filtri",
"filtering_explanation": "Tutti i post contenenti queste parole saranno silenziati, uno per linea",
"filtering_explanation": "Tutti i post contenenti queste parole saranno silenziati, una per riga",
"hide_attachments_in_convo": "Nascondi gli allegati presenti nelle conversazioni",
"hide_attachments_in_tl": "Nascondi gli allegati presenti nella sequenza temporale",
"hide_attachments_in_tl": "Nascondi gli allegati presenti nelle sequenze",
"name": "Nome",
"name_bio": "Nome & Introduzione",
"nsfw_clickthrough": "Abilita il click per visualizzare gli allegati segnati come NSFW",
"name_bio": "Nome ed introduzione",
"nsfw_clickthrough": "Fai click per visualizzare gli allegati nascosti",
"profile_background": "Sfondo della tua pagina",
"profile_banner": "Banner del tuo profilo",
"reply_link_preview": "Abilita il link per la risposta al passaggio del mouse",
"set_new_avatar": "Scegli un nuovo avatar",
"profile_banner": "Stendardo del tuo profilo",
"reply_link_preview": "Visualizza le risposte al passaggio del cursore",
"set_new_avatar": "Scegli una nuova icona",
"set_new_profile_background": "Scegli un nuovo sfondo per la tua pagina",
"set_new_profile_banner": "Scegli un nuovo banner per il tuo profilo",
"set_new_profile_banner": "Scegli un nuovo stendardo per il tuo profilo",
"settings": "Impostazioni",
"theme": "Tema",
"user_settings": "Impostazioni Utente",
"attachmentRadius": "Allegati",
"avatarAltRadius": "Avatar (Notifiche)",
"avatarRadius": "Avatar",
"avatarAltRadius": "Icone utente (Notifiche)",
"avatarRadius": "Icone utente",
"background": "Sfondo",
"btnRadius": "Pulsanti",
"cBlue": "Blu (Rispondere, seguire)",
"cGreen": "Verde (Condividi)",
"cOrange": "Arancio (Mi piace)",
"cRed": "Rosso (Annulla)",
"change_password": "Cambia Password",
"cBlue": "Blu (risposte, seguire)",
"cGreen": "Verde (ripeti)",
"cOrange": "Arancione (gradire)",
"cRed": "Rosso (annulla)",
"change_password": "Cambia password",
"change_password_error": "C'è stato un problema durante il cambiamento della password.",
"changed_password": "Password cambiata correttamente!",
"collapse_subject": "Riduci post che hanno un oggetto",
"collapse_subject": "Ripiega messaggi con Oggetto",
"confirm_new_password": "Conferma la nuova password",
"current_password": "Password attuale",
"data_import_export_tab": "Importa / Esporta Dati",
"default_vis": "Visibilità predefinita dei post",
"delete_account": "Elimina Account",
"delete_account_description": "Elimina definitivamente il tuo account e tutti i tuoi messaggi.",
"delete_account_error": "C'è stato un problema durante l'eliminazione del tuo account. Se il problema persiste contatta l'amministratore della tua istanza.",
"delete_account_instructions": "Digita la tua password nel campo sottostante per confermare l'eliminazione dell'account.",
"export_theme": "Salva settaggi",
"current_password": "La tua password attuale",
"data_import_export_tab": "Importa o esporta dati",
"default_vis": "Visibilità predefinita dei messaggi",
"delete_account": "Elimina 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_instructions": "Digita la tua password nel campo sottostante per confermare l'eliminazione del tuo profilo.",
"export_theme": "Salva impostazioni",
"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",
"follow_export_processing": "Sto elaborando, presto ti sarà chiesto di scaricare il tuo file",
"follow_import": "Importa la lista di chi segui",
"follow_import_error": "Errore nell'importazione della lista di chi segui",
"follows_imported": "Importazione riuscita! L'elaborazione richiederà un po' di tempo.",
"foreground": "In primo piano",
"foreground": "Primo piano",
"general": "Generale",
"hide_post_stats": "Nascondi statistiche dei post (es. il numero di mi piace)",
"hide_user_stats": "Nascondi statistiche dell'utente (es. il numero di chi ti segue)",
"import_followers_from_a_csv_file": "Importa una lista di chi segui da un file csv",
"import_theme": "Carica settaggi",
"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)",
"import_followers_from_a_csv_file": "Importa una lista di chi segui da un file CSV",
"import_theme": "Carica impostazioni",
"inputRadius": "Campi di testo",
"instance_default": "(predefinito: {value})",
"interfaceLanguage": "Linguaggio dell'interfaccia",
"invalid_theme_imported": "Il file selezionato non è un file di tema per Pleroma supportato. Il tuo tema non è stato modificato.",
"interfaceLanguage": "Lingua dell'interfaccia",
"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",
"links": "Collegamenti",
"lock_account_description": "Limita il tuo account solo per contatti approvati",
"lock_account_description": "Limita il tuo account solo a seguaci approvati",
"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 senza audio in ciclo continuo (es. le \"gif\" di Mastodon)",
"new_password": "Nuova password",
"notification_visibility": "Tipi di notifiche da mostrare",
"notification_visibility_follows": "Nuove persone ti seguono",
"notification_visibility_likes": "Mi piace",
"notification_visibility_likes": "Preferiti",
"notification_visibility_mentions": "Menzioni",
"notification_visibility_repeats": "Condivisioni",
"no_rich_text_description": "Togli la formattazione del testo da tutti i post",
"no_rich_text_description": "Togli la formattazione del testo da tutti i messaggi",
"oauth_tokens": "Token OAuth",
"token": "Token",
"refresh_token": "Aggiorna token",
"valid_until": "Valido fino a",
"revoke_token": "Revocare",
"revoke_token": "Revoca",
"panelRadius": "Pannelli",
"pause_on_unfocused": "Metti in pausa l'aggiornamento continuo quando la scheda non è in primo piano",
"pause_on_unfocused": "Interrompi l'aggiornamento continuo mentre la scheda è in secondo piano",
"presets": "Valori predefiniti",
"profile_tab": "Profilo",
"radii_help": "Imposta l'arrotondamento dei bordi (in pixel)",
"replies_in_timeline": "Risposte nella sequenza temporale",
"radii_help": "Imposta il raggio degli angoli (in pixel)",
"replies_in_timeline": "Risposte nella sequenza personale",
"reply_visibility_all": "Mostra tutte le risposte",
"reply_visibility_following": "Mostra solo le risposte dirette a me o agli utenti che seguo",
"reply_visibility_self": "Mostra solo risposte dirette a me",
"reply_visibility_following": "Mostra solo le risposte rivolte a me o agli utenti che seguo",
"reply_visibility_self": "Mostra solo risposte rivolte a me",
"saving_err": "Errore nel salvataggio delle impostazioni",
"saving_ok": "Impostazioni salvate",
"security_tab": "Sicurezza",
"stop_gifs": "Riproduci GIF al passaggio del cursore del mouse",
"streaming": "Abilita aggiornamento automatico dei nuovi post quando si è in alto alla pagina",
"stop_gifs": "Riproduci GIF al passaggio del cursore",
"streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina",
"text": "Testo",
"theme_help": "Usa codici colore esadecimali (#rrggbb) per personalizzare il tuo schema di colori.",
"tooltipRadius": "Descrizioni/avvisi",
"values": {
"false": "no",
"true": "si"
"true": "sì"
}
},
"timeline": {
"error_fetching": "Errore nel prelievo aggiornamenti",
"error_fetching": "Errore nell'aggiornamento",
"load_older": "Carica messaggi più vecchi",
"show_new": "Mostra nuovi",
"up_to_date": "Aggiornato",
"collapse": "Riduci",
"conversation": "Conversazione",
"no_retweet_hint": "La visibilità del post è impostata solo per chi ti segue o messaggio diretto e non può essere condiviso",
"no_retweet_hint": "Il messaggio è diretto o solo per seguaci e non può essere condiviso",
"repeated": "condiviso"
},
"user_card": {
"follow": "Segui",
"followees": "Chi stai seguendo",
"followers": "Chi ti segue",
"following": "Lo stai seguendo!",
"followers": "Seguaci",
"following": "Seguìto!",
"follows_you": "Ti segue!",
"mute": "Silenzia",
"muted": "Silenziato",
@ -152,9 +176,9 @@
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Media proxy",
"scope_options": "Opzioni di visibilità",
"text_limit": "Lunghezza limite",
"media_proxy": "Proxy multimedia",
"scope_options": "Opzioni visibilità",
"text_limit": "Lunghezza massima",
"title": "Caratteristiche",
"who_to_follow": "Chi seguire"
},
@ -166,26 +190,36 @@
"login": "Accedi",
"logout": "Disconnettiti",
"password": "Password",
"placeholder": "es. lain",
"placeholder": "es. Lupo Lucio",
"register": "Registrati",
"username": "Nome utente"
"username": "Nome utente",
"description": "Accedi con OAuth",
"hint": "Accedi per partecipare alla discussione",
"authentication_code": "Codice di autenticazione",
"enter_recovery_code": "Inserisci un codice di recupero",
"enter_two_factor_code": "Inserisci un codice two-factor",
"recovery_code": "Codice di recupero",
"heading": {
"totp": "Autenticazione two-factor",
"recovery": "Recupero two-factor"
}
},
"post_status": {
"account_not_locked_warning": "Il tuo account non è {0}. Chiunque può seguirti e vedere i tuoi post riservati a chi ti segue.",
"account_not_locked_warning_link": "bloccato",
"attachments_sensitive": "Segna allegati come sensibili",
"account_not_locked_warning": "Il tuo profilo non è {0}. Chiunque può seguirti e vedere i tuoi messaggi riservati ai tuoi seguaci.",
"account_not_locked_warning_link": "protetto",
"attachments_sensitive": "Nascondi gli allegati",
"content_type": {
"text/plain": "Testo normale"
},
"content_warning": "Oggetto (facoltativo)",
"default": "Appena atterrato in L.A.",
"default": "Sono appena atterrato a Fiumicino.",
"direct_warning": "Questo post sarà visibile solo dagli utenti menzionati.",
"posting": "Pubblica",
"posting": "Sto pubblicando",
"scope": {
"direct": "Diretto - Pubblicato solo per gli utenti menzionati",
"private": "Solo per chi ti segue - Visibile solo da chi ti segue",
"public": "Pubblico - Visibile sulla sequenza temporale pubblica",
"unlisted": "Non elencato - Non visibile sulla sequenza temporale pubblica"
"direct": "Diretto - Visibile solo agli utenti menzionati",
"private": "Solo per seguaci - Visibile solo dai tuoi seguaci",
"public": "Pubblico - Visibile sulla sequenza pubblica",
"unlisted": "Non elencato - Non visibile sulla sequenza pubblica"
}
},
"registration": {
@ -197,10 +231,93 @@
"token": "Codice d'invito"
},
"user_profile": {
"timeline_title": "Sequenza Temporale dell'Utente"
"timeline_title": "Sequenza dell'Utente"
},
"who_to_follow": {
"more": "Più",
"more": "Altro",
"who_to_follow": "Chi seguire"
},
"about": {
"mrf": {
"federation": "Federazione",
"keyword": {
"reject": "Rifiuta",
"replace": "Sostituisci",
"is_replaced_by": "→",
"keyword_policies": "Regole per parole chiave",
"ftl_removal": "Rimozione dalla sequenza globale"
},
"simple": {
"reject": "Rifiuta",
"accept": "Accetta",
"simple_policies": "Regole specifiche alla stanza",
"accept_desc": "Questa stanza accetta messaggi solo dalle seguenti stanze:",
"reject_desc": "Questa stanza non accetterà messaggi dalle stanze seguenti:",
"quarantine": "Quarantena",
"quarantine_desc": "Questa stanza inoltrerà solo messaggi pubblici alle seguenti stanze:",
"ftl_removal": "Rimozione dalla sequenza globale",
"ftl_removal_desc": "Questa stanza rimuove le seguenti stanze dalla sequenza globale:",
"media_removal": "Rimozione multimedia",
"media_removal_desc": "Questa istanza rimuove gli allegati dalle seguenti stanze:",
"media_nsfw": "Allegati oscurati forzatamente",
"media_nsfw_desc": "Questa stanza oscura gli allegati dei messaggi provenienti da queste stanze:"
},
"mrf_policies": "Regole RM abilitate",
"mrf_policies_desc": "Le regole RM cambiano il comportamento federativo della stanza. Vigono le seguenti regole:"
},
"staff": "Equipaggio"
},
"domain_mute_card": {
"mute": "Zittisci",
"mute_progress": "Zittisco...",
"unmute": "Ascolta",
"unmute_progress": "Procedo..."
},
"exporter": {
"export": "Esporta",
"processing": "In elaborazione, il tuo file sarà scaricabile a breve"
},
"image_cropper": {
"crop_picture": "Ritaglia immagine",
"save": "Salva",
"save_without_cropping": "Salva senza ritagliare",
"cancel": "Annulla"
},
"importer": {
"submit": "Invia",
"success": "Importato.",
"error": "L'importazione non è andata a buon fine."
},
"media_modal": {
"previous": "Precedente",
"next": "Prossimo"
},
"polls": {
"add_poll": "Sondaggio",
"add_option": "Alternativa",
"option": "Opzione",
"votes": "voti",
"vote": "Vota",
"type": "Tipo di sondaggio",
"single_choice": "Scelta singola",
"multiple_choices": "Scelta multipla",
"expiry": "Scadenza",
"expires_in": "Scade fra {0}",
"expired": "Scaduto {0} fa",
"not_enough_options": "Aggiungi altre risposte"
},
"interactions": {
"favs_repeats": "Condivisi e preferiti"
},
"emoji": {
"load_all": "Carico tutti i {emojiAmount} emoji",
"load_all_hint": "Primi {saneAmount} emoji caricati, caricarli tutti potrebbe causare rallentamenti.",
"unicode": "Emoji Unicode",
"custom": "Emoji personale",
"add_emoji": "Inserisci Emoji",
"search_emoji": "Cerca un emoji",
"keep_open": "Tieni aperto il menù",
"emoji": "Emoji",
"stickers": "Adesivi"
}
}

View file

@ -8,7 +8,7 @@
"media_proxy": "Media proxy",
"scope_options": "Zichtbaarheidsopties",
"text_limit": "Tekst limiet",
"title": "Features",
"title": "Kenmerken",
"who_to_follow": "Wie te volgen"
},
"finder": {
@ -16,31 +16,54 @@
"find_user": "Gebruiker zoeken"
},
"general": {
"apply": "toepassen",
"submit": "Verzend"
"apply": "Toepassen",
"submit": "Verzend",
"more": "Meer",
"optional": "optioneel",
"show_more": "Bekijk meer",
"show_less": "Bekijk minder",
"dismiss": "Opheffen",
"cancel": "Annuleren",
"disable": "Uitschakelen",
"enable": "Inschakelen",
"confirm": "Bevestigen",
"verify": "Verifiëren",
"generic_error": "Er is een fout opgetreden"
},
"login": {
"login": "Log in",
"description": "Log in met OAuth",
"logout": "Log uit",
"logout": "Uitloggen",
"password": "Wachtwoord",
"placeholder": "bv. lain",
"register": "Registreer",
"username": "Gebruikersnaam"
"placeholder": "bijv. lain",
"register": "Registreren",
"username": "Gebruikersnaam",
"hint": "Log in om deel te nemen aan de discussie",
"authentication_code": "Authenticatie code",
"enter_recovery_code": "Voer een herstelcode in",
"enter_two_factor_code": "Voer een twee-factor code in",
"recovery_code": "Herstelcode",
"heading": {
"totp": "Twee-factor authenticatie",
"recovery": "Twee-factor herstelling"
}
},
"nav": {
"about": "Over",
"back": "Terug",
"chat": "Locale Chat",
"friend_requests": "Volgverzoek",
"chat": "Lokale Chat",
"friend_requests": "Volgverzoeken",
"mentions": "Vermeldingen",
"dms": "Directe Berichten",
"public_tl": "Publieke Tijdlijn",
"timeline": "Tijdlijn",
"twkn": "Het Geheel Gekende Netwerk",
"user_search": "Zoek Gebruiker",
"twkn": "Het Geheel Bekende Netwerk",
"user_search": "Gebruiker Zoeken",
"who_to_follow": "Wie te volgen",
"preferences": "Voorkeuren"
"preferences": "Voorkeuren",
"administration": "Administratie",
"search": "Zoeken",
"interactions": "Interacties"
},
"notifications": {
"broken_favorite": "Onbekende status, aan het zoeken...",
@ -49,25 +72,39 @@
"load_older": "Laad oudere meldingen",
"notifications": "Meldingen",
"read": "Gelezen!",
"repeated_you": "Herhaalde je status"
"repeated_you": "Herhaalde je status",
"no_more_notifications": "Geen meldingen meer",
"migrated_to": "is gemigreerd naar",
"follow_request": "wil je volgen",
"reacted_with": "reageerde met {0}"
},
"post_status": {
"new_status": "Post nieuwe status",
"account_not_locked_warning": "Je account is niet {0}. Iedereen die je volgt kan enkel-volgers posts lezen.",
"new_status": "Nieuwe status plaatsen",
"account_not_locked_warning": "Je account is niet {0}. Iedereen kan je volgen om je alleen-volgers berichten te lezen.",
"account_not_locked_warning_link": "gesloten",
"attachments_sensitive": "Markeer bijlage als gevoelig",
"attachments_sensitive": "Markeer bijlagen als gevoelig",
"content_type": {
"text/plain": "Gewone tekst"
"text/plain": "Platte tekst",
"text/html": "HTML",
"text/markdown": "Markdown",
"text/bbcode": "BBCode"
},
"content_warning": "Onderwerp (optioneel)",
"default": "Tijd voor een pauze!",
"default": "Zojuist geland in L.A.",
"direct_warning": "Deze post zal enkel zichtbaar zijn voor de personen die genoemd zijn.",
"posting": "Plaatsen",
"scope": {
"direct": "Direct - Post enkel naar genoemde gebruikers",
"direct": "Direct - Post enkel naar vermelde gebruikers",
"private": "Enkel volgers - Post enkel naar volgers",
"public": "Publiek - Post op publieke tijdlijnen",
"unlisted": "Unlisted - Toon niet op publieke tijdlijnen"
"unlisted": "Niet Vermelden - Niet tonen op publieke tijdlijnen"
},
"direct_warning_to_all": "Dit bericht zal zichtbaar zijn voor alle vermelde gebruikers.",
"direct_warning_to_first_only": "Dit bericht zal alleen zichtbaar zijn voor de vermelde gebruikers aan het begin van het bericht.",
"scope_notice": {
"public": "Dit bericht zal voor iedereen zichtbaar zijn",
"unlisted": "Dit bericht zal niet zichtbaar zijn in de Publieke Tijdlijn en Het Geheel Bekende Netwerk",
"private": "Dit bericht zal voor alleen je volgers zichtbaar zijn"
}
},
"registration": {
@ -76,7 +113,7 @@
"fullname": "Weergave naam",
"password_confirm": "Wachtwoord bevestiging",
"registration": "Registratie",
"token": "Uitnodigingstoken",
"token": "Uitnodigings-token",
"captcha": "CAPTCHA",
"new_captcha": "Klik op de afbeelding voor een nieuwe captcha",
"validations": {
@ -86,141 +123,161 @@
"password_required": "moet ingevuld zijn",
"password_confirmation_required": "moet ingevuld zijn",
"password_confirmation_match": "komt niet overeen met het wachtwoord"
}
},
"username_placeholder": "bijv. lain",
"fullname_placeholder": "bijv. Lain Iwakura",
"bio_placeholder": "bijv.\nHallo, ik ben Lain.\nIk ben een anime meisje woonachtig in een buitenwijk in Japan. Je kent me misschien van the Wired."
},
"settings": {
"attachmentRadius": "Bijlages",
"attachments": "Bijlages",
"autoload": "Automatisch laden wanneer tot de bodem gescrold inschakelen",
"autoload": "Automatisch laden inschakelen wanneer tot de bodem gescrold wordt",
"avatar": "Avatar",
"avatarAltRadius": "Avatars (Meldingen)",
"avatarRadius": "Avatars",
"background": "Achtergrond",
"bio": "Bio",
"btnRadius": "Knoppen",
"cBlue": "Blauw (Antwoord, volgen)",
"cGreen": "Groen (Herhaal)",
"cOrange": "Oranje (Vind ik leuk)",
"cRed": "Rood (Annuleer)",
"change_password": "Verander Wachtwoord",
"change_password_error": "Er was een probleem bij het aanpassen van je wachtwoord.",
"changed_password": "Wachtwoord succesvol aangepast!",
"collapse_subject": "Klap posts met onderwerp in",
"composing": "Samenstellen",
"confirm_new_password": "Bevestig nieuw wachtwoord",
"cBlue": "Blauw (Beantwoorden, volgen)",
"cGreen": "Groen (Herhalen)",
"cOrange": "Oranje (Favoriet)",
"cRed": "Rood (Annuleren)",
"change_password": "Wachtwoord Wijzigen",
"change_password_error": "Er is een fout opgetreden bij het wijzigen van je wachtwoord.",
"changed_password": "Wachtwoord succesvol gewijzigd!",
"collapse_subject": "Klap berichten met een onderwerp in",
"composing": "Opstellen",
"confirm_new_password": "Nieuw wachtwoord bevestigen",
"current_avatar": "Je huidige avatar",
"current_password": "Huidig wachtwoord",
"current_profile_banner": "Je huidige profiel banner",
"data_import_export_tab": "Data Import / Export",
"default_vis": "Standaard zichtbaarheidsscope",
"delete_account": "Verwijder Account",
"delete_account_description": "Verwijder je account en berichten permanent.",
"delete_account_error": "Er was een probleem bij het verwijderen van je account. Indien dit probleem blijft, gelieve de administratie van deze instantie te verwittigen.",
"delete_account_instructions": "Typ je wachtwoord in de input hieronder om het verwijderen van je account te bevestigen.",
"export_theme": "Sla preset op",
"default_vis": "Standaard zichtbaarheidsbereik",
"delete_account": "Account Verwijderen",
"delete_account_description": "Permanent je gegevens verwijderen en account deactiveren.",
"delete_account_error": "Er is een fout opgetreden bij het verwijderen van je account. Indien dit probleem zich voor blijft doen, neem dan contact op met de beheerder van deze instantie.",
"delete_account_instructions": "Voer je wachtwoord in het onderstaande invoerveld in om het verwijderen van je account te bevestigen.",
"export_theme": "Preset opslaan",
"filtering": "Filtering",
"filtering_explanation": "Alle statussen die deze woorden bevatten worden genegeerd, één filter per lijn.",
"follow_export": "Volgers export",
"follow_export_button": "Exporteer je volgers naar een csv file",
"filtering_explanation": "Alle statussen die deze woorden bevatten worden genegeerd, één filter per lijn",
"follow_export": "Volgers exporteren",
"follow_export_button": "Exporteer je volgers naar een csv bestand",
"follow_export_processing": "Aan het verwerken, binnen enkele ogenblikken wordt je gevraagd je bestand te downloaden",
"follow_import": "Volgers import",
"follow_import": "Volgers importeren",
"follow_import_error": "Fout bij importeren volgers",
"follows_imported": "Volgers geïmporteerd! Het kan even duren om ze allemaal te verwerken.",
"follows_imported": "Volgers geïmporteerd! Het kan even duren voordat deze verwerkt zijn.",
"foreground": "Voorgrond",
"general": "Algemeen",
"hide_attachments_in_convo": "Verberg bijlages in conversaties",
"hide_attachments_in_tl": "Verberg bijlages in de tijdlijn",
"hide_isp": "Verberg instantie-specifiek paneel",
"preload_images": "Afbeeldingen voorladen",
"hide_post_stats": "Verberg post statistieken (bv. het aantal vind-ik-leuks)",
"hide_user_stats": "Verberg post statistieken (bv. het aantal volgers)",
"import_followers_from_a_csv_file": "Importeer volgers uit een csv file",
"import_theme": "Laad preset",
"preload_images": "Afbeeldingen vooraf laden",
"hide_post_stats": "Verberg bericht statistieken (bijv. het aantal favorieten)",
"hide_user_stats": "Verberg bericht statistieken (bijv. het aantal volgers)",
"import_followers_from_a_csv_file": "Importeer volgers uit een csv bestand",
"import_theme": "Preset laden",
"inputRadius": "Invoervelden",
"checkboxRadius": "Checkboxen",
"instance_default": "(standaard: {value})",
"instance_default_simple": "(standaard)",
"interface": "Interface",
"interfaceLanguage": "Interface taal",
"invalid_theme_imported": "Het geselecteerde thema is geen door Pleroma ondersteund thema. Er zijn geen aanpassingen gedaan.",
"limited_availability": "Onbeschikbaar in je browser",
"invalid_theme_imported": "Het geselecteerde bestand is geen door Pleroma ondersteund thema. Er zijn geen aanpassingen gedaan.",
"limited_availability": "Niet beschikbaar in je browser",
"links": "Links",
"lock_account_description": "Laat volgers enkel toe na expliciete toestemming",
"loop_video": "Speel videos af in een lus",
"loop_video_silent_only": "Speel enkel videos zonder geluid af in een lus (bv. Mastodon's \"gifs\")",
"loop_video": "Herhaal video's",
"loop_video_silent_only": "Herhaal enkel video's zonder geluid (bijv. Mastodon's \"gifs\")",
"name": "Naam",
"name_bio": "Naam & Bio",
"new_password": "Nieuw wachtwoord",
"notification_visibility": "Type meldingen die getoond worden",
"notification_visibility_follows": "Volgers",
"notification_visibility_follows": "Volgingen",
"notification_visibility_likes": "Vind-ik-leuks",
"notification_visibility_mentions": "Vermeldingen",
"notification_visibility_repeats": "Herhalingen",
"no_rich_text_description": "Strip rich text formattering van alle posts",
"no_rich_text_description": "Verwijder rich text formattering van alle berichten",
"hide_network_description": "Toon niet wie mij volgt en wie ik volg.",
"nsfw_clickthrough": "Schakel doorklikbaar verbergen van NSFW bijlages in",
"nsfw_clickthrough": "Doorklikbaar verbergen van gevoelige bijlages inschakelen",
"oauth_tokens": "OAuth-tokens",
"token": "Token",
"refresh_token": "Token vernieuwen",
"refresh_token": "Token Vernieuwen",
"valid_until": "Geldig tot",
"revoke_token": "Intrekken",
"panelRadius": "Panelen",
"pause_on_unfocused": "Pauzeer streamen wanneer de tab niet gefocused is",
"pause_on_unfocused": "Streamen pauzeren wanneer de tab niet in focus is",
"presets": "Presets",
"profile_background": "Profiel Achtergrond",
"profile_banner": "Profiel Banner",
"profile_tab": "Profiel",
"radii_help": "Stel afronding van hoeken in de interface in (in pixels)",
"replies_in_timeline": "Antwoorden in tijdlijn",
"reply_link_preview": "Schakel antwoordlink preview in bij over zweven met muisaanwijzer",
"reply_visibility_all": "Toon alle antwoorden",
"reply_visibility_following": "Toon enkel antwoorden naar mij of andere gebruikers gericht",
"reply_visibility_self": "Toon enkel antwoorden naar mij gericht",
"reply_link_preview": "Antwoord-link weergave inschakelen bij aanwijzen met muisaanwijzer",
"reply_visibility_all": "Alle antwoorden tonen",
"reply_visibility_following": "Enkel antwoorden tonen die aan mij of gevolgde gebruikers gericht zijn",
"reply_visibility_self": "Enkel antwoorden tonen die aan mij gericht zijn",
"saving_err": "Fout tijdens opslaan van instellingen",
"saving_ok": "Instellingen opgeslagen",
"security_tab": "Veiligheid",
"scope_copy": "Neem scope over bij antwoorden (Directe Berichten blijven altijd Direct)",
"set_new_avatar": "Zet nieuwe avatar",
"set_new_profile_background": "Zet nieuwe profiel achtergrond",
"set_new_profile_banner": "Zet nieuwe profiel banner",
"security_tab": "Beveiliging",
"scope_copy": "Neem bereik over bij beantwoorden (Directe Berichten blijven altijd Direct)",
"set_new_avatar": "Nieuwe avatar instellen",
"set_new_profile_background": "Nieuwe profiel achtergrond instellen",
"set_new_profile_banner": "Nieuwe profiel banner instellen",
"settings": "Instellingen",
"subject_input_always_show": "Maak onderwerpveld altijd zichtbaar",
"subject_line_behavior": "Kopieer onderwerp bij antwoorden",
"subject_input_always_show": "Altijd onderwerpveld tonen",
"subject_line_behavior": "Onderwerp kopiëren bij antwoorden",
"subject_line_email": "Zoals email: \"re: onderwerp\"",
"subject_line_mastodon": "Zoals Mastodon: kopieer zoals het is",
"subject_line_noop": "Kopieer niet",
"stop_gifs": "Speel GIFs af bij zweven",
"streaming": "Schakel automatisch streamen van posts in wanneer tot boven gescrold.",
"subject_line_mastodon": "Zoals mastodon: kopieer zoals het is",
"subject_line_noop": "Niet kopiëren",
"stop_gifs": "GIFs afspelen bij zweven",
"streaming": "Automatisch streamen van nieuwe berichten inschakelen wanneer tot boven gescrold is",
"text": "Tekst",
"theme": "Thema",
"theme_help": "Gebruik hex color codes (#rrggbb) om je kleurschema te wijzigen.",
"theme_help_v2_1": "Je kan ook de kleur en transparantie van bepaalde componenten overschrijven door de checkbox aan te vinken, gebruik de \"Wis alles\" knop om alle overschrijvingen te annuleren.",
"theme_help_v2_2": "Iconen onder sommige items zijn achtergrond/tekst contrast indicators, zweef er over voor gedetailleerde info. Hou er rekening mee dat bij doorzichtigheid de ergst mogelijke situatie wordt weer gegeven.",
"tooltipRadius": "Gereedschapstips/alarmen",
"user_settings": "Gebruikers Instellingen",
"theme_help_v2_1": "Je kan ook de kleur en transparantie van bepaalde componenten overschrijven door de checkbox aan te vinken, gebruik de \"Alles wissen\" knop om alle overschrijvingen te annuleren.",
"theme_help_v2_2": "Iconen onder sommige onderdelen zijn achtergrond/tekst contrast indicatoren, zweef er over voor gedetailleerde info. Hou er rekening mee dat bij doorzichtigheid de ergst mogelijke situatie wordt weer gegeven.",
"tooltipRadius": "Tooltips/alarmen",
"user_settings": "Gebruikersinstellingen",
"values": {
"false": "nee",
"true": "ja"
},
"notifications": "Meldingen",
"enable_web_push_notifications": "Schakel web push meldingen in",
"enable_web_push_notifications": "Web push meldingen inschakelen",
"style": {
"switcher": {
"keep_color": "Behoud kleuren",
"keep_shadows": "Behoud schaduwen",
"keep_opacity": "Behoud transparantie",
"keep_roundness": "Behoud afrondingen",
"keep_fonts": "Behoud lettertypes",
"keep_color": "Kleuren behouden",
"keep_shadows": "Schaduwen behouden",
"keep_opacity": "Transparantie behouden",
"keep_roundness": "Rondingen behouden",
"keep_fonts": "Lettertypes behouden",
"save_load_hint": "\"Behoud\" opties behouden de momenteel ingestelde opties bij het selecteren of laden van thema's, maar slaan ook de genoemde opties op bij het exporteren van een thema. Wanneer alle selectievakjes zijn uitgeschakeld, zal het exporteren van thema's alles opslaan.",
"reset": "Reset",
"clear_all": "Wis alles",
"clear_opacity": "Wis transparantie"
"clear_all": "Alles wissen",
"clear_opacity": "Transparantie wissen",
"keep_as_is": "Hou zoals het is",
"use_snapshot": "Oude versie",
"use_source": "Nieuwe versie",
"help": {
"future_version_imported": "Het geïmporteerde bestand is gemaakt voor een nieuwere versie van FE.",
"older_version_imported": "Het geïmporteerde bestand is gemaakt voor een oudere versie van FE.",
"upgraded_from_v2": "PleromaFE is bijgewerkt, het thema kan iets anders uitzien dan dat je gewend bent.",
"v2_imported": "Het geïmporteerde bestand is gemaakt voor een oudere FE. We proberen compatibiliteit te maximaliseren, maar het kan toch voorkomen dat er inconsistenties zijn.",
"snapshot_source_mismatch": "Versie conflict: waarschijnlijk was FE terug gerold en opnieuw bijgewerkt, indien je het thema aangepast hebt met de oudere versie van FE wil je waarschijnlijk de oude versie gebruiken, gebruik anders de nieuwe versie.",
"migration_napshot_gone": "Voor een onduidelijke reden mist de momentopname, dus sommige dingen kunnen anders uitzien dan je gewend bent.",
"migration_snapshot_ok": "Voor de zekerheid is een momentopname van het thema geladen. Je kunt proberen om de thema gegevens te laden.",
"fe_downgraded": "PleromaFE's versie is terug gerold.",
"fe_upgraded": "De thema-engine van PleromaFE is bijgewerkt na de versie update.",
"snapshot_missing": "Het bestand bevat geen thema momentopname, dus het thema kan anders uitzien dan je oorspronkelijk bedacht had.",
"snapshot_present": "Thema momentopname is geladen, alle waarden zijn overschreven. Je kunt in plaats daarvan ook de daadwerkelijke data van het thema laden."
},
"load_theme": "Thema laden"
},
"common": {
"color": "Kleur",
"opacity": "Transparantie",
"contrast": {
"hint": "Contrast ratio is {ratio}, {level} {context}",
"hint": "Contrast verhouding is {ratio}, {level} {context}",
"level": {
"aa": "voldoet aan de richtlijn van niveau AA (minimum)",
"aaa": "voldoet aan de richtlijn van niveau AAA (aangeraden)",
@ -233,8 +290,8 @@
}
},
"common_colors": {
"_tab_label": "Gemeenschappelijk",
"main": "Gemeenschappelijke kleuren",
"_tab_label": "Algemeen",
"main": "Algemene kleuren",
"foreground_hint": "Zie \"Geavanceerd\" tab voor meer gedetailleerde controle",
"rgbo": "Iconen, accenten, badges"
},
@ -244,58 +301,73 @@
"alert_error": "Fout",
"badge": "Badge achtergrond",
"badge_notification": "Meldingen",
"panel_header": "Paneel hoofding",
"top_bar": "Top bar",
"panel_header": "Paneel koptekst",
"top_bar": "Top balk",
"borders": "Randen",
"buttons": "Knoppen",
"inputs": "Invoervelden",
"faint_text": "Vervaagde tekst"
"faint_text": "Vervaagde tekst",
"tabs": "Tabbladen",
"toggled": "Geschakeld",
"disabled": "Uitgeschakeld",
"selectedMenu": "Geselecteerd menu item",
"selectedPost": "Geselecteerd bericht",
"pressed": "Ingedrukt",
"highlight": "Gemarkeerde elementen",
"icons": "Iconen",
"poll": "Poll grafiek",
"underlay": "Onderlaag",
"popover": "Tooltips, menu's, popovers",
"post": "Berichten / Gebruiker bios",
"alert_neutral": "Neutraal",
"alert_warning": "Waarschuwing"
},
"radii": {
"_tab_label": "Rondheid"
},
"shadows": {
"_tab_label": "Schaduw en belichting",
"component": "Component",
"component": "Onderdeel",
"override": "Overschrijven",
"shadow_id": "Schaduw #{value}",
"blur": "Vervagen",
"spread": "Spreid",
"spread": "Spreiding",
"inset": "Inzet",
"hint": "Voor schaduw kan je ook --variable gebruiken als een kleur waarde om CSS3 variabelen te gebruiken. Houd er rekening mee dat het instellen van opaciteit in dit geval niet werkt.",
"filter_hint": {
"always_drop_shadow": "Waarschuwing, deze schaduw gebruikt altijd {0} als de browser dit ondersteund.",
"drop_shadow_syntax": "{0} ondersteund niet de {1} parameter en {2} sleutelwoord.",
"avatar_inset": "Houd er rekening mee dat het combineren van zowel inzet and niet-inzet schaduwen op transparante avatars onverwachte resultaten kan opleveren.",
"avatar_inset": "Houdt er rekening mee dat het combineren van zowel inzet and niet-inzet schaduwen op transparante avatars onverwachte resultaten kan opleveren.",
"spread_zero": "Schaduw met spreiding > 0 worden weergegeven alsof ze op nul staan",
"inset_classic": "Inzet schaduw zal {0} gebruiken"
},
"components": {
"panel": "Paneel",
"panelHeader": "Paneel hoofding",
"topBar": "Top bar",
"avatar": "Gebruiker avatar (in profiel weergave)",
"avatarStatus": "Gebruiker avatar (in post weergave)",
"popup": "Popups en gereedschapstips",
"panelHeader": "Paneel koptekst",
"topBar": "Top balk",
"avatar": "Gebruikers avatar (in profiel weergave)",
"avatarStatus": "Gebruikers avatar (in bericht weergave)",
"popup": "Popups en tooltips",
"button": "Knop",
"buttonHover": "Knop (zweven)",
"buttonPressed": "Knop (ingedrukt)",
"buttonPressedHover": "Knop (ingedrukt+zweven)",
"input": "Invoerveld"
}
},
"hintV3": "Voor schaduwen kun je ook de {0} notatie gebruiken om de andere kleur invoer te gebruiken."
},
"fonts": {
"_tab_label": "Lettertypes",
"help": "Selecteer het lettertype om te gebruiken voor elementen van de UI.Voor \"aangepast\" moet je de exacte naam van het lettertype invoeren zoals die in het systeem wordt weergegeven.",
"help": "Selecteer het lettertype om te gebruiken voor elementen van de UI. Voor \"aangepast\" dien je de exacte naam van het lettertype in te voeren zoals die in het systeem wordt weergegeven.",
"components": {
"interface": "Interface",
"input": "Invoervelden",
"post": "Post tekst",
"postCode": "Monospaced tekst in een post (rich text)"
"post": "Bericht tekst",
"postCode": "Monospaced tekst in een bericht (rich text)"
},
"family": "Naam lettertype",
"family": "Lettertype naam",
"size": "Grootte (in px)",
"weight": "Gewicht (vetheid)",
"weight": "Gewicht (dikgedruktheid)",
"custom": "Aangepast"
},
"preview": {
@ -305,31 +377,119 @@
"button": "Knop",
"text": "Nog een boel andere {0} en {1}",
"mono": "inhoud",
"input": "Tijd voor een pauze!",
"input": "Zojuist geland in L.A.",
"faint_link": "handige gebruikershandleiding",
"fine_print": "Lees onze {0} om niets nuttig te leren!",
"header_faint": "Alles komt goed",
"checkbox": "Ik heb de gebruikersvoorwaarden eens van ver bekeken",
"link": "een link"
"checkbox": "Ik heb de gebruikersvoorwaarden gelezen",
"link": "een leuke kleine link"
}
},
"notification_setting_follows": "Gebruikers die je volgt",
"notification_setting_non_follows": "Gebruikers die je niet volgt",
"notification_setting_followers": "Gebruikers die je volgen",
"notification_setting_privacy": "Privacy",
"notification_setting_privacy_option": "Verberg de afzender en inhoud van push meldingen",
"notification_mutes": "Om niet langer meldingen te ontvangen van een specifieke gebruiker, kun je deze negeren.",
"app_name": "App naam",
"security": "Beveiliging",
"enter_current_password_to_confirm": "Voer je huidige wachtwoord in om je identiteit te bevestigen",
"mfa": {
"otp": "OTP",
"setup_otp": "OTP instellen",
"wait_pre_setup_otp": "OTP voorinstellen",
"confirm_and_enable": "Bevestig en schakel OTP in",
"title": "Twee-factor Authenticatie",
"generate_new_recovery_codes": "Genereer nieuwe herstelcodes",
"recovery_codes": "Herstelcodes.",
"waiting_a_recovery_codes": "Backup codes ontvangen...",
"authentication_methods": "Authenticatie methodes",
"scan": {
"title": "Scannen",
"desc": "Scan de QR code of voer een sleutel in met je twee-factor applicatie:",
"secret_code": "Sleutel"
},
"verify": {
"desc": "Voer de code van je twee-factor applicatie in om twee-factor authenticatie in te schakelen:"
},
"warning_of_generate_new_codes": "Wanneer je nieuwe herstelcodes genereert, zullen je oude code niet langer werken.",
"recovery_codes_warning": "Schrijf de codes op of sla ze op een veilige locatie op - anders kun je ze niet meer inzien. Als je toegang tot je 2FA app en herstelcodes verliest, zal je buitengesloten zijn uit je account."
},
"allow_following_move": "Automatisch volgen toestaan wanneer een gevolgd account migreert",
"block_export": "Blokkades exporteren",
"block_import": "Blokkades importeren",
"blocks_imported": "Blokkades geïmporteerd! Het kan even duren voordat deze verwerkt zijn.",
"blocks_tab": "Blokkades",
"change_email": "Email wijzigen",
"change_email_error": "Er is een fout opgetreden tijdens het wijzigen van je email.",
"changed_email": "Email succesvol gewijzigd!",
"domain_mutes": "Domeinen",
"avatar_size_instruction": "De aangeraden minimale afmeting voor avatar afbeeldingen is 150x150 pixels.",
"pad_emoji": "Vul emoji aan met spaties wanneer deze met de picker ingevoegd worden",
"emoji_reactions_on_timeline": "Toon emoji reacties op de tijdlijn",
"accent": "Accent",
"hide_muted_posts": "Verberg berichten van genegeerde gebruikers",
"max_thumbnails": "Maximaal aantal miniaturen per bericht",
"use_one_click_nsfw": "Open gevoelige bijlagen met slechts één klik",
"hide_filtered_statuses": "Gefilterde statussen verbergen",
"import_blocks_from_a_csv_file": "Importeer blokkades van een csv bestand",
"mutes_tab": "Negeringen",
"play_videos_in_modal": "Speel video's af in een popup frame",
"new_email": "Nieuwe Email",
"notification_visibility_emoji_reactions": "Reacties",
"no_blocks": "Geen blokkades",
"no_mutes": "Geen negeringen",
"hide_followers_description": "Niet tonen wie mij volgt",
"hide_followers_count_description": "Niet mijn volgers aantal tonen",
"hide_follows_count_description": "Niet mijn gevolgde aantal tonen",
"show_admin_badge": "Beheerders badge tonen in mijn profiel",
"autohide_floating_post_button": "Nieuw Bericht knop automatisch verbergen (mobiel)",
"search_user_to_block": "Zoek wie je wilt blokkeren",
"search_user_to_mute": "Zoek wie je wilt negeren",
"minimal_scopes_mode": "Bericht bereik-opties minimaliseren",
"post_status_content_type": "Bericht status content type",
"user_mutes": "Gebruikers",
"useStreamingApi": "Berichten en meldingen in real-time ontvangen",
"useStreamingApiWarning": "(Afgeraden, experimenteel, kan berichten overslaan)",
"type_domains_to_mute": "Voer domeinen in om te negeren",
"upload_a_photo": "Upload een foto",
"fun": "Plezier",
"greentext": "Meme pijlen",
"notification_setting": "Ontvang meldingen van:",
"block_export_button": "Exporteer je geblokkeerde gebruikers naar een csv bestand",
"block_import_error": "Fout bij importeren blokkades",
"discoverable": "Sta toe dat dit account ontdekt kan worden in zoekresultaten en andere diensten",
"use_contain_fit": "Snij bijlage in miniaturen niet bij",
"notification_visibility_moves": "Gebruiker Migraties",
"hide_follows_description": "Niet tonen wie ik volg",
"show_moderator_badge": "Moderators badge tonen in mijn profiel",
"notification_setting_filters": "Filters",
"notification_setting_non_followers": "Gebruikers die je niet volgen",
"notification_blocks": "Door een gebruiker te blokkeren, ontvang je geen meldingen meer van de gebruiker en wordt je abonnement op de gebruiker opgeheven.",
"version": {
"frontend_version": "Frontend Versie",
"backend_version": "Backend Versie",
"title": "Versie"
}
},
"timeline": {
"collapse": "Inklappen",
"conversation": "Conversatie",
"error_fetching": "Fout bij ophalen van updates",
"load_older": "Laad oudere Statussen",
"no_retweet_hint": "Post is gemarkeerd als enkel volgers of direct en kan niet worden herhaald",
"load_older": "Oudere statussen laden",
"no_retweet_hint": "Bericht is gemarkeerd als enkel volgers of direct en kan niet worden herhaald",
"repeated": "herhaalde",
"show_new": "Toon nieuwe",
"up_to_date": "Up-to-date"
"show_new": "Nieuwe tonen",
"up_to_date": "Up-to-date",
"no_statuses": "Geen statussen",
"no_more_statuses": "Geen statussen meer"
},
"user_card": {
"approve": "Goedkeuren",
"block": "Blokkeren",
"blocked": "Geblokkeerd!",
"deny": "Ontzeggen",
"favorites": "Vind-ik-leuks",
"deny": "Weigeren",
"favorites": "Favorieten",
"follow": "Volgen",
"follow_sent": "Aanvraag verzonden!",
"follow_progress": "Aanvragen…",
@ -340,31 +500,69 @@
"following": "Aan het volgen!",
"follows_you": "Volgt jou!",
"its_you": "'t is jij!",
"mute": "Dempen",
"muted": "Gedempt",
"mute": "Negeren",
"muted": "Genegeerd",
"per_day": "per dag",
"remote_follow": "Volg vanop afstand",
"statuses": "Statussen"
"statuses": "Statussen",
"admin_menu": {
"delete_user_confirmation": "Weet je het heel zeker? Deze uitvoering kan niet ongedaan worden gemaakt.",
"delete_user": "Gebruiker verwijderen",
"quarantine": "Federeren van gebruikers berichten verbieden",
"disable_any_subscription": "Volgen van gebruiker in zijn geheel verbieden",
"disable_remote_subscription": "Volgen van gebruiker vanaf andere instanties verbieden",
"sandbox": "Berichten forceren om alleen voor volgers zichtbaar te zijn",
"force_unlisted": "Berichten forceren om niet publiekelijk getoond te worden",
"strip_media": "Media van berichten verwijderen",
"force_nsfw": "Alle berichten als gevoelig markeren",
"delete_account": "Account verwijderen",
"deactivate_account": "Account deactiveren",
"activate_account": "Account activeren",
"revoke_moderator": "Moderatorsrechten intrekken",
"grant_moderator": "Moderatorsrechten toekennen",
"revoke_admin": "Beheerdersrechten intrekken",
"grant_admin": "Beheerdersrechten toekennen",
"moderation": "Moderatie"
},
"show_repeats": "Herhalingen tonen",
"hide_repeats": "Herhalingen verbergen",
"mute_progress": "Negeren...",
"unmute_progress": "Negering opheffen...",
"unmute": "Negering opheffen",
"block_progress": "Blokkeren...",
"unblock_progress": "Blokkade opheffen...",
"unblock": "Blokkade opheffen",
"unsubscribe": "Abonnement opzeggen",
"subscribe": "Abonneren",
"report": "Aangeven",
"mention": "Vermelding",
"media": "Media",
"hidden": "Verborgen"
},
"user_profile": {
"timeline_title": "Gebruikers Tijdlijn"
"timeline_title": "Gebruikers Tijdlijn",
"profile_loading_error": "Sorry, er is een fout opgetreden bij het laden van dit profiel.",
"profile_does_not_exist": "Sorry, dit profiel bestaat niet."
},
"who_to_follow": {
"more": "Meer",
"who_to_follow": "Wie te volgen"
},
"tool_tip": {
"media_upload": "Upload Media",
"repeat": "Herhaal",
"reply": "Antwoord",
"favorite": "Vind-ik-leuk",
"user_settings": "Gebruikers Instellingen"
"media_upload": "Media Uploaden",
"repeat": "Herhalen",
"reply": "Beantwoorden",
"favorite": "Favoriet maken",
"user_settings": "Gebruikers Instellingen",
"reject_follow_request": "Volg-verzoek afwijzen",
"accept_follow_request": "Volg-aanvraag accepteren",
"add_reaction": "Reactie toevoegen"
},
"upload": {
"error": {
"base": "Upload gefaald.",
"base": "Upload mislukt.",
"file_too_big": "Bestand is te groot [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "Probeer later opnieuw"
"default": "Probeer het later opnieuw"
},
"file_size_units": {
"B": "B",
@ -373,5 +571,177 @@
"GiB": "GiB",
"TiB": "TiB"
}
},
"about": {
"mrf": {
"federation": "Federatie",
"keyword": {
"reject": "Afwijzen",
"replace": "Vervangen",
"is_replaced_by": "→",
"keyword_policies": "Zoekwoord Beleid",
"ftl_removal": "Verwijdering van \"Het Geheel Bekende Netwerk\" Tijdlijn"
},
"mrf_policies_desc": "MRF regels beïnvloeden het federatie gedrag van de instantie. De volgende regels zijn ingeschakeld:",
"mrf_policies": "Ingeschakelde MRF Regels",
"simple": {
"simple_policies": "Instantie-specifieke Regels",
"accept": "Accepteren",
"accept_desc": "Deze instantie accepteert alleen berichten van de volgende instanties:",
"reject": "Afwijzen",
"reject_desc": "Deze instantie zal geen berichten accepteren van de volgende instanties:",
"quarantine": "Quarantaine",
"quarantine_desc": "Deze instantie zal alleen publieke berichten sturen naar de volgende instanties:",
"ftl_removal_desc": "Deze instantie verwijdert de volgende instanties van \"Het Geheel Bekende Netwerk\" tijdlijn:",
"media_removal_desc": "Deze instantie verwijdert media van berichten van de volgende instanties:",
"media_nsfw_desc": "Deze instantie stelt media in als gevoelig in berichten van de volgende instanties:",
"ftl_removal": "Verwijderen van \"Het Geheel Bekende Netwerk\" Tijdlijn",
"media_removal": "Media Verwijdering",
"media_nsfw": "Forceer Media als Gevoelig"
}
},
"staff": "Personeel"
},
"domain_mute_card": {
"mute": "Negeren",
"mute_progress": "Negeren...",
"unmute": "Negering opheffen",
"unmute_progress": "Negering wordt opgeheven..."
},
"exporter": {
"export": "Exporteren",
"processing": "Verwerken, er wordt zo gevraagd om je bestand te downloaden"
},
"image_cropper": {
"save": "Opslaan",
"save_without_cropping": "Opslaan zonder bijsnijden",
"cancel": "Annuleren",
"crop_picture": "Afbeelding bijsnijden"
},
"importer": {
"submit": "Verzenden",
"success": "Succesvol geïmporteerd.",
"error": "Er is een fout opgetreden bij het importeren van dit bestand."
},
"media_modal": {
"previous": "Vorige",
"next": "Volgende"
},
"polls": {
"add_poll": "Poll Toevoegen",
"add_option": "Optie Toevoegen",
"option": "Optie",
"votes": "stemmen",
"vote": "Stem",
"single_choice": "Enkele keuze",
"multiple_choices": "Meerkeuze",
"expiry": "Poll leeftijd",
"expires_in": "Poll eindigt in {0}",
"expired": "Poll is {0} geleden beëindigd",
"not_enough_options": "Te weinig opties in poll",
"type": "Poll type"
},
"emoji": {
"emoji": "Emoji",
"keep_open": "Picker openhouden",
"search_emoji": "Zoek voor een emoji",
"add_emoji": "Emoji invoegen",
"unicode": "Unicode emoji",
"load_all": "Alle {emojiAmount} emoji worden geladen",
"stickers": "Stickers",
"load_all_hint": "Eerste {saneAmount} emoji geladen, alle emoji tegelijk laden kan problemen veroorzaken met prestaties.",
"custom": "Gepersonaliseerde emoji"
},
"interactions": {
"favs_repeats": "Herhalingen en Favorieten",
"follows": "Nieuwe volgingen",
"moves": "Gebruiker migreert",
"load_older": "Oudere interacties laden"
},
"remote_user_resolver": {
"searching_for": "Zoeken naar",
"error": "Niet gevonden.",
"remote_user_resolver": "Externe gebruikers zoeker"
},
"selectable_list": {
"select_all": "Alles selecteren"
},
"password_reset": {
"password_reset_required_but_mailer_is_disabled": "Je dient je wachtwoord opnieuw in te stellen, maar wachtwoord reset is uitgeschakeld. Neem contact op met de beheerder van deze instantie.",
"password_reset_required": "Je dient je wachtwoord opnieuw in te stellen om in te kunnen loggen.",
"password_reset_disabled": "Wachtwoord reset is uitgeschakeld. Neem contact op met de beheerder van deze instantie.",
"too_many_requests": "Je hebt het maximaal aantal pogingen bereikt, probeer het later opnieuw.",
"not_found": "We kunnen die email of gebruikersnaam niet vinden.",
"return_home": "Terugkeren naar de home pagina",
"check_email": "Controleer je email inbox voor een link om je wachtwoord opnieuw in te stellen.",
"placeholder": "Je email of gebruikersnaam",
"instruction": "Voer je email adres of gebruikersnaam in. We sturen je een link om je wachtwoord opnieuw in te stellen.",
"password_reset": "Wachtwoord opnieuw instellen",
"forgot_password": "Wachtwoord vergeten?"
},
"search": {
"no_results": "Geen resultaten",
"people_talking": "{count} personen aan het praten",
"person_talking": "{count} persoon aan het praten",
"hashtags": "Hashtags",
"people": "Personen"
},
"user_reporting": {
"generic_error": "Er is een fout opgetreden tijdens het verwerken van je verzoek.",
"submit": "Verzenden",
"forward_to": "Doorsturen naar {0}",
"forward_description": "Dit account hoort bij een andere server. Wil je een kopie van het rapport ook daarheen sturen?",
"additional_comments": "Aanvullende opmerkingen",
"add_comment_description": "Het rapport zal naar de moderators van de instantie worden verstuurd. Je kunt hieronder uitleg bijvoegen waarom je dit account wilt aangeven:",
"title": "{0} aangeven"
},
"status": {
"copy_link": "Link naar status kopiëren",
"status_unavailable": "Status niet beschikbaar",
"unmute_conversation": "Conversatie niet meer negeren",
"mute_conversation": "Conversatie negeren",
"replies_list": "Antwoorden:",
"reply_to": "Antwoorden aan",
"delete_confirm": "Wil je echt deze status verwijderen?",
"pin": "Aan profiel vastmaken",
"pinned": "Vastgezet",
"unpin": "Van profiel losmaken",
"delete": "Status verwijderen",
"repeats": "Herhalingen",
"favorites": "Favorieten"
},
"time": {
"years_short": "{0}j",
"year_short": "{0}j",
"years": "{0} jaren",
"year": "{0} jaar",
"weeks_short": "{0}w",
"week_short": "{0}w",
"weeks": "{0} weken",
"week": "{0} week",
"seconds_short": "{0}s",
"second_short": "{0}s",
"seconds": "{0} seconden",
"second": "{0} seconde",
"now_short": "nu",
"now": "zojuist",
"months_short": "{0}ma",
"month_short": "{0}ma",
"months": "{0} maanden",
"month": "{0} maand",
"minutes_short": "{0}min",
"minute_short": "{0}min",
"minutes": "{0} minuten",
"minute": "{0} minuut",
"in_past": "{0} geleden",
"in_future": "over {0}",
"hours_short": "{0}u",
"hour_short": "{0}u",
"hours": "{0} uren",
"hour": "{0} uur",
"days_short": "{0}d",
"day_short": "{0}d",
"days": "{0} dagen",
"day": "{0} dag"
}
}

View file

@ -20,14 +20,14 @@
"quarantine": "Kwarantanna",
"quarantine_desc": "Ta instancja wysyła tylko publiczne posty do wymienionych instancji:",
"ftl_removal": "Usunięcie z \"Całej znanej sieci\"",
"ftl_removal_desc": "Ta instancja usuwa te instancje z \"Całej znanej sieci\"",
"ftl_removal_desc": "Ta instancja usuwa wymienionych instancje z \"Całej znanej sieci\":",
"media_removal": "Usuwanie multimediów",
"media_removal_desc": "Ta instancja usuwa multimedia z postów od wymienionych instancji:",
"media_nsfw": "Multimedia ustawione jako wrażliwe",
"media_nsfw_desc": "Ta instancja wymusza, by multimedia z wymienionych instancji były ustawione jako wrażliwe:"
}
},
"staff": "Obsługa"
"staff": "Administracja"
},
"chat": {
"title": "Czat"
@ -40,7 +40,7 @@
},
"exporter": {
"export": "Eksportuj",
"processing": "Przetwarzam, za chwilę zostaniesz zapytany o ściągnięcie pliku"
"processing": "Przetwarzam, za chwilę zostaniesz zapytany(-na) o ściągnięcie pliku"
},
"features_panel": {
"chat": "Czat",
@ -78,7 +78,7 @@
},
"importer": {
"submit": "Wyślij",
"success": "Zaimportowano pomyślnie",
"success": "Zaimportowano pomyślnie.",
"error": "Wystąpił błąd podczas importowania pliku."
},
"login": {
@ -130,7 +130,8 @@
"repeated_you": "powtórzył(-a) twój status",
"no_more_notifications": "Nie masz więcej powiadomień",
"migrated_to": "wyemigrował do",
"reacted_with": "zareagował z {0}"
"reacted_with": "zareagował z {0}",
"follow_request": "chce ciebie obserwować"
},
"polls": {
"add_poll": "Dodaj ankietę",
@ -231,10 +232,10 @@
"confirm_and_enable": "Potwierdź i włącz OTP",
"title": "Weryfikacja dwuetapowa",
"generate_new_recovery_codes": "Wygeneruj nowe kody zapasowe",
"warning_of_generate_new_codes" : "Po tym gdy generujesz nowe kody zapasowe, stare przestaną działać.",
"warning_of_generate_new_codes": "Po tym gdy wygenerujesz nowe kody zapasowe, stare przestaną działać.",
"recovery_codes": "Kody zapasowe.",
"waiting_a_recovery_codes": "Otrzymuję kody zapasowe...",
"recovery_codes_warning" : "Spisz kody na kartce papieru, albo zapisz je w bezpiecznym miejscu - inaczej nie zobaczysz ich już nigdy. Jeśli stracisz dostęp do twojej aplikacji 2FA i kodów zapasowych, nie będziesz miał dostępu do swojego konta.",
"recovery_codes_warning": "Spisz kody na kartce papieru, albo zapisz je w bezpiecznym miejscu - inaczej nie zobaczysz ich już nigdy. Jeśli stracisz dostęp do twojej aplikacji 2FA i kodów zapasowych, nie będziesz miał(-a) dostępu do swojego konta.",
"authentication_methods": "Metody weryfikacji",
"scan": {
"title": "Skanuj",
@ -280,10 +281,10 @@
"data_import_export_tab": "Import/eksport danych",
"default_vis": "Domyślny zakres widoczności",
"delete_account": "Usuń konto",
"delete_account_description": "Trwale usuń konto i wszystkie posty.",
"delete_account_description": "Trwale usuń dane i zdezaktywuj konto.",
"delete_account_error": "Wystąpił problem z usuwaniem twojego konta. Jeżeli problem powtarza się, poinformuj administratora swojej instancji.",
"delete_account_instructions": "Wprowadź swoje hasło w poniższe pole aby potwierdzić usunięcie konta.",
"discoverable": "Zezwól na odkrywanie tego konta w wynikach wyszukiwania i innych usługa.",
"discoverable": "Zezwól na odkrywanie tego konta w wynikach wyszukiwania i innych usługach",
"domain_mutes": "Domeny",
"avatar_size_instruction": "Zalecany minimalny rozmiar awatarów to 150x150 pikseli.",
"pad_emoji": "Dodaj odstęp z obu stron emoji podczas dodawania selektorem",
@ -314,14 +315,14 @@
"import_theme": "Załaduj motyw",
"inputRadius": "Pola tekstowe",
"checkboxRadius": "Pola wyboru",
"instance_default": "(domyślny: {value})",
"instance_default_simple": "(domyślny)",
"instance_default": "(domyślnie: {value})",
"instance_default_simple": "(domyślne)",
"interface": "Interfejs",
"interfaceLanguage": "Język interfejsu",
"invalid_theme_imported": "Wybrany plik nie jest obsługiwanym motywem Pleromy. Nie dokonano zmian w twoim motywie.",
"limited_availability": "Niedostępne w twojej przeglądarce",
"links": "Łącza",
"lock_account_description": "Ogranicz swoje konto dla zatwierdzonych obserwowanych",
"lock_account_description": "Spraw, by konto mogli wyświetlać tylko zatwierdzeni obserwujący",
"loop_video": "Zapętlaj filmy",
"loop_video_silent_only": "Zapętlaj tylko filmy bez dźwięku (np. mastodonowe „gify”)",
"mutes_tab": "Wyciszenia",
@ -385,7 +386,7 @@
"post_status_content_type": "Post status content type",
"stop_gifs": "Odtwarzaj GIFy po najechaniu kursorem",
"streaming": "Włącz automatycznie strumieniowanie nowych postów gdy jesteś na początku strony",
"user_mutes": "Users",
"user_mutes": "Użytkownicy",
"useStreamingApi": "Otrzymuj posty i powiadomienia w czasie rzeczywistym",
"useStreamingApiWarning": "(Niezalecane, eksperymentalne, pomija posty)",
"text": "Tekst",
@ -409,7 +410,7 @@
"notification_setting_non_follows": "Ludzi których nie obserwujesz",
"notification_setting_followers": "Ludzi którzy obserwują ciebie",
"notification_setting_non_followers": "Ludzi którzy nie obserwują ciebie",
"notification_mutes": "By przestać otrzymywać powiadomienia od jednego użytkownika, wycisz go",
"notification_mutes": "By przestać otrzymywać powiadomienia od jednego użytkownika, wycisz go.",
"notification_blocks": "Blokowanie uzytkownika zatrzymuje wszystkie powiadomienia i odsubskrybowuje go.",
"enable_web_push_notifications": "Włącz powiadomienia push",
"style": {
@ -419,7 +420,7 @@
"keep_opacity": "Zachowaj widoczność",
"keep_roundness": "Zachowaj zaokrąglenie",
"keep_fonts": "Zachowaj czcionki",
"save_load_hint": "Opcje „zachowaj” pozwalają na pozostanie przy obecnych opcjach po wybraniu lub załadowaniu motywu, jak i przechowywanie ich podczas eksportowania motywu. Jeżeli wszystkie są odznaczone, eksportowanie motywu spowoduje zapisanie wszystkiego.",
"save_load_hint": "Opcje „zachowaj” pozwalają na pozostanie przy obecnych opcjach po wybraniu lub załadowaniu motywu, jak i przechowywanie ich podczas eksportowania motywu. Jeżeli wszystkie opcje są odznaczone, eksportowanie motywu spowoduje zapisanie wszystkiego.",
"reset": "Wyzeruj",
"clear_all": "Wyczyść wszystko",
"clear_opacity": "Wyczyść widoczność",
@ -428,17 +429,17 @@
"use_snapshot": "Stara wersja",
"use_source": "Nowa wersja",
"help": {
"upgraded_from_v2": "PleromaFE zostało zaaktualizowane, motyw może wyglądać nieco inaczej niż sobie zapamiętałeś.",
"v2_imported": "Plik który zaimportowałeś został stworzony dla starszego FE. Próbujemy zwiększyć kompatybiliność, lecz wciąż mogą występować rozbieżności.",
"future_version_imported": "Plik który zaimportowałeś został stworzony w nowszej wersji FE.",
"older_version_imported": "Plik który zaimportowałeś został stworzony w starszej wersji FE.",
"snapshot_present": "Migawka motywu jest załadowana, więc wszystkie wartości zostały nadpisane. Zamiast tego, możesz załadować właściwe dane motywu",
"upgraded_from_v2": "PleromaFE zostało zaaktualizowane, motyw może wyglądać nieco inaczej niż zapamiętałeś(-aś).",
"v2_imported": "Plik który zaimportowałeś(-aś) został stworzony dla starszego FE. Próbujemy zwiększyć kompatybilność, lecz wciąż mogą występować rozbieżności.",
"future_version_imported": "Plik który zaimportowałeś(-aś) został stworzony w nowszej wersji FE.",
"older_version_imported": "Plik który zaimportowałeś(-aś) został stworzony w starszej wersji FE.",
"snapshot_present": "Migawka motywu jest załadowana, więc wszystkie wartości zostały nadpisane. Zamiast tego możesz załadować właściwe dane motywu.",
"snapshot_missing": "Nie znaleziono migawki motywu w pliku, więc motyw może wyglądać inaczej niż pierwotnie zaplanowano.",
"fe_upgraded": "Silnik motywów PleromaFE został zaaktualizowany.",
"fe_downgraded": "Wersja PleromaFE została cofnięta.",
"migration_snapshot_ok": "Żeby być bezpiecznym, migawka motywu została załadowana. Możesz spróbować załadować dane motywu.",
"migration_napshot_gone": "Z jakiegoś powodu migawka zniknęła, niektóre rzeczy mogą wyglądać inaczej niż sobie zapamiętałeś.",
"snapshot_source_mismatch": "Konflikt wersji: najprawdopodobniej FE zostało cofnięte do poprzedniej wersji i zaaktualizowane ponownie, jeśli zmieniłeś motyw używając starszej wersji FE, najprawdopodobniej chcesz używać starszej wersji, w przeciwnym razie użyj nowej wersji."
"migration_napshot_gone": "Z jakiegoś powodu migawka zniknęła, niektóre rzeczy mogą wyglądać inaczej niż zapamiętałeś(-aś).",
"snapshot_source_mismatch": "Konflikt wersji: najprawdopodobniej FE zostało cofnięte do poprzedniej wersji i zaktualizowane ponownie, jeśli zmieniłeś(-aś) motyw używając starszej wersji FE, najprawdopodobniej chcesz używać starszej wersji, w przeciwnym razie użyj nowej wersji."
}
},
"common": {
@ -548,7 +549,7 @@
"faint_link": "pomocny podręcznik",
"fine_print": "Przeczytaj nasz {0}, aby nie nauczyć się niczego przydatnego!",
"header_faint": "W porządku",
"checkbox": "Przeleciałem przez zasady użytkowania",
"checkbox": "Przeleciałem(-am) przez zasady użytkowania",
"link": "i fajny mały odnośnik"
}
},
@ -556,7 +557,10 @@
"title": "Wersja",
"backend_version": "Wersja back-endu",
"frontend_version": "Wersja front-endu"
}
},
"notification_setting_privacy": "Prywatność",
"notification_setting_filters": "Filtry",
"notification_setting_privacy_option": "Ukryj nadawcę i zawartość powiadomień push"
},
"time": {
"day": "{0} dzień",
@ -615,7 +619,9 @@
"reply_to": "Odpowiedź dla",
"replies_list": "Odpowiedzi:",
"mute_conversation": "Wycisz konwersację",
"unmute_conversation": "Odcisz konwersację"
"unmute_conversation": "Odcisz konwersację",
"status_unavailable": "Status niedostępny",
"copy_link": "Kopiuj link do statusu"
},
"user_card": {
"approve": "Przyjmij",
@ -640,7 +646,7 @@
"muted": "Wyciszony(-a)",
"per_day": "dziennie",
"remote_follow": "Zdalna obserwacja",
"report": "Raportuj",
"report": "Zgłoś",
"statuses": "Statusy",
"subscribe": "Subskrybuj",
"unsubscribe": "Odsubskrybuj",
@ -669,7 +675,7 @@
"disable_any_subscription": "Zakaż całkowicie obserwowania użytkownika",
"quarantine": "Zakaż federowania postów od tego użytkownika",
"delete_user": "Usuń użytkownika",
"delete_user_confirmation": "Czy jesteś absolutnie pewny? Ta operacja nie może być cofnięta."
"delete_user_confirmation": "Czy jesteś absolutnie pewny(-a)? Ta operacja nie może być cofnięta."
}
},
"user_profile": {
@ -679,9 +685,9 @@
},
"user_reporting": {
"title": "Raportowanie {0}",
"add_comment_description": "Raport zostanie wysłany do moderatorów instancji. Możesz dodać powód dlaczego raportujesz to konto poniżej:",
"add_comment_description": "Zgłoszenie zostanie wysłane do moderatorów instancji. Możesz dodać powód dlaczego zgłaszasz owe konto poniżej:",
"additional_comments": "Dodatkowe komentarze",
"forward_description": "To konto jest z innego serwera. Wysłać również tam kopię raportu?",
"forward_description": "To konto jest z innego serwera. Wysłać również tam kopię zgłoszenia?",
"forward_to": "Przekaż do {0}",
"submit": "Wyślij",
"generic_error": "Wystąpił błąd podczas przetwarzania twojej prośby."
@ -696,7 +702,9 @@
"reply": "Odpowiedz",
"favorite": "Dodaj do ulubionych",
"add_reaction": "Dodaj reakcję",
"user_settings": "Ustawienia użytkownika"
"user_settings": "Ustawienia użytkownika",
"accept_follow_request": "Akceptuj prośbę o możliwość obserwacji",
"reject_follow_request": "Odrzuć prośbę o możliwość obserwacji"
},
"upload": {
"error": {
@ -720,14 +728,14 @@
"no_results": "Brak wyników"
},
"password_reset": {
"forgot_password": "Zapomniałeś hasła?",
"forgot_password": "Zapomniałeś(-aś) hasła?",
"password_reset": "Reset hasła",
"instruction": "Wprowadź swój adres email lub nazwę użytkownika. Wyślemy ci link z którym możesz zresetować hasło.",
"placeholder": "Twój email lub nazwa użytkownika",
"check_email": "Sprawdź pocztę, aby uzyskać link do zresetowania hasła.",
"return_home": "Wróć do strony głównej",
"not_found": "Nie mogliśmy znaleźć tego emaila lub nazwy użytkownika.",
"too_many_requests": "Przekroczyłeś limit prób, spróbuj ponownie później.",
"too_many_requests": "Przekroczyłeś(-aś) limit prób, spróbuj ponownie później.",
"password_reset_disabled": "Resetowanie hasła jest wyłączone. Proszę skontaktuj się z administratorem tej instancji.",
"password_reset_required": "Musisz zresetować hasło, by się zalogować.",
"password_reset_required_but_mailer_is_disabled": "Musisz zresetować hasło, ale resetowanie hasła jest wyłączone. Proszę skontaktuj się z administratorem tej instancji."

View file

@ -13,7 +13,12 @@
"disable": "Оключить",
"enable": "Включить",
"confirm": "Подтвердить",
"verify": "Проверить"
"verify": "Проверить",
"more": "Больше",
"generic_error": "Произошла ошибка",
"optional": "не обязательно",
"show_less": "Показать меньше",
"show_more": "Показать больше"
},
"login": {
"login": "Войти",
@ -39,7 +44,8 @@
"public_tl": "Публичная лента",
"timeline": "Лента",
"twkn": "Федеративная лента",
"search": "Поиск"
"search": "Поиск",
"friend_requests": "Запросы на чтение"
},
"notifications": {
"broken_favorite": "Неизвестный статус, ищем...",
@ -48,7 +54,8 @@
"load_older": "Загрузить старые уведомления",
"notifications": "Уведомления",
"read": "Прочесть",
"repeated_you": "повторил(а) ваш статус"
"repeated_you": "повторил(а) ваш статус",
"follow_request": "хочет читать вас"
},
"interactions": {
"favs_repeats": "Повторы и фавориты",
@ -56,7 +63,7 @@
"load_older": "Загрузить старые взаимодействия"
},
"post_status": {
"account_not_locked_warning": "Ваш аккаунт не {0}. Кто угодно может зафоловить вас чтобы прочитать посты только для подписчиков",
"account_not_locked_warning": "Ваш аккаунт не {0}. Кто угодно может начать читать вас чтобы видеть посты только для подписчиков.",
"account_not_locked_warning_link": "залочен",
"attachments_sensitive": "Вложения содержат чувствительный контент",
"content_warning": "Тема (не обязательно)",
@ -129,10 +136,10 @@
"cRed": "Отменить",
"change_email": "Сменить email",
"change_email_error": "Произошла ошибка при попытке изменить email.",
"changed_email": "Email изменён успешно.",
"changed_email": "Email изменён успешно!",
"change_password": "Сменить пароль",
"change_password_error": "Произошла ошибка при попытке изменить пароль.",
"changed_password": "Пароль изменён успешно.",
"changed_password": "Пароль изменён успешно!",
"collapse_subject": "Сворачивать посты с темой",
"confirm_new_password": "Подтверждение нового пароля",
"current_avatar": "Текущий аватар",
@ -150,7 +157,7 @@
"follow_export_button": "Экспортировать читаемых в файл .csv",
"follow_export_processing": "Ведётся обработка, скоро вам будет предложено загрузить файл",
"follow_import": "Импортировать читаемых",
"follow_import_error": "Ошибка при импортировании читаемых.",
"follow_import_error": "Ошибка при импортировании читаемых",
"follows_imported": "Список читаемых импортирован. Обработка займёт некоторое время..",
"foreground": "Передний план",
"general": "Общие",
@ -204,7 +211,7 @@
"replies_in_timeline": "Ответы в ленте",
"reply_link_preview": "Включить предварительный просмотр ответа при наведении мыши",
"reply_visibility_all": "Показывать все ответы",
"reply_visibility_following": "Показывать только ответы мне и тех на кого я подписан",
"reply_visibility_following": "Показывать только ответы мне или тех на кого я подписан",
"reply_visibility_self": "Показывать только ответы мне",
"autohide_floating_post_button": "Автоматически скрывать кнопку постинга (в мобильной версии)",
"saving_err": "Не удалось сохранить настройки",
@ -224,7 +231,7 @@
"text": "Текст",
"theme": "Тема",
"theme_help": "Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.",
"theme_help_v2_1": "Вы так же можете перепоределить цвета определенных компонентов нажав соотв. галочку. Используйте кнопку \"Очистить всё\" чтобы снять все переопределения",
"theme_help_v2_1": "Вы так же можете перепоределить цвета определенных компонентов нажав соотв. галочку. Используйте кнопку \"Очистить всё\" чтобы снять все переопределения.",
"theme_help_v2_2": "Под некоторыми полями ввода это идикаторы контрастности, наведите на них мышью чтобы узнать больше. Приспользовании прозрачности контраст расчитывается для наихудшего варианта.",
"tooltipRadius": "Всплывающие подсказки/уведомления",
"user_settings": "Настройки пользователя",
@ -292,9 +299,9 @@
"inset": "Внутренняя",
"hint": "Для теней вы так же можете использовать --variable в качестве цвета чтобы использовать CSS3-переменные. В таком случае прозрачность работать не будет.",
"filter_hint": {
"always_drop_shadow": "Внимание, эта тень всегда использует {0} когда браузер поддерживает это",
"drop_shadow_syntax": "{0} не поддерживает параметр {1} и ключевое слово {2}",
"avatar_inset": "Одновременное использование внутренних и внешних теней на (прозрачных) аватарках может дать не те результаты что вы ожидаете",
"always_drop_shadow": "Внимание, эта тень всегда использует {0} когда браузер поддерживает это.",
"drop_shadow_syntax": "{0} не поддерживает параметр {1} и ключевое слово {2}.",
"avatar_inset": "Одновременное использование внутренних и внешних теней на (прозрачных) аватарках может дать не те результаты что вы ожидаете.",
"spread_zero": "Тени с разбросом > 0 будут выглядеть как если бы разброс установлен в 0",
"inset_classic": "Внутренние тени будут использовать {0}"
},
@ -340,7 +347,13 @@
"checkbox": "Я подтверждаю что не было ни единого разрыва",
"link": "ссылка"
}
}
},
"notification_setting_non_followers": "Не читающие вас",
"allow_following_move": "Разрешить автоматически читать новый аккаунт при перемещении на другой сервер",
"hide_user_stats": "Не показывать статистику пользователей (например количество читателей)",
"notification_setting_followers": "Читающие вас",
"notification_setting_follows": "Читаемые вами",
"notification_setting_non_follows": "Не читаемые вами"
},
"timeline": {
"collapse": "Свернуть",
@ -359,12 +372,12 @@
"follow": "Читать",
"follow_sent": "Запрос отправлен!",
"follow_progress": "Запрашиваем…",
"follow_again": "Запросить еще заново?",
"follow_again": "Запросить еще раз?",
"follow_unfollow": "Перестать читать",
"followees": "Читаемые",
"followers": "Читатели",
"following": "Читаю",
"follows_you": "Читает вас",
"following": "Читаю!",
"follows_you": "Читает вас!",
"mute": "Игнорировать",
"muted": "Игнорирую",
"per_day": "в день",
@ -382,9 +395,9 @@
"force_nsfw": "Отмечать посты пользователя как NSFW",
"strip_media": "Убирать вложения из постов пользователя",
"force_unlisted": "Не добавлять посты в публичные ленты",
"sandbox": "Посты доступны только для подписчиков",
"disable_remote_subscription": "Запретить подписываться с удаленных серверов",
"disable_any_subscription": "Запретить подписываться на пользователя",
"sandbox": "Принудить видимость постов только читателям",
"disable_remote_subscription": "Запретить читать с удаленных серверов",
"disable_any_subscription": "Запретить читать пользователя",
"quarantine": "Не федерировать посты пользователя",
"delete_user": "Удалить пользователя",
"delete_user_confirmation": "Вы уверены? Это действие нельзя отменить."
@ -410,5 +423,56 @@
"not_found": "Мы не смогли найти аккаунт с таким email-ом или именем пользователя.",
"too_many_requests": "Вы исчерпали допустимое количество попыток, попробуйте позже.",
"password_reset_disabled": "Сброс пароля отключен. Cвяжитесь с администратором вашего сервера."
},
"about": {
"mrf": {
"federation": "Федерация",
"simple": {
"accept_desc": "Данный сервер принимает сообщения только со следующих серверов:",
"ftl_removal_desc": "Данный сервер скрывает следующие сервера с федеративной ленты:",
"media_nsfw_desc": "Данный сервер принужденно помечает вложения со следущих серверов как NSFW:",
"simple_policies": "Правила для определенных серверов",
"accept": "Принимаемые сообщения",
"reject": "Отклоняемые сообщения",
"reject_desc": "Данный сервер не принимает сообщения со следующих серверов:",
"quarantine": "Зона карантина",
"quarantine_desc": "Данный сервер отправляет только публичные посты следующим серверам:",
"ftl_removal": "Скрытие с федеративной ленты",
"media_removal": "Удаление вложений",
"media_removal_desc": "Данный сервер удаляет вложения со следующих серверов:",
"media_nsfw": "Принужденно помеченно как NSFW"
},
"keyword": {
"ftl_removal": "Убрать из федеративной ленты",
"reject": "Отклонить",
"keyword_policies": "Действия на ключевые слова",
"replace": "Заменить",
"is_replaced_by": "→"
},
"mrf_policies": "Активные правила MRF (модуль переписывания сообщений)",
"mrf_policies_desc": "Правила MRF (модуль переписывания сообщений) влияют на федерацию данного сервера. Следующие правила активны:"
},
"staff": "Администрация"
},
"domain_mute_card": {
"mute": "Игнорировать",
"mute_progress": "В процессе...",
"unmute": "Прекратить игнорирование",
"unmute_progress": "В процессе..."
},
"exporter": {
"export": "Экспорт",
"processing": "Запрос в обработке, вам скоро будет предложено загрузить файл"
},
"features_panel": {
"chat": "Чат",
"media_proxy": "Прокси для внешних вложений",
"text_limit": "Лимит символов",
"title": "Особенности",
"gopher": "Gopher"
},
"tool_tip": {
"accept_follow_request": "Принять запрос на чтение",
"reject_follow_request": "Отклонить запрос на чтение"
}
}

View file

@ -25,13 +25,14 @@
"more": "更多",
"generic_error": "发生一个错误",
"optional": "可选项",
"show_more": "显示更多",
"show_less": "显示更少",
"show_more": "展开",
"show_less": "收起",
"cancel": "取消",
"disable": "禁用",
"enable": "启用",
"confirm": "确认",
"verify": "验证"
"verify": "验证",
"dismiss": "忽略"
},
"image_cropper": {
"crop_picture": "裁剪图片",
@ -68,8 +69,8 @@
},
"nav": {
"about": "关于",
"back": "Back",
"chat": "本地聊天",
"back": "后退",
"chat": "本站聊天",
"friend_requests": "关注请求",
"mentions": "提及",
"interactions": "互动",
@ -80,7 +81,8 @@
"user_search": "用户搜索",
"search": "搜索",
"who_to_follow": "推荐关注",
"preferences": "偏好设置"
"preferences": "偏好设置",
"administration": "管理员"
},
"notifications": {
"broken_favorite": "未知的状态,正在搜索中...",
@ -90,7 +92,10 @@
"notifications": "通知",
"read": "阅读!",
"repeated_you": "转发了你的状态",
"no_more_notifications": "没有更多的通知"
"no_more_notifications": "没有更多的通知",
"reacted_with": "和 {0} 互动过",
"migrated_to": "迁移到",
"follow_request": "想要关注你"
},
"polls": {
"add_poll": "增加问卷调查",
@ -112,7 +117,8 @@
"interactions": {
"favs_repeats": "转发和收藏",
"follows": "新的关注者",
"load_older": "加载更早的互动"
"load_older": "加载更早的互动",
"moves": "用户迁移"
},
"post_status": {
"new_status": "发布新状态",
@ -152,8 +158,8 @@
"captcha": "CAPTCHA",
"new_captcha": "点击图片获取新的验证码",
"username_placeholder": "例如lain",
"fullname_placeholder": "例如: Lain Iwakura",
"bio_placeholder": "例如:\n你好 我是 Lain.\n我是一个住在上海的宅男。你可能在某处见过我。",
"fullname_placeholder": "例如:岩仓玲音",
"bio_placeholder": "例如:\n你好我是玲音。\n我是一个住在日本郊区的动画少女。你可能在 Wired 见过我。",
"validations": {
"username_required": "不能留空",
"fullname_required": "不能留空",
@ -177,9 +183,9 @@
"confirm_and_enable": "确认并启用 OTP",
"title": "双因素验证",
"generate_new_recovery_codes": "生成新的恢复码",
"warning_of_generate_new_codes" : "当你生成新的恢复码时,你的恢复码就失效了。",
"warning_of_generate_new_codes": "当你生成新的恢复码时,你的恢复码就失效了。",
"recovery_codes": "恢复码。",
"waiting_a_recovery_codes": "接受备份码。。。",
"waiting_a_recovery_codes": "正在接收备份码……",
"recovery_codes_warning": "抄写这些号码,或者保存在安全的地方。这些号码不会再次显示。如果你无法访问你的 2FA app也丢失了你的恢复码你的账号就再也无法登录了。",
"authentication_methods": "身份验证方法",
"scan": {
@ -222,7 +228,7 @@
"data_import_export_tab": "数据导入/导出",
"default_vis": "默认可见范围",
"delete_account": "删除账户",
"delete_account_description": "永久删除你的帐号和所有消息。",
"delete_account_description": "永久删除你的帐号和所有数据。",
"delete_account_error": "删除账户时发生错误,如果一直删除不了,请联系实例管理员。",
"delete_account_instructions": "在下面输入你的密码来确认删除账户",
"avatar_size_instruction": "推荐的头像图片最小的尺寸是 150x150 像素。",
@ -263,7 +269,7 @@
"loop_video_silent_only": "只循环没有声音的视频例如Mastodon 里的“GIF”",
"mutes_tab": "隐藏",
"play_videos_in_modal": "在弹出框内播放视频",
"use_contain_fit": "生成缩略图时不要裁剪附件",
"use_contain_fit": "生成缩略图时不要裁剪附件",
"name": "名字",
"name_bio": "名字及简介",
"new_password": "新密码",
@ -348,7 +354,14 @@
"save_load_hint": "\"保留\" 选项在选择或加载主题时保留当前设置的选项,在导出主题时还会存储上述选项。当所有复选框未设置时,导出主题将保存所有内容。",
"reset": "重置",
"clear_all": "清除全部",
"clear_opacity": "清除透明度"
"clear_opacity": "清除透明度",
"load_theme": "加载主题",
"help": {
"upgraded_from_v2": "PleromaFE 已升级,主题会和你记忆中的不太一样。"
},
"use_source": "新版本",
"use_snapshot": "老版本",
"keep_as_is": "保持原状"
},
"common": {
"color": "颜色",
@ -441,7 +454,7 @@
"mono": "内容",
"input": "刚刚抵达上海",
"faint_link": "帮助菜单",
"fine_print": "阅读我们的 {0} 学不到什么东东",
"fine_print": "阅读我们的 {0} ,然而什么也学不到!",
"header_faint": "这很正常",
"checkbox": "我已经浏览了 TOC",
"link": "一个很棒的摇滚链接"
@ -451,7 +464,20 @@
"title": "版本",
"backend_version": "后端版本",
"frontend_version": "前端版本"
}
},
"notification_setting_filters": "过滤器",
"domain_mutes": "域名",
"changed_email": "邮箱修改成功!",
"change_email_error": "修改你的电子邮箱时发生错误",
"change_email": "修改电子邮箱",
"allow_following_move": "正在关注的账号迁移时自动重新关注",
"notification_setting_privacy_option": "在通知推送中隐藏发送者和内容",
"notification_setting_privacy": "隐私",
"hide_follows_count_description": "不显示关注数",
"notification_visibility_emoji_reactions": "互动",
"notification_visibility_moves": "用户迁移",
"new_email": "新邮箱",
"emoji_reactions_on_timeline": "在时间线上显示表情符号互动"
},
"time": {
"day": "{0} 天",
@ -561,7 +587,10 @@
"quarantine": "从联合实例中禁止用户帖子",
"delete_user": "删除用户",
"delete_user_confirmation": "你确认吗?此操作无法撤销。"
}
},
"hidden": "已隐藏",
"show_repeats": "显示转发",
"hide_repeats": "隐藏转发"
},
"user_profile": {
"timeline_title": "用户时间线",
@ -586,7 +615,9 @@
"repeat": "转发",
"reply": "回复",
"favorite": "收藏",
"user_settings": "用户设置"
"user_settings": "用户设置",
"reject_follow_request": "拒绝关注请求",
"add_reaction": "添加互动"
},
"upload": {
"error": {
@ -605,8 +636,8 @@
"search": {
"people": "人",
"hashtags": "Hashtags",
"person_talking": "{count} 人论",
"people_talking": "{count} 人论",
"person_talking": "{count} 人正在讨论",
"people_talking": "{count} 人正在讨论",
"no_results": "没有搜索结果"
},
"password_reset": {
@ -619,5 +650,49 @@
"not_found": "我们无法找到匹配的邮箱地址或者用户名。",
"too_many_requests": "你触发了尝试的限制,请稍后再试。",
"password_reset_disabled": "密码重置已经被禁用。请联系你的实例管理员。"
},
"remote_user_resolver": {
"error": "未找到。",
"searching_for": "搜索",
"remote_user_resolver": "远程用户解析器"
},
"emoji": {
"keep_open": "选择器保持打开",
"stickers": "贴图",
"unicode": "Unicode 表情符号",
"custom": "自定义表情符号",
"add_emoji": "插入表情符号",
"search_emoji": "搜索表情符号",
"emoji": "表情符号"
},
"about": {
"mrf": {
"simple": {
"quarantine_desc": "本实例只会把公开状态发送非下列实例:",
"quarantine": "隔离",
"reject_desc": "本实例不会接收来自下列实例的消息:",
"reject": "拒绝",
"accept_desc": "本实例只接收来自下列实例的消息:",
"simple_policies": "站规",
"accept": "接受",
"media_removal": "移除媒体"
},
"mrf_policies_desc": "MRF 策略会影响本实例的互通行为。以下策略已启用:",
"mrf_policies": "已启动 MRF 策略",
"keyword": {
"ftl_removal": "从“全部已知网络”时间线上移除",
"keyword_policies": "关键词策略",
"is_replaced_by": "→",
"replace": "替换",
"reject": "拒绝"
},
"federation": "联邦"
}
},
"domain_mute_card": {
"unmute_progress": "正在取消隐藏……",
"unmute": "取消隐藏",
"mute_progress": "隐藏中……",
"mute": "隐藏"
}
}

View file

@ -4,52 +4,55 @@ import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js'
import { instanceDefaultProperties } from './config.js'
const defaultState = {
// Stuff from static/config.json and apiConfig
// Stuff from apiConfig
name: 'Pleroma FE',
registrationOpen: true,
safeDM: true,
textlimit: 5000,
server: 'http://localhost:4040/',
theme: 'pleroma-dark',
textlimit: 5000,
themeData: undefined,
background: '/static/aurora_borealis.jpg',
logo: '/static/logo.png',
logoMask: true,
logoMargin: '.2em',
redirectRootNoLogin: '/main/all',
redirectRootLogin: '/main/friends',
showInstanceSpecificPanel: false,
alwaysShowSubjectInput: true,
hideMutedPosts: false,
collapseMessageWithSubject: false,
hidePostStats: false,
hideUserStats: false,
hideFilteredStatuses: false,
disableChat: false,
scopeCopy: true,
subjectLineBehavior: 'email',
postContentType: 'text/plain',
hideSitename: false,
nsfwCensorImage: undefined,
vapidPublicKey: undefined,
noAttachmentLinks: false,
showFeaturesPanel: true,
minimalScopesMode: false,
// Stuff from static/config.json
alwaysShowSubjectInput: true,
background: '/static/aurora_borealis.jpg',
collapseMessageWithSubject: false,
disableChat: false,
greentext: false,
hideFilteredStatuses: false,
hideMutedPosts: false,
hidePostStats: false,
hideSitename: false,
hideUserStats: false,
loginMethod: 'password',
logo: '/static/logo.png',
logoMargin: '.2em',
logoMask: true,
minimalScopesMode: false,
nsfwCensorImage: undefined,
postContentType: 'text/plain',
redirectRootLogin: '/main/friends',
redirectRootNoLogin: '/main/all',
scopeCopy: true,
showFeaturesPanel: true,
showInstanceSpecificPanel: false,
sidebarRight: false,
subjectLineBehavior: 'email',
theme: 'pleroma-dark',
// Nasty stuff
pleromaBackend: true,
emoji: [],
emojiFetched: false,
customEmoji: [],
customEmojiFetched: false,
restrictedNicknames: [],
emoji: [],
emojiFetched: false,
pleromaBackend: true,
postFormats: [],
restrictedNicknames: [],
safeDM: true,
// Feature-set, apparently, not everything here is reported...
mediaProxyAvailable: false,
chatAvailable: false,
gopherAvailable: false,
mediaProxyAvailable: false,
suggestionsEnabled: false,
suggestionsWeb: '',

View file

@ -48,6 +48,11 @@ const unblockUser = (store, id) => {
}
const muteUser = (store, id) => {
const predictedRelationship = store.state.relationships[id] || { id }
predictedRelationship.muting = true
store.commit('updateUserRelationship', [predictedRelationship])
store.commit('addMuteId', id)
return store.rootState.api.backendInteractor.muteUser({ id })
.then((relationship) => {
store.commit('updateUserRelationship', [relationship])
@ -56,6 +61,10 @@ const muteUser = (store, id) => {
}
const unmuteUser = (store, id) => {
const predictedRelationship = store.state.relationships[id] || { id }
predictedRelationship.muting = false
store.commit('updateUserRelationship', [predictedRelationship])
return store.rootState.api.backendInteractor.unmuteUser({ id })
.then((relationship) => store.commit('updateUserRelationship', [relationship]))
}
@ -83,10 +92,6 @@ const unmuteDomain = (store, domain) => {
}
export const mutations = {
setMuted (state, { user: { id }, muted }) {
const user = state.usersObject[id]
set(user, 'muted', muted)
},
tagUser (state, { user: { id }, tag }) {
const user = state.usersObject[id]
const tags = user.tags || []
@ -146,26 +151,18 @@ export const mutations = {
}
},
addNewUsers (state, users) {
each(users, (user) => mergeOrAdd(state.users, state.usersObject, user))
each(users, (user) => {
if (user.relationship) {
set(state.relationships, user.relationship.id, user.relationship)
}
mergeOrAdd(state.users, state.usersObject, user)
})
},
updateUserRelationship (state, relationships) {
relationships.forEach((relationship) => {
const user = state.usersObject[relationship.id]
if (user) {
user.follows_you = relationship.followed_by
user.following = relationship.following
user.muted = relationship.muting
user.statusnet_blocking = relationship.blocking
user.subscribed = relationship.subscribing
user.showing_reblogs = relationship.showing_reblogs
}
set(state.relationships, relationship.id, relationship)
})
},
updateBlocks (state, blockedUsers) {
// Reset statusnet_blocking of all fetched users
each(state.users, (user) => { user.statusnet_blocking = false })
each(blockedUsers, (user) => mergeOrAdd(state.users, state.usersObject, user))
},
saveBlockIds (state, blockIds) {
state.currentUser.blockIds = blockIds
},
@ -174,11 +171,6 @@ export const mutations = {
state.currentUser.blockIds.push(blockId)
}
},
updateMutes (state, mutedUsers) {
// Reset muted of all fetched users
each(state.users, (user) => { user.muted = false })
each(mutedUsers, (user) => mergeOrAdd(state.users, state.usersObject, user))
},
saveMuteIds (state, muteIds) {
state.currentUser.muteIds = muteIds
},
@ -244,6 +236,10 @@ export const getters = {
return state.usersObject[query.toLowerCase()]
}
return result
},
relationship: state => id => {
const rel = id && state.relationships[id]
return rel || { id, loading: true }
}
}
@ -254,7 +250,8 @@ export const defaultState = {
users: [],
usersObject: {},
signUpPending: false,
signUpErrors: []
signUpErrors: [],
relationships: {}
}
const users = {
@ -279,7 +276,7 @@ const users = {
return store.rootState.api.backendInteractor.fetchBlocks()
.then((blocks) => {
store.commit('saveBlockIds', map(blocks, 'id'))
store.commit('updateBlocks', blocks)
store.commit('addNewUsers', blocks)
return blocks
})
},
@ -298,8 +295,8 @@ const users = {
fetchMutes (store) {
return store.rootState.api.backendInteractor.fetchMutes()
.then((mutes) => {
store.commit('updateMutes', mutes)
store.commit('saveMuteIds', map(mutes, 'id'))
store.commit('addNewUsers', mutes)
return mutes
})
},
@ -416,7 +413,7 @@ const users = {
},
addNewNotifications (store, { notifications }) {
const users = map(notifications, 'from_profile')
const targetUsers = map(notifications, 'target')
const targetUsers = map(notifications, 'target').filter(_ => _)
const notificationIds = notifications.map(_ => _.id)
store.commit('addNewUsers', users)
store.commit('addNewUsers', targetUsers)
@ -431,7 +428,7 @@ const users = {
store.commit('setUserForNotification', notification)
})
},
searchUsers (store, query) {
searchUsers (store, { query }) {
return store.rootState.api.backendInteractor.searchUsers({ query })
.then((users) => {
store.commit('addNewUsers', users)

View file

@ -324,7 +324,8 @@ const fetchFriends = ({ id, maxId, sinceId, limit = 20, credentials }) => {
const args = [
maxId && `max_id=${maxId}`,
sinceId && `since_id=${sinceId}`,
limit && `limit=${limit}`
limit && `limit=${limit}`,
`with_relationships=true`
].filter(_ => _).join('&')
url = url + (args ? '?' + args : '')
@ -358,7 +359,8 @@ const fetchFollowers = ({ id, maxId, sinceId, limit = 20, credentials }) => {
const args = [
maxId && `max_id=${maxId}`,
sinceId && `since_id=${sinceId}`,
limit && `limit=${limit}`
limit && `limit=${limit}`,
`with_relationships=true`
].filter(_ => _).join('&')
url += args ? '?' + args : ''
@ -971,6 +973,8 @@ const search2 = ({ credentials, q, resolve, limit, offset, following }) => {
params.push(['following', true])
}
params.push(['with_relationships', true])
let queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&')
url += `?${queryString}`

View file

@ -75,13 +75,7 @@ export const parseUser = (data) => {
output.token = data.pleroma.chat_token
if (relationship) {
output.follows_you = relationship.followed_by
output.requested = relationship.requested
output.following = relationship.following
output.statusnet_blocking = relationship.blocking
output.muted = relationship.muting
output.showing_reblogs = relationship.showing_reblogs
output.subscribed = relationship.subscribing
output.relationship = relationship
}
output.allow_following_move = data.pleroma.allow_following_move
@ -138,16 +132,10 @@ export const parseUser = (data) => {
output.statusnet_profile_url = data.statusnet_profile_url
output.statusnet_blocking = data.statusnet_blocking
output.is_local = data.is_local
output.role = data.role
output.show_role = data.show_role
output.follows_you = data.follows_you
output.muted = data.muted
if (data.rights) {
output.rights = {
moderator: data.rights.delete_others_notice,
@ -161,10 +149,16 @@ export const parseUser = (data) => {
output.hide_follows_count = data.hide_follows_count
output.hide_followers_count = data.hide_followers_count
output.background_image = data.background_image
// on mastoapi this info is contained in a "relationship"
output.following = data.following
// Websocket token
output.token = data.token
// Convert relationsip data to expected format
output.relationship = {
muting: data.muted,
blocking: data.statusnet_blocking,
followed_by: data.follows_you,
following: data.following
}
}
output.created_at = new Date(data.created_at)

View file

@ -1,24 +1,27 @@
const fetchUser = (attempt, user, store) => new Promise((resolve, reject) => {
const fetchRelationship = (attempt, userId, store) => new Promise((resolve, reject) => {
setTimeout(() => {
store.state.api.backendInteractor.fetchUser({ id: user.id })
.then((user) => store.commit('addNewUsers', [user]))
.then(() => resolve([user.following, user.requested, user.locked, attempt]))
store.state.api.backendInteractor.fetchUserRelationship({ id: userId })
.then((relationship) => {
store.commit('updateUserRelationship', [relationship])
return relationship
})
.then((relationship) => resolve([relationship.following, relationship.requested, relationship.locked, attempt]))
.catch((e) => reject(e))
}, 500)
}).then(([following, sent, locked, attempt]) => {
if (!following && !(locked && sent) && attempt <= 3) {
// If we BE reports that we still not following that user - retry,
// increment attempts by one
fetchUser(++attempt, user, store)
fetchRelationship(++attempt, userId, store)
}
})
export const requestFollow = (user, store) => new Promise((resolve, reject) => {
store.state.api.backendInteractor.followUser({ id: user.id })
export const requestFollow = (userId, store) => new Promise((resolve, reject) => {
store.state.api.backendInteractor.followUser({ id: userId })
.then((updated) => {
store.commit('updateUserRelationship', [updated])
if (updated.following || (user.locked && user.requested)) {
if (updated.following || (updated.locked && updated.requested)) {
// If we get result immediately or the account is locked, just stop.
resolve()
return
@ -31,15 +34,15 @@ export const requestFollow = (user, store) => new Promise((resolve, reject) => {
// don't know that yet.
// Recursive Promise, it will call itself up to 3 times.
return fetchUser(1, user, store)
return fetchRelationship(1, updated, store)
.then(() => {
resolve()
})
})
})
export const requestUnfollow = (user, store) => new Promise((resolve, reject) => {
store.state.api.backendInteractor.unfollowUser({ id: user.id })
export const requestUnfollow = (userId, store) => new Promise((resolve, reject) => {
store.state.api.backendInteractor.unfollowUser({ id: userId })
.then((updated) => {
store.commit('updateUserRelationship', [updated])
resolve({

View file

@ -1,23 +1,28 @@
{
"theme": "pleroma-dark",
"background": "/static/aurora_borealis.jpg",
"logo": "/static/logo.png",
"logoMask": true,
"logoMargin": ".1em",
"redirectRootNoLogin": "/main/all",
"redirectRootLogin": "/main/friends",
"showInstanceSpecificPanel": false,
"collapseMessageWithSubject": false,
"scopeCopy": true,
"subjectLineBehavior": "email",
"postContentType": "text/plain",
"alwaysShowSubjectInput": true,
"background": "/static/aurora_borealis.jpg",
"collapseMessageWithSubject": false,
"disableChat": false,
"greentext": false,
"hideFilteredStatuses": false,
"hideMutedPosts": false,
"hidePostStats": false,
"hideSitename": false,
"hideUserStats": false,
"loginMethod": "password",
"webPushNotifications": false,
"noAttachmentLinks": false,
"logo": "/static/logo.png",
"logoMargin": ".1em",
"logoMask": true,
"minimalScopesMode": false,
"nsfwCensorImage": "",
"postContentType": "text/plain",
"redirectRootLogin": "/main/friends",
"redirectRootNoLogin": "/main/all",
"scopeCopy": true,
"showFeaturesPanel": true,
"minimalScopesMode": false
"showInstanceSpecificPanel": false,
"sidebarRight": false,
"subjectLineBehavior": "email",
"theme": "pleroma-dark",
"webPushNotifications": false
}

View file

@ -346,6 +346,12 @@
"code": 59427,
"src": "fontawesome"
},
{
"uid": "4aad6bb50b02c18508aae9cbe14e784e",
"css": "share",
"code": 61920,
"src": "fontawesome"
},
{
"uid": "8b80d36d4ef43889db10bc1f0dc9a862",
"css": "user",

View file

@ -19,6 +19,7 @@ const actions = {
const testGetters = {
findUser: state => getters.findUser(state.users),
relationship: state => getters.relationship(state.users),
mergedConfig: state => ({
colors: '',
highlight: {},
@ -96,7 +97,8 @@ const externalProfileStore = new Vuex.Store({
credentials: ''
},
usersObject: { 100: extUser },
users: [extUser]
users: [extUser],
relationships: {}
}
}
})
@ -164,7 +166,8 @@ const localProfileStore = new Vuex.Store({
credentials: ''
},
usersObject: { 100: localUser, 'testuser': localUser },
users: [localUser]
users: [localUser],
relationships: {}
}
}
})

View file

@ -18,20 +18,6 @@ describe('The users module', () => {
expect(state.users).to.eql([user])
expect(state.users[0].name).to.eql('Dude')
})
it('sets a mute bit on users', () => {
const state = cloneDeep(defaultState)
const user = { id: '1', name: 'Guy' }
mutations.addNewUsers(state, [user])
mutations.setMuted(state, { user, muted: true })
expect(user.muted).to.eql(true)
mutations.setMuted(state, { user, muted: false })
expect(user.muted).to.eql(false)
})
})
describe('findUser', () => {