fix conflicts, fix mouseover in statuses

This commit is contained in:
Shpuld Shpuldson 2020-08-13 15:13:44 +03:00
commit 2031f3822d
55 changed files with 3108 additions and 948 deletions

View file

@ -1,7 +1,7 @@
# This file is a template, and might need editing before it works on your project. # This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at: # Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/node/tags/ # https://hub.docker.com/r/library/node/tags/
image: node:8 image: node:10
stages: stages:
- lint - lint
@ -14,6 +14,7 @@ lint:
script: script:
- yarn - yarn
- npm run lint - npm run lint
- npm run stylelint
test: test:
stage: test stage: test

19
.stylelintrc.json Normal file
View file

@ -0,0 +1,19 @@
{
"extends": [
"stylelint-rscss/config",
"stylelint-config-recommended",
"stylelint-config-standard"
],
"rules": {
"declaration-no-important": true,
"rscss/no-descendant-combinator": false,
"rscss/class-format": [
true,
{
"component": "pascal-case",
"variant": "^-[a-z]\\w+",
"element": "^[a-z]\\w+"
}
]
}
}

View file

@ -24,6 +24,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Descriptions can be set on uploaded files before posting - Descriptions can be set on uploaded files before posting
- Added status preview option to preview your statuses before posting - Added status preview option to preview your statuses before posting
- When a post is a reply to an unavailable post, the 'Reply to'-text has a strike-through style - When a post is a reply to an unavailable post, the 'Reply to'-text has a strike-through style
- Added ability to see all favoriting or repeating users when hovering the number on highlighted statuses
### Changed ### Changed
- Registration page no longer requires email if the server is configured not to require it - Registration page no longer requires email if the server is configured not to require it
@ -50,6 +51,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Videos are not cropped awkwardly in the uploads section anymore - Videos are not cropped awkwardly in the uploads section anymore
- Reply filtering options in Settings -> Filtering now work again using filtering on server - Reply filtering options in Settings -> Filtering now work again using filtering on server
- Don't show just blank-screen when cookies are disabled - Don't show just blank-screen when cookies are disabled
- Add status idempotency to prevent accidental double posting when posting returns an error
## [2.0.3] - 2020-05-02 ## [2.0.3] - 2020-05-02
### Fixed ### Fixed

View file

@ -2,7 +2,7 @@
> A single column frontend designed for Pleroma. > A single column frontend designed for Pleroma.
![screenshot](https://i.imgur.com/DJVqSJ0.png) ![screenshot](/uploads/796c5ecf985ed1e2b0943ee0df131ed0/DJVqSJ0.png)
# For Translators # For Translators

View file

@ -11,6 +11,7 @@
"unit:watch": "karma start test/unit/karma.conf.js --single-run=false", "unit:watch": "karma start test/unit/karma.conf.js --single-run=false",
"e2e": "node test/e2e/runner.js", "e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e", "test": "npm run unit && npm run e2e",
"stylelint": "npx stylelint src/components/status/status.scss",
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs", "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs",
"lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs" "lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs"
}, },
@ -22,8 +23,8 @@
"cropperjs": "^1.4.3", "cropperjs": "^1.4.3",
"diff": "^3.0.1", "diff": "^3.0.1",
"escape-html": "^1.0.3", "escape-html": "^1.0.3",
"parse-link-header": "^1.0.1",
"localforage": "^1.5.0", "localforage": "^1.5.0",
"parse-link-header": "^1.0.1",
"phoenix": "^1.3.0", "phoenix": "^1.3.0",
"portal-vue": "^2.1.4", "portal-vue": "^2.1.4",
"v-click-outside": "^2.1.1", "v-click-outside": "^2.1.1",
@ -36,7 +37,6 @@
"vuex": "^3.0.1" "vuex": "^3.0.1"
}, },
"devDependencies": { "devDependencies": {
"karma-mocha-reporter": "^2.2.1",
"@babel/core": "^7.7.5", "@babel/core": "^7.7.5",
"@babel/plugin-transform-runtime": "^7.7.6", "@babel/plugin-transform-runtime": "^7.7.6",
"@babel/preset-env": "^7.7.6", "@babel/preset-env": "^7.7.6",
@ -80,6 +80,7 @@
"karma-coverage": "^1.1.1", "karma-coverage": "^1.1.1",
"karma-firefox-launcher": "^1.1.0", "karma-firefox-launcher": "^1.1.0",
"karma-mocha": "^1.2.0", "karma-mocha": "^1.2.0",
"karma-mocha-reporter": "^2.2.1",
"karma-sinon-chai": "^2.0.2", "karma-sinon-chai": "^2.0.2",
"karma-sourcemap-loader": "^0.3.7", "karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "0.0.26", "karma-spec-reporter": "0.0.26",
@ -101,6 +102,9 @@
"shelljs": "^0.7.4", "shelljs": "^0.7.4",
"sinon": "^2.1.0", "sinon": "^2.1.0",
"sinon-chai": "^2.8.0", "sinon-chai": "^2.8.0",
"stylelint": "^13.6.1",
"stylelint-config-standard": "^20.0.0",
"stylelint-rscss": "^0.4.0",
"url-loader": "^1.1.2", "url-loader": "^1.1.2",
"vue-loader": "^14.0.0", "vue-loader": "^14.0.0",
"vue-style-loader": "^4.0.0", "vue-style-loader": "^4.0.0",

View file

@ -77,7 +77,7 @@
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius); border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
} }
.status-body { .StatusContent {
img.emoji { img.emoji {
width: 1.4em; width: 1.4em;
height: 1.4em; height: 1.4em;

View file

@ -10,7 +10,7 @@
@click.stop.prevent="togglePanel" @click.stop.prevent="togglePanel"
> >
<div class="title"> <div class="title">
<span>{{ $t('chat.title') }}</span> <span>{{ $t('shoutbox.title') }}</span>
<i <i
v-if="floating" v-if="floating"
class="icon-cancel" class="icon-cancel"
@ -64,7 +64,7 @@
> >
<div class="title"> <div class="title">
<i class="icon-comment-empty" /> <i class="icon-comment-empty" />
{{ $t('chat.title') }} {{ $t('shoutbox.title') }}
</div> </div>
</div> </div>
</div> </div>

View file

@ -1,7 +1,7 @@
<template> <template>
<div <div
class="timeline panel-default" class="Conversation"
:class="[isExpanded ? 'panel' : 'panel-disabled']" :class="{ '-expanded' : isExpanded, 'panel' : isExpanded }"
> >
<div <div
v-if="isExpanded" v-if="isExpanded"
@ -28,7 +28,7 @@
:replies="getReplies(status.id)" :replies="getReplies(status.id)"
:in-profile="inProfile" :in-profile="inProfile"
:profile-user-id="profileUserId" :profile-user-id="profileUserId"
class="status-fadein panel-body" class="conversation-status status-fadein panel-body"
@goto="setHighlight" @goto="setHighlight"
@toggleExpanded="toggleExpanded" @toggleExpanded="toggleExpanded"
/> />
@ -40,14 +40,27 @@
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.timeline { .Conversation {
.panel-disabled { .conversation-status {
.status-el { border-left: none;
border-left: none; border-bottom-width: 1px;
border-bottom-width: 1px; border-bottom-style: solid;
border-bottom-style: solid; border-bottom-color: var(--border, $fallback--border);
border-radius: 0;
}
&.-expanded {
.conversation-status {
border-color: $fallback--border;
border-color: var(--border, $fallback--border); border-color: var(--border, $fallback--border);
border-radius: 0; border-left: 4px solid $fallback--cRed;
border-left: 4px solid var(--cRed, $fallback--cRed);
}
.conversation-status:last-child {
border-bottom: none;
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
} }
} }
} }

View file

@ -1,5 +1,5 @@
import UserAvatar from '../user_avatar/user_avatar.vue' import UserAvatar from '../user_avatar/user_avatar.vue'
import Popover from '../popover/popover.vue' import UserListPopover from '../user_list_popover/user_list_popover.vue'
const EMOJI_REACTION_COUNT_CUTOFF = 12 const EMOJI_REACTION_COUNT_CUTOFF = 12
@ -7,7 +7,7 @@ const EmojiReactions = {
name: 'EmojiReactions', name: 'EmojiReactions',
components: { components: {
UserAvatar, UserAvatar,
Popover UserListPopover
}, },
props: ['status'], props: ['status'],
data: () => ({ data: () => ({

View file

@ -1,44 +1,11 @@
<template> <template>
<div class="emoji-reactions"> <div class="emoji-reactions">
<Popover <UserListPopover
v-for="(reaction) in emojiReactions" v-for="(reaction) in emojiReactions"
:key="reaction.name" :key="reaction.name"
trigger="hover" :users="accountsForEmoji[reaction.name]"
placement="top"
:offset="{ y: 5 }"
> >
<div
slot="content"
class="reacted-users"
>
<div v-if="accountsForEmoji[reaction.name].length">
<div
v-for="(account) in accountsForEmoji[reaction.name]"
:key="account.id"
class="reacted-user"
>
<UserAvatar
:user="account"
class="avatar-small"
:compact="true"
/>
<div class="reacted-user-names">
<!-- eslint-disable vue/no-v-html -->
<span
class="reacted-user-name"
v-html="account.name_html"
/>
<!-- eslint-enable vue/no-v-html -->
<span class="reacted-user-screen-name">{{ account.screen_name }}</span>
</div>
</div>
</div>
<div v-else>
<i class="icon-spin4 animate-spin" />
</div>
</div>
<button <button
slot="trigger"
class="emoji-reaction btn btn-default" class="emoji-reaction btn btn-default"
:class="{ 'picked-reaction': reactedWith(reaction.name), 'not-clickable': !loggedIn }" :class="{ 'picked-reaction': reactedWith(reaction.name), 'not-clickable': !loggedIn }"
@click="emojiOnClick(reaction.name, $event)" @click="emojiOnClick(reaction.name, $event)"
@ -47,7 +14,7 @@
<span class="reaction-emoji">{{ reaction.name }}</span> <span class="reaction-emoji">{{ reaction.name }}</span>
<span>{{ reaction.count }}</span> <span>{{ reaction.count }}</span>
</button> </button>
</Popover> </UserListPopover>
<a <a
v-if="tooManyReactions" v-if="tooManyReactions"
class="emoji-reaction-expand faint" class="emoji-reaction-expand faint"
@ -69,32 +36,6 @@
flex-wrap: wrap; flex-wrap: wrap;
} }
.reacted-users {
padding: 0.5em;
}
.reacted-user {
padding: 0.25em;
display: flex;
flex-direction: row;
.reacted-user-names {
display: flex;
flex-direction: column;
margin-left: 0.5em;
min-width: 5em;
img {
width: 1em;
height: 1em;
}
}
.reacted-user-screen-name {
font-size: 9px;
}
}
.emoji-reaction { .emoji-reaction {
padding: 0 0.5em; padding: 0 0.5em;
margin-right: 0.5em; margin-right: 0.5em;

View file

@ -1,3 +1,4 @@
import { timelineNames } from '../timeline_menu/timeline_menu.js'
import { mapState, mapGetters } from 'vuex' import { mapState, mapGetters } from 'vuex'
const NavPanel = { const NavPanel = {
@ -7,9 +8,17 @@ const NavPanel = {
} }
}, },
computed: { computed: {
onTimelineRoute () {
return !!timelineNames()[this.$route.name]
},
timelinesRoute () {
if (this.$store.state.interface.lastTimeline) {
return this.$store.state.interface.lastTimeline
}
return this.currentUser ? 'friends' : 'public-timeline'
},
...mapState({ ...mapState({
currentUser: state => state.users.currentUser, currentUser: state => state.users.currentUser,
chat: state => state.chat.channel,
followRequestCount: state => state.api.followRequests.length, followRequestCount: state => state.api.followRequests.length,
privateMode: state => state.instance.private, privateMode: state => state.instance.private,
federating: state => state.instance.federating, federating: state => state.instance.federating,

View file

@ -2,9 +2,12 @@
<div class="nav-panel"> <div class="nav-panel">
<div class="panel panel-default"> <div class="panel panel-default">
<ul> <ul>
<li v-if="currentUser"> <li v-if="currentUser || !privateMode">
<router-link :to="{ name: 'friends' }"> <router-link
<i class="button-icon icon-home-2" /> {{ $t("nav.timeline") }} :to="{ name: timelinesRoute }"
:class="onTimelineRoute && 'router-link-active'"
>
<i class="button-icon icon-home-2" /> {{ $t("nav.timelines") }}
</router-link> </router-link>
</li> </li>
<li v-if="currentUser"> <li v-if="currentUser">
@ -12,16 +15,6 @@
<i class="button-icon icon-bell-alt" /> {{ $t("nav.interactions") }} <i class="button-icon icon-bell-alt" /> {{ $t("nav.interactions") }}
</router-link> </router-link>
</li> </li>
<li v-if="currentUser">
<router-link :to="{ name: 'dms', params: { username: currentUser.screen_name } }">
<i class="button-icon icon-mail-alt" /> {{ $t("nav.dms") }}
</router-link>
</li>
<li v-if="currentUser">
<router-link :to="{ name: 'bookmarks'}">
<i class="button-icon icon-bookmark" /> {{ $t("nav.bookmarks") }}
</router-link>
</li>
<li v-if="currentUser && pleromaChatMessagesAvailable"> <li v-if="currentUser && pleromaChatMessagesAvailable">
<router-link :to="{ name: 'chats', params: { username: currentUser.screen_name } }"> <router-link :to="{ name: 'chats', params: { username: currentUser.screen_name } }">
<div <div
@ -44,16 +37,6 @@
</span> </span>
</router-link> </router-link>
</li> </li>
<li v-if="currentUser || !privateMode">
<router-link :to="{ name: 'public-timeline' }">
<i class="button-icon icon-users" /> {{ $t("nav.public_tl") }}
</router-link>
</li>
<li v-if="federating && (currentUser || !privateMode)">
<router-link :to="{ name: 'public-external-timeline' }">
<i class="button-icon icon-globe" /> {{ $t("nav.twkn") }}
</router-link>
</li>
<li> <li>
<router-link :to="{ name: 'about' }"> <router-link :to="{ name: 'about' }">
<i class="button-icon icon-info-circled" /> {{ $t("nav.about") }} <i class="button-icon icon-info-circled" /> {{ $t("nav.about") }}

View file

@ -60,16 +60,8 @@
height: 32px; height: 32px;
} }
.status-body { --link: var(--faintLink);
color: $fallback--faint; --text: var(--faint);
color: var(--faint, $fallback--faint);
a {
color: var(--faintLink);
}
.status-content a {
color: var(--postFaintLink);
}
}
} }
.follow-request-accept { .follow-request-accept {
@ -106,7 +98,8 @@
} }
} }
.status-el { /* TODO cleanup this */
.Status {
flex: 1; flex: 1;
} }

View file

@ -17,7 +17,7 @@
<span class="result-percentage"> <span class="result-percentage">
{{ percentageForOption(option.votes_count) }}% {{ percentageForOption(option.votes_count) }}%
</span> </span>
<span v-html="option.title_html"></span> <span v-html="option.title_html" />
</div> </div>
<div <div
class="result-fill" class="result-fill"

View file

@ -75,6 +75,7 @@ export default {
deleteOption (index, event) { deleteOption (index, event) {
if (this.options.length > 2) { if (this.options.length > 2) {
this.options.splice(index, 1) this.options.splice(index, 1)
this.updatePollToParent()
} }
}, },
convertExpiryToUnit (unit, amount) { convertExpiryToUnit (unit, amount) {

View file

@ -20,7 +20,9 @@ const Popover = {
offset: Object, offset: Object,
// Takes a x/y/h object and tells how much to offset the anchor point // Takes a x/y/h object and tells how much to offset the anchor point
anchorOffset: Object, anchorOffset: Object,
// Additional styles you may want for the popover container // Replaces the classes you may want for the popover container.
// Use 'popover-default' in addition to get the default popover
// styles with your custom class.
popoverClass: String, popoverClass: String,
// Time in milliseconds until the popup appears, default is 100ms // Time in milliseconds until the popup appears, default is 100ms
delay: Number, delay: Number,
@ -42,8 +44,10 @@ const Popover = {
}, },
watch: { watch: {
disabled (newValue, oldValue) { disabled (newValue, oldValue) {
if (newValue === true) { if (newValue) {
this.hidePopover() this.styles = { opacity: 0 }
} else {
if (this.trigger === 'hover') this.onMouseenter()
} }
} }
}, },
@ -188,7 +192,6 @@ const Popover = {
} }
}, },
onClickOutside (e) { onClickOutside (e) {
console.log('onClickOutside')
if (this.hidden) return if (this.hidden) return
if (this.$el.contains(e.target)) return if (this.$el.contains(e.target)) return
this.hidePopover() this.hidePopover()

View file

@ -10,11 +10,11 @@
<slot name="trigger" /> <slot name="trigger" />
</div> </div>
<div <div
v-if="!hidden" v-if="!hidden && !disabled"
ref="content" ref="content"
:style="styles" :style="styles"
class="popover" class="popover"
:class="popoverClass" :class="popoverClass || 'popover-default'"
> >
<slot <slot
name="content" name="content"
@ -34,6 +34,9 @@
z-index: 1000; z-index: 1000;
position: absolute; position: absolute;
min-width: 0; min-width: 0;
}
.popover-default {
transition: opacity 0.3s; transition: opacity 0.3s;
box-shadow: 1px 1px 4px rgba(0,0,0,.6); box-shadow: 1px 1px 4px rgba(0,0,0,.6);

View file

@ -66,6 +66,7 @@ const PostStatusForm = {
StatusContent StatusContent
}, },
mounted () { mounted () {
this.updateIdempotencyKey()
this.resize(this.$refs.textarea) this.resize(this.$refs.textarea)
if (this.replyTo) { if (this.replyTo) {
@ -116,7 +117,8 @@ const PostStatusForm = {
dropStopTimeout: null, dropStopTimeout: null,
preview: null, preview: null,
previewLoading: false, previewLoading: false,
emojiInputShown: false emojiInputShown: false,
idempotencyKey: ''
} }
}, },
computed: { computed: {
@ -211,14 +213,43 @@ const PostStatusForm = {
}) })
}, },
watch: { watch: {
'newStatus.contentType': function () { 'newStatus': {
this.autoPreview() deep: true,
}, handler () {
'newStatus.spoilerText': function () { this.statusChanged()
this.autoPreview() }
} }
}, },
methods: { methods: {
statusChanged () {
this.autoPreview()
this.updateIdempotencyKey()
},
clearStatus () {
const newStatus = this.newStatus
this.newStatus = {
status: '',
spoilerText: '',
files: [],
visibility: newStatus.visibility,
contentType: newStatus.contentType,
poll: {},
mediaDescriptions: {}
}
this.pollFormVisible = false
this.$refs.mediaUpload && this.$refs.mediaUpload.clearFile()
this.clearPollForm()
if (this.preserveFocus) {
this.$nextTick(() => {
this.$refs.textarea.focus()
})
}
let el = this.$el.querySelector('textarea')
el.style.height = 'auto'
el.style.height = undefined
this.error = null
if (this.preview) this.previewStatus()
},
async postStatus (event, newStatus, opts = {}) { async postStatus (event, newStatus, opts = {}) {
if (this.posting) { return } if (this.posting) { return }
if (this.disableSubmit) { return } if (this.disableSubmit) { return }
@ -258,36 +289,16 @@ const PostStatusForm = {
store: this.$store, store: this.$store,
inReplyToStatusId: this.replyTo, inReplyToStatusId: this.replyTo,
contentType: newStatus.contentType, contentType: newStatus.contentType,
poll poll,
idempotencyKey: this.idempotencyKey
} }
const postHandler = this.postHandler ? this.postHandler : statusPoster.postStatus const postHandler = this.postHandler ? this.postHandler : statusPoster.postStatus
postHandler(postingOptions).then((data) => { postHandler(postingOptions).then((data) => {
if (!data.error) { if (!data.error) {
this.newStatus = { this.clearStatus()
status: '',
spoilerText: '',
files: [],
visibility: newStatus.visibility,
contentType: newStatus.contentType,
poll: {},
mediaDescriptions: {}
}
this.pollFormVisible = false
this.$refs.mediaUpload && this.$refs.mediaUpload.clearFile()
this.clearPollForm()
this.$emit('posted', data) this.$emit('posted', data)
if (this.preserveFocus) {
this.$nextTick(() => {
this.$refs.textarea.focus()
})
}
let el = this.$el.querySelector('textarea')
el.style.height = 'auto'
el.style.height = undefined
this.error = null
if (this.preview) this.previewStatus()
} else { } else {
this.error = data.error this.error = data.error
} }
@ -404,7 +415,6 @@ const PostStatusForm = {
} }
}, },
onEmojiInputInput (e) { onEmojiInputInput (e) {
this.autoPreview()
this.$nextTick(() => { this.$nextTick(() => {
this.resize(this.$refs['textarea']) this.resize(this.$refs['textarea'])
}) })
@ -542,6 +552,9 @@ const PostStatusForm = {
}, },
handleEmojiInputShow (value) { handleEmojiInputShow (value) {
this.emojiInputShown = value this.emojiInputShown = value
},
updateIdempotencyKey () {
this.idempotencyKey = Date.now().toString()
} }
} }
} }

View file

@ -79,10 +79,7 @@
@click.stop.prevent="togglePreview" @click.stop.prevent="togglePreview"
> >
{{ $t('post_status.preview') }} {{ $t('post_status.preview') }}
<i <i :class="showPreview ? 'icon-left-open' : 'icon-right-open'" />
class="icon-down-open"
:style="{ transform: showPreview ? 'rotate(0deg)' : 'rotate(-90deg)' }"
/>
</a> </a>
<i <i
v-show="previewLoading" v-show="previewLoading"
@ -374,6 +371,7 @@
} }
.preview-heading { .preview-heading {
padding-left: 0.5em;
display: flex; display: flex;
width: 100%; width: 100%;
@ -385,14 +383,16 @@
.preview-toggle { .preview-toggle {
display: flex; display: flex;
cursor: pointer; cursor: pointer;
user-select: none;
&:hover { &:hover {
text-decoration: underline; text-decoration: underline;
} }
} i {
margin-left: 0.2em;
.icon-down-open { font-size: 0.8em;
transition: transform 0.1s; transform: rotate(90deg);
}
} }
.preview-container { .preview-container {

View file

@ -13,6 +13,13 @@
* - 50px - leaving tiny amount of space so that titlebar + tiny amount of modal is visible * - 50px - leaving tiny amount of space so that titlebar + tiny amount of modal is visible
*/ */
transform: translateY(calc(((100vh - 100%) / 2 + 100%) - 50px)); transform: translateY(calc(((100vh - 100%) / 2 + 100%) - 50px));
@media all and (max-width: 800px) {
/* For mobile, the modal takes 100% of the available screen.
This ensures the minimized modal is always 50px above the browser bottom bar regardless of whether or not it is visible.
*/
transform: translateY(calc(100% - 50px));
}
} }
} }
@ -27,7 +34,7 @@
@media all and (max-width: 800px) { @media all and (max-width: 800px) {
max-width: 100vw; max-width: 100vw;
height: 100vh; height: 100%;
} }
>.panel-body { >.panel-body {

View file

@ -49,6 +49,12 @@ const SideDrawer = {
federating () { federating () {
return this.$store.state.instance.federating return this.$store.state.instance.federating
}, },
timelinesRoute () {
if (this.$store.state.interface.lastTimeline) {
return this.$store.state.interface.lastTimeline
}
return this.currentUser ? 'friends' : 'public-timeline'
},
...mapState({ ...mapState({
pleromaChatMessagesAvailable: state => state.instance.pleromaChatMessagesAvailable pleromaChatMessagesAvailable: state => state.instance.pleromaChatMessagesAvailable
}), }),

View file

@ -39,13 +39,18 @@
<i class="button-icon icon-login" /> {{ $t("login.login") }} <i class="button-icon icon-login" /> {{ $t("login.login") }}
</router-link> </router-link>
</li> </li>
<li
v-if="currentUser || !privateMode"
@click="toggleDrawer"
>
<router-link :to="{ name: timelinesRoute }">
<i class="button-icon icon-home-2" /> {{ $t("nav.timelines") }}
</router-link>
</li>
<li <li
v-if="currentUser && pleromaChatMessagesAvailable" v-if="currentUser && pleromaChatMessagesAvailable"
@click="toggleDrawer" @click="toggleDrawer"
> >
<router-link :to="{ name: 'dms', params: { username: currentUser.screen_name } }">
<i class="button-icon icon-mail-alt" /> {{ $t("nav.dms") }}
</router-link>
<router-link <router-link
:to="{ name: 'chats', params: { username: currentUser.screen_name } }" :to="{ name: 'chats', params: { username: currentUser.screen_name } }"
style="position: relative" style="position: relative"
@ -59,34 +64,15 @@
</span> </span>
</router-link> </router-link>
</li> </li>
<li </ul>
v-if="currentUser" <ul v-if="currentUser">
@click="toggleDrawer" <li @click="toggleDrawer">
>
<router-link :to="{ name: 'interactions', params: { username: currentUser.screen_name } }"> <router-link :to="{ name: 'interactions', params: { username: currentUser.screen_name } }">
<i class="button-icon icon-bell-alt" /> {{ $t("nav.interactions") }} <i class="button-icon icon-bell-alt" /> {{ $t("nav.interactions") }}
</router-link> </router-link>
</li> </li>
</ul>
<ul>
<li <li
v-if="currentUser" v-if="currentUser.locked"
@click="toggleDrawer"
>
<router-link :to="{ name: 'friends' }">
<i class="button-icon icon-home-2" /> {{ $t("nav.timeline") }}
</router-link>
</li>
<li
v-if="currentUser"
@click="toggleDrawer"
>
<router-link :to="{ name: 'bookmarks'}">
<i class="button-icon icon-bookmark" /> {{ $t("nav.bookmarks") }}
</router-link>
</li>
<li
v-if="currentUser && currentUser.locked"
@click="toggleDrawer" @click="toggleDrawer"
> >
<router-link to="/friend-requests"> <router-link to="/friend-requests">
@ -100,19 +86,11 @@
</router-link> </router-link>
</li> </li>
<li <li
v-if="currentUser || !privateMode" v-if="chat"
@click="toggleDrawer" @click="toggleDrawer"
> >
<router-link to="/main/public"> <router-link :to="{ name: 'chat' }">
<i class="button-icon icon-users" /> {{ $t("nav.public_tl") }} <i class="button-icon icon-chat" /> {{ $t("nav.chat") }}
</router-link>
</li>
<li
v-if="federating && (currentUser || !privateMode)"
@click="toggleDrawer"
>
<router-link to="/main/all">
<i class="button-icon icon-globe" /> {{ $t("nav.twkn") }}
</router-link> </router-link>
</li> </li>
</ul> </ul>

View file

@ -9,6 +9,7 @@ import Timeago from '../timeago/timeago.vue'
import StatusContent from '../status_content/status_content.vue' import StatusContent from '../status_content/status_content.vue'
import StatusPopover from '../status_popover/status_popover.vue' import StatusPopover from '../status_popover/status_popover.vue'
import UserPopover from '../user_popover/user_popover.vue' import UserPopover from '../user_popover/user_popover.vue'
import UserListPopover from '../user_list_popover/user_list_popover.vue'
import EmojiReactions from '../emoji_reactions/emoji_reactions.vue' import EmojiReactions from '../emoji_reactions/emoji_reactions.vue'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js' import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
@ -18,6 +19,21 @@ import { mapGetters, mapState } from 'vuex'
const Status = { const Status = {
name: 'Status', name: 'Status',
components: {
FavoriteButton,
ReactButton,
RetweetButton,
ExtraButtons,
PostStatusForm,
UserAvatar,
AvatarList,
Timeago,
StatusPopover,
UserListPopover,
UserPopover,
EmojiReactions,
StatusContent
},
props: [ props: [
'statusoid', 'statusoid',
'expandable', 'expandable',
@ -196,20 +212,6 @@ const Status = {
currentUser: state => state.users.currentUser currentUser: state => state.users.currentUser
}) })
}, },
components: {
FavoriteButton,
ReactButton,
RetweetButton,
ExtraButtons,
PostStatusForm,
UserAvatar,
AvatarList,
Timeago,
StatusPopover,
EmojiReactions,
StatusContent,
UserPopover
},
methods: { methods: {
visibilityIcon (visibility) { visibilityIcon (visibility) {
switch (visibility) { switch (visibility) {

View file

@ -0,0 +1,410 @@
@import '../../_variables.scss';
$status-margin: 0.75em;
.Status {
min-width: 0;
&:hover .avatar {
--still-image-img: visible;
--still-image-canvas: hidden;
}
&.-focused {
background-color: $fallback--lightBg;
background-color: var(--selectedPost, $fallback--lightBg);
color: $fallback--text;
color: var(--selectedPostText, $fallback--text);
--lightText: var(--selectedPostLightText, $fallback--light);
--faint: var(--selectedPostFaintText, $fallback--faint);
--faintLink: var(--selectedPostFaintLink, $fallback--faint);
--postLink: var(--selectedPostPostLink, $fallback--faint);
--postFaintLink: var(--selectedPostFaintPostLink, $fallback--faint);
--icon: var(--selectedPostIcon, $fallback--icon);
}
.status-container {
display: flex;
padding: $status-margin;
&.-repeat {
padding-top: 0;
}
}
.pin {
padding: $status-margin $status-margin 0;
display: flex;
align-items: center;
justify-content: flex-end;
}
.left-side {
margin-right: $status-margin;
}
.right-side {
flex: 1;
min-width: 0;
}
.usercard {
margin-bottom: $status-margin;
}
.status-username {
white-space: nowrap;
font-size: 14px;
overflow: hidden;
max-width: 85%;
font-weight: bold;
flex-shrink: 1;
margin-right: 0.4em;
text-overflow: ellipsis;
.emoji {
width: 14px;
height: 14px;
vertical-align: middle;
object-fit: contain;
}
}
.status-favicon {
height: 18px;
width: 18px;
margin-right: 0.4em;
}
.status-heading {
margin-bottom: 0.5em;
}
.heading-name-row {
display: flex;
justify-content: space-between;
line-height: 18px;
a {
display: inline-block;
word-break: break-all;
}
}
.account-name {
min-width: 1.6em;
margin-right: 0.4em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1 1 0;
display: block;
}
.heading-left {
display: flex;
min-width: 0;
}
.heading-right {
display: flex;
flex-shrink: 0;
}
.timeago {
margin-right: 0.2em;
}
.heading-reply-row {
position: relative;
align-content: baseline;
font-size: 12px;
line-height: 18px;
max-width: 100%;
display: flex;
flex-wrap: wrap;
align-items: stretch;
}
.reply-to-accountname {
overflow: hidden;
max-width: 100%;
text-overflow: ellipsis;
white-space: nowrap;
word-break: break-all;
display: block;
}
.reply-to-and-accountname {
display: flex;
height: 18px;
margin-right: 0.5em;
max-width: 100%;
.icon-reply {
// mirror the icon
transform: scaleX(-1);
}
}
& .reply-to-popover,
& .reply-to-no-popover {
min-width: 0;
margin-right: 0.4em;
}
.reply-to-popover {
&:hover {
border-bottom: 1px solid var(--faint);
}
.faint-link:hover {
// override default
text-decoration: none;
}
&.-strikethrough {
position: relative;
&::after {
content: '';
display: block;
position: absolute;
top: 50%;
width: 100%;
border-bottom: 1px solid var(--faint);
}
}
}
.reply-to {
display: flex;
}
.reply-to-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin-left: 0.2em;
}
.replies-separator {
margin-left: 0.4em;
}
.replies {
line-height: 18px;
font-size: 12px;
display: flex;
flex-wrap: wrap;
& > * {
margin-right: 0.4em;
}
}
.reply-link {
height: 17px;
}
.repeat-info {
padding: 0.4em $status-margin;
line-height: 22px;
.right-side {
display: flex;
align-content: center;
flex-wrap: wrap;
}
i {
padding: 0 0.2em;
}
}
.repeater-avatar {
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
margin-left: 28px;
width: 20px;
height: 20px;
}
.repeater-name {
text-overflow: ellipsis;
margin-right: 0;
.emoji {
width: 14px;
height: 14px;
vertical-align: middle;
object-fit: contain;
}
}
.status-fadein {
animation-duration: 0.4s;
animation-name: fadein;
}
@keyframes fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.status-actions {
position: relative;
width: 100%;
display: flex;
margin-top: $status-margin;
> * {
max-width: 4em;
flex: 1;
}
}
.button-reply {
&:not(.-disabled) {
cursor: pointer;
}
&:not(.-disabled):hover,
&.-active {
color: $fallback--cBlue;
color: var(--cBlue, $fallback--cBlue);
}
}
.muted {
padding: 0.25em 0.6em;
height: 1.2em;
line-height: 1.2em;
text-overflow: ellipsis;
overflow: hidden;
display: flex;
flex-wrap: nowrap;
& .status-username,
& .mute-thread,
& .mute-words {
word-wrap: normal;
word-break: normal;
white-space: nowrap;
}
& .status-username,
& .mute-words {
text-overflow: ellipsis;
overflow: hidden;
}
.status-username {
font-weight: normal;
flex: 0 1 auto;
margin-right: 0.2em;
font-size: smaller;
}
.mute-thread {
flex: 0 0 auto;
}
.mute-words {
flex: 1 0 5em;
margin-left: 0.2em;
&::before {
content: ' ';
}
}
.unmute {
flex: 0 0 auto;
margin-left: auto;
display: block;
}
}
.reply-form {
padding-top: 0;
padding-bottom: 0;
}
.reply-body {
flex: 1;
}
.favs-repeated-users {
margin-top: $status-margin;
}
.stats {
width: 100%;
display: flex;
line-height: 1em;
}
.avatar-row {
flex: 1;
overflow: hidden;
position: relative;
display: flex;
align-items: center;
&::before {
content: '';
position: absolute;
height: 100%;
width: 1px;
left: 0;
background-color: var(--faint, $fallback--faint);
}
}
.stat-count {
margin-right: $status-margin;
user-select: none;
.stat-title {
color: var(--faint, $fallback--faint);
font-size: 12px;
text-transform: uppercase;
position: relative;
}
.stat-number {
font-weight: bolder;
font-size: 16px;
line-height: 1em;
}
&:hover .stat-title {
text-decoration: underline;
}
}
@media all and (max-width: 800px) {
.repeater-avatar {
margin-left: 20px;
}
.avatar:not(.repeater-avatar) {
width: 40px;
height: 40px;
// TODO define those other way somehow?
// stylelint-disable rscss/class-format
&.avatar-compact {
width: 32px;
height: 32px;
}
}
}
}

View file

@ -2,8 +2,8 @@
<!-- eslint-disable vue/no-v-html --> <!-- eslint-disable vue/no-v-html -->
<div <div
v-if="!hideStatus" v-if="!hideStatus"
class="status-el" class="Status"
:class="[{ 'status-el_focused': isFocused }, { 'status-conversation': inlineExpanded }]" :class="[{ '-focused': isFocused }, { '-conversation': inlineExpanded }]"
> >
<div <div
v-if="error" v-if="error"
@ -16,8 +16,8 @@
/> />
</div> </div>
<template v-if="muted && !isPreview"> <template v-if="muted && !isPreview">
<div class="media status container muted"> <div class="status-csontainer muted">
<small class="username"> <small class="status-username">
<i <i
v-if="muted && retweet" v-if="muted && retweet"
class="button-icon icon-retweet" class="button-icon icon-retweet"
@ -56,7 +56,7 @@
<template v-else> <template v-else>
<div <div
v-if="showPinned" v-if="showPinned"
class="status-pin" class="pin"
> >
<i class="fa icon-pin faint" /> <i class="fa icon-pin faint" />
<span class="faint">{{ $t('status.pinned') }}</span> <span class="faint">{{ $t('status.pinned') }}</span>
@ -65,17 +65,17 @@
v-if="retweet && !noHeading && !inConversation" v-if="retweet && !noHeading && !inConversation"
:class="[repeaterClass, { highlighted: repeaterStyle }]" :class="[repeaterClass, { highlighted: repeaterStyle }]"
:style="[repeaterStyle]" :style="[repeaterStyle]"
class="media container retweet-info" class="status-container repeat-info"
> >
<UserAvatar <UserAvatar
v-if="retweet" v-if="retweet"
class="media-left" class="left-side repeater-avatar"
:better-shadow="betterShadow" :better-shadow="betterShadow"
:user="statusoid.user" :user="statusoid.user"
/> />
<div class="media-body faint"> <div class="right-side faint">
<span <span
class="user-name" class="status-username repeater-name"
:title="retweeter" :title="retweeter"
> >
<UserPopover :user-id="statusoid.user.id"> <UserPopover :user-id="statusoid.user.id">
@ -100,14 +100,14 @@
</div> </div>
<div <div
:class="[userClass, { highlighted: userStyle, 'is-retweet': retweet && !inConversation }]" :class="[userClass, { highlighted: userStyle, '-repeat': retweet && !inConversation }]"
:style="[ userStyle ]" :style="[ userStyle ]"
class="media status" class="status-container"
:data-tags="tags" :data-tags="tags"
> >
<div <div
v-if="!noHeading" v-if="!noHeading"
class="media-left" class="left-side"
> >
<router-link :to="userProfileLink"> <router-link :to="userProfileLink">
<UserAvatar <UserAvatar
@ -120,19 +120,19 @@
<div class="status-body"> <div class="status-body">
<div <div
v-if="!noHeading" v-if="!noHeading"
class="media-heading" class="status-heading"
> >
<div class="heading-name-row"> <div class="heading-name-row">
<div class="name-and-account-name"> <div class="heading-left">
<h4 <h4
v-if="status.user.name_html" v-if="status.user.name_html"
class="user-name" class="status-username"
:title="status.user.name" :title="status.user.name"
v-html="status.user.name_html" v-html="status.user.name_html"
/> />
<h4 <h4
v-else v-else
class="user-name" class="status-username"
:title="status.user.name" :title="status.user.name"
> >
{{ status.user.name }} {{ status.user.name }}
@ -211,6 +211,7 @@
:status-id="status.parent_visible && status.in_reply_to_status_id" :status-id="status.parent_visible && status.in_reply_to_status_id"
class="reply-to-popover" class="reply-to-popover"
style="min-width: 0" style="min-width: 0"
:class="{ '-strikethrough': !status.parent_visible }"
> >
<a <a
class="reply-to" class="reply-to"
@ -218,10 +219,9 @@
:aria-label="$t('tool_tip.reply')" :aria-label="$t('tool_tip.reply')"
@click.prevent="gotoOriginal(status.in_reply_to_status_id)" @click.prevent="gotoOriginal(status.in_reply_to_status_id)"
> >
<i class="button-icon icon-reply" /> <i class="button-icon reply-button icon-reply" />
<span <span
class="faint-link reply-to-text" class="faint-link reply-to-text"
:class="{ 'strikethrough': !status.parent_visible }"
> >
{{ $t('status.reply_to') }} {{ $t('status.reply_to') }}
</span> </span>
@ -229,7 +229,7 @@
</StatusPopover> </StatusPopover>
<span <span
v-else v-else
class="reply-to" class="reply-to-no-popover"
> >
<span class="reply-to-text">{{ $t('status.reply_to') }}</span> <span class="reply-to-text">{{ $t('status.reply_to') }}</span>
</span> </span>
@ -284,24 +284,30 @@
class="favs-repeated-users" class="favs-repeated-users"
> >
<div class="stats"> <div class="stats">
<div <UserListPopover
v-if="statusFromGlobalRepository.rebloggedBy && statusFromGlobalRepository.rebloggedBy.length > 0" v-if="statusFromGlobalRepository.rebloggedBy && statusFromGlobalRepository.rebloggedBy.length > 0"
class="stat-count" :users="statusFromGlobalRepository.rebloggedBy"
> >
<a class="stat-title">{{ $t('status.repeats') }}</a> <div class="stat-count">
<div class="stat-number"> <a class="stat-title">{{ $t('status.repeats') }}</a>
{{ statusFromGlobalRepository.rebloggedBy.length }} <div class="stat-number">
{{ statusFromGlobalRepository.rebloggedBy.length }}
</div>
</div> </div>
</div> </UserListPopover>
<div <UserListPopover
v-if="statusFromGlobalRepository.favoritedBy && statusFromGlobalRepository.favoritedBy.length > 0" v-if="statusFromGlobalRepository.favoritedBy && statusFromGlobalRepository.favoritedBy.length > 0"
class="stat-count" :users="statusFromGlobalRepository.favoritedBy"
> >
<a class="stat-title">{{ $t('status.favorites') }}</a> <div
<div class="stat-number"> class="stat-count"
{{ statusFromGlobalRepository.favoritedBy.length }} >
<a class="stat-title">{{ $t('status.favorites') }}</a>
<div class="stat-number">
{{ statusFromGlobalRepository.favoritedBy.length }}
</div>
</div> </div>
</div> </UserListPopover>
<div class="avatar-row"> <div class="avatar-row">
<AvatarList :users="combinedFavsAndRepeatsUsers" /> <AvatarList :users="combinedFavsAndRepeatsUsers" />
</div> </div>
@ -316,19 +322,19 @@
<div <div
v-if="!noHeading && !isPreview" v-if="!noHeading && !isPreview"
class="status-actions media-body" class="status-actions"
> >
<div> <div>
<i <i
v-if="loggedIn" v-if="loggedIn"
class="button-icon icon-reply" class="button-icon button-reply icon-reply"
:title="$t('tool_tip.reply')" :title="$t('tool_tip.reply')"
:class="{'button-icon-active': replying}" :class="{'-active': replying}"
@click.prevent="toggleReplying" @click.prevent="toggleReplying"
/> />
<i <i
v-else v-else
class="button-icon button-icon-disabled icon-reply" class="button-icon button-reply -disabled icon-reply"
:title="$t('tool_tip.reply')" :title="$t('tool_tip.reply')"
/> />
<span v-if="status.replies_count > 0">{{ status.replies_count }}</span> <span v-if="status.replies_count > 0">{{ status.replies_count }}</span>
@ -356,7 +362,7 @@
</div> </div>
<div <div
v-if="replying" v-if="replying"
class="container" class="status-container reply-form"
> >
<PostStatusForm <PostStatusForm
class="reply-body" class="reply-body"
@ -374,436 +380,5 @@
</template> </template>
<script src="./status.js" ></script> <script src="./status.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
$status-margin: 0.75em; <style src="./status.scss" lang="scss"></style>
.status-body {
flex: 1;
min-width: 0;
}
.status-pin {
padding: $status-margin $status-margin 0;
display: flex;
align-items: center;
justify-content: flex-end;
}
.media-left {
margin-right: $status-margin;
}
.status-el {
border-left-width: 0px;
min-width: 0;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
border-left: 4px $fallback--cRed;
border-left: 4px var(--cRed, $fallback--cRed);
&_focused {
background-color: $fallback--lightBg;
background-color: var(--selectedPost, $fallback--lightBg);
color: $fallback--text;
color: var(--selectedPostText, $fallback--text);
--lightText: var(--selectedPostLightText, $fallback--light);
--faint: var(--selectedPostFaintText, $fallback--faint);
--faintLink: var(--selectedPostFaintLink, $fallback--faint);
--postLink: var(--selectedPostPostLink, $fallback--faint);
--postFaintLink: var(--selectedPostFaintPostLink, $fallback--faint);
--icon: var(--selectedPostIcon, $fallback--icon);
}
.timeline & {
border-bottom-width: 1px;
border-bottom-style: solid;
}
.media-body {
flex: 1;
padding: 0;
}
.status-usercard {
margin-bottom: $status-margin;
}
.user-name {
white-space: nowrap;
font-size: 14px;
overflow: hidden;
flex-shrink: 0;
max-width: 85%;
font-weight: bold;
img.emoji {
width: 14px;
height: 14px;
vertical-align: middle;
object-fit: contain
}
}
.status-favicon {
height: 18px;
width: 18px;
margin-right: 0.4em;
}
.media-heading {
padding: 0;
vertical-align: bottom;
flex-basis: 100%;
margin-bottom: 0.5em;
small {
font-weight: lighter;
}
.heading-name-row {
padding: 0;
display: flex;
justify-content: space-between;
line-height: 18px;
a {
display: inline-block;
word-break: break-all;
}
.name-and-account-name {
display: flex;
min-width: 0;
}
.user-name {
flex-shrink: 1;
margin-right: 0.4em;
overflow: hidden;
text-overflow: ellipsis;
}
.account-name {
min-width: 1.6em;
margin-right: 0.4em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex: 1 1 0;
display: block;
}
}
.heading-right {
display: flex;
flex-shrink: 0;
}
.timeago {
margin-right: 0.2em;
}
.heading-reply-row {
position: relative;
align-content: baseline;
font-size: 12px;
line-height: 18px;
max-width: 100%;
display: flex;
flex-wrap: wrap;
align-items: stretch;
.reply-to-accountname {
overflow: hidden;
max-width: 100%;
text-overflow: ellipsis;
white-space: nowrap;
word-break: break-all;
display: block;
}
}
.reply-to-and-accountname {
display: flex;
height: 18px;
margin-right: 0.5em;
max-width: 100%;
.icon-reply {
transform: scaleX(-1);
}
}
.reply-info {
display: flex;
}
.reply-to-popover {
min-width: 0;
}
.reply-to {
display: flex;
}
.reply-to-text {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
margin: 0 0.4em 0 0.2em;
}
.strikethrough {
text-decoration: line-through;
}
.replies-separator {
margin-left: 0.4em;
}
.replies {
line-height: 18px;
font-size: 12px;
display: flex;
flex-wrap: wrap;
& > * {
margin-right: 0.4em;
}
}
.reply-link {
height: 17px;
}
}
.retweet-info {
padding: 0.4em $status-margin;
margin: 0;
.avatar.still-image {
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
margin-left: 28px;
width: 20px;
height: 20px;
}
.media-body {
font-size: 1em;
line-height: 22px;
display: flex;
align-content: center;
flex-wrap: wrap;
.user-name {
font-weight: bold;
overflow: hidden;
text-overflow: ellipsis;
img {
width: 14px;
height: 14px;
vertical-align: middle;
object-fit: contain
}
}
i {
padding: 0 0.2em;
}
a {
max-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
}
.status-fadein {
animation-duration: 0.4s;
animation-name: fadein;
}
@keyframes fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.status-conversation {
border-left-style: solid;
}
.status-actions {
position: relative;
width: 100%;
display: flex;
margin-top: $status-margin;
> * {
max-width: 4em;
flex: 1;
}
}
.button-icon.icon-reply {
&:not(.button-icon-disabled):hover,
&.button-icon-active {
color: $fallback--cBlue;
color: var(--cBlue, $fallback--cBlue);
}
}
.button-icon.icon-reply {
&:not(.button-icon-disabled) {
cursor: pointer;
}
}
.status:hover .animated.avatar {
canvas {
display: none;
}
img {
visibility: visible;
}
}
.status {
display: flex;
padding: $status-margin;
&.is-retweet {
padding-top: 0;
}
}
.status-conversation:last-child {
border-bottom: none;
}
.muted {
padding: .25em .6em;
height: 1.2em;
line-height: 1.2em;
text-overflow: ellipsis;
overflow: hidden;
display: flex;
flex-wrap: nowrap;
.username, .mute-thread, .mute-words {
word-wrap: normal;
word-break: normal;
white-space: nowrap;
}
.username, .mute-words {
text-overflow: ellipsis;
overflow: hidden;
}
.username {
flex: 0 1 auto;
margin-right: .2em;
}
.mute-thread {
flex: 0 0 auto;
}
.mute-words {
flex: 1 0 5em;
margin-left: .2em;
&::before {
content: ' '
}
}
.unmute {
flex: 0 0 auto;
margin-left: auto;
display: block;
margin-left: auto;
}
}
.reply-body {
flex: 1;
}
.favs-repeated-users {
margin-top: $status-margin;
.stats {
width: 100%;
display: flex;
line-height: 1em;
.stat-count {
margin-right: $status-margin;
.stat-title {
color: var(--faint, $fallback--faint);
font-size: 12px;
text-transform: uppercase;
position: relative;
}
.stat-number {
font-weight: bolder;
font-size: 16px;
line-height: 1em;
}
}
.avatar-row {
flex: 1;
overflow: hidden;
position: relative;
display: flex;
align-items: center;
&::before {
content: '';
position: absolute;
height: 100%;
width: 1px;
left: 0;
background-color: var(--faint, $fallback--faint);
}
}
}
}
@media all and (max-width: 800px) {
.status-el {
.retweet-info {
.avatar.still-image {
margin-left: 20px;
}
}
}
.status {
max-width: 100%;
}
.status .avatar.still-image {
width: 40px;
height: 40px;
&.avatar-compact {
width: 32px;
height: 32px;
}
}
}
</style>

View file

@ -1,6 +1,6 @@
<template> <template>
<!-- eslint-disable vue/no-v-html --> <!-- eslint-disable vue/no-v-html -->
<div class="status-body"> <div class="StatusContent">
<slot name="header" /> <slot name="header" />
<div <div
v-if="status.summary_html" v-if="status.summary_html"
@ -141,7 +141,7 @@
$status-margin: 0.75em; $status-margin: 0.75em;
.status-body { .StatusContent {
flex: 1; flex: 1;
min-width: 0; min-width: 0;
@ -287,6 +287,7 @@ $status-margin: 0.75em;
white-space: nowrap; white-space: nowrap;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
height: 1.4em;
} }
} }
} }
@ -295,13 +296,4 @@ $status-margin: 0.75em;
color: $fallback--cGreen; color: $fallback--cGreen;
color: var(--postGreentext, $fallback--cGreen); color: var(--postGreentext, $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> </style>

View file

@ -1,7 +1,7 @@
<template> <template>
<Popover <Popover
trigger="hover" trigger="hover"
popover-class="status-popover" popover-class="popover-default status-popover"
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
@show="enter" @show="enter"
> >
@ -52,7 +52,8 @@
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5); box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
box-shadow: var(--popupShadow); box-shadow: var(--popupShadow);
.status-el.status-el { /* TODO cleanup this */
.Status.Status {
border: none; border: none;
} }

View file

@ -35,43 +35,6 @@
display: flex; display: flex;
align-items: center; align-items: center;
&:hover canvas {
display: none;
}
img {
width: 100%;
min-height: 100%;
object-fit: contain;
}
&.animated {
&:hover::before,
img {
visibility: hidden;
}
&:hover img {
visibility: visible
}
&::before {
content: 'gif';
position: absolute;
line-height: 10px;
font-size: 10px;
top: 5px;
left: 5px;
background: rgba(127,127,127,.5);
color: #FFF;
display: block;
padding: 2px 4px;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
z-index: 2;
}
}
canvas { canvas {
position: absolute; position: absolute;
top: 0; top: 0;
@ -81,6 +44,44 @@
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain; object-fit: contain;
visibility: var(--still-image-canvas, visible);
}
img {
width: 100%;
min-height: 100%;
object-fit: contain;
}
&.animated {
&::before {
content: 'gif';
position: absolute;
line-height: 10px;
font-size: 10px;
top: 5px;
left: 5px;
background: rgba(127, 127, 127, 0.5);
color: #fff;
display: block;
padding: 2px 4px;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
z-index: 2;
}
&:hover canvas {
display: none;
}
&:hover::before,
img {
visibility: var(--still-image-img, hidden);
}
&:hover img {
visibility: visible;
}
} }
} }
</style> </style>

View file

@ -1,4 +1,5 @@
import Vue from 'vue' import Vue from 'vue'
import { mapState } from 'vuex'
import './tab_switcher.scss' import './tab_switcher.scss'
@ -44,7 +45,13 @@ export default Vue.component('tab-switcher', {
} else { } else {
return this.active return this.active
} }
} },
settingsModalVisible () {
return this.settingsModalState === 'visible'
},
...mapState({
settingsModalState: state => state.interface.settingsModalState
})
}, },
beforeUpdate () { beforeUpdate () {
const currentSlot = this.$slots.default[this.active] const currentSlot = this.$slots.default[this.active]
@ -134,7 +141,7 @@ export default Vue.component('tab-switcher', {
<div class="tabs"> <div class="tabs">
{tabs} {tabs}
</div> </div>
<div ref="contents" class={'contents' + (this.scrollableTabs ? ' scrollable-tabs' : '')}> <div ref="contents" class={'contents' + (this.scrollableTabs ? ' scrollable-tabs' : '')} v-body-scroll-lock={this.settingsModalVisible}>
{contents} {contents}
</div> </div>
</div> </div>

View file

@ -1,6 +1,7 @@
import Status from '../status/status.vue' import Status from '../status/status.vue'
import timelineFetcher from '../../services/timeline_fetcher/timeline_fetcher.service.js' import timelineFetcher from '../../services/timeline_fetcher/timeline_fetcher.service.js'
import Conversation from '../conversation/conversation.vue' import Conversation from '../conversation/conversation.vue'
import TimelineMenu from '../timeline_menu/timeline_menu.vue'
import { throttle, keyBy } from 'lodash' import { throttle, keyBy } from 'lodash'
export const getExcludedStatusIdsByPinning = (statuses, pinnedStatusIds) => { export const getExcludedStatusIdsByPinning = (statuses, pinnedStatusIds) => {
@ -35,6 +36,11 @@ const Timeline = {
bottomedOut: false bottomedOut: false
} }
}, },
components: {
Status,
Conversation,
TimelineMenu
},
computed: { computed: {
timelineError () { timelineError () {
return this.$store.state.statuses.error return this.$store.state.statuses.error
@ -74,10 +80,6 @@ const Timeline = {
return keyBy(this.pinnedStatusIds) return keyBy(this.pinnedStatusIds)
} }
}, },
components: {
Status,
Conversation
},
created () { created () {
const store = this.$store const store = this.$store
const credentials = store.state.users.currentUser.credentials const credentials = store.state.users.currentUser.credentials

View file

@ -1,9 +1,7 @@
<template> <template>
<div :class="classes.root"> <div :class="[classes.root, 'timeline']">
<div :class="classes.header"> <div :class="classes.header">
<div class="title"> <TimelineMenu v-if="!embedded" />
{{ title }}
</div>
<div <div
v-if="timelineError" v-if="timelineError"
class="loadmore-error alert error" class="loadmore-error alert error"
@ -106,4 +104,16 @@
opacity: 1; opacity: 1;
} }
} }
.timeline-heading {
max-width: 100%;
flex-wrap: nowrap;
.loadmore-button {
flex-shrink: 0;
}
.loadmore-text {
flex-shrink: 0;
line-height: 1em;
}
}
</style> </style>

View file

@ -0,0 +1,57 @@
import Popover from '../popover/popover.vue'
import { mapState } from 'vuex'
// Route -> i18n key mapping, exported andnot in the computed
// because nav panel benefits from the same information.
export const timelineNames = () => {
return {
'friends': 'nav.timeline',
'bookmarks': 'nav.bookmarks',
'dms': 'nav.dms',
'public-timeline': 'nav.public_tl',
'public-external-timeline': 'nav.twkn'
}
}
const TimelineMenu = {
components: {
Popover
},
data () {
return {
isOpen: false
}
},
created () {
if (this.currentUser && this.currentUser.locked) {
this.$store.dispatch('startFetchingFollowRequests')
}
if (timelineNames()[this.$route.name]) {
this.$store.dispatch('setLastTimeline', this.$route.name)
}
},
methods: {
openMenu () {
// $nextTick is too fast, animation won't play back but
// instead starts in fully open position. Low values
// like 1-5 work on fast machines but not on mobile, 25
// seems like a good compromise that plays without significant
// added lag.
setTimeout(() => {
this.isOpen = true
}, 25)
}
},
computed: {
...mapState({
currentUser: state => state.users.currentUser,
privateMode: state => state.instance.private,
federating: state => state.instance.federating
}),
timelineNames () {
return timelineNames()
}
}
}
export default TimelineMenu

View file

@ -0,0 +1,180 @@
<template>
<Popover
trigger="click"
class="timeline-menu"
:class="{ 'open': isOpen }"
:margin="{ left: -15, right: -200 }"
:bound-to="{ x: 'container' }"
popover-class="timeline-menu-popover-wrap"
@show="openMenu"
@close="() => isOpen = false"
>
<div
slot="content"
class="timeline-menu-popover panel panel-default"
>
<ul>
<li v-if="currentUser">
<router-link :to="{ name: 'friends' }">
<i class="button-icon icon-home-2" />{{ $t("nav.timeline") }}
</router-link>
</li>
<li v-if="currentUser">
<router-link :to="{ name: 'bookmarks'}">
<i class="button-icon icon-bookmark" />{{ $t("nav.bookmarks") }}
</router-link>
</li>
<li v-if="currentUser">
<router-link :to="{ name: 'dms', params: { username: currentUser.screen_name } }">
<i class="button-icon icon-mail-alt" />{{ $t("nav.dms") }}
</router-link>
</li>
<li v-if="currentUser || !privateMode">
<router-link :to="{ name: 'public-timeline' }">
<i class="button-icon icon-users" />{{ $t("nav.public_tl") }}
</router-link>
</li>
<li v-if="federating && (currentUser || !privateMode)">
<router-link :to="{ name: 'public-external-timeline' }">
<i class="button-icon icon-globe" />{{ $t("nav.twkn") }}
</router-link>
</li>
</ul>
</div>
<div
slot="trigger"
class="title timeline-menu-title"
>
<span>{{ $t(timelineNames[$route.name]) }}</span>
<i class="icon-down-open" />
</div>
</Popover>
</template>
<script src="./timeline_menu.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.timeline-menu {
flex-shrink: 1;
margin-right: auto;
min-width: 0;
width: 24rem;
.timeline-menu-popover-wrap {
overflow: hidden;
// Match panel heading padding to line up menu with bottom of heading
margin-top: 0.6rem;
padding: 0 15px 15px 15px;
}
.timeline-menu-popover {
width: 24rem;
max-width: 100vw;
margin: 0;
font-size: 1rem;
border-top-right-radius: 0;
border-top-left-radius: 0;
transform: translateY(-100%);
transition: transform 100ms;
}
.panel::after {
border-top-right-radius: 0;
border-top-left-radius: 0;
}
&.open .timeline-menu-popover {
transform: translateY(0);
}
.timeline-menu-title {
margin: 0;
cursor: pointer;
display: flex;
user-select: none;
width: 100%;
span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
i {
margin-left: 0.6em;
flex-shrink: 0;
font-size: 1rem;
transition: transform 100ms;
}
}
&.open .timeline-menu-title i {
color: $fallback--text;
color: var(--panelText, $fallback--text);
transform: rotate(180deg);
}
.panel {
box-shadow: var(--popoverShadow);
}
ul {
list-style: none;
margin: 0;
padding: 0;
}
li {
border-bottom: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
padding: 0;
&:last-child a {
border-bottom-right-radius: $fallback--panelRadius;
border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius);
border-bottom-left-radius: $fallback--panelRadius;
border-bottom-left-radius: var(--panelRadius, $fallback--panelRadius);
}
&:last-child {
border: none;
}
i {
margin: 0 0.5em;
}
}
a {
display: block;
padding: 0.6em 0;
&:hover {
background-color: $fallback--lightBg;
background-color: var(--selectedMenu, $fallback--lightBg);
color: $fallback--link;
color: var(--selectedMenuText, $fallback--link);
--faint: var(--selectedMenuFaintText, $fallback--faint);
--faintLink: var(--selectedMenuFaintLink, $fallback--faint);
--lightText: var(--selectedMenuLightText, $fallback--lightText);
--icon: var(--selectedMenuIcon, $fallback--icon);
}
&.router-link-active {
font-weight: bolder;
background-color: $fallback--lightBg;
background-color: var(--selectedMenu, $fallback--lightBg);
color: $fallback--text;
color: var(--selectedMenuText, $fallback--text);
--faint: var(--selectedMenuFaintText, $fallback--faint);
--faintLink: var(--selectedMenuFaintLink, $fallback--faint);
--lightText: var(--selectedMenuLightText, $fallback--lightText);
--icon: var(--selectedMenuIcon, $fallback--icon);
&:hover {
text-decoration: underline;
}
}
}
}
</style>

View file

@ -0,0 +1,18 @@
const UserListPopover = {
name: 'UserListPopover',
props: [
'users'
],
components: {
Popover: () => import('../popover/popover.vue'),
UserAvatar: () => import('../user_avatar/user_avatar.vue')
},
computed: {
usersCapped () {
return this.users.slice(0, 16)
}
}
}
export default UserListPopover

View file

@ -0,0 +1,71 @@
<template>
<Popover
trigger="hover"
placement="top"
:offset="{ y: 5 }"
>
<template slot="trigger">
<slot />
</template>
<div
slot="content"
class="user-list-popover"
>
<div v-if="users.length">
<div
v-for="(user) in usersCapped"
:key="user.id"
class="user-list-row"
>
<UserAvatar
:user="user"
class="avatar-small"
:compact="true"
/>
<div class="user-list-names">
<!-- eslint-disable vue/no-v-html -->
<span v-html="user.name_html" />
<!-- eslint-enable vue/no-v-html -->
<span class="user-list-screen-name">{{ user.screen_name }}</span>
</div>
</div>
</div>
<div v-else>
<i class="icon-spin4 animate-spin" />
</div>
</div>
</Popover>
</template>
<script src="./user_list_popover.js" ></script>
<style lang="scss">
@import '../../_variables.scss';
.user-list-popover {
padding: 0.5em;
.user-list-row {
padding: 0.25em;
display: flex;
flex-direction: row;
.user-list-names {
display: flex;
flex-direction: column;
margin-left: 0.5em;
min-width: 5em;
img {
width: 1em;
height: 1em;
}
}
.user-list-screen-name {
font-size: 9px;
}
}
}
</style>

View file

@ -2,7 +2,7 @@
<Popover <Popover
class="user-popover-container" class="user-popover-container"
trigger="hover" trigger="hover"
popover-class="user-popover" popover-class="popover-default user-popover"
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
:margin="{ left: 5, right: 5 }" :margin="{ left: 5, right: 5 }"
:delay="200" :delay="200"

View file

@ -146,7 +146,8 @@
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
> .status-el { /* TODO cleanup this */
> .Status {
flex: 1; flex: 1;
} }

View file

@ -95,8 +95,8 @@
"default_vis": "Abast per defecte de les entrades", "default_vis": "Abast per defecte de les entrades",
"delete_account": "Esborra el compte", "delete_account": "Esborra el compte",
"delete_account_description": "Esborra permanentment el teu compte i tots els missatges", "delete_account_description": "Esborra permanentment el teu compte i tots els missatges",
"delete_account_error": "No s'ha pogut esborrar el compte. Si continua el problema, contacta amb l'administració del node", "delete_account_error": "No s'ha pogut esborrar el compte. Si continua el problema, contacta amb l'administració del node.",
"delete_account_instructions": "Confirma que vols esborrar el compte escrivint la teva contrasenya aquí sota", "delete_account_instructions": "Confirma que vols esborrar el compte escrivint la teva contrasenya aquí sota.",
"export_theme": "Desa el tema", "export_theme": "Desa el tema",
"filtering": "Filtres", "filtering": "Filtres",
"filtering_explanation": "Es silenciaran totes les entrades que continguin aquestes paraules. Separa-les per línies", "filtering_explanation": "Es silenciaran totes les entrades que continguin aquestes paraules. Separa-les per línies",
@ -118,7 +118,7 @@
"invalid_theme_imported": "No s'ha entès l'arxiu carregat perquè no és un tema vàlid de Pleroma. No s'ha fet cap canvi als temes actuals.", "invalid_theme_imported": "No s'ha entès l'arxiu carregat perquè no és un tema vàlid de Pleroma. No s'ha fet cap canvi als temes actuals.",
"limited_availability": "No està disponible en aquest navegador", "limited_availability": "No està disponible en aquest navegador",
"links": "Enllaços", "links": "Enllaços",
"lock_account_description": "Restringeix el teu compte només a seguidores aprovades.", "lock_account_description": "Restringeix el teu compte només a seguidores aprovades",
"loop_video": "Reprodueix els vídeos en bucle", "loop_video": "Reprodueix els vídeos en bucle",
"loop_video_silent_only": "Reprodueix en bucles només els vídeos sense so (com els \"GIF\" de Mastodon)", "loop_video_silent_only": "Reprodueix en bucles només els vídeos sense so (com els \"GIF\" de Mastodon)",
"name": "Nom", "name": "Nom",
@ -158,7 +158,7 @@
"streaming": "Carrega automàticament entrades noves quan estigui a dalt de tot", "streaming": "Carrega automàticament entrades noves quan estigui a dalt de tot",
"text": "Text", "text": "Text",
"theme": "Tema", "theme": "Tema",
"theme_help": "Personalitza els colors del tema. Escriu-los en format RGB hexadecimal (#rrggbb)", "theme_help": "Personalitza els colors del tema. Escriu-los en format RGB hexadecimal (#rrggbb).",
"tooltipRadius": "Missatges sobreposats", "tooltipRadius": "Missatges sobreposats",
"user_settings": "Configuració personal", "user_settings": "Configuració personal",
"values": { "values": {

View file

@ -256,7 +256,7 @@
"contrast": { "contrast": {
"hint": "Poměr kontrastu je {ratio}, {level} {context}", "hint": "Poměr kontrastu je {ratio}, {level} {context}",
"level": { "level": {
"aa": "splňuje směrnici úrovně AA (minimální)", "aa": "splňuje směrnici úrovně AA (minimální)",
"aaa": "splňuje směrnici úrovně AAA (doporučováno)", "aaa": "splňuje směrnici úrovně AAA (doporučováno)",
"bad": "nesplňuje žádné směrnice přístupnosti" "bad": "nesplňuje žádné směrnice přístupnosti"
}, },
@ -398,7 +398,6 @@
"reply_to": "Odpověď uživateli", "reply_to": "Odpověď uživateli",
"replies_list": "Odpovědi:" "replies_list": "Odpovědi:"
}, },
"user_card": { "user_card": {
"approve": "Schválit", "approve": "Schválit",
"block": "Blokovat", "block": "Blokovat",
@ -444,7 +443,7 @@
"favorite": "Oblíbit", "favorite": "Oblíbit",
"user_settings": "Uživatelské nastavení" "user_settings": "Uživatelské nastavení"
}, },
"upload":{ "upload": {
"error": { "error": {
"base": "Nahrávání selhalo.", "base": "Nahrávání selhalo.",
"file_too_big": "Soubor je příliš velký [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", "file_too_big": "Soubor je příliš velký [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",

View file

@ -58,7 +58,7 @@
"dms": "Direktnachrichten", "dms": "Direktnachrichten",
"public_tl": "Öffentliche Zeitleiste", "public_tl": "Öffentliche Zeitleiste",
"timeline": "Zeitleiste", "timeline": "Zeitleiste",
"twkn": "Das gesamte bekannte Netzwerk", "twkn": "Bekannte Netzwerk",
"user_search": "Benutzersuche", "user_search": "Benutzersuche",
"search": "Suche", "search": "Suche",
"preferences": "Voreinstellungen", "preferences": "Voreinstellungen",
@ -66,7 +66,7 @@
"who_to_follow": "Wem folgen" "who_to_follow": "Wem folgen"
}, },
"notifications": { "notifications": {
"broken_favorite": "Unbekannte Nachricht, suche danach...", "broken_favorite": "Unbekannte Nachricht, suche danach",
"favorited_you": "favorisierte deine Nachricht", "favorited_you": "favorisierte deine Nachricht",
"followed_you": "folgt dir", "followed_you": "folgt dir",
"load_older": "Ältere Benachrichtigungen laden", "load_older": "Ältere Benachrichtigungen laden",
@ -115,7 +115,7 @@
"registration": "Registrierung", "registration": "Registrierung",
"token": "Einladungsschlüssel", "token": "Einladungsschlüssel",
"captcha": "CAPTCHA", "captcha": "CAPTCHA",
"new_captcha": "Zum Erstellen eines neuen Captcha auf das Bild klicken.", "new_captcha": "Zum Erstellen eines neuen Captcha auf das Bild klicken",
"validations": { "validations": {
"username_required": "darf nicht leer sein", "username_required": "darf nicht leer sein",
"fullname_required": "darf nicht leer sein", "fullname_required": "darf nicht leer sein",
@ -161,7 +161,7 @@
"pad_emoji": "Emojis mit Leerzeichen umrahmen", "pad_emoji": "Emojis mit Leerzeichen umrahmen",
"export_theme": "Farbschema speichern", "export_theme": "Farbschema speichern",
"filtering": "Filtern", "filtering": "Filtern",
"filtering_explanation": "Alle Beiträge, welche 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": "Follower exportieren",
"follow_export_button": "Exportiere deine Follows in eine csv-Datei", "follow_export_button": "Exportiere deine Follows in eine csv-Datei",
"follow_export_processing": "In Bearbeitung. Die Liste steht gleich zum herunterladen bereit.", "follow_export_processing": "In Bearbeitung. Die Liste steht gleich zum herunterladen bereit.",
@ -247,7 +247,7 @@
"streaming": "Aktiviere automatisches Laden (Streaming) von neuen Beiträgen", "streaming": "Aktiviere automatisches Laden (Streaming) von neuen Beiträgen",
"text": "Text", "text": "Text",
"theme": "Farbschema", "theme": "Farbschema",
"theme_help": "Benutze HTML-Farbcodes (#rrggbb) um dein Farbschema anzupassen", "theme_help": "Benutze HTML-Farbcodes (#rrggbb) um dein Farbschema anzupassen.",
"theme_help_v2_1": "Du kannst auch die Farben und die Deckkraft bestimmter Komponenten überschreiben, indem du das Kontrollkästchen umschaltest. Verwende die Schaltfläche \"Alle löschen\", um alle Überschreibungen zurückzusetzen.", "theme_help_v2_1": "Du kannst auch die Farben und die Deckkraft bestimmter Komponenten überschreiben, indem du das Kontrollkästchen umschaltest. Verwende die Schaltfläche \"Alle löschen\", um alle Überschreibungen zurückzusetzen.",
"theme_help_v2_2": "Unter einigen Einträgen befinden sich Symbole für Hintergrund-/Textkontrastindikatoren, für detaillierte Informationen fahre mit der Maus darüber. Bitte beachte, dass bei der Verwendung von Transparenz Kontrastindikatoren den schlechtest möglichen Fall darstellen.", "theme_help_v2_2": "Unter einigen Einträgen befinden sich Symbole für Hintergrund-/Textkontrastindikatoren, für detaillierte Informationen fahre mit der Maus darüber. Bitte beachte, dass bei der Verwendung von Transparenz Kontrastindikatoren den schlechtest möglichen Fall darstellen.",
"tooltipRadius": "Tooltips/Warnungen", "tooltipRadius": "Tooltips/Warnungen",
@ -321,7 +321,7 @@
"always_drop_shadow": "Achtung, dieser Schatten verwendet immer {0}, wenn der Browser dies unterstützt.", "always_drop_shadow": "Achtung, dieser Schatten verwendet immer {0}, wenn der Browser dies unterstützt.",
"drop_shadow_syntax": "{0} unterstützt Parameter {1} und Schlüsselwort {2} nicht.", "drop_shadow_syntax": "{0} unterstützt Parameter {1} und Schlüsselwort {2} nicht.",
"avatar_inset": "Bitte beachte, dass die Kombination von eingesetzten und nicht eingesetzten Schatten auf Avataren zu unerwarteten Ergebnissen bei transparenten Avataren führen kann.", "avatar_inset": "Bitte beachte, dass die Kombination von eingesetzten und nicht eingesetzten Schatten auf Avataren zu unerwarteten Ergebnissen bei transparenten Avataren führen kann.",
"spread_zero": "Schatten mit einer Streuung > 0 erscheinen so, als ob sie auf Null gesetzt wären.", "spread_zero": "Schatten mit einer Streuung > 0 erscheinen so, als ob sie auf Null gesetzt wären",
"inset_classic": "Eingesetzte Schatten werden mit {0} verwendet" "inset_classic": "Eingesetzte Schatten werden mit {0} verwendet"
}, },
"components": { "components": {
@ -375,7 +375,7 @@
"warning_of_generate_new_codes": "Wenn du neue Wiederherstellungs-Codes generierst, werden die alten Codes nicht mehr funktionieren.", "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", "generate_new_recovery_codes": "Generiere neue Wiederherstellungs-Codes",
"title": "Zwei-Faktor Authentifizierung", "title": "Zwei-Faktor Authentifizierung",
"waiting_a_recovery_codes": "Erhalte Wiederherstellungscodes...", "waiting_a_recovery_codes": "Erhalte Wiederherstellungscodes",
"authentication_methods": "Authentifizierungsmethoden", "authentication_methods": "Authentifizierungsmethoden",
"scan": { "scan": {
"title": "Scan", "title": "Scan",
@ -407,7 +407,7 @@
"conversation": "Unterhaltung", "conversation": "Unterhaltung",
"error_fetching": "Fehler beim Laden", "error_fetching": "Fehler beim Laden",
"load_older": "Lade ältere Beiträge", "load_older": "Lade ältere Beiträge",
"no_retweet_hint": "Der Beitrag ist als nur-für-Follower oder als Direktnachricht markiert und kann nicht wiederholt werden.", "no_retweet_hint": "Der Beitrag ist als nur-für-Follower oder als Direktnachricht markiert und kann nicht wiederholt werden",
"repeated": "wiederholte", "repeated": "wiederholte",
"show_new": "Zeige Neuere", "show_new": "Zeige Neuere",
"up_to_date": "Aktuell" "up_to_date": "Aktuell"
@ -481,7 +481,7 @@
"not_found": "Benutzername/E-Mail-Adresse nicht gefunden. Vertippt?", "not_found": "Benutzername/E-Mail-Adresse nicht gefunden. Vertippt?",
"too_many_requests": "Kurze Pause. Zu viele Versuche. Bitte, später nochmal probieren.", "too_many_requests": "Kurze Pause. Zu viele Versuche. Bitte, später nochmal probieren.",
"password_reset_disabled": "Passwortzurücksetzen deaktiviert. Bitte Administrator kontaktieren.", "password_reset_disabled": "Passwortzurücksetzen deaktiviert. Bitte Administrator kontaktieren.",
"password_reset_required": "Passwortzurücksetzen erforderlich", "password_reset_required": "Passwortzurücksetzen erforderlich.",
"password_reset_required_but_mailer_is_disabled": "Passwortzurücksetzen wäre erforderlich, ist aber deaktiviert. Bitte Administrator kontaktieren." "password_reset_required_but_mailer_is_disabled": "Passwortzurücksetzen wäre erforderlich, ist aber deaktiviert. Bitte Administrator kontaktieren."
}, },
"about": { "about": {
@ -516,9 +516,9 @@
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Stummschalten", "mute": "Stummschalten",
"mute_progress": "Wird stummgeschaltet..", "mute_progress": "Wird stummgeschaltet",
"unmute": "Stummschaltung aufheben", "unmute": "Stummschaltung aufheben",
"unmute_progress": "Stummschaltung wird aufgehoben.." "unmute_progress": "Stummschaltung wird aufgehoben"
}, },
"exporter": { "exporter": {
"export": "Exportieren", "export": "Exportieren",

View file

@ -29,8 +29,8 @@
}, },
"staff": "Staff" "staff": "Staff"
}, },
"chat": { "shoutbox": {
"title": "Chat" "title": "Shoutbox"
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Mute", "mute": "Mute",
@ -120,12 +120,13 @@
"dms": "Direct Messages", "dms": "Direct Messages",
"public_tl": "Public Timeline", "public_tl": "Public Timeline",
"timeline": "Timeline", "timeline": "Timeline",
"twkn": "The Whole Known Network", "twkn": "Known Network",
"bookmarks": "Bookmarks", "bookmarks": "Bookmarks",
"user_search": "User Search", "user_search": "User Search",
"search": "Search", "search": "Search",
"who_to_follow": "Who to follow", "who_to_follow": "Who to follow",
"preferences": "Preferences", "preferences": "Preferences",
"timelines": "Timelines",
"chats": "Chats" "chats": "Chats"
}, },
"notifications": { "notifications": {

View file

@ -5,14 +5,15 @@
"features_panel": { "features_panel": {
"chat": "Babilejo", "chat": "Babilejo",
"gopher": "Gopher", "gopher": "Gopher",
"media_proxy": "Aŭdvidaĵa prokurilo", "media_proxy": "Vidaŭdaĵa prokurilo",
"scope_options": "Agordoj de amplekso", "scope_options": "Agordoj de amplekso",
"text_limit": "Teksta limo", "text_limit": "Limo de teksto",
"title": "Funkcioj", "title": "Funkcioj",
"who_to_follow": "Kiun aboni" "who_to_follow": "Kiun aboni",
"pleroma_chat_messages": "Babilejo de Pleroma"
}, },
"finder": { "finder": {
"error_fetching_user": "Eraro alportante uzanton", "error_fetching_user": "Eraris alporto de uzanto",
"find_user": "Trovi uzanton" "find_user": "Trovi uzanton"
}, },
"general": { "general": {
@ -20,12 +21,25 @@
"submit": "Sendi", "submit": "Sendi",
"more": "Pli", "more": "Pli",
"generic_error": "Eraro okazis", "generic_error": "Eraro okazis",
"optional": "Malnepra" "optional": "malnepra",
"close": "Fermi",
"verify": "Kontroli",
"confirm": "Konfirmi",
"enable": "Ŝalti",
"disable": "Malŝalti",
"cancel": "Nuligi",
"dismiss": "Forlasi",
"show_less": "Montri malplion",
"show_more": "Montri plion",
"retry": "Reprovi",
"error_retry": "Bonvolu reprovi",
"loading": "Enlegante…"
}, },
"image_cropper": { "image_cropper": {
"crop_picture": "Tondi bildon", "crop_picture": "Tondi bildon",
"save": "Konservi", "save": "Konservi",
"cancel": "Nuligi" "cancel": "Nuligi",
"save_without_cropping": "Konservi sen tondado"
}, },
"login": { "login": {
"login": "Saluti", "login": "Saluti",
@ -34,8 +48,16 @@
"password": "Pasvorto", "password": "Pasvorto",
"placeholder": "ekz. lain", "placeholder": "ekz. lain",
"register": "Registriĝi", "register": "Registriĝi",
"username": "Salutnomo", "username": "Uzantonomo",
"hint": "Salutu por partopreni la diskutadon" "hint": "Salutu por partopreni la diskutadon",
"heading": {
"recovery": "Rehavo de duobla aŭtentikigo",
"totp": "Duobla aŭtentikigo"
},
"recovery_code": "Rehava kodo",
"enter_two_factor_code": "Enigu kodon de duobla aŭtentikigo",
"enter_recovery_code": "Enigu rehavan kodon",
"authentication_code": "Aŭtentikiga kodo"
}, },
"media_modal": { "media_modal": {
"previous": "Antaŭa", "previous": "Antaŭa",
@ -45,7 +67,7 @@
"about": "Pri", "about": "Pri",
"back": "Reen", "back": "Reen",
"chat": "Loka babilejo", "chat": "Loka babilejo",
"friend_requests": "Abonaj petoj", "friend_requests": "Petoj pri abono",
"mentions": "Mencioj", "mentions": "Mencioj",
"dms": "Rektaj mesaĝoj", "dms": "Rektaj mesaĝoj",
"public_tl": "Publika tempolinio", "public_tl": "Publika tempolinio",
@ -53,7 +75,12 @@
"twkn": "La tuta konata reto", "twkn": "La tuta konata reto",
"user_search": "Serĉi uzantojn", "user_search": "Serĉi uzantojn",
"who_to_follow": "Kiun aboni", "who_to_follow": "Kiun aboni",
"preferences": "Agordoj" "preferences": "Agordoj",
"chats": "Babiloj",
"search": "Serĉi",
"interactions": "Interagoj",
"administration": "Administrado",
"bookmarks": "Legosignoj"
}, },
"notifications": { "notifications": {
"broken_favorite": "Nekonata stato, serĉante ĝin…", "broken_favorite": "Nekonata stato, serĉante ĝin…",
@ -63,15 +90,21 @@
"notifications": "Sciigoj", "notifications": "Sciigoj",
"read": "Legite!", "read": "Legite!",
"repeated_you": "ripetis vian staton", "repeated_you": "ripetis vian staton",
"no_more_notifications": "Neniuj pliaj sciigoj" "no_more_notifications": "Neniuj pliaj sciigoj",
"reacted_with": "reagis per {0}",
"migrated_to": "migris al",
"follow_request": "volas vin aboni"
}, },
"post_status": { "post_status": {
"new_status": "Afiŝi novan staton", "new_status": "Afiŝi novan staton",
"account_not_locked_warning": "Via konto ne estas {0}. Iu ajn povas vin aboni por vidi viajn afiŝoj nur por abonantoj.", "account_not_locked_warning": "Via konto ne estas {0}. Iu ajn povas vin aboni por vidi viajn afiŝoj nur por abonantoj.",
"account_not_locked_warning_link": "ŝlosita", "account_not_locked_warning_link": "ŝlosita",
"attachments_sensitive": "Marki kunsendaĵojn kiel konsternajn", "attachments_sensitive": "Marki kunsendaĵojn konsternaj",
"content_type": { "content_type": {
"text/plain": "Plata teksto" "text/plain": "Plata teksto",
"text/bbcode": "BBCode",
"text/markdown": "Markdown",
"text/html": "HTML"
}, },
"content_warning": "Temo (malnepra)", "content_warning": "Temo (malnepra)",
"default": "Ĵus alvenis al la Universala Kongreso!", "default": "Ĵus alvenis al la Universala Kongreso!",
@ -82,7 +115,19 @@
"private": "Nur abonantoj Afiŝi nur al abonantoj", "private": "Nur abonantoj Afiŝi nur al abonantoj",
"public": "Publika Afiŝi al publikaj tempolinioj", "public": "Publika Afiŝi al publikaj tempolinioj",
"unlisted": "Nelistigita Ne afiŝi al publikaj tempolinioj" "unlisted": "Nelistigita Ne afiŝi al publikaj tempolinioj"
} },
"scope_notice": {
"unlisted": "Ĉi tiu afiŝo ne estos videbla en la Publika historio kaj La tuta konata reto",
"private": "Ĉi tiu afiŝo estos videbla nur al viaj abonantoj",
"public": "Ĉi tiu afiŝo estos videbla al ĉiuj"
},
"media_description_error": "Malsukcesis afiŝo de vidaŭdaĵoj; reprovu",
"empty_status_error": "Ne povas afiŝi malplenan staton sen dosieroj",
"preview_empty": "Malplena",
"preview": "Antaŭrigardo",
"direct_warning_to_first_only": "Ĉi tiu afiŝo estas nur videbla al uzantoj menciitaj je la komenco de la mesaĝo.",
"direct_warning_to_all": "Ĉi tiu afiŝo estos videbla al ĉiuj menciitaj uzantoj.",
"media_description": "Priskribo de vidaŭdaĵo"
}, },
"registration": { "registration": {
"bio": "Priskribo", "bio": "Priskribo",
@ -92,10 +137,10 @@
"registration": "Registriĝo", "registration": "Registriĝo",
"token": "Invita ĵetono", "token": "Invita ĵetono",
"captcha": "TESTO DE HOMECO", "captcha": "TESTO DE HOMECO",
"new_captcha": "Alklaku la bildon por akiri novan teston", "new_captcha": "Klaku la bildon por akiri novan teston",
"username_placeholder": "ekz. lain", "username_placeholder": "ekz. lain",
"fullname_placeholder": "ekz. Lain Iwakura", "fullname_placeholder": "ekz. Lain Iwakura",
"bio_placeholder": "ekz.\nSaluton, mi estas Lain\nMi estas animea knabino vivante en Japanujo. Eble vi konas min de la retejo «Wired».", "bio_placeholder": "ekz.\nSaluton, mi estas Lain.\nMi estas animea knabino vivanta en Japanujo. Eble vi konas min pro la retejo «Wired».",
"validations": { "validations": {
"username_required": "ne povas resti malplena", "username_required": "ne povas resti malplena",
"fullname_required": "ne povas resti malplena", "fullname_required": "ne povas resti malplena",
@ -114,47 +159,47 @@
"avatarRadius": "Profilbildoj", "avatarRadius": "Profilbildoj",
"background": "Fono", "background": "Fono",
"bio": "Priskribo", "bio": "Priskribo",
"blocks_tab": "Baroj", "blocks_tab": "Blokitoj",
"btnRadius": "Butonoj", "btnRadius": "Butonoj",
"cBlue": "Blua (Respondo, abono)", "cBlue": "Blua (respondi, aboni)",
"cGreen": "Verda (Kunhavigo)", "cGreen": "Verda (kunhavigi)",
"cOrange": "Oranĝa (Ŝato)", "cOrange": "Oranĝa (ŝati)",
"cRed": "Ruĝa (Nuligo)", "cRed": "Ruĝa (nuligi)",
"change_password": "Ŝanĝi pasvorton", "change_password": "Ŝanĝi pasvorton",
"change_password_error": "Okazis eraro dum ŝanĝo de via pasvorto.", "change_password_error": "Eraris ŝanĝo de via pasvorto.",
"changed_password": "Pasvorto sukcese ŝanĝiĝis!", "changed_password": "Pasvorto sukcese ŝanĝiĝis!",
"collapse_subject": "Maletendi afiŝojn kun temoj", "collapse_subject": "Maletendi afiŝojn kun temoj",
"composing": "Verkante", "composing": "Verkado",
"confirm_new_password": "Konfirmu novan pasvorton", "confirm_new_password": "Konfirmu novan pasvorton",
"current_avatar": "Via nuna profilbildo", "current_avatar": "Via nuna profilbildo",
"current_password": "Nuna pasvorto", "current_password": "Nuna pasvorto",
"current_profile_banner": "Via nuna profila rubando", "current_profile_banner": "Via nuna profila rubando",
"data_import_export_tab": "Enporto / Elporto de datenoj", "data_import_export_tab": "Enporto / Elporto de datumoj",
"default_vis": "Implicita videbleca amplekso", "default_vis": "Implicita amplekso de vidibleco",
"delete_account": "Forigi konton", "delete_account": "Forigi konton",
"delete_account_description": "Por ĉiam forigi vian konton kaj ĉiujn viajn mesaĝojn", "delete_account_description": "Por ĉiam forigi viajn datumojn kaj malaktivigi vian konton.",
"delete_account_error": "Okazis eraro dum forigo de via kanto. Se tio daŭre okazados, bonvolu kontakti la administranton de via nodo.", "delete_account_error": "Eraris forigo de via kanto. Se tio daŭre ripetiĝos, bonvolu kontakti la administranton de via nodo.",
"delete_account_instructions": "Entajpu sube vian pasvorton por konfirmi forigon de konto.", "delete_account_instructions": "Entajpu sube vian pasvorton por konfirmi forigon de konto.",
"avatar_size_instruction": "La rekomendata malpleja grando de profilbildoj estas 150×150 bilderoj.", "avatar_size_instruction": "La rekomendata minimuma grando de profilbildoj estas 150×150 bilderoj.",
"export_theme": "Konservi antaŭagordon", "export_theme": "Konservi antaŭagordon",
"filtering": "Filtrado", "filtering": "Filtrado",
"filtering_explanation": "Ĉiuj statoj kun tiuj ĉi vortoj silentiĝos, po unu linio", "filtering_explanation": "Ĉiuj statoj kun tiuj ĉi vortoj silentiĝos; skribu po unu linie",
"follow_export": "Abona elporto", "follow_export": "Elporto de abonoj",
"follow_export_button": "Elporti viajn abonojn al CSV-dosiero", "follow_export_button": "Elporti viajn abonojn al CSV-dosiero",
"follow_export_processing": "Traktante; baldaŭ vi ricevos peton elŝuti la dosieron", "follow_export_processing": "Traktante; baldaŭ vi ricevos peton elŝuti la dosieron",
"follow_import": "Abona enporto", "follow_import": "Enporto de abonoj",
"follow_import_error": "Eraro enportante abonojn", "follow_import_error": "Eraro enportante abonojn",
"follows_imported": "Abonoj enportiĝis! Traktado daŭros iom.", "follows_imported": "Abonoj enportiĝis! Traktado daŭros iom da tempo.",
"foreground": "Malfono", "foreground": "Malfono",
"general": "Ĝenerala", "general": "Ĝenerala",
"hide_attachments_in_convo": "Kaŝi kunsendaĵojn en interparoloj", "hide_attachments_in_convo": "Kaŝi kunsendaĵojn en interparoloj",
"hide_attachments_in_tl": "Kaŝi kunsendaĵojn en tempolinio", "hide_attachments_in_tl": "Kaŝi kunsendaĵojn en tempolinio",
"max_thumbnails": "Plej multa nombro da bildetoj po afiŝo", "max_thumbnails": "Maksimuma nombro da bildetoj en afiŝo",
"hide_isp": "Kaŝi nodo-propran breton", "hide_isp": "Kaŝi breton propran al nodo",
"preload_images": "Antaŭ-enlegi bildojn", "preload_images": "Antaŭ-enlegi bildojn",
"use_one_click_nsfw": "Malfermi konsternajn kunsendaĵojn per nur unu klako", "use_one_click_nsfw": "Malfermi konsternajn kunsendaĵojn per nur unu klako",
"hide_post_stats": "Kaŝi statistikon de afiŝoj (ekz. nombron da ŝatoj)", "hide_post_stats": "Kaŝi statistikon de afiŝoj (ekz. nombron de ŝatoj)",
"hide_user_stats": "Kaŝi statistikon de uzantoj (ekz. nombron da abonantoj)", "hide_user_stats": "Kaŝi statistikon de uzantoj (ekz. nombron de abonantoj)",
"hide_filtered_statuses": "Kaŝi filtritajn statojn", "hide_filtered_statuses": "Kaŝi filtritajn statojn",
"import_followers_from_a_csv_file": "Enporti abonojn el CSV-dosiero", "import_followers_from_a_csv_file": "Enporti abonojn el CSV-dosiero",
"import_theme": "Enlegi antaŭagordojn", "import_theme": "Enlegi antaŭagordojn",
@ -169,9 +214,9 @@
"links": "Ligiloj", "links": "Ligiloj",
"lock_account_description": "Limigi vian konton al nur abonantoj aprobitaj", "lock_account_description": "Limigi vian konton al nur abonantoj aprobitaj",
"loop_video": "Ripetadi filmojn", "loop_video": "Ripetadi filmojn",
"loop_video_silent_only": "Ripetadi nur filmojn sen sono (ekz. la \"GIF-ojn\" de Mastodon)", "loop_video_silent_only": "Ripetadi nur filmojn sen sono (ekz. la «GIF-ojn» de Mastodon)",
"mutes_tab": "Silentigoj", "mutes_tab": "Silentigoj",
"play_videos_in_modal": "Ludi filmojn rekte en la aŭdvidaĵa spektilo", "play_videos_in_modal": "Ludi filmojn en ŝpruca kadro",
"use_contain_fit": "Ne tondi la kunsendaĵon en bildetoj", "use_contain_fit": "Ne tondi la kunsendaĵon en bildetoj",
"name": "Nomo", "name": "Nomo",
"name_bio": "Nomo kaj priskribo", "name_bio": "Nomo kaj priskribo",
@ -182,50 +227,50 @@
"notification_visibility_mentions": "Mencioj", "notification_visibility_mentions": "Mencioj",
"notification_visibility_repeats": "Ripetoj", "notification_visibility_repeats": "Ripetoj",
"no_rich_text_description": "Forigi riĉtekstajn formojn de ĉiuj afiŝoj", "no_rich_text_description": "Forigi riĉtekstajn formojn de ĉiuj afiŝoj",
"no_blocks": "Neniuj baroj", "no_blocks": "Neniuj blokitoj",
"no_mutes": "Neniuj silentigoj", "no_mutes": "Neniuj silentigoj",
"hide_follows_description": "Ne montri kiun mi sekvas", "hide_follows_description": "Ne montri kiun mi sekvas",
"hide_followers_description": "Ne montri kiu min sekvas", "hide_followers_description": "Ne montri kiu min sekvas",
"show_admin_badge": "Montri la insignon de administranto en mia profilo", "show_admin_badge": "Montri la insignon de administranto en mia profilo",
"show_moderator_badge": "Montri la insignon de kontrolanto en mia profilo", "show_moderator_badge": "Montri la insignon de reguligisto en mia profilo",
"nsfw_clickthrough": "Ŝalti traklakan kaŝon de konsternaj kunsendaĵoj", "nsfw_clickthrough": "Ŝalti traklakan kaŝadon de konsternaj kunsendaĵoj",
"oauth_tokens": "Ĵetonoj de OAuth", "oauth_tokens": "Ĵetonoj de OAuth",
"token": "Ĵetono", "token": "Ĵetono",
"refresh_token": "Ĵetono de novigo", "refresh_token": "Ĵetono de aktualigo",
"valid_until": "Valida ĝis", "valid_until": "Valida ĝis",
"revoke_token": "Senvalidigi", "revoke_token": "Senvalidigi",
"panelRadius": "Bretoj", "panelRadius": "Bretoj",
"pause_on_unfocused": "Paŭzigi elsendfluon kiam langeto ne estas fokusata", "pause_on_unfocused": "Paŭzigi elsendfluon kiam langeto ne estas fokusata",
"presets": "Antaŭagordoj", "presets": "Antaŭagordoj",
"profile_background": "Profila fono", "profile_background": "Fono de profilo",
"profile_banner": "Profila rubando", "profile_banner": "Rubando de profilo",
"profile_tab": "Profilo", "profile_tab": "Profilo",
"radii_help": "Agordi fasadan rondigon de randoj (bildere)", "radii_help": "Agordi fasadan rondigon de randoj (bildere)",
"replies_in_timeline": "Respondoj en tempolinio", "replies_in_timeline": "Respondoj en tempolinio",
"reply_visibility_all": "Montri ĉiujn respondojn", "reply_visibility_all": "Montri ĉiujn respondojn",
"reply_visibility_following": "Montri nur respondojn por mi aŭ miaj abonatoj", "reply_visibility_following": "Montri nur respondojn por mi aŭ miaj abonatoj",
"reply_visibility_self": "Montri nur respondojn por mi", "reply_visibility_self": "Montri nur respondojn por mi",
"saving_err": "Eraro dum konservo de agordoj", "saving_err": "Eraris konservado de agordoj",
"saving_ok": "Agordoj konserviĝis", "saving_ok": "Agordoj konserviĝis",
"security_tab": "Sekureco", "security_tab": "Sekureco",
"scope_copy": "Kopii amplekson por respondo (rektaj mesaĝoj ĉiam kopiiĝas)", "scope_copy": "Kopii amplekson por respondo (rektaj mesaĝoj ĉiam kopiiĝas)",
"set_new_avatar": "Agordi novan profilbildon", "set_new_avatar": "Agordi novan profilbildon",
"set_new_profile_background": "Agordi novan profilan fonon", "set_new_profile_background": "Agordi novan fonon de profilo",
"set_new_profile_banner": "Agordi novan profilan rubandon", "set_new_profile_banner": "Agordi novan rubandon de profilo",
"settings": "Agordoj", "settings": "Agordoj",
"subject_input_always_show": "Ĉiam montri teman kampon", "subject_input_always_show": "Ĉiam montri kampon de temo",
"subject_line_behavior": "Kopii temon por respondo", "subject_line_behavior": "Kopii temon dum respondado",
"subject_line_email": "Kiel retpoŝto: \"re: temo\"", "subject_line_email": "Kiel retpoŝto: «re: temo»",
"subject_line_mastodon": "Kiel Mastodon: kopii senŝanĝe", "subject_line_mastodon": "Kiel Mastodon: kopii senŝanĝe",
"subject_line_noop": "Ne kopii", "subject_line_noop": "Ne kopii",
"post_status_content_type": "Afiŝi specon de la enhavo de la stato", "post_status_content_type": "Afiŝi specon de la enhavo de la stato",
"stop_gifs": "Movi GIF-bildojn dum musa ŝvebo", "stop_gifs": "Movi GIF-bildojn dum ŝvebo de muso",
"streaming": "Ŝalti memfaran fluigon de novaj afiŝoj ĉe la supro de la paĝo", "streaming": "Ŝalti memagan fluigon de novaj afiŝoj kiam vi vidas la supron de la paĝo",
"text": "Teksto", "text": "Teksto",
"theme": "Haŭto", "theme": "Haŭto",
"theme_help": "Uzu deksesumajn kolorkodojn (#rrvvbb) por adapti vian koloran haŭton.", "theme_help": "Uzu deksesumajn kolorkodojn (#rrvvbb) por adapti vian koloran haŭton.",
"theme_help_v2_1": "Vi ankaŭ povas superagordi la kolorojn kaj travideblecon de kelkaj eroj per marko de la markbutono; uzu la butonon \"Vakigi ĉion\" por forigi ĉîujn superagordojn.", "theme_help_v2_1": "Vi ankaŭ povas superagordi la kolorojn kaj travideblecon de kelkaj eroj per marko de la markbutono; uzu la butonon «Vakigi ĉion» por forigi ĉîujn superagordojn.",
"theme_help_v2_2": "Bildsimboloj sub kelkaj eroj estas indikiloj de kontrasto inter fono kaj teksto; muse ŝvebu por detalaj informoj. Bonvolu memori, ke la indikilo montras la plej malbonan okazeblon dum sia uzo.", "theme_help_v2_2": "Bildsimboloj sub kelkaj eroj estas indikiloj de kontrasto inter fono kaj teksto; ŝvebigu muson por detalaj informoj. Bonvolu memori, ke la indikilo montras la plej malbonan okazeblon dum sia uzo.",
"tooltipRadius": "Ŝpruchelpiloj/avertoj", "tooltipRadius": "Ŝpruchelpiloj/avertoj",
"upload_a_photo": "Alŝuti foton", "upload_a_photo": "Alŝuti foton",
"user_settings": "Agordoj de uzanto", "user_settings": "Agordoj de uzanto",
@ -234,7 +279,7 @@
"true": "jes" "true": "jes"
}, },
"notifications": "Sciigoj", "notifications": "Sciigoj",
"enable_web_push_notifications": "Ŝalti retajn pajn sciigojn", "enable_web_push_notifications": "Ŝalti retajn pasivajn sciigojn",
"style": { "style": {
"switcher": { "switcher": {
"keep_color": "Konservi kolorojn", "keep_color": "Konservi kolorojn",
@ -242,10 +287,22 @@
"keep_opacity": "Konservi maltravideblecon", "keep_opacity": "Konservi maltravideblecon",
"keep_roundness": "Konservi rondecon", "keep_roundness": "Konservi rondecon",
"keep_fonts": "Konservi tiparojn", "keep_fonts": "Konservi tiparojn",
"save_load_hint": "Elektebloj de \"konservi\" konservas la nuntempajn agordojn dum elektado aŭ enlegado de haŭtoj. Ĝi ankaŭ konservas tiujn agordojn dum elportado de haŭto. Kun ĉiuj markbutonoj nemarkitaj, elporto de la haŭto ĉion konservos.", "save_load_hint": "Elektebloj de «konservi» konservas la nuntempajn agordojn dum elektado aŭ enlegado de haŭtoj. Ĝi ankaŭ konservas tiujn agordojn dum elportado de haŭto. Kun ĉiuj markbutonoj nemarkitaj, elporto de la haŭto ĉion konservos.",
"reset": "Restarigi", "reset": "Restarigi",
"clear_all": "Vakigi ĉion", "clear_all": "Vakigi ĉion",
"clear_opacity": "Vakigi maltravideblecon" "clear_opacity": "Vakigi maltravideblecon",
"help": {
"fe_downgraded": "Versio de PleromaFE reen iris.",
"fe_upgraded": "La motoro de haŭtoj de PleromaFE ĝisdatiĝis post ĝisdatigo de la versio.",
"older_version_imported": "La enportita dosiero estis farita per pli malnova versio de PleromaFE.",
"future_version_imported": "La enportita dosiero estis farita per pli nova versio de PleromaFE.",
"v2_imported": "La dosiero, kiun vi enportis, estis farita por malnova versio de PleromaFE. Ni provas maksimumigi interkonformecon, sed tamen eble montriĝos misoj.",
"upgraded_from_v2": "PleromaFE estis ĝisdatigita; la haŭto eble aspektos malsame ol kiel vi ĝin memoras."
},
"use_source": "Nova versio",
"use_snapshot": "Malnova versio",
"keep_as_is": "Teni senŝanĝa",
"load_theme": "Enlegi haŭton"
}, },
"common": { "common": {
"color": "Koloro", "color": "Koloro",
@ -253,7 +310,7 @@
"contrast": { "contrast": {
"hint": "Proporcio de kontrasto estas {ratio}, ĝi {level} {context}", "hint": "Proporcio de kontrasto estas {ratio}, ĝi {level} {context}",
"level": { "level": {
"aa": "plenumas la gvidilon je nivelo AA (malpleja)", "aa": "plenumas la gvidilon je nivelo AA (minimuma)",
"aaa": "plenumas la gvidilon je nivela AAA (rekomendita)", "aaa": "plenumas la gvidilon je nivela AAA (rekomendita)",
"bad": "plenumas neniujn faciluzajn gvidilojn" "bad": "plenumas neniujn faciluzajn gvidilojn"
}, },
@ -266,21 +323,39 @@
"common_colors": { "common_colors": {
"_tab_label": "Komunaj", "_tab_label": "Komunaj",
"main": "Komunaj koloroj", "main": "Komunaj koloroj",
"foreground_hint": "Vidu langeton \"Specialaj\" por pli detalaj agordoj", "foreground_hint": "Vidu langeton «Specialaj» por pli detalaj agordoj",
"rgbo": "Bildsimboloj, emfazoj, insignoj" "rgbo": "Bildsimboloj, emfazoj, insignoj"
}, },
"advanced_colors": { "advanced_colors": {
"_tab_label": "Specialaj", "_tab_label": "Specialaj",
"alert": "Averta fono", "alert": "Fono de averto",
"alert_error": "Eraro", "alert_error": "Eraro",
"badge": "Insigna fono", "badge": "Fono de insigno",
"badge_notification": "Sciigo", "badge_notification": "Sciigo",
"panel_header": "Kapo de breto", "panel_header": "Kapo de breto",
"top_bar": "Supra breto", "top_bar": "Supra breto",
"borders": "Limoj", "borders": "Limoj",
"buttons": "Butonoj", "buttons": "Butonoj",
"inputs": "Enigaj kampoj", "inputs": "Enigaj kampoj",
"faint_text": "Malvigla teksto" "faint_text": "Malvigla teksto",
"chat": {
"border": "Limo",
"outgoing": "Eliraj",
"incoming": "Envenaj"
},
"tabs": "Langetoj",
"disabled": "Malŝaltita",
"selectedMenu": "Elektita menuero",
"selectedPost": "Elektita afiŝo",
"pressed": "Premita",
"highlight": "Emfazitaj eroj",
"icons": "Bildsimboloj",
"poll": "Grafo de enketo",
"underlay": "Subtavolo",
"popover": "Ŝpruchelpiloj, menuoj",
"post": "Afiŝoj/Priskriboj de uzantoj",
"alert_neutral": "Neŭtrala",
"alert_warning": "Averto"
}, },
"radii": { "radii": {
"_tab_label": "Rondeco" "_tab_label": "Rondeco"
@ -295,7 +370,7 @@
"inset": "Internigo", "inset": "Internigo",
"hint": "Por ombroj vi ankaŭ povas uzi --variable kiel koloran valoron, por uzi variantojn de CSS3. Bonvolu rimarki, ke tiuokaze agordoj de maltravidebleco ne funkcios.", "hint": "Por ombroj vi ankaŭ povas uzi --variable kiel koloran valoron, por uzi variantojn de CSS3. Bonvolu rimarki, ke tiuokaze agordoj de maltravidebleco ne funkcios.",
"filter_hint": { "filter_hint": {
"always_drop_shadow": "Averto: ĉi tiu ombro ĉiam uzas {0} kiam la foliumilo ĝin subtenas.", "always_drop_shadow": "Averto: ĉi tiu ombro ĉiam uzas {0} kiam la foliumilo tion subtenas.",
"drop_shadow_syntax": "{0} ne subtenas parametron {1} kaj ŝlosilvorton {2}.", "drop_shadow_syntax": "{0} ne subtenas parametron {1} kaj ŝlosilvorton {2}.",
"avatar_inset": "Bonvolu rimarki, ke agordi ambaŭ internajn kaj eksterajn ombrojn por profilbildoj povas redoni neatenditajn rezultojn ĉe profilbildoj travideblaj.", "avatar_inset": "Bonvolu rimarki, ke agordi ambaŭ internajn kaj eksterajn ombrojn por profilbildoj povas redoni neatenditajn rezultojn ĉe profilbildoj travideblaj.",
"spread_zero": "Ombroj kun vastigo > 0 aperos kvazaŭ ĝi estus fakte nulo", "spread_zero": "Ombroj kun vastigo > 0 aperos kvazaŭ ĝi estus fakte nulo",
@ -311,13 +386,13 @@
"button": "Butono", "button": "Butono",
"buttonHover": "Butono (je ŝvebo)", "buttonHover": "Butono (je ŝvebo)",
"buttonPressed": "Butono (premita)", "buttonPressed": "Butono (premita)",
"buttonPressedHover": "Butono (premita je ŝvebo)", "buttonPressedHover": "Butono (premita kaj je ŝvebo)",
"input": "Eniga kampo" "input": "Eniga kampo"
} }
}, },
"fonts": { "fonts": {
"_tab_label": "Tiparoj", "_tab_label": "Tiparoj",
"help": "Elektu tiparon uzotan por eroj de la fasado. Por \"propra\" vi devas enigi la precizan nomon de tiparo tiel, kiel ĝi aperas en la sistemo", "help": "Elektu tiparon uzotan por eroj de la fasado. Por «propra» vi devas enigi la precizan nomon de tiparo tiel, kiel ĝi aperas en la sistemo.",
"components": { "components": {
"interface": "Fasado", "interface": "Fasado",
"input": "Enigaj kampoj", "input": "Enigaj kampoj",
@ -343,66 +418,175 @@
"checkbox": "Mi legetis la kondiĉojn de uzado", "checkbox": "Mi legetis la kondiĉojn de uzado",
"link": "bela eta ligil" "link": "bela eta ligil"
} }
} },
"discoverable": "Permesi trovon de ĉi tiu konto en serĉrezultoj kaj aliaj servoj",
"mutes_and_blocks": "Silentigitoj kaj blokitoj",
"chatMessageRadius": "Babileja mesaĝo",
"changed_email": "Retpoŝtadreso sukcese ŝanĝiĝis!",
"change_email_error": "Eraris ŝanĝo de via retpoŝtadreso.",
"change_email": "Ŝanĝi retpoŝtadreson",
"bot": "Ĉi tio estas robota konto",
"blocks_imported": "Blokitoj enportiĝis! Traktado daŭros iom da tempo.",
"block_import_error": "Eraris enporto de blokitoj",
"block_export": "Elporto de blokitoj",
"block_import": "Enporto de blokitoj",
"block_export_button": "Elporti viajn blokitojn al CSV-dosiero",
"allow_following_move": "Permesi memagan abonadon kiam abonata konto migras",
"mfa": {
"verify": {
"desc": "Por ŝalti duoblan aŭtentikigon, enigu la kodon el via aplikaĵo por duobla aŭtentikigo:"
},
"scan": {
"secret_code": "Ŝlosilo",
"desc": "Uzante vian aplikaĵon por duobla aŭtentikigo, skanu ĉi tiun rapidrespondan kodon aŭ enigu tekstan ŝlosilon:",
"title": "Skani"
},
"authentication_methods": "Metodoj de aŭtentikigo",
"recovery_codes_warning": "Notu la kodojn aŭ konservu ilin en sekura loko alie vi ne revidos ilin. Se vi perdos aliron al via aplikaĵo por duobla aŭtentikigo kaj al la rehavaj kodoj, vi ne povos aliri vian konton.",
"waiting_a_recovery_codes": "Ricevante savkopiajn kodojn…",
"recovery_codes": "Rehavaj kodoj.",
"warning_of_generate_new_codes": "Kiam vi estigos novajn rehavajn kodojn, viaj malnovaj ne plu funkcios.",
"generate_new_recovery_codes": "Estigi novajn rehavajn kodojn",
"title": "Duobla aŭtentikigo",
"otp": "OTP"
},
"enter_current_password_to_confirm": "Enigu vian pasvorton por konfirmi vian identecon",
"security": "Sekureco",
"fun": "Amuzo",
"type_domains_to_mute": "Serĉu silentigotajn retnomojn",
"useStreamingApiWarning": "(Nerekomendate, eksperimente, povas preterpasi afiŝojn)",
"useStreamingApi": "Ricevi afiŝojn kaj sciigojn realtempe",
"user_mutes": "Uzantoj",
"reset_background_confirm": "Ĉu vi certe volas restarigi la fonon?",
"reset_banner_confirm": "Ĉu vi certe volas restarigi la rubandon?",
"reset_avatar_confirm": "Ĉu vi certe volas restarigi la profilbildon?",
"reset_profile_banner": "Restarigi rubandon de profilo",
"reset_profile_background": "Restarigi fonon de profilo",
"reset_avatar": "Restarigi profilbildon",
"minimal_scopes_mode": "Minimumigi elekteblojn pri amplekso de afiŝoj",
"search_user_to_block": "Serĉu, kiun vi volas bloki",
"search_user_to_mute": "Serĉu, kiun vi volas silentigi",
"autohide_floating_post_button": "Memage kaŝi la butonon por Nova afiŝo (poŝtelefone)",
"hide_followers_count_description": "Ne montri nombron de abonantoj",
"hide_follows_count_description": "Ne montri nombron de abonoj",
"notification_visibility_emoji_reactions": "Reagoj",
"notification_visibility_moves": "Migroj",
"new_email": "Nova retpoŝtadreso",
"profile_fields": {
"value": "Enhavo",
"name": "Etikedo",
"add_field": "Aldoni kampon",
"label": "Pridatumoj de profilo"
},
"import_blocks_from_a_csv_file": "Enporti blokitojn el CSV-dosiero",
"hide_muted_posts": "Kaŝi afiŝojn de silentigitaj uzantoj",
"emoji_reactions_on_timeline": "Montri bildosignajn reagojn en la tempolinio",
"pad_emoji": "Meti spacetojn ĉirkaŭ bildosigno post ties elekto",
"domain_mutes": "Retnomoj",
"notification_blocks": "Blokinte uzanton vi malabonos ĝin kaj haltigos ĉiujn sciigojn.",
"notification_mutes": "Por ne plu ricevi sciigojn de certa uzanto, silentigu.",
"notification_setting_hide_notification_contents": "Kaŝi la sendinton kaj la enhavojn de pasivaj sciigoj",
"notification_setting_privacy": "Privateco",
"notification_setting_block_from_strangers": "Bloki sciigojn de uzantoj, kiujn vi ne abonas",
"notification_setting_filters": "Filtriloj",
"greentext": "Memecitaĵoj",
"version": {
"frontend_version": "Versio de fasado",
"backend_version": "Versio de internaĵo",
"title": "Versio"
},
"accent": "Emfazo"
}, },
"timeline": { "timeline": {
"collapse": "Maletendi", "collapse": "Maletendi",
"conversation": "Interparolo", "conversation": "Interparolo",
"error_fetching": "Eraro dum ĝisdatigo", "error_fetching": "Eraris ĝisdatigo",
"load_older": "Montri pli malnovajn statojn", "load_older": "Montri pli malnovajn statojn",
"no_retweet_hint": "Afiŝo estas markita kiel rekta aŭ nur por abonantoj, kaj ne eblas ĝin ripeti", "no_retweet_hint": "Afiŝo estas markita kiel rekta aŭ nur por abonantoj, kaj ne eblas ĝin ripeti",
"repeated": "ripetita", "repeated": "ripetita",
"show_new": "Montri novajn", "show_new": "Montri novajn",
"up_to_date": "Ĝisdata", "up_to_date": "Ĝisdata",
"no_more_statuses": "Neniuj pliaj statoj", "no_more_statuses": "Neniuj pliaj statoj",
"no_statuses": "Neniuj statoj" "no_statuses": "Neniuj statoj",
"reload": "Enlegi ree"
}, },
"user_card": { "user_card": {
"approve": "Aprobi", "approve": "Aprobi",
"block": "Bari", "block": "Bloki",
"blocked": "Barita!", "blocked": "Blokita!",
"deny": "Rifuzi", "deny": "Rifuzi",
"favorites": "Ŝatataj", "favorites": "Ŝatataj",
"follow": "Aboni", "follow": "Aboni",
"follow_sent": "Peto sendiĝis!", "follow_sent": "Peto sendiĝis!",
"follow_progress": "Petanta…", "follow_progress": "Petante…",
"follow_again": "Ĉu sendi peton denove?", "follow_again": "Ĉu sendi peton ree?",
"follow_unfollow": "Malaboni", "follow_unfollow": "Malaboni",
"followees": "Abonatoj", "followees": "Abonatoj",
"followers": "Abonantoj", "followers": "Abonantoj",
"following": "Abonanta!", "following": "Abonata!",
"follows_you": "Abonas vin!", "follows_you": "Abonas vin!",
"its_you": "Tio estas vi!", "its_you": "Tio estas vi!",
"media": "Aŭdvidaĵoj", "media": "Vidaŭdaĵoj",
"mute": "Silentigi", "mute": "Silentigi",
"muted": "Silentigitaj", "muted": "Silentigita",
"per_day": "tage", "per_day": "tage",
"remote_follow": "Fore aboni", "remote_follow": "Fore aboni",
"statuses": "Statoj", "statuses": "Statoj",
"unblock": "Malbari", "unblock": "Malbloki",
"unblock_progress": "Malbaranta…", "unblock_progress": "Malblokante…",
"block_progress": "Baranta…", "block_progress": "Blokante…",
"unmute": "Malsilentigi", "unmute": "Malsilentigi",
"unmute_progress": "Malsilentiganta…", "unmute_progress": "Malsilentigante…",
"mute_progress": "Silentiganta…" "mute_progress": "Silentigante…",
"report": "Raporti",
"message": "Mesaĝo",
"mention": "Mencio",
"hidden": "Kaŝita",
"admin_menu": {
"delete_user_confirmation": "Ĉu vi tute certas? Ĉi tiu ago ne estas malfarebla.",
"delete_user": "Forigi uzanton",
"quarantine": "Malpermesi federadon de afiŝoj de uzanto",
"disable_any_subscription": "Malpermesi ĉian abonadon al uzanto",
"disable_remote_subscription": "Malpermesi abonadon al uzanto el foraj nodoj",
"sandbox": "Devigi afiŝojn esti nur por abonantoj",
"force_unlisted": "Devigi afiŝojn nelistiĝi",
"strip_media": "Forigi vidaŭdaĵojn de afiŝoj",
"force_nsfw": "Marki ĉiujn afiŝojn konsternaj",
"delete_account": "Forigi konton",
"deactivate_account": "Malaktivigi konton",
"activate_account": "Aktivigi konton",
"revoke_moderator": "Malnomumi reguligiston",
"grant_moderator": "Nomumi reguligiston",
"revoke_admin": "Malnomumi administranton",
"grant_admin": "Nomumi administranton",
"moderation": "Reguligado"
},
"show_repeats": "Montri ripetojn",
"hide_repeats": "Kaŝi ripetojn",
"unsubscribe": "Ne ricevi sciigojn",
"subscribe": "Ricevi sciigojn"
}, },
"user_profile": { "user_profile": {
"timeline_title": "Uzanta tempolinio", "timeline_title": "Historio de uzanto",
"profile_does_not_exist": "Pardonu, ĉi tiu profilo ne ekzistas.", "profile_does_not_exist": "Pardonu, ĉi tiu profilo ne ekzistas.",
"profile_loading_error": "Pardonu, eraro okazis dum enlegado de ĉi tiu profilo." "profile_loading_error": "Pardonu, eraris enlego de ĉi tiu profilo."
}, },
"who_to_follow": { "who_to_follow": {
"more": "Pli", "more": "Pli",
"who_to_follow": "Kiun aboni" "who_to_follow": "Kiun aboni"
}, },
"tool_tip": { "tool_tip": {
"media_upload": "Alŝuti aŭdvidaĵon", "media_upload": "Alŝuti vidaŭdaĵon",
"repeat": "Ripeti", "repeat": "Ripeti",
"reply": "Respondi", "reply": "Respondi",
"favorite": "Ŝati", "favorite": "Ŝati",
"user_settings": "Agordoj de uzanto" "user_settings": "Agordoj de uzanto",
"bookmark": "Legosigno",
"reject_follow_request": "Rifuzi abonpeton",
"accept_follow_request": "Akcepti abonpeton",
"add_reaction": "Aldoni reagon"
}, },
"upload":{ "upload": {
"error": { "error": {
"base": "Alŝuto malsukcesis.", "base": "Alŝuto malsukcesis.",
"file_too_big": "Dosiero estas tro granda [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", "file_too_big": "Dosiero estas tro granda [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
@ -415,5 +599,198 @@
"GiB": "GiB", "GiB": "GiB",
"TiB": "TiB" "TiB": "TiB"
} }
},
"emoji": {
"search_emoji": "Serĉi bildosignon",
"keep_open": "Teni elektilon malfermita",
"emoji": "Bildsignoj",
"stickers": "Glumarkoj",
"add_emoji": "Enigi bildosignon",
"load_all": "Enlegante ĉiujn {emojiAmount} bildosignojn",
"load_all_hint": "Enlegis la {saneAmount} unuajn bildosignojn; enlego de ĉiuj povus kaŭzi problemojn pri efikeco.",
"unicode": "Unikoda bildosigno",
"custom": "Propra bildosigno"
},
"polls": {
"not_enough_options": "Tro malmultaj unikaj elektebloj en la enketo",
"expired": "Enketo finiĝis antaŭ {0}",
"expires_in": "Enketo finiĝas je {0}",
"expiry": "Aĝo de enketo",
"multiple_choices": "Pluraj elektoj",
"single_choice": "Unu elekto",
"type": "Speco de enketo",
"vote": "Voĉi",
"votes": "voĉoj",
"option": "Elekteblo",
"add_option": "Aldoni elekteblon",
"add_poll": "Aldoni enketon"
},
"importer": {
"error": "Eraris enporto de ĉi tiu dosiero.",
"success": "Enportita sukcese.",
"submit": "Sendi"
},
"exporter": {
"processing": "Traktante; baldaŭ vi ricevos peton elŝuti vian dosieron",
"export": "Elporti"
},
"domain_mute_card": {
"unmute_progress": "Malsilentigante…",
"unmute": "Malsilentigi",
"mute_progress": "Silentigante…",
"mute": "Silentigi"
},
"about": {
"staff": "Skipo",
"mrf": {
"simple": {
"media_nsfw_desc": "Ĉi tiu nodo devigas vidaŭdaĵojn esti markitaj kiel konsternaj en afiŝoj el la jenaj nodoj:",
"media_nsfw": "Devige marki vidaŭdaĵojn konsternaj",
"media_removal_desc": "Ĉi tiu nodo forigas vidaŭdaĵojn de afiŝoj el la jenaj nodoj:",
"media_removal": "Forigo de vidaŭdaĵoj",
"ftl_removal": "Forigo de la historio de «La tuta konata reto»",
"quarantine_desc": "Ĉi tiu nodo sendos nur publikajn afiŝojn al la jenaj nodoj:",
"quarantine": "Kvaranteno",
"reject_desc": "Ĉi tiu nodo ne akceptos mesaĝojn de la jenaj nodoj:",
"reject": "Rifuzi",
"accept_desc": "Ĉi tiu nodo nur akceptas mesaĝojn de la jenaj nodoj:",
"accept": "Akcepti",
"simple_policies": "Specialaj politikoj de la nodo"
},
"mrf_policies": "Ŝaltis politikon de Mesaĝa ŝanĝilaro (MRF)",
"keyword": {
"is_replaced_by": "→",
"replace": "Anstataŭigi",
"reject": "Rifuzi",
"ftl_removal": "Forigo de la historio de «La tuta konata reto»",
"keyword_policies": "Politiko pri ŝlosilvortoj"
},
"federation": "Federado",
"mrf_policies_desc": "Politikoj de Mesaĝa ŝanĝilaro (MRF) efikas sur federa konduto de la nodo. La sekvaj politikoj estas ŝaltitaj:"
}
},
"selectable_list": {
"select_all": "Elekti ĉion"
},
"remote_user_resolver": {
"error": "Netrovinte.",
"searching_for": "Serĉante",
"remote_user_resolver": "Trovilo de foraj uzantoj"
},
"interactions": {
"load_older": "Enlegi pli malnovajn interagojn",
"moves": "Migrado de uzantoj",
"follows": "Novaj abonoj",
"favs_repeats": "Ripetoj kaj ŝatoj"
},
"errors": {
"storage_unavailable": "Pleroma ne povis aliri deponejon de la foliumilo. Via saluto kaj viaj lokaj agordoj ne estos konservitaj, kaj vi eble renkontos neatenditajn problemojn. Provu permesi kuketojn."
},
"status": {
"hide_content": "Kaŝi enhavon",
"show_content": "Montri enhavon",
"hide_full_subject": "Kaŝi plenan temon",
"show_full_subject": "Montri plenan temon",
"thread_muted_and_words": ", enhavas vortojn:",
"thread_muted": "Fadeno silentigita",
"copy_link": "Kopii ligilon al stato",
"status_unavailable": "Stato ne estas disponebla",
"unmute_conversation": "Malsilentigi interparolon",
"mute_conversation": "Silentigi interparolon",
"replies_list": "Respondoj:",
"reply_to": "Responde al",
"delete_confirm": "Ĉu vi certe volas forigi ĉi tiun staton?",
"unbookmark": "Senlegosigni",
"bookmark": "Legosigni",
"pinned": "Fiksita",
"unpin": "Malfiksi de profilo",
"pin": "Fiksi al profilo",
"delete": "Forigi staton",
"repeats": "Ripetoj",
"favorites": "Ŝatataj"
},
"time": {
"years_short": "{0}j",
"year_short": "{0}j",
"years": "{0} jaroj",
"year": "{0} jaro",
"weeks_short": "{0}s",
"week_short": "{0}s",
"weeks": "{0} semajnoj",
"week": "{0} semajno",
"seconds_short": "{0}s",
"second_short": "{0}s",
"seconds": "{0} sekundoj",
"second": "{0} sekundo",
"now_short": "nun",
"now": "ĵus",
"months_short": "{0}m",
"month_short": "{0}m",
"months": "{0} monatoj",
"month": "{0} monato",
"minutes_short": "{0}m",
"minute_short": "{0}m",
"minutes": "{0} minutoj",
"minute": "{0} minuto",
"in_past": "antaŭ {0}",
"in_future": "post {0}",
"hours_short": "{0}h",
"hour_short": "{0}h",
"hours": "{0} horoj",
"hour": "{0} horo",
"days_short": "{0}t",
"day_short": "{0}t",
"days": "{0} tagoj",
"day": "{0} tago"
},
"search": {
"people": "Personoj",
"no_results": "Neniuj rezultoj",
"people_talking": "{count} personoj parolas",
"person_talking": "{count} persono parolas",
"hashtags": "Kradvortoj"
},
"display_date": {
"today": "Hodiaŭ"
},
"file_type": {
"file": "Dosiero",
"image": "Bildo",
"video": "Filmo",
"audio": "Sono"
},
"chats": {
"empty_chat_list_placeholder": "Vi ankoraŭ havas neniun babilon. Komencu novan babilon!",
"error_sending_message": "Io misokazis dum sendado de la mesaĝo.",
"error_loading_chat": "Io misokazis dum enlego de la babilo.",
"delete_confirm": "Ĉu vi certe volas forigi ĉi tiun mesaĝon?",
"more": "Pli",
"empty_message_error": "Ne povas sendi malplenan mesaĝon",
"new": "Nova babilo",
"chats": "Babiloj",
"delete": "Forigi",
"you": "Vi:"
},
"password_reset": {
"password_reset_required_but_mailer_is_disabled": "Vi devas restarigi vian pasvorton, sed restarigado de pasvortoj estas malŝaltita. Bonvolu kontakti la administranton de via nodo.",
"password_reset_required": "Vi devas restarigi vian pasvorton por saluti.",
"password_reset_disabled": "Restarigado de pasvortoj estas malŝaltita. Bonvolu kontakti la administranton de via nodo.",
"too_many_requests": "Vi atingis la limon de provoj, reprovu pli poste.",
"not_found": "Ni ne trovis tiun retpoŝtadreson aŭ uzantonomon.",
"return_home": "Reiri al la hejmpaĝo",
"check_email": "Kontrolu vian retpoŝton pro ligilo por restarigi vian pasvorton.",
"placeholder": "Via retpoŝtadreso aŭ uzantonomo",
"instruction": "Enigu vian retpoŝtadreson aŭ uzantonomon. Ni sendos al vi ligilon por restarigi vian pasvorton.",
"password_reset": "Restarigi pasvorton",
"forgot_password": "Ĉu vi forgesis pasvorton?"
},
"user_reporting": {
"generic_error": "Eraris traktado de via peto.",
"submit": "Sendi",
"forward_to": "Plusendi al {0}",
"forward_description": "La konto venas de alia servilo. Ĉu kopio de la raporto sendiĝu ankaŭ tien?",
"additional_comments": "Aldonaj komentoj",
"add_comment_description": "Ĉi tiu raporto sendiĝos al reguligistoj de via nodo. Vi povas komprenigi kial vi raportas ĉi tiun konton sube:",
"title": "Raportante {0}"
} }
} }

View file

@ -84,7 +84,7 @@
"preferences": "Hobespenak" "preferences": "Hobespenak"
}, },
"notifications": { "notifications": {
"broken_favorite": "Egoera ezezaguna, bilatzen...", "broken_favorite": "Egoera ezezaguna, bilatzen",
"favorited_you": "zure mezua gogoko du", "favorited_you": "zure mezua gogoko du",
"followed_you": "Zu jarraitzen zaitu", "followed_you": "Zu jarraitzen zaitu",
"load_older": "Kargatu jakinarazpen zaharragoak", "load_older": "Kargatu jakinarazpen zaharragoak",
@ -128,7 +128,7 @@
"new_status": "Mezu berri bat idatzi", "new_status": "Mezu berri bat idatzi",
"account_not_locked_warning": "Zure kontua ez dago {0}. Edozeinek jarraitzen hastearekin, zure mezuak irakur ditzake.", "account_not_locked_warning": "Zure kontua ez dago {0}. Edozeinek jarraitzen hastearekin, zure mezuak irakur ditzake.",
"account_not_locked_warning_link": "Blokeatuta", "account_not_locked_warning_link": "Blokeatuta",
"attachments_sensitive": "Nabarmendu eranskinak hunkigarri gisa ", "attachments_sensitive": "Nabarmendu eranskinak hunkigarri gisa",
"content_type": { "content_type": {
"text/plain": "Testu arrunta", "text/plain": "Testu arrunta",
"text/html": "HTML", "text/html": "HTML",
@ -187,9 +187,9 @@
"confirm_and_enable": "Baieztatu eta gaitu OTP", "confirm_and_enable": "Baieztatu eta gaitu OTP",
"title": "Bi-faktore autentifikazioa", "title": "Bi-faktore autentifikazioa",
"generate_new_recovery_codes": "Sortu berreskuratze kode berriak", "generate_new_recovery_codes": "Sortu berreskuratze kode berriak",
"warning_of_generate_new_codes": "Berreskuratze kode berriak sortzean, zure berreskuratze kode zaharrak ez dute balioko", "warning_of_generate_new_codes": "Berreskuratze kode berriak sortzean, zure berreskuratze kode zaharrak ez dute balioko.",
"recovery_codes": "Berreskuratze kodea", "recovery_codes": "Berreskuratze kodea",
"waiting_a_recovery_codes": "Babes-kopia kodeak jasotzen...", "waiting_a_recovery_codes": "Babes-kopia kodeak jasotzen",
"recovery_codes_warning": "Idatzi edo gorde kodeak leku seguruan - bestela ez dituzu berriro ikusiko. Zure 2FA aplikaziorako sarbidea eta berreskuratze kodeak galduz gero, zure kontutik blokeatuta egongo zara.", "recovery_codes_warning": "Idatzi edo gorde kodeak leku seguruan - bestela ez dituzu berriro ikusiko. Zure 2FA aplikaziorako sarbidea eta berreskuratze kodeak galduz gero, zure kontutik blokeatuta egongo zara.",
"authentication_methods": "Autentifikazio metodoa", "authentication_methods": "Autentifikazio metodoa",
"scan": { "scan": {
@ -198,7 +198,7 @@
"secret_code": "Giltza" "secret_code": "Giltza"
}, },
"verify": { "verify": {
"desc": "Bi-faktore autentifikazioa gaitzeko, sar ezazu bi-faktore kodea zure app-tik" "desc": "Bi-faktore autentifikazioa gaitzeko, sar ezazu bi-faktore kodea zure app-tik:"
} }
}, },
"attachmentRadius": "Eranskinak", "attachmentRadius": "Eranskinak",
@ -220,7 +220,7 @@
"cOrange": "Laranja (Gogokoa)", "cOrange": "Laranja (Gogokoa)",
"cRed": "Gorria (ezeztatu)", "cRed": "Gorria (ezeztatu)",
"change_password": "Pasahitza aldatu", "change_password": "Pasahitza aldatu",
"change_password_error": "Arazao bat egon da zure pasahitza aldatzean", "change_password_error": "Arazao bat egon da zure pasahitza aldatzean.",
"changed_password": "Pasahitza ondo aldatu da!", "changed_password": "Pasahitza ondo aldatu da!",
"collapse_subject": "Bildu gaia daukaten mezuak", "collapse_subject": "Bildu gaia daukaten mezuak",
"composing": "Idazten", "composing": "Idazten",
@ -247,7 +247,7 @@
"follows_imported": "Jarraitzaileak inportatuta! Prozesatzeak denbora pixka bat iraungo du.", "follows_imported": "Jarraitzaileak inportatuta! Prozesatzeak denbora pixka bat iraungo du.",
"foreground": "Aurreko planoa", "foreground": "Aurreko planoa",
"general": "Orokorra", "general": "Orokorra",
"hide_attachments_in_convo": "Ezkutatu eranskinak elkarrizketatan ", "hide_attachments_in_convo": "Ezkutatu eranskinak elkarrizketatan",
"hide_attachments_in_tl": "Ezkutatu eranskinak donbora-lerroan", "hide_attachments_in_tl": "Ezkutatu eranskinak donbora-lerroan",
"hide_muted_posts": "Ezkutatu mutututako erabiltzaileen mezuak", "hide_muted_posts": "Ezkutatu mutututako erabiltzaileen mezuak",
"max_thumbnails": "Mezu bakoitzeko argazki-miniatura kopuru maximoa", "max_thumbnails": "Mezu bakoitzeko argazki-miniatura kopuru maximoa",
@ -427,7 +427,7 @@
}, },
"fonts": { "fonts": {
"_tab_label": "Letra-tipoak", "_tab_label": "Letra-tipoak",
"help": "Aukeratu letra-tipoak erabiltzailearen interfazean erabiltzeko. \"Pertsonalizatua\" letra-tipoan, sisteman agertzen den izen berdinarekin idatzi behar duzu.", "help": "Aukeratu letra-tipoak erabiltzailearen interfazean erabiltzeko. \"Pertsonalizatua\" letra-tipoan, sisteman agertzen den izen berdinarekin idatzi behar duzu.",
"components": { "components": {
"interface": "Interfazea", "interface": "Interfazea",
"input": "Sarrera eremuak", "input": "Sarrera eremuak",
@ -527,7 +527,7 @@
"favorites": "Gogokoak", "favorites": "Gogokoak",
"follow": "Jarraitu", "follow": "Jarraitu",
"follow_sent": "Eskaera bidalita!", "follow_sent": "Eskaera bidalita!",
"follow_progress": "Eskatzen...", "follow_progress": "Eskatzen",
"follow_again": "Eskaera berriro bidali?", "follow_again": "Eskaera berriro bidali?",
"follow_unfollow": "Jarraitzeari utzi", "follow_unfollow": "Jarraitzeari utzi",
"followees": "Jarraitzen", "followees": "Jarraitzen",
@ -546,11 +546,11 @@
"subscribe": "Harpidetu", "subscribe": "Harpidetu",
"unsubscribe": "Harpidetza ezeztatu", "unsubscribe": "Harpidetza ezeztatu",
"unblock": "Blokeoa kendu", "unblock": "Blokeoa kendu",
"unblock_progress": "Blokeoa ezeztatzen...", "unblock_progress": "Blokeoa ezeztatzen",
"block_progress": "Blokeatzen...", "block_progress": "Blokeatzen",
"unmute": "Isiltasuna kendu", "unmute": "Isiltasuna kendu",
"unmute_progress": "Isiltasuna kentzen...", "unmute_progress": "Isiltasuna kentzen",
"mute_progress": "Isiltzen...", "mute_progress": "Isiltzen",
"hide_repeats": "Ezkutatu errepikapenak", "hide_repeats": "Ezkutatu errepikapenak",
"show_repeats": "Erakutsi errpekiapenak", "show_repeats": "Erakutsi errpekiapenak",
"admin_menu": { "admin_menu": {

View file

@ -63,7 +63,7 @@
"dms": "Yksityisviestit", "dms": "Yksityisviestit",
"public_tl": "Julkinen Aikajana", "public_tl": "Julkinen Aikajana",
"timeline": "Aikajana", "timeline": "Aikajana",
"twkn": "Koko Tunnettu Verkosto", "twkn": "Tunnettu Verkosto",
"user_search": "Käyttäjähaku", "user_search": "Käyttäjähaku",
"who_to_follow": "Seurausehdotukset", "who_to_follow": "Seurausehdotukset",
"preferences": "Asetukset", "preferences": "Asetukset",

View file

@ -343,7 +343,8 @@
"migration_snapshot_ok": "Pour être sûr un instantanée du thème à été chargé. Vos pouvez essayer de charger ses données.", "migration_snapshot_ok": "Pour être sûr un instantanée du thème à été chargé. Vos pouvez essayer de charger ses données.",
"fe_downgraded": "Retour en arrière de la version de PleromaFE.", "fe_downgraded": "Retour en arrière de la version de PleromaFE.",
"fe_upgraded": "Le moteur de thème PleromaFE à été mis à jour après un changement de version.", "fe_upgraded": "Le moteur de thème PleromaFE à été mis à jour après un changement de version.",
"snapshot_missing": "Aucun instantané du thème à été trouvé dans le fichier, il peut y avoir un rendu différent à la vision originelle." "snapshot_missing": "Aucun instantané du thème à été trouvé dans le fichier, il peut y avoir un rendu différent à la vision originelle.",
"snapshot_present": "Un instantané du thème à été chargé, toutes les valeurs sont dont écrasées. Vous pouvez autrement charger le thème complètement."
}, },
"keep_as_is": "Garder tel-quel", "keep_as_is": "Garder tel-quel",
"use_source": "Nouvelle version" "use_source": "Nouvelle version"
@ -619,7 +620,7 @@
"reject": "Rejeté", "reject": "Rejeté",
"replace": "Remplacer", "replace": "Remplacer",
"keyword_policies": "Politiques par mot-clés", "keyword_policies": "Politiques par mot-clés",
"ftl_removal": "Suppression du flux \"Ensemble du réseau connu\"", "ftl_removal": "Suppression du flux fédéré",
"is_replaced_by": "→" "is_replaced_by": "→"
}, },
"simple": { "simple": {

View file

@ -36,7 +36,7 @@
"twkn": "An Líonra Iomlán" "twkn": "An Líonra Iomlán"
}, },
"notifications": { "notifications": {
"broken_favorite": "Post anaithnid. Cuardach dó...", "broken_favorite": "Post anaithnid. Cuardach dó",
"favorited_you": "toghadh le do phost", "favorited_you": "toghadh le do phost",
"followed_you": "lean tú", "followed_you": "lean tú",
"load_older": "Luchtaigh fógraí aosta", "load_older": "Luchtaigh fógraí aosta",
@ -84,7 +84,7 @@
"cOrange": "Oráiste (Cosúil)", "cOrange": "Oráiste (Cosúil)",
"cRed": "Dearg (Cealaigh)", "cRed": "Dearg (Cealaigh)",
"change_password": "Athraigh do pasfhocal", "change_password": "Athraigh do pasfhocal",
"change_password_error": "Bhí fadhb ann ag athrú do pasfhocail", "change_password_error": "Bhí fadhb ann ag athrú do pasfhocail.",
"changed_password": "Athraigh an pasfhocal go rathúil!", "changed_password": "Athraigh an pasfhocal go rathúil!",
"collapse_subject": "Poist a chosc le teidil", "collapse_subject": "Poist a chosc le teidil",
"confirm_new_password": "Deimhnigh do pasfhocal nua", "confirm_new_password": "Deimhnigh do pasfhocal nua",
@ -160,7 +160,7 @@
"streaming": "Cumasaigh post nua a shruthú uathoibríoch nuair a scrollaítear go barr an leathanaigh", "streaming": "Cumasaigh post nua a shruthú uathoibríoch nuair a scrollaítear go barr an leathanaigh",
"text": "Téacs", "text": "Téacs",
"theme": "Téama", "theme": "Téama",
"theme_help": "Úsáid cód daith hex (#rrggbb) chun do schéim a saincheapadh", "theme_help": "Úsáid cód daith hex (#rrggbb) chun do schéim a saincheapadh.",
"tooltipRadius": "Bileoga eolais", "tooltipRadius": "Bileoga eolais",
"user_settings": "Socruithe úsáideora", "user_settings": "Socruithe úsáideora",
"values": { "values": {

View file

@ -70,9 +70,9 @@
"preferences": "העדפות" "preferences": "העדפות"
}, },
"notifications": { "notifications": {
"broken_favorite": "סטאטוס לא ידוע, מחפש...", "broken_favorite": "סטאטוס לא ידוע, מחפש",
"favorited_you": "אהב את הסטטוס שלך", "favorited_you": "אהב את הסטטוס שלך",
"followed_you": "עקב אחריך!", "followed_you": "עקב אחריך",
"load_older": "טען התראות ישנות", "load_older": "טען התראות ישנות",
"notifications": "התראות", "notifications": "התראות",
"read": "קרא!", "read": "קרא!",
@ -178,7 +178,7 @@
"follow_export": "יצוא עקיבות", "follow_export": "יצוא עקיבות",
"follow_export_button": "ייצא את הנעקבים שלך לקובץ csv", "follow_export_button": "ייצא את הנעקבים שלך לקובץ csv",
"follow_import": "יבוא עקיבות", "follow_import": "יבוא עקיבות",
"follow_import_error": "שגיאה בייבוא נעקבים.", "follow_import_error": "שגיאה בייבוא נעקבים",
"follows_imported": "נעקבים יובאו! ייקח זמן מה לעבד אותם.", "follows_imported": "נעקבים יובאו! ייקח זמן מה לעבד אותם.",
"foreground": "חזית", "foreground": "חזית",
"general": "כללי", "general": "כללי",
@ -311,7 +311,7 @@
"favorites": "מועדפים", "favorites": "מועדפים",
"follow": "עקוב", "follow": "עקוב",
"follow_sent": "בקשה נשלחה!", "follow_sent": "בקשה נשלחה!",
"follow_progress": "מבקש...", "follow_progress": "מבקש",
"follow_again": "שלח בקשה שוב?", "follow_again": "שלח בקשה שוב?",
"follow_unfollow": "בטל עקיבה", "follow_unfollow": "בטל עקיבה",
"followees": "נעקבים", "followees": "נעקבים",
@ -327,11 +327,11 @@
"report": "דווח", "report": "דווח",
"statuses": "סטטוסים", "statuses": "סטטוסים",
"unblock": "הסר חסימה", "unblock": "הסר חסימה",
"unblock_progress": "מסיר חסימה...", "unblock_progress": "מסיר חסימה",
"block_progress": "חוסם...", "block_progress": "חוסם",
"unmute": "הסר השתקה", "unmute": "הסר השתקה",
"unmute_progress": "מסיר השתקה...", "unmute_progress": "מסיר השתקה",
"mute_progress": "משתיק...", "mute_progress": "משתיק",
"admin_menu": { "admin_menu": {
"moderation": "ניהול (צוות)", "moderation": "ניהול (צוות)",
"grant_admin": "הפוך למנהל", "grant_admin": "הפוך למנהל",
@ -377,7 +377,7 @@
"favorite": "מועדף", "favorite": "מועדף",
"user_settings": "הגדרות משתמש" "user_settings": "הגדרות משתמש"
}, },
"upload":{ "upload": {
"error": { "error": {
"base": "העלאה נכשלה.", "base": "העלאה נכשלה.",
"file_too_big": "קובץ גדול מדי [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", "file_too_big": "קובץ גדול מדי [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",

View file

@ -404,7 +404,9 @@
"reset_avatar_confirm": "Vuoi veramente azzerare l'icona?", "reset_avatar_confirm": "Vuoi veramente azzerare l'icona?",
"reset_banner_confirm": "Vuoi veramente azzerare lo stendardo?", "reset_banner_confirm": "Vuoi veramente azzerare lo stendardo?",
"reset_background_confirm": "Vuoi veramente azzerare lo sfondo?", "reset_background_confirm": "Vuoi veramente azzerare lo sfondo?",
"chatMessageRadius": "Messaggi istantanei" "chatMessageRadius": "Messaggi istantanei",
"notification_setting_hide_notification_contents": "Nascondi mittente e contenuti delle notifiche push",
"notification_setting_block_from_strangers": "Blocca notifiche da utenti che non segui"
}, },
"timeline": { "timeline": {
"error_fetching": "Errore nell'aggiornamento", "error_fetching": "Errore nell'aggiornamento",
@ -801,6 +803,10 @@
"new": "Nuova conversazione", "new": "Nuova conversazione",
"chats": "Conversazioni", "chats": "Conversazioni",
"delete": "Elimina", "delete": "Elimina",
"message_user": "Contatta {nickname}" "message_user": "Contatta {nickname}",
"you": "Tu:"
},
"shoutbox": {
"title": "Graffiti"
} }
} }

View file

@ -27,7 +27,7 @@
}, },
"exporter": { "exporter": {
"export": "エクスポート", "export": "エクスポート",
"processing": "おまちください。しばらくすると、あなたのファイルをダウンロードするように、メッセージがでます" "processing": "おまちください。しばらくすると、あなたのファイルをダウンロードするように、メッセージがでます"
}, },
"features_panel": { "features_panel": {
"chat": "チャット", "chat": "チャット",
@ -39,7 +39,7 @@
"who_to_follow": "おすすめユーザー" "who_to_follow": "おすすめユーザー"
}, },
"finder": { "finder": {
"error_fetching_user": "ユーザーけんさくがエラーになりました", "error_fetching_user": "ユーザーけんさくがエラーになりました",
"find_user": "ユーザーをさがす" "find_user": "ユーザーをさがす"
}, },
"general": { "general": {
@ -80,9 +80,9 @@
"enter_recovery_code": "リカバリーコードをいれてください", "enter_recovery_code": "リカバリーコードをいれてください",
"enter_two_factor_code": "2-ファクターコードをいれてください", "enter_two_factor_code": "2-ファクターコードをいれてください",
"recovery_code": "リカバリーコード", "recovery_code": "リカバリーコード",
"heading" : { "heading": {
"totp" : "2-ファクターにんしょう", "totp": "2-ファクターにんしょう",
"recovery" : "2-ファクターリカバリー" "recovery": "2-ファクターリカバリー"
} }
}, },
"media_modal": { "media_modal": {
@ -107,7 +107,7 @@
"preferences": "せってい" "preferences": "せってい"
}, },
"notifications": { "notifications": {
"broken_favorite": "ステータスがみつかりません。さがしています...", "broken_favorite": "ステータスがみつかりません。さがしています",
"favorited_you": "あなたのステータスがおきにいりされました", "favorited_you": "あなたのステータスがおきにいりされました",
"followed_you": "フォローされました", "followed_you": "フォローされました",
"load_older": "ふるいつうちをみる", "load_older": "ふるいつうちをみる",
@ -172,10 +172,10 @@
"unlisted": "このとうこうは、パブリックタイムラインと、つながっているすべてのネットワークでは、みることができません" "unlisted": "このとうこうは、パブリックタイムラインと、つながっているすべてのネットワークでは、みることができません"
}, },
"scope": { "scope": {
"direct": "ダイレクト: メンションされたユーザーのみにとどきます", "direct": "ダイレクト: メンションされたユーザーのみにとどきます",
"private": "フォロワーげんてい: フォロワーのみにとどきます", "private": "フォロワーげんてい: フォロワーのみにとどきます",
"public": "パブリック: パブリックタイムラインにとどきます", "public": "パブリック: パブリックタイムラインにとどきます",
"unlisted": "アンリステッド: パブリックタイムラインにとどきません" "unlisted": "アンリステッド: パブリックタイムラインにとどきません"
} }
}, },
"registration": { "registration": {
@ -212,17 +212,17 @@
"security": "セキュリティ", "security": "セキュリティ",
"enter_current_password_to_confirm": "あなたのアイデンティティをたしかめるため、あなたのいまのパスワードをかいてください", "enter_current_password_to_confirm": "あなたのアイデンティティをたしかめるため、あなたのいまのパスワードをかいてください",
"mfa": { "mfa": {
"otp" : "OTP", "otp": "OTP",
"setup_otp" : "OTPをつくる", "setup_otp": "OTPをつくる",
"wait_pre_setup_otp" : "OTPをよういしています", "wait_pre_setup_otp": "OTPをよういしています",
"confirm_and_enable" : "OTPをたしかめて、ゆうこうにする", "confirm_and_enable": "OTPをたしかめて、ゆうこうにする",
"title": "2-ファクターにんしょう", "title": "2-ファクターにんしょう",
"generate_new_recovery_codes" : "あたらしいリカバリーコードをつくる", "generate_new_recovery_codes": "あたらしいリカバリーコードをつくる",
"warning_of_generate_new_codes" : "あたらしいリカバリーコードをつくったら、ふるいコードはつかえなくなります。", "warning_of_generate_new_codes": "あたらしいリカバリーコードをつくったら、ふるいコードはつかえなくなります。",
"recovery_codes" : "リカバリーコード。", "recovery_codes": "リカバリーコード。",
"waiting_a_recovery_codes": "バックアップコードをうけとっています...", "waiting_a_recovery_codes": "バックアップコードをうけとっています",
"recovery_codes_warning" : "コードをかきうつすか、ひとにみられないところにセーブしてください。そうでなければ、あなたはこのコードをふたたびみることはできません。もしあなたが、2FAアプリのアクセスをうしなって、なおかつ、リカバリーコードもおもいだせないならば、あなたはあなたのアカウントから、しめだされます。", "recovery_codes_warning": "コードをかきうつすか、ひとにみられないところにセーブしてください。そうでなければ、あなたはこのコードをふたたびみることはできません。もしあなたが、2FAアプリのアクセスをうしなって、なおかつ、リカバリーコードもおもいだせないならば、あなたはあなたのアカウントから、しめだされます。",
"authentication_methods" : "にんしょうメソッド", "authentication_methods": "にんしょうメソッド",
"scan": { "scan": {
"title": "スキャン", "title": "スキャン",
"desc": "あなたの2-ファクターアプリをつかって、このQRコードをスキャンするか、テキストキーをうちこんでください:", "desc": "あなたの2-ファクターアプリをつかって、このQRコードをスキャンするか、テキストキーをうちこんでください:",
@ -273,12 +273,12 @@
"pad_emoji": "えもじをピッカーでえらんだとき、えもじのまわりにスペースをいれる", "pad_emoji": "えもじをピッカーでえらんだとき、えもじのまわりにスペースをいれる",
"export_theme": "セーブ", "export_theme": "セーブ",
"filtering": "フィルタリング", "filtering": "フィルタリング",
"filtering_explanation": "これらのことばをふくむすべてのものがミュートされます。1ぎょうに1つのことばをかいてください", "filtering_explanation": "これらのことばをふくむすべてのものがミュートされます。1ぎょうに1つのことばをかいてください",
"follow_export": "フォローのエクスポート", "follow_export": "フォローのエクスポート",
"follow_export_button": "エクスポート", "follow_export_button": "エクスポート",
"follow_export_processing": "おまちください。まもなくファイルをダウンロードできます。", "follow_export_processing": "おまちください。まもなくファイルをダウンロードできます。",
"follow_import": "フォローインポート", "follow_import": "フォローインポート",
"follow_import_error": "フォローのインポートがエラーになりました", "follow_import_error": "フォローのインポートがエラーになりました",
"follows_imported": "フォローがインポートされました! すこしじかんがかかるかもしれません。", "follows_imported": "フォローがインポートされました! すこしじかんがかかるかもしれません。",
"foreground": "フォアグラウンド", "foreground": "フォアグラウンド",
"general": "ぜんぱん", "general": "ぜんぱん",
@ -340,7 +340,7 @@
"profile_background": "プロフィールのバックグラウンド", "profile_background": "プロフィールのバックグラウンド",
"profile_banner": "プロフィールバナー", "profile_banner": "プロフィールバナー",
"profile_tab": "プロフィール", "profile_tab": "プロフィール",
"radii_help": "インターフェースのまるさをせっていする", "radii_help": "インターフェースのまるさをせっていする",
"replies_in_timeline": "タイムラインのリプライ", "replies_in_timeline": "タイムラインのリプライ",
"reply_visibility_all": "すべてのリプライをみる", "reply_visibility_all": "すべてのリプライをみる",
"reply_visibility_following": "わたしにあてられたリプライと、フォローしているひとからのリプライをみる", "reply_visibility_following": "わたしにあてられたリプライと、フォローしているひとからのリプライをみる",
@ -367,7 +367,7 @@
"streaming": "うえまでスクロールしたとき、じどうてきにストリーミングする", "streaming": "うえまでスクロールしたとき、じどうてきにストリーミングする",
"text": "もじ", "text": "もじ",
"theme": "テーマ", "theme": "テーマ",
"theme_help": "カラーテーマをカスタマイズできます", "theme_help": "カラーテーマをカスタマイズできます",
"theme_help_v2_1": "チェックボックスをONにすると、コンポーネントごとに、いろと、とうめいどを、オーバーライドできます。「すべてクリア」ボタンをおすと、すべてのオーバーライドを、やめます。", "theme_help_v2_1": "チェックボックスをONにすると、コンポーネントごとに、いろと、とうめいどを、オーバーライドできます。「すべてクリア」ボタンをおすと、すべてのオーバーライドを、やめます。",
"theme_help_v2_2": "バックグラウンドとテキストのコントラストをあらわすアイコンがあります。マウスをホバーすると、くわしいせつめいがでます。とうめいないろをつかっているときは、もっともわるいばあいのコントラストがしめされます。", "theme_help_v2_2": "バックグラウンドとテキストのコントラストをあらわすアイコンがあります。マウスをホバーすると、くわしいせつめいがでます。とうめいないろをつかっているときは、もっともわるいばあいのコントラストがしめされます。",
"upload_a_photo": "がぞうをアップロード", "upload_a_photo": "がぞうをアップロード",
@ -402,8 +402,8 @@
"hint": "コントラストは {ratio} です。{level}。({context})", "hint": "コントラストは {ratio} です。{level}。({context})",
"level": { "level": {
"aa": "AAレベルガイドライン (ミニマル) をみたします", "aa": "AAレベルガイドライン (ミニマル) をみたします",
"aaa": "AAAレベルガイドライン (レコメンデッド) をみたします", "aaa": "AAAレベルガイドライン (レコメンデッド) をみたします",
"bad": "ガイドラインをみたしません" "bad": "ガイドラインをみたしません"
}, },
"context": { "context": {
"18pt": "おおきい (18ポイントいじょう) テキスト", "18pt": "おおきい (18ポイントいじょう) テキスト",
@ -447,8 +447,8 @@
"always_drop_shadow": "ブラウザーがサポートしていれば、つねに {0} がつかわれます。", "always_drop_shadow": "ブラウザーがサポートしていれば、つねに {0} がつかわれます。",
"drop_shadow_syntax": "{0} は、{1} パラメーターと {2} キーワードをサポートしていません。", "drop_shadow_syntax": "{0} は、{1} パラメーターと {2} キーワードをサポートしていません。",
"avatar_inset": "うちがわのかげと、そとがわのかげを、いっしょにつかうと、とうめいなアバターが、へんなみためになります。", "avatar_inset": "うちがわのかげと、そとがわのかげを、いっしょにつかうと、とうめいなアバターが、へんなみためになります。",
"spread_zero": "ひろがりが 0 よりもおおきなかげは、0 とおなじです", "spread_zero": "ひろがりが 0 よりもおおきなかげは、0 とおなじです",
"inset_classic": "うちがわのかげは {0} をつかいます" "inset_classic": "うちがわのかげは {0} をつかいます"
}, },
"components": { "components": {
"panel": "パネル", "panel": "パネル",
@ -483,7 +483,7 @@
"content": "ほんぶん", "content": "ほんぶん",
"error": "エラーのれい", "error": "エラーのれい",
"button": "ボタン", "button": "ボタン",
"text": "これは{0}と{1}のれいです", "text": "これは{0}と{1}のれいです",
"mono": "monospace", "mono": "monospace",
"input": "はねだくうこうに、つきました。", "input": "はねだくうこうに、つきました。",
"faint_link": "とてもたすけになるマニュアル", "faint_link": "とてもたすけになるマニュアル",
@ -586,11 +586,11 @@
"subscribe": "サブスクライブ", "subscribe": "サブスクライブ",
"unsubscribe": "サブスクライブをやめる", "unsubscribe": "サブスクライブをやめる",
"unblock": "ブロックをやめる", "unblock": "ブロックをやめる",
"unblock_progress": "ブロックをとりけしています...", "unblock_progress": "ブロックをとりけしています",
"block_progress": "ブロックしています...", "block_progress": "ブロックしています",
"unmute": "ミュートをやめる", "unmute": "ミュートをやめる",
"unmute_progress": "ミュートをとりけしています...", "unmute_progress": "ミュートをとりけしています",
"mute_progress": "ミュートしています...", "mute_progress": "ミュートしています",
"hide_repeats": "リピートをかくす", "hide_repeats": "リピートをかくす",
"show_repeats": "リピートをみる", "show_repeats": "リピートをみる",
"admin_menu": { "admin_menu": {
@ -638,11 +638,11 @@
"favorite": "おきにいり", "favorite": "おきにいり",
"user_settings": "ユーザーせってい" "user_settings": "ユーザーせってい"
}, },
"upload":{ "upload": {
"error": { "error": {
"base": "アップロードにしっぱいしました。", "base": "アップロードにしっぱいしました。",
"file_too_big": "ファイルがおおきすぎます [{filesize} {filesizeunit} / {allowedsize} {allowedsizeunit}]", "file_too_big": "ファイルがおおきすぎます [{filesize} {filesizeunit} / {allowedsize} {allowedsizeunit}]",
"default": "しばらくしてから、ためしてください" "default": "しばらくしてから、ためしてください"
}, },
"file_size_units": { "file_size_units": {
"B": "B", "B": "B",

View file

@ -34,9 +34,9 @@
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Wycisz", "mute": "Wycisz",
"mute_progress": "Wyciszam...", "mute_progress": "Wyciszam",
"unmute": "Odcisz", "unmute": "Odcisz",
"unmute_progress": "Odciszam..." "unmute_progress": "Odciszam"
}, },
"exporter": { "exporter": {
"export": "Eksportuj", "export": "Eksportuj",
@ -68,7 +68,10 @@
"disable": "Wyłącz", "disable": "Wyłącz",
"enable": "Włącz", "enable": "Włącz",
"confirm": "Potwierdź", "confirm": "Potwierdź",
"verify": "Zweryfikuj" "verify": "Zweryfikuj",
"close": "Zamknij",
"loading": "Ładowanie…",
"retry": "Spróbuj ponownie"
}, },
"image_cropper": { "image_cropper": {
"crop_picture": "Przytnij obrazek", "crop_picture": "Przytnij obrazek",
@ -118,7 +121,8 @@
"user_search": "Wyszukiwanie użytkowników", "user_search": "Wyszukiwanie użytkowników",
"search": "Wyszukiwanie", "search": "Wyszukiwanie",
"who_to_follow": "Sugestie obserwacji", "who_to_follow": "Sugestie obserwacji",
"preferences": "Preferencje" "preferences": "Preferencje",
"bookmarks": "Zakładki"
}, },
"notifications": { "notifications": {
"broken_favorite": "Nieznany status, szukam go…", "broken_favorite": "Nieznany status, szukam go…",
@ -190,7 +194,10 @@
"private": "Tylko dla obserwujących Umieść dla osób, które cię obserwują", "private": "Tylko dla obserwujących Umieść dla osób, które cię obserwują",
"public": "Publiczny Umieść na publicznych osiach czasu", "public": "Publiczny Umieść na publicznych osiach czasu",
"unlisted": "Niewidoczny Nie umieszczaj na publicznych osiach czasu" "unlisted": "Niewidoczny Nie umieszczaj na publicznych osiach czasu"
} },
"preview_empty": "Pusty",
"preview": "Podgląd",
"empty_status_error": "Nie można wysłać pustego wpisu bez plików"
}, },
"registration": { "registration": {
"bio": "Bio", "bio": "Bio",
@ -234,7 +241,7 @@
"generate_new_recovery_codes": "Wygeneruj nowe kody zapasowe", "generate_new_recovery_codes": "Wygeneruj nowe kody zapasowe",
"warning_of_generate_new_codes": "Po tym gdy wygenerujesz 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.", "recovery_codes": "Kody zapasowe.",
"waiting_a_recovery_codes": "Otrzymuję 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ł(-a) 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", "authentication_methods": "Metody weryfikacji",
"scan": { "scan": {
@ -339,8 +346,8 @@
"notification_visibility_moves": "Użytkownik migruje", "notification_visibility_moves": "Użytkownik migruje",
"notification_visibility_emoji_reactions": "Reakcje", "notification_visibility_emoji_reactions": "Reakcje",
"no_rich_text_description": "Usuwaj formatowanie ze wszystkich postów", "no_rich_text_description": "Usuwaj formatowanie ze wszystkich postów",
"no_blocks": "Bez blokad", "no_blocks": "Brak blokad",
"no_mutes": "Bez wyciszeń", "no_mutes": "Brak wyciszeń",
"hide_follows_description": "Nie pokazuj kogo obserwuję", "hide_follows_description": "Nie pokazuj kogo obserwuję",
"hide_followers_description": "Nie pokazuj kto mnie obserwuje", "hide_followers_description": "Nie pokazuj kto mnie obserwuje",
"hide_follows_count_description": "Nie pokazuj licznika obserwowanych", "hide_follows_count_description": "Nie pokazuj licznika obserwowanych",
@ -482,7 +489,11 @@
"selectedMenu": "Wybrany element menu", "selectedMenu": "Wybrany element menu",
"disabled": "Wyłączone", "disabled": "Wyłączone",
"toggled": "Przełączone", "toggled": "Przełączone",
"tabs": "Karty" "tabs": "Karty",
"chat": {
"outgoing": "Wiadomości wychodzące",
"incoming": "Wiadomości przychodzące"
}
}, },
"radii": { "radii": {
"_tab_label": "Zaokrąglenie" "_tab_label": "Zaokrąglenie"
@ -553,7 +564,16 @@
}, },
"notification_setting_privacy": "Prywatność", "notification_setting_privacy": "Prywatność",
"notification_setting_filters": "Filtry", "notification_setting_filters": "Filtry",
"notification_setting_privacy_option": "Ukryj nadawcę i zawartość powiadomień push" "notification_setting_privacy_option": "Ukryj nadawcę i zawartość powiadomień push",
"reset_avatar": "Zresetuj awatar",
"profile_fields": {
"value": "Zawartość",
"label": "Metadane profilu",
"name": "Nazwa",
"add_field": "Dodaj pole"
},
"bot": "To konto jest prowadzone przez bota",
"notification_setting_hide_notification_contents": "Ukryj nadawcę i zawartość powiadomień push"
}, },
"time": { "time": {
"day": "{0} dzień", "day": "{0} dzień",
@ -599,7 +619,8 @@
"show_new": "Pokaż nowe", "show_new": "Pokaż nowe",
"up_to_date": "Na bieżąco", "up_to_date": "Na bieżąco",
"no_more_statuses": "Brak kolejnych statusów", "no_more_statuses": "Brak kolejnych statusów",
"no_statuses": "Brak statusów" "no_statuses": "Brak statusów",
"reload": "Odśwież"
}, },
"status": { "status": {
"favorites": "Ulubione", "favorites": "Ulubione",
@ -614,7 +635,11 @@
"mute_conversation": "Wycisz konwersację", "mute_conversation": "Wycisz konwersację",
"unmute_conversation": "Odcisz konwersację", "unmute_conversation": "Odcisz konwersację",
"status_unavailable": "Status niedostępny", "status_unavailable": "Status niedostępny",
"copy_link": "Kopiuj link do statusu" "copy_link": "Kopiuj link do statusu",
"unbookmark": "Usuń z zakładek",
"bookmark": "Dodaj do zakładek",
"hide_content": "Ukryj zawartość",
"show_content": "Pokaż zawartość"
}, },
"user_card": { "user_card": {
"approve": "Przyjmij", "approve": "Przyjmij",
@ -669,7 +694,8 @@
"quarantine": "Zakaż federowania postów od tego użytkownika", "quarantine": "Zakaż federowania postów od tego użytkownika",
"delete_user": "Usuń użytkownika", "delete_user": "Usuń użytkownika",
"delete_user_confirmation": "Czy jesteś absolutnie pewny(-a)? Ta operacja nie może być cofnięta." "delete_user_confirmation": "Czy jesteś absolutnie pewny(-a)? Ta operacja nie może być cofnięta."
} },
"message": "Napisz"
}, },
"user_profile": { "user_profile": {
"timeline_title": "Oś czasu użytkownika", "timeline_title": "Oś czasu użytkownika",
@ -732,5 +758,25 @@
"password_reset_disabled": "Resetowanie hasła jest wyłączone. Proszę skontaktuj się z administratorem tej instancji.", "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": "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." "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."
},
"file_type": {
"file": "Plik",
"image": "Zdjęcie",
"video": "Wideo",
"audio": "Audio"
},
"chats": {
"more": "Więcej",
"delete": "Usuń",
"you": "Ty:",
"delete_confirm": "Czy na pewno chcesz usunąć tą wiadomość?",
"message_user": "Napisz do {nickname}",
"error_sending_message": "Coś poszło nie tak podczas wysyłania wiadomości.",
"error_loading_chat": "Coś poszło nie tak podczas ładowania czatu.",
"empty_message_error": "Nie można wysłać pustej wiadomości",
"new": "Nowy czat"
},
"display_date": {
"today": "Dzisiaj"
} }
} }

View file

@ -16,7 +16,8 @@ const defaultState = {
}, },
mobileLayout: false, mobileLayout: false,
globalNotices: [], globalNotices: [],
layoutHeight: 0 layoutHeight: 0,
lastTimeline: null
} }
const interfaceMod = { const interfaceMod = {
@ -69,6 +70,9 @@ const interfaceMod = {
}, },
setLayoutHeight (state, value) { setLayoutHeight (state, value) {
state.layoutHeight = value state.layoutHeight = value
},
setLastTimeline (state, value) {
state.lastTimeline = value
} }
}, },
actions: { actions: {
@ -117,6 +121,9 @@ const interfaceMod = {
}, },
setLayoutHeight ({ commit }, value) { setLayoutHeight ({ commit }, value) {
commit('setLayoutHeight', value) commit('setLayoutHeight', value)
},
setLastTimeline ({ commit }, value) {
commit('setLastTimeline', value)
} }
} }
} }

View file

@ -499,6 +499,7 @@ const users = {
store.commit('clearNotifications') store.commit('clearNotifications')
store.commit('resetStatuses') store.commit('resetStatuses')
store.dispatch('resetChats') store.dispatch('resetChats')
store.dispatch('setLastTimeline', 'public-timeline')
}) })
}, },
loginUser (store, accessToken) { loginUser (store, accessToken) {

View file

@ -631,7 +631,8 @@ const postStatus = ({
mediaIds = [], mediaIds = [],
inReplyToStatusId, inReplyToStatusId,
contentType, contentType,
preview preview,
idempotencyKey
}) => { }) => {
const form = new FormData() const form = new FormData()
const pollOptions = poll.options || [] const pollOptions = poll.options || []
@ -665,10 +666,15 @@ const postStatus = ({
form.append('preview', 'true') form.append('preview', 'true')
} }
let postHeaders = authHeaders(credentials)
if (idempotencyKey) {
postHeaders['idempotency-key'] = idempotencyKey
}
return fetch(MASTODON_POST_STATUS_URL, { return fetch(MASTODON_POST_STATUS_URL, {
body: form, body: form,
method: 'POST', method: 'POST',
headers: authHeaders(credentials) headers: postHeaders
}) })
.then((response) => { .then((response) => {
return response.json() return response.json()

View file

@ -11,7 +11,8 @@ const postStatus = ({
media = [], media = [],
inReplyToStatusId = undefined, inReplyToStatusId = undefined,
contentType = 'text/plain', contentType = 'text/plain',
preview = false preview = false,
idempotencyKey = ''
}) => { }) => {
const mediaIds = map(media, 'id') const mediaIds = map(media, 'id')
@ -25,7 +26,8 @@ const postStatus = ({
inReplyToStatusId, inReplyToStatusId,
contentType, contentType,
poll, poll,
preview preview,
idempotencyKey
}) })
.then((data) => { .then((data) => {
if (!data.error && !preview) { if (!data.error && !preview) {

1437
yarn.lock

File diff suppressed because it is too large Load diff