Page MenuHomePhorge

No OneTemporary

Authored By
Unknown
Size
112 KB
Referenced Files
None
Subscribers
None
diff --git a/src/App.scss b/src/App.scss
index 9f7ef860fb..3b8b3224ba 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -1,443 +1,463 @@
@import './_variables.scss';
#app {
background-size: cover;
background-attachment: fixed;
background-repeat: no-repeat;
background-position: 0 50px;
min-height: 100vh;
max-width: 100%;
overflow: hidden;
}
i {
user-select: none;
}
h4 {
margin: 0;
}
#content {
box-sizing: border-box;
padding-top: 60px;
margin: auto;
min-height: 100vh;
max-width: 980px;
background-color: rgba(0,0,0,0.15);
align-content: flex-start;
}
.text-center {
text-align: center;
}
body {
font-family: sans-serif;
font-size: 14px;
margin: 0;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
max-width: 100vw;
overflow-x: hidden;
}
a {
text-decoration: none;
color: $fallback--link;
color: var(--link, $fallback--link);
}
button{
user-select: none;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
border: none;
border-radius: $fallback--btnRadius;
border-radius: var(--btnRadius, $fallback--btnRadius);
cursor: pointer;
border-top: 1px solid rgba(255, 255, 255, 0.2);
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
box-shadow: 0px 0px 2px black;
font-size: 14px;
font-family: sans-serif;
&:hover {
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
}
&:disabled {
cursor: not-allowed;
opacity: 0.5;
}
&.pressed {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg)
}
}
label.select {
padding: 0;
}
input, textarea, .select {
border: none;
border-radius: $fallback--inputRadius;
border-radius: var(--inputRadius, $fallback--inputRadius);
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
border-top: 1px solid rgba(0, 0, 0, 0.2);
box-shadow: 0px 0px 2px black inset;
background-color: $fallback--input;
background-color: var(--input, $fallback--input);
color: $fallback--lightFg;
color: var(--lightFg, $fallback--lightFg);
font-family: sans-serif;
font-size: 14px;
padding: 8px 7px;
box-sizing: border-box;
display: inline-block;
position: relative;
height: 29px;
line-height: 16px;
.icon-down-open {
position: absolute;
top: 0;
bottom: 0;
right: 5px;
height: 100%;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
line-height: 29px;
z-index: 0;
pointer-events: none;
}
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: transparent;
border: none;
margin: 0;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
padding: 4px 2em 3px 3px;
width: 100%;
z-index: 1;
height: 29px;
line-height: 16px;
}
&[type=radio],
&[type=checkbox] {
display: none;
&:checked + label::before {
color: $fallback--fg;
color: var(--fg, $fallback--fg);
}
&:disabled,
{
&,
& + label,
& + label::before {
opacity: .5;
}
}
+ label::before {
display: inline-block;
content: '✔';
transition: color 200ms;
width: 1.1em;
height: 1.1em;
border-radius: $fallback--checkBoxRadius;
border-radius: var(--checkBoxRadius, $fallback--checkBoxRadius);
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
border-top: 1px solid rgba(0, 0, 0, 0.2);
box-shadow: 0px 0px 2px black inset;
margin-right: .5em;
background-color: $fallback--input;
background-color: var(--input, $fallback--input);
vertical-align: top;
text-align: center;
line-height: 1.1em;
font-size: 1.1em;
box-sizing: border-box;
color: transparent;
overflow: hidden;
box-sizing: border-box;
}
}
}
option {
color: $fallback--fg;
color: var(--fg, $fallback--fg);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
}
i[class*=icon-] {
color: $fallback--icon;
color: var(--icon, $fallback--icon)
}
.container {
display: flex;
flex-wrap: wrap;
margin: 0;
padding: 0 10px 0 10px;
}
.gaps {
margin: -1em 0 0 -1em;
}
.item {
flex: 1;
line-height: 50px;
height: 50px;
overflow: hidden;
.nav-icon {
font-size: 1.1em;
margin-left: 0.4em;
}
}
.gaps > .item {
padding: 1em 0 0 1em;
}
.auto-size {
flex: 1
}
nav {
width: 100%;
align-items: center;
position: fixed;
height: 50px;
.inner-nav {
padding-left: 20px;
padding-right: 20px;
display: flex;
align-items: center;
flex-basis: 970px;
margin: auto;
height: 50px;
background-repeat: no-repeat;
background-position: center;
background-size: auto 80%;
a i {
color: $fallback--link;
color: var(--link, $fallback--link);
}
}
}
main-router {
flex: 1;
}
.status.compact {
color: rgba(0, 0, 0, 0.42);
font-weight: 300;
p {
margin: 0;
font-size: 0.8em
}
}
/* Panel */
.panel {
display: flex;
flex-direction: column;
margin: 0.5em;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
box-shadow: 1px 1px 4px rgba(0,0,0,.6);
}
.panel-body:empty::before {
content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
display: block;
margin: 1em;
text-align: center;
}
.panel-heading {
border-radius: $fallback--panelRadius $fallback--panelRadius 0 0;
border-radius: var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius) 0 0;
background-size: cover;
padding: 0.6em 1.0em;
text-align: left;
font-size: 1.3em;
line-height: 24px;
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
}
.panel-heading.stub {
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
}
.panel-footer {
border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
}
.panel-body > p {
line-height: 18px;
padding: 1em;
margin: 0;
}
.container > * {
min-width: 0px;
}
.fa {
color: grey;
}
nav {
z-index: 1000;
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
color: $fallback--faint;
color: var(--faint, $fallback--faint);
box-shadow: 0px 0px 4px rgba(0,0,0,.6);
}
.fade-enter-active, .fade-leave-active {
transition: opacity .2s
}
.fade-enter, .fade-leave-active {
opacity: 0
}
.main {
flex-basis: 60%;
flex-grow: 1;
flex-shrink: 1;
}
.sidebar-bounds {
flex: 0;
flex-basis: 35%;
}
.sidebar-flexer {
flex: 1;
flex-basis: 345px;
width: 365px;
}
.mobile-shown {
display: none;
}
.panel-switcher {
display: none;
width: 100%;
height: 46px;
button {
display: block;
flex: 1;
max-height: 32px;
margin: 0.5em;
padding: 0.5em;
}
}
@media all and (min-width: 960px) {
body {
overflow-y: scroll;
}
.sidebar-bounds {
overflow: hidden;
max-height: 100vh;
width: 345px;
position: fixed;
margin-top: -10px;
.sidebar-scroller {
height: 96vh;
width: 365px;
padding-top: 10px;
padding-right: 50px;
overflow-x: hidden;
overflow-y: scroll;
}
.sidebar {
width: 345px;
}
}
.sidebar-flexer {
max-height: 96vh;
flex-shrink: 0;
flex-grow: 0;
}
}
.alert {
margin: 0.35em;
padding: 0.25em;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
color: $fallback--faint;
color: var(--faint, $fallback--faint);
min-height: 28px;
line-height: 28px;
&.error {
background-color: $fallback--cAlertRed;
background-color: var(--cAlertRed, $fallback--cAlertRed);
}
}
.faint {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
@media all and (max-width: 959px) {
.mobile-hidden {
display: none;
}
.panel-switcher {
display: flex;
}
.container {
padding: 0 0 0 0;
}
.panel {
margin: 0.5em 0 0.5em 0;
}
}
.item.right {
text-align: right;
padding-right: 20px;
}
+
+.visibility-tray {
+ font-size: 1.2em;
+ padding: 3px;
+ cursor: pointer;
+
+ .selected {
+ color: $fallback--lightFg;
+ color: var(--lightFg, $fallback--lightFg);
+ }
+}
+
+.visibility-notice {
+ padding: .5em;
+ border: 1px solid $fallback--faint;
+ border: 1px solid var(--faint, $fallback--faint);
+ border-radius: $fallback--inputRadius;
+ border-radius: var(--inputRadius, $fallback--inputRadius);
+}
+
diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js
index 61f2ac0a0c..ff3bb90626 100644
--- a/src/components/post_status_form/post_status_form.js
+++ b/src/components/post_status_form/post_status_form.js
@@ -1,280 +1,280 @@
import statusPoster from '../../services/status_poster/status_poster.service.js'
import MediaUpload from '../media_upload/media_upload.vue'
import fileTypeService from '../../services/file_type/file_type.service.js'
import Completion from '../../services/completion/completion.js'
import { take, filter, reject, map, uniqBy } from 'lodash'
const buildMentionsString = ({user, attentions}, currentUser) => {
let allAttentions = [...attentions]
allAttentions.unshift(user)
allAttentions = uniqBy(allAttentions, 'id')
allAttentions = reject(allAttentions, {id: currentUser.id})
let mentions = map(allAttentions, (attention) => {
return `@${attention.screen_name}`
})
return mentions.join(' ') + ' '
}
const PostStatusForm = {
props: [
'replyTo',
'repliedUser',
'attentions',
'messageScope'
],
components: {
MediaUpload
},
mounted () {
this.resize(this.$refs.textarea)
if (this.replyTo) {
this.$refs.textarea.focus()
}
},
data () {
const preset = this.$route.query.message
let statusText = preset || ''
if (this.replyTo) {
const currentUser = this.$store.state.users.currentUser
statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)
}
return {
dropFiles: [],
submitDisabled: false,
error: null,
posting: false,
highlighted: 0,
newStatus: {
status: statusText,
files: [],
- visibility: this.messageScope || 'public'
+ visibility: this.messageScope || this.$store.state.users.currentUser.default_scope
},
caret: 0
}
},
computed: {
vis () {
return {
public: { selected: this.newStatus.visibility === 'public' },
unlisted: { selected: this.newStatus.visibility === 'unlisted' },
private: { selected: this.newStatus.visibility === 'private' },
direct: { selected: this.newStatus.visibility === 'direct' }
}
},
candidates () {
const firstchar = this.textAtCaret.charAt(0)
if (firstchar === '@') {
const matchedUsers = filter(this.users, (user) => (String(user.name + user.screen_name)).toUpperCase()
.match(this.textAtCaret.slice(1).toUpperCase()))
if (matchedUsers.length <= 0) {
return false
}
// eslint-disable-next-line camelcase
return map(take(matchedUsers, 5), ({screen_name, name, profile_image_url_original}, index) => ({
// eslint-disable-next-line camelcase
screen_name: `@${screen_name}`,
name: name,
img: profile_image_url_original,
highlighted: index === this.highlighted
}))
} else if (firstchar === ':') {
if (this.textAtCaret === ':') { return }
const matchedEmoji = filter(this.emoji.concat(this.customEmoji), (emoji) => emoji.shortcode.match(this.textAtCaret.slice(1)))
if (matchedEmoji.length <= 0) {
return false
}
return map(take(matchedEmoji, 5), ({shortcode, image_url, utf}, index) => ({
screen_name: `:${shortcode}:`,
name: '',
utf: utf || '',
// eslint-disable-next-line camelcase
img: utf ? '' : this.$store.state.config.server + image_url,
highlighted: index === this.highlighted
}))
} else {
return false
}
},
textAtCaret () {
return (this.wordAtCaret || {}).word || ''
},
wordAtCaret () {
const word = Completion.wordAtPosition(this.newStatus.status, this.caret - 1) || {}
return word
},
users () {
return this.$store.state.users.users
},
emoji () {
return this.$store.state.config.emoji || []
},
customEmoji () {
return this.$store.state.config.customEmoji || []
},
statusLength () {
return this.newStatus.status.length
},
statusLengthLimit () {
return this.$store.state.config.textlimit
},
hasStatusLengthLimit () {
return this.statusLengthLimit > 0
},
charactersLeft () {
return this.statusLengthLimit - this.statusLength
},
isOverLengthLimit () {
return this.hasStatusLengthLimit && (this.statusLength > this.statusLengthLimit)
},
scopeOptionsEnabled () {
return this.$store.state.config.scopeOptionsEnabled
}
},
methods: {
replace (replacement) {
this.newStatus.status = Completion.replaceWord(this.newStatus.status, this.wordAtCaret, replacement)
const el = this.$el.querySelector('textarea')
el.focus()
this.caret = 0
},
replaceCandidate (e) {
const len = this.candidates.length || 0
if (this.textAtCaret === ':' || e.ctrlKey) { return }
if (len > 0) {
e.preventDefault()
const candidate = this.candidates[this.highlighted]
const replacement = candidate.utf || (candidate.screen_name + ' ')
this.newStatus.status = Completion.replaceWord(this.newStatus.status, this.wordAtCaret, replacement)
const el = this.$el.querySelector('textarea')
el.focus()
this.caret = 0
this.highlighted = 0
}
},
cycleBackward (e) {
const len = this.candidates.length || 0
if (len > 0) {
e.preventDefault()
this.highlighted -= 1
if (this.highlighted < 0) {
this.highlighted = this.candidates.length - 1
}
} else {
this.highlighted = 0
}
},
cycleForward (e) {
const len = this.candidates.length || 0
if (len > 0) {
if (e.shiftKey) { return }
e.preventDefault()
this.highlighted += 1
if (this.highlighted >= len) {
this.highlighted = 0
}
} else {
this.highlighted = 0
}
},
setCaret ({target: {selectionStart}}) {
this.caret = selectionStart
},
postStatus (newStatus) {
if (this.posting) { return }
if (this.submitDisabled) { return }
if (this.newStatus.status === '') {
if (this.newStatus.files.length > 0) {
this.newStatus.status = '\u200b' // hack
} else {
this.error = 'Cannot post an empty status with no files'
return
}
}
this.posting = true
statusPoster.postStatus({
status: newStatus.status,
spoilerText: newStatus.spoilerText || null,
visibility: newStatus.visibility,
media: newStatus.files,
store: this.$store,
inReplyToStatusId: this.replyTo
}).then((data) => {
if (!data.error) {
this.newStatus = {
status: '',
files: [],
visibility: newStatus.visibility
}
this.$emit('posted')
let el = this.$el.querySelector('textarea')
el.style.height = '16px'
this.error = null
} else {
this.error = data.error
}
this.posting = false
})
},
addMediaFile (fileInfo) {
this.newStatus.files.push(fileInfo)
this.enableSubmit()
},
removeMediaFile (fileInfo) {
let index = this.newStatus.files.indexOf(fileInfo)
this.newStatus.files.splice(index, 1)
},
disableSubmit () {
this.submitDisabled = true
},
enableSubmit () {
this.submitDisabled = false
},
type (fileInfo) {
return fileTypeService.fileType(fileInfo.mimetype)
},
paste (e) {
if (e.clipboardData.files.length > 0) {
// Strangely, files property gets emptied after event propagation
// Trying to wrap it in array doesn't work. Plus I doubt it's possible
// to hold more than one file in clipboard.
this.dropFiles = [e.clipboardData.files[0]]
}
},
fileDrop (e) {
if (e.dataTransfer.files.length > 0) {
e.preventDefault() // allow dropping text like before
this.dropFiles = e.dataTransfer.files
}
},
fileDrag (e) {
e.dataTransfer.dropEffect = 'copy'
},
resize (e) {
if (!e.target) { return }
const vertPadding = Number(window.getComputedStyle(e.target)['padding-top'].substr(0, 1)) +
Number(window.getComputedStyle(e.target)['padding-bottom'].substr(0, 1))
e.target.style.height = 'auto'
e.target.style.height = `${e.target.scrollHeight - vertPadding}px`
if (e.target.value === '') {
e.target.style.height = '16px'
}
},
clearError () {
this.error = null
},
changeVis (visibility) {
this.newStatus.visibility = visibility
}
}
}
export default PostStatusForm
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index ce078fe134..2b84758baf 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -1,301 +1,282 @@
<template>
<div class="post-status-form">
<form @submit.prevent="postStatus(newStatus)">
<div class="form-group" >
<i18n
v-if="!this.$store.state.users.currentUser.locked && this.newStatus.visibility == 'private'"
path="post_status.account_not_locked_warning"
tag="p"
class="visibility-notice">
<router-link to="/user-settings">{{ $t('post_status.account_not_locked_warning_link') }}</router-link>
</i18n>
<p v-if="this.newStatus.visibility == 'direct'" class="visibility-notice">{{ $t('post_status.direct_warning') }}</p>
<input
v-if="scopeOptionsEnabled"
type="text"
:placeholder="$t('post_status.content_warning')"
v-model="newStatus.spoilerText"
class="form-cw">
<textarea
ref="textarea"
@click="setCaret"
@keyup="setCaret" v-model="newStatus.status" :placeholder="$t('post_status.default')" rows="1" class="form-control"
@keydown.down="cycleForward"
@keydown.up="cycleBackward"
@keydown.shift.tab="cycleBackward"
@keydown.tab="cycleForward"
@keydown.enter="replaceCandidate"
@keydown.meta.enter="postStatus(newStatus)"
@keyup.ctrl.enter="postStatus(newStatus)"
@drop="fileDrop"
@dragover.prevent="fileDrag"
@input="resize"
@paste="paste">
</textarea>
<div v-if="scopeOptionsEnabled" class="visibility-tray">
<i v-on:click="changeVis('direct')" class="icon-mail-alt" :class="vis.direct" :title="$t('post_status.scope.direct')"></i>
<i v-on:click="changeVis('private')" class="icon-lock" :class="vis.private" :title="$t('post_status.scope.private')"></i>
<i v-on:click="changeVis('unlisted')" class="icon-lock-open-alt" :class="vis.unlisted" :title="$t('post_status.scope.unlisted')"></i>
<i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public" :title="$t('post_status.scope.public')"></i>
</div>
</div>
<div style="position:relative;" v-if="candidates">
<div class="autocomplete-panel">
<div v-for="candidate in candidates" @click="replace(candidate.utf || (candidate.screen_name + ' '))">
<div class="autocomplete" :class="{ highlighted: candidate.highlighted }">
<span v-if="candidate.img"><img :src="candidate.img"></img></span>
<span v-else>{{candidate.utf}}</span>
<span>{{candidate.screen_name}}<small>{{candidate.name}}</small></span>
</div>
</div>
</div>
</div>
<div class='form-bottom'>
<media-upload @uploading="disableSubmit" @uploaded="addMediaFile" @upload-failed="enableSubmit" :drop-files="dropFiles"></media-upload>
<p v-if="isOverLengthLimit" class="error">{{ charactersLeft }}</p>
<p class="faint" v-else-if="hasStatusLengthLimit">{{ charactersLeft }}</p>
<button v-if="posting" disabled class="btn btn-default">{{$t('post_status.posting')}}</button>
<button v-else-if="isOverLengthLimit" disabled class="btn btn-default">{{$t('general.submit')}}</button>
<button v-else :disabled="submitDisabled" type="submit" class="btn btn-default">{{$t('general.submit')}}</button>
</div>
<div class='alert error' v-if="error">
Error: {{ error }}
<i class="icon-cancel" @click="clearError"></i>
</div>
<div class="attachments">
<div class="media-upload-wrapper" v-for="file in newStatus.files">
<i class="fa icon-cancel" @click="removeMediaFile(file)"></i>
<div class="media-upload-container attachment">
<img class="thumbnail media-upload" :src="file.image" v-if="type(file) === 'image'"></img>
<video v-if="type(file) === 'video'" :src="file.image" controls></video>
<audio v-if="type(file) === 'audio'" :src="file.image" controls></audio>
<a v-if="type(file) === 'unknown'" :href="file.image">{{file.url}}</a>
</div>
</div>
</div>
</form>
</div>
</template>
<script src="./post_status_form.js"></script>
<style lang="scss">
@import '../../_variables.scss';
.tribute-container {
ul {
padding: 0px;
li {
display: flex;
align-items: center;
}
}
img {
padding: 3px;
width: 16px;
height: 16px;
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
}
}
-.post-status-form .visibility-tray {
- font-size: 1.2em;
- padding: 3px;
- cursor: pointer;
-
- .selected {
- color: $fallback--lightFg;
- color: var(--lightFg, $fallback--lightFg);
- }
-}
-
-.visibility-notice {
- padding: .5em;
- border: 1px solid $fallback--faint;
- border: 1px solid var(--faint, $fallback--faint);
- border-radius: $fallback--inputRadius;
- border-radius: var(--inputRadius, $fallback--inputRadius);
-}
-
.post-status-form, .login {
.form-bottom {
display: flex;
padding: 0.5em;
height: 32px;
button {
width: 10em;
}
p {
margin: 0.35em;
padding: 0.35em;
display: flex;
}
}
.error {
text-align: center;
}
.media-upload-wrapper {
flex: 0 0 auto;
max-width: 100%;
min-width: 50px;
margin-right: .2em;
margin-bottom: .5em;
.icon-cancel {
display: inline-block;
position: static;
margin: 0;
padding-bottom: 0;
margin-left: $fallback--attachmentRadius;
margin-left: var(--attachmentRadius, $fallback--attachmentRadius);
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
.attachments {
padding: 0 0.5em;
.attachment {
margin: 0;
position: relative;
flex: 0 0 auto;
border: 1px solid $fallback--border;
border: 1px solid var(--border, $fallback--border);
text-align: center;
audio {
min-width: 300px;
flex: 1 0 auto;
}
a {
display: block;
text-align: left;
line-height: 1.2;
padding: .5em;
}
}
i {
position: absolute;
margin: 10px;
padding: 5px;
background: rgba(230,230,230,0.6);
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
font-weight: bold;
}
}
.btn {
cursor: pointer;
}
.btn[disabled] {
cursor: not-allowed;
}
form {
display: flex;
flex-direction: column;
padding: 0.6em;
}
.form-group {
display: flex;
flex-direction: column;
padding: 0.3em 0.5em 0.6em;
line-height:24px;
}
form textarea.form-cw {
line-height:16px;
resize: none;
overflow: hidden;
transition: min-height 200ms 100ms;
min-height: 1px;
}
form textarea.form-control {
line-height:16px;
resize: none;
overflow: hidden;
transition: min-height 200ms 100ms;
min-height: 1px;
box-sizing: content-box;
}
form textarea.form-control:focus {
min-height: 48px;
}
.btn {
cursor: pointer;
}
.btn[disabled] {
cursor: not-allowed;
}
.icon-cancel {
cursor: pointer;
z-index: 4;
}
.autocomplete-panel {
margin: 0 0.5em 0 0.5em;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
position: absolute;
z-index: 1;
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
min-width: 75%;
background: $fallback--bg;
background: var(--bg, $fallback--bg);
color: $fallback--lightFg;
color: var(--lightFg, $fallback--lightFg);
}
.autocomplete {
cursor: pointer;
padding: 0.2em 0.4em 0.2em 0.4em;
border-bottom: 1px solid rgba(0, 0, 0, 0.4);
display: flex;
img {
width: 24px;
height: 24px;
border-radius: $fallback--avatarRadius;
border-radius: var(--avatarRadius, $fallback--avatarRadius);
object-fit: contain;
}
span {
line-height: 24px;
margin: 0 0.1em 0 0.2em;
}
small {
margin-left: .5em;
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
&.highlighted {
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
}
}
}
</style>
diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js
index 443e63dd2d..f046885ed9 100644
--- a/src/components/user_settings/user_settings.js
+++ b/src/components/user_settings/user_settings.js
@@ -1,224 +1,246 @@
import StyleSwitcher from '../style_switcher/style_switcher.vue'
const UserSettings = {
data () {
return {
newname: this.$store.state.users.currentUser.name,
newbio: this.$store.state.users.currentUser.description,
newlocked: this.$store.state.users.currentUser.locked,
+ newdefaultScope: this.$store.state.users.currentUser.default_scope,
followList: null,
followImportError: false,
followsImported: false,
enableFollowsExport: true,
uploading: [ false, false, false, false ],
previews: [ null, null, null ],
deletingAccount: false,
deleteAccountConfirmPasswordInput: '',
deleteAccountError: false,
changePasswordInputs: [ '', '', '' ],
changedPassword: false,
- changePasswordError: false
+ changePasswordError: false,
+ activeTab: 'profile'
}
},
components: {
StyleSwitcher
},
computed: {
user () {
return this.$store.state.users.currentUser
},
pleromaBackend () {
return this.$store.state.config.pleromaBackend
+ },
+ scopeOptionsEnabled () {
+ return this.$store.state.config.scopeOptionsEnabled
+ },
+ vis () {
+ return {
+ public: { selected: this.newdefaultScope === 'public' },
+ unlisted: { selected: this.newdefaultScope === 'unlisted' },
+ private: { selected: this.newdefaultScope === 'private' },
+ direct: { selected: this.newdefaultScope === 'direct' }
+ }
}
},
methods: {
updateProfile () {
const name = this.newname
const description = this.newbio
const locked = this.newlocked
- this.$store.state.api.backendInteractor.updateProfile({params: {name, description, locked}}).then((user) => {
+ /* eslint-disable camelcase */
+ const default_scope = this.newdefaultScope
+ this.$store.state.api.backendInteractor.updateProfile({params: {name, description, locked, default_scope}}).then((user) => {
if (!user.error) {
this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user)
}
})
+ /* eslint-enable camelcase */
+ },
+ changeVis (visibility) {
+ this.newdefaultScope = visibility
},
uploadFile (slot, e) {
const file = e.target.files[0]
if (!file) { return }
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({target}) => {
const img = target.result
this.previews[slot] = img
this.$forceUpdate() // just changing the array with the index doesn't update the view
}
reader.readAsDataURL(file)
},
submitAvatar () {
if (!this.previews[0]) { return }
let img = this.previews[0]
// eslint-disable-next-line no-undef
let imginfo = new Image()
let cropX, cropY, cropW, cropH
imginfo.src = img
if (imginfo.height > imginfo.width) {
cropX = 0
cropW = imginfo.width
cropY = Math.floor((imginfo.height - imginfo.width) / 2)
cropH = imginfo.width
} else {
cropY = 0
cropH = imginfo.height
cropX = Math.floor((imginfo.width - imginfo.height) / 2)
cropW = imginfo.height
}
this.uploading[0] = true
this.$store.state.api.backendInteractor.updateAvatar({params: {img, cropX, cropY, cropW, cropH}}).then((user) => {
if (!user.error) {
this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user)
this.previews[0] = null
}
this.uploading[0] = false
})
},
submitBanner () {
if (!this.previews[1]) { return }
let banner = this.previews[1]
// eslint-disable-next-line no-undef
let imginfo = new Image()
/* eslint-disable camelcase */
let offset_top, offset_left, width, height
imginfo.src = banner
width = imginfo.width
height = imginfo.height
offset_top = 0
offset_left = 0
this.uploading[1] = true
this.$store.state.api.backendInteractor.updateBanner({params: {banner, offset_top, offset_left, width, height}}).then((data) => {
if (!data.error) {
let clone = JSON.parse(JSON.stringify(this.$store.state.users.currentUser))
clone.cover_photo = data.url
this.$store.commit('addNewUsers', [clone])
this.$store.commit('setCurrentUser', clone)
this.previews[1] = null
}
this.uploading[1] = false
})
/* eslint-enable camelcase */
},
submitBg () {
if (!this.previews[2]) { return }
let img = this.previews[2]
// eslint-disable-next-line no-undef
let imginfo = new Image()
let cropX, cropY, cropW, cropH
imginfo.src = img
cropX = 0
cropY = 0
cropW = imginfo.width
cropH = imginfo.width
this.uploading[2] = true
this.$store.state.api.backendInteractor.updateBg({params: {img, cropX, cropY, cropW, cropH}}).then((data) => {
if (!data.error) {
let clone = JSON.parse(JSON.stringify(this.$store.state.users.currentUser))
clone.background_image = data.url
this.$store.commit('addNewUsers', [clone])
this.$store.commit('setCurrentUser', clone)
this.previews[2] = null
}
this.uploading[2] = false
})
},
importFollows () {
this.uploading[3] = true
const followList = this.followList
this.$store.state.api.backendInteractor.followImport({params: followList})
.then((status) => {
if (status) {
this.followsImported = true
} else {
this.followImportError = true
}
this.uploading[3] = false
})
},
/* This function takes an Array of Users
* and outputs a file with all the addresses for the user to download
*/
exportPeople (users, filename) {
// Get all the friends addresses
var UserAddresses = users.map(function (user) {
// check is it's a local user
if (user && user.is_local) {
// append the instance address
// eslint-disable-next-line no-undef
user.screen_name += '@' + location.hostname
}
return user.screen_name
}).join('\n')
// Make the user download the file
var fileToDownload = document.createElement('a')
fileToDownload.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(UserAddresses))
fileToDownload.setAttribute('download', filename)
fileToDownload.style.display = 'none'
document.body.appendChild(fileToDownload)
fileToDownload.click()
document.body.removeChild(fileToDownload)
},
exportFollows () {
this.enableFollowsExport = false
this.$store.state.api.backendInteractor
.fetchFriends({id: this.$store.state.users.currentUser.id})
.then((friendList) => {
this.exportPeople(friendList, 'friends.csv')
})
},
followListChange () {
// eslint-disable-next-line no-undef
let formData = new FormData()
formData.append('list', this.$refs.followlist.files[0])
this.followList = formData
},
dismissImported () {
this.followsImported = false
this.followImportError = false
},
confirmDelete () {
this.deletingAccount = true
},
deleteAccount () {
this.$store.state.api.backendInteractor.deleteAccount({password: this.deleteAccountConfirmPasswordInput})
.then((res) => {
if (res.status === 'success') {
this.$store.dispatch('logout')
this.$router.push('/main/all')
} else {
this.deleteAccountError = res.error
}
})
},
changePassword () {
const params = {
password: this.changePasswordInputs[0],
newPassword: this.changePasswordInputs[1],
newPasswordConfirmation: this.changePasswordInputs[2]
}
this.$store.state.api.backendInteractor.changePassword(params)
.then((res) => {
if (res.status === 'success') {
this.changedPassword = true
this.changePasswordError = false
} else {
this.changedPassword = false
this.changePasswordError = res.error
}
})
+ },
+ activateTab (tabName) {
+ this.activeTab = tabName
}
}
}
export default UserSettings
diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue
index 881b0fa180..c3ca1dbd3a 100644
--- a/src/components/user_settings/user_settings.vue
+++ b/src/components/user_settings/user_settings.vue
@@ -1,140 +1,163 @@
<template>
<div class="settings panel panel-default">
<div class="panel-heading">
{{$t('settings.user_settings')}}
</div>
<div class="panel-body profile-edit">
- <div class="setting-item">
+ <div class="tab-switcher">
+ <button class="btn btn-default" @click="activateTab('profile')">{{$t('settings.profile_tab')}}</button>
+ <button class="btn btn-default" @click="activateTab('security')">{{$t('settings.security_tab')}}</button>
+ <button class="btn btn-default" @click="activateTab('data_import_export')" v-if="pleromaBackend">{{$t('settings.data_import_export_tab')}}</button>
+ </div>
+ <div class="setting-item" v-if="activeTab == 'profile'">
<h2>{{$t('settings.name_bio')}}</h2>
<p>{{$t('settings.name')}}</p>
<input class='name-changer' id='username' v-model="newname"></input>
<p>{{$t('settings.bio')}}</p>
<textarea class="bio" v-model="newbio"></textarea>
- <div class="setting-item">
+ <p>
<input type="checkbox" v-model="newlocked" id="account-locked">
<label for="account-locked">{{$t('settings.lock_account_description')}}</label>
+ </p>
+ <div v-if="scopeOptionsEnabled">
+ <label for="default-vis">{{$t('settings.default_vis')}}</label>
+ <div id="default-vis" class="visibility-tray">
+ <i v-on:click="changeVis('direct')" class="icon-mail-alt" :class="vis.direct"></i>
+ <i v-on:click="changeVis('private')" class="icon-lock" :class="vis.private"></i>
+ <i v-on:click="changeVis('unlisted')" class="icon-lock-open-alt" :class="vis.unlisted"></i>
+ <i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public"></i>
+ </div>
</div>
<button :disabled='newname.length <= 0' class="btn btn-default" @click="updateProfile">{{$t('general.submit')}}</button>
</div>
- <div class="setting-item">
+ <div class="setting-item" v-if="activeTab == 'profile'">
<h2>{{$t('settings.avatar')}}</h2>
<p>{{$t('settings.current_avatar')}}</p>
<img :src="user.profile_image_url_original" class="old-avatar"></img>
<p>{{$t('settings.set_new_avatar')}}</p>
<img class="new-avatar" v-bind:src="previews[0]" v-if="previews[0]">
</img>
<div>
<input type="file" @change="uploadFile(0, $event)" ></input>
</div>
<i class="icon-spin4 animate-spin" v-if="uploading[0]"></i>
<button class="btn btn-default" v-else-if="previews[0]" @click="submitAvatar">{{$t('general.submit')}}</button>
</div>
- <div class="setting-item">
+ <div class="setting-item" v-if="activeTab == 'profile'">
<h2>{{$t('settings.profile_banner')}}</h2>
<p>{{$t('settings.current_profile_banner')}}</p>
<img :src="user.cover_photo" class="banner"></img>
<p>{{$t('settings.set_new_profile_banner')}}</p>
<img class="banner" v-bind:src="previews[1]" v-if="previews[1]">
</img>
<div>
<input type="file" @change="uploadFile(1, $event)" ></input>
</div>
<i class=" icon-spin4 animate-spin uploading" v-if="uploading[1]"></i>
<button class="btn btn-default" v-else-if="previews[1]" @click="submitBanner">{{$t('general.submit')}}</button>
</div>
- <div class="setting-item">
+ <div class="setting-item" v-if="activeTab == 'profile'">
<h2>{{$t('settings.profile_background')}}</h2>
<p>{{$t('settings.set_new_profile_background')}}</p>
<img class="bg" v-bind:src="previews[2]" v-if="previews[2]">
</img>
<div>
<input type="file" @change="uploadFile(2, $event)" ></input>
</div>
<i class=" icon-spin4 animate-spin uploading" v-if="uploading[2]"></i>
<button class="btn btn-default" v-else-if="previews[2]" @click="submitBg">{{$t('general.submit')}}</button>
</div>
- <div class="setting-item">
+ <div class="setting-item" v-if="activeTab == 'security'">
<h2>{{$t('settings.change_password')}}</h2>
<div>
<p>{{$t('settings.current_password')}}</p>
<input type="password" v-model="changePasswordInputs[0]">
</div>
<div>
<p>{{$t('settings.new_password')}}</p>
<input type="password" v-model="changePasswordInputs[1]">
</div>
<div>
<p>{{$t('settings.confirm_new_password')}}</p>
<input type="password" v-model="changePasswordInputs[2]">
</div>
<button class="btn btn-default" @click="changePassword">{{$t('general.submit')}}</button>
<p v-if="changedPassword">{{$t('settings.changed_password')}}</p>
<p v-else-if="changePasswordError !== false">{{$t('settings.change_password_error')}}</p>
<p v-if="changePasswordError">{{changePasswordError}}</p>
</div>
- <div class="setting-item" v-if="pleromaBackend">
+ <div class="setting-item" v-if="pleromaBackend && activeTab == 'data_import_export'">
<h2>{{$t('settings.follow_import')}}</h2>
<p>{{$t('settings.import_followers_from_a_csv_file')}}</p>
<form v-model="followImportForm">
<input type="file" ref="followlist" v-on:change="followListChange"></input>
</form>
<i class=" icon-spin4 animate-spin uploading" v-if="uploading[3]"></i>
<button class="btn btn-default" v-else @click="importFollows">{{$t('general.submit')}}</button>
<div v-if="followsImported">
<i class="icon-cross" @click="dismissImported"></i>
<p>{{$t('settings.follows_imported')}}</p>
</div>
<div v-else-if="followImportError">
<i class="icon-cross" @click="dismissImported"></i>
<p>{{$t('settings.follow_import_error')}}</p>
</div>
</div>
- <div class="setting-item" v-if="enableFollowsExport">
+ <div class="setting-item" v-if="enableFollowsExport && activeTab == 'data_import_export'">
<h2>{{$t('settings.follow_export')}}</h2>
<button class="btn btn-default" @click="exportFollows">{{$t('settings.follow_export_button')}}</button>
</div>
- <div class="setting-item" v-else>
+ <div class="setting-item" v-else-if="activeTab == 'data_import_export'">
<h2>{{$t('settings.follow_export_processing')}}</h2>
</div>
<hr>
- <div class="setting-item">
+ <div class="setting-item" v-if="activeTab == 'security'">
<h2>{{$t('settings.delete_account')}}</h2>
<p v-if="!deletingAccount">{{$t('settings.delete_account_description')}}</p>
<div v-if="deletingAccount">
<p>{{$t('settings.delete_account_instructions')}}</p>
<p>{{$t('login.password')}}</p>
<input type="password" v-model="deleteAccountConfirmPasswordInput">
<button class="btn btn-default" @click="deleteAccount">{{$t('settings.delete_account')}}</button>
</div>
<p v-if="deleteAccountError !== false">{{$t('settings.delete_account_error')}}</p>
<p v-if="deleteAccountError">{{deleteAccountError}}</p>
<button class="btn btn-default" v-if="!deletingAccount" @click="confirmDelete">{{$t('general.submit')}}</button>
</div>
</div>
</div>
</template>
<script src="./user_settings.js">
</script>
<style lang="scss">
.profile-edit {
.bio {
margin: 0;
}
input[type=file] {
padding: 5px;
height: auto;
}
.banner {
max-width: 400px;
}
.uploading {
font-size: 1.5em;
margin: 0.25em;
}
}
+
+.tab-switcher {
+ margin: 7px 7px;
+ display: inline-block;
+
+ button {
+ height: 30px;
+ }
+}
</style>
diff --git a/src/i18n/messages.js b/src/i18n/messages.js
index 3c11af8cea..993823640e 100644
--- a/src/i18n/messages.js
+++ b/src/i18n/messages.js
@@ -1,1948 +1,1952 @@
const de = {
chat: {
title: 'Chat'
},
nav: {
chat: 'Lokaler Chat',
timeline: 'Zeitleiste',
mentions: 'Erwähnungen',
public_tl: 'Lokale Zeitleiste',
twkn: 'Das gesamte Netzwerk'
},
user_card: {
follows_you: 'Folgt dir!',
following: 'Folgst du!',
follow: 'Folgen',
blocked: 'Blockiert!',
block: 'Blockieren',
statuses: 'Beiträge',
mute: 'Stummschalten',
muted: 'Stummgeschaltet',
followers: 'Folgende',
followees: 'Folgt',
per_day: 'pro Tag',
remote_follow: 'Remote Follow'
},
timeline: {
show_new: 'Zeige Neuere',
error_fetching: 'Fehler beim Laden',
up_to_date: 'Aktuell',
load_older: 'Lade ältere Beiträge',
conversation: 'Unterhaltung',
collapse: 'Einklappen',
repeated: 'wiederholte'
},
settings: {
user_settings: 'Benutzereinstellungen',
name_bio: 'Name & Bio',
name: 'Name',
bio: 'Bio',
avatar: 'Avatar',
current_avatar: 'Dein derzeitiger Avatar',
set_new_avatar: 'Setze neuen Avatar',
profile_banner: 'Profil Banner',
current_profile_banner: 'Dein derzeitiger Profil Banner',
set_new_profile_banner: 'Setze neuen Profil Banner',
profile_background: 'Profil Hintergrund',
set_new_profile_background: 'Setze neuen Profil Hintergrund',
settings: 'Einstellungen',
theme: 'Farbschema',
presets: 'Voreinstellungen',
theme_help: 'Benutze HTML Farbcodes (#rrggbb) um dein Farbschema anzupassen',
radii_help: 'Kantenrundung (in Pixel) der Oberfläche anpassen',
background: 'Hintergrund',
foreground: 'Vordergrund',
text: 'Text',
links: 'Links',
cBlue: 'Blau (Antworten, Folgt dir)',
cRed: 'Rot (Abbrechen)',
cOrange: 'Orange (Favorisieren)',
cGreen: 'Grün (Retweet)',
btnRadius: 'Buttons',
inputRadius: 'Eingabefelder',
panelRadius: 'Panel',
avatarRadius: 'Avatare',
avatarAltRadius: 'Avatare (Benachrichtigungen)',
tooltipRadius: 'Tooltips/Warnungen',
attachmentRadius: 'Anhänge',
filtering: 'Filter',
filtering_explanation: 'Alle Beiträge die diese Wörter enthalten werden ausgeblendet. Ein Wort pro Zeile.',
attachments: 'Anhänge',
hide_attachments_in_tl: 'Anhänge in der Zeitleiste ausblenden',
hide_attachments_in_convo: 'Anhänge in Unterhaltungen ausblenden',
nsfw_clickthrough: 'Aktiviere ausblendbares Overlay für Anhänge, die als NSFW markiert sind',
stop_gifs: 'Play-on-hover GIFs',
autoload: 'Aktiviere automatisches Laden von älteren Beiträgen beim scrollen',
streaming: 'Aktiviere automatisches Laden (Streaming) von neuen Beiträgen',
reply_link_preview: 'Aktiviere reply-link Vorschau bei Maus-Hover',
follow_import: 'Folgeliste importieren',
import_followers_from_a_csv_file: 'Importiere Kontakte, denen du folgen möchtest, aus einer CSV-Datei',
follows_imported: 'Folgeliste importiert! Die Bearbeitung kann eine Zeit lang dauern.',
follow_import_error: 'Fehler beim importieren der Folgeliste',
delete_account: 'Account löschen',
delete_account_description: 'Lösche deinen Account und alle deine Nachrichten dauerhaft.',
delete_account_instructions: 'Tippe dein Passwort unten in das Feld ein um die Löschung deines Accounts zu bestätigen.',
delete_account_error: 'Es ist ein Fehler beim löschen deines Accounts aufgetreten. Tritt dies weiterhin auf, wende dich an den Administrator der Instanz.',
follow_export: 'Folgeliste exportieren',
follow_export_processing: 'In Bearbeitung. Die Liste steht gleich zum herunterladen bereit.',
follow_export_button: 'Liste (.csv) erstellen',
change_password: 'Passwort ändern',
current_password: 'Aktuelles Passwort',
new_password: 'Neues Passwort',
confirm_new_password: 'Neues Passwort bestätigen',
changed_password: 'Passwort erfolgreich geändert!',
change_password_error: 'Es gab ein Problem bei der Änderung des Passworts.'
},
notifications: {
notifications: 'Benachrichtigungen',
read: 'Gelesen!',
followed_you: 'folgt dir',
favorited_you: 'favorisierte deine Nachricht',
repeated_you: 'wiederholte deine Nachricht'
},
login: {
login: 'Anmelden',
username: 'Benutzername',
placeholder: 'z.B. lain',
password: 'Passwort',
register: 'Registrieren',
logout: 'Abmelden'
},
registration: {
registration: 'Registrierung',
fullname: 'Angezeigter Name',
email: 'Email',
bio: 'Bio',
password_confirm: 'Passwort bestätigen'
},
post_status: {
posting: 'Veröffentlichen',
default: 'Sitze gerade im Hofbräuhaus.',
account_not_locked_warning: 'Dein Profil ist nicht {0}. Wer dir folgen will, kann das jederzeit tun und dann auch deine privaten Beiträge sehen.',
account_not_locked_warning_link: 'gesperrt',
direct_warning: 'Dieser Beitrag wird nur für die erwähnten Nutzer sichtbar sein.',
scope: {
public: 'Öffentlich - Beitrag an öffentliche Zeitleisten',
unlisted: 'Nicht gelistet - Nicht in öffentlichen Zeitleisten anzeigen',
private: 'Nur Folgende - Beitrag nur an Folgende',
direct: 'Direkt - Beitrag nur an erwähnte Profile'
}
},
finder: {
find_user: 'Finde Benutzer',
error_fetching_user: 'Fehler beim Suchen des Benutzers'
},
general: {
submit: 'Absenden',
apply: 'Anwenden'
},
user_profile: {
timeline_title: 'Beiträge'
}
}
const fi = {
nav: {
timeline: 'Aikajana',
mentions: 'Maininnat',
public_tl: 'Julkinen Aikajana',
twkn: 'Koko Tunnettu Verkosto'
},
user_card: {
follows_you: 'Seuraa sinua!',
following: 'Seuraat!',
follow: 'Seuraa',
statuses: 'Viestit',
mute: 'Hiljennä',
muted: 'Hiljennetty',
followers: 'Seuraajat',
followees: 'Seuraa',
per_day: 'päivässä'
},
timeline: {
show_new: 'Näytä uudet',
error_fetching: 'Virhe ladatessa viestejä',
up_to_date: 'Ajantasalla',
load_older: 'Lataa vanhempia viestejä',
conversation: 'Keskustelu',
collapse: 'Sulje',
repeated: 'toisti'
},
settings: {
user_settings: 'Käyttäjän asetukset',
name_bio: 'Nimi ja kuvaus',
name: 'Nimi',
bio: 'Kuvaus',
avatar: 'Profiilikuva',
current_avatar: 'Nykyinen profiilikuvasi',
set_new_avatar: 'Aseta uusi profiilikuva',
profile_banner: 'Juliste',
current_profile_banner: 'Nykyinen julisteesi',
set_new_profile_banner: 'Aseta uusi juliste',
profile_background: 'Taustakuva',
set_new_profile_background: 'Aseta uusi taustakuva',
settings: 'Asetukset',
theme: 'Teema',
presets: 'Valmiit teemat',
theme_help: 'Käytä heksadesimaalivärejä muokataksesi väriteemaasi.',
background: 'Tausta',
foreground: 'Korostus',
text: 'Teksti',
links: 'Linkit',
filtering: 'Suodatus',
filtering_explanation: 'Kaikki viestit, jotka sisältävät näitä sanoja, suodatetaan. Yksi sana per rivi.',
attachments: 'Liitteet',
hide_attachments_in_tl: 'Piilota liitteet aikajanalla',
hide_attachments_in_convo: 'Piilota liitteet keskusteluissa',
nsfw_clickthrough: 'Piilota NSFW liitteet klikkauksen taakse.',
autoload: 'Lataa vanhempia viestejä automaattisesti ruudun pohjalla',
streaming: 'Näytä uudet viestit automaattisesti ollessasi ruudun huipulla',
reply_link_preview: 'Keskusteluiden vastauslinkkien esikatselu'
},
notifications: {
notifications: 'Ilmoitukset',
read: 'Lue!',
followed_you: 'seuraa sinua',
favorited_you: 'tykkäsi viestistäsi',
repeated_you: 'toisti viestisi'
},
login: {
login: 'Kirjaudu sisään',
username: 'Käyttäjänimi',
placeholder: 'esim. lain',
password: 'Salasana',
register: 'Rekisteröidy',
logout: 'Kirjaudu ulos'
},
registration: {
registration: 'Rekisteröityminen',
fullname: 'Koko nimi',
email: 'Sähköposti',
bio: 'Kuvaus',
password_confirm: 'Salasanan vahvistaminen'
},
post_status: {
posting: 'Lähetetään',
default: 'Tulin juuri saunasta.'
},
finder: {
find_user: 'Hae käyttäjä',
error_fetching_user: 'Virhe hakiessa käyttäjää'
},
general: {
submit: 'Lähetä',
apply: 'Aseta'
}
}
const en = {
chat: {
title: 'Chat'
},
nav: {
chat: 'Local Chat',
timeline: 'Timeline',
mentions: 'Mentions',
public_tl: 'Public Timeline',
twkn: 'The Whole Known Network',
friend_requests: 'Follow Requests'
},
user_card: {
follows_you: 'Follows you!',
following: 'Following!',
follow: 'Follow',
blocked: 'Blocked!',
block: 'Block',
statuses: 'Statuses',
mute: 'Mute',
muted: 'Muted',
followers: 'Followers',
followees: 'Following',
per_day: 'per day',
remote_follow: 'Remote follow',
approve: 'Approve',
deny: 'Deny'
},
timeline: {
show_new: 'Show new',
error_fetching: 'Error fetching updates',
up_to_date: 'Up-to-date',
load_older: 'Load older statuses',
conversation: 'Conversation',
collapse: 'Collapse',
repeated: 'repeated'
},
settings: {
user_settings: 'User Settings',
name_bio: 'Name & Bio',
name: 'Name',
bio: 'Bio',
avatar: 'Avatar',
current_avatar: 'Your current avatar',
set_new_avatar: 'Set new avatar',
profile_banner: 'Profile Banner',
current_profile_banner: 'Your current profile banner',
set_new_profile_banner: 'Set new profile banner',
profile_background: 'Profile Background',
set_new_profile_background: 'Set new profile background',
settings: 'Settings',
theme: 'Theme',
presets: 'Presets',
theme_help: 'Use hex color codes (#rrggbb) to customize your color theme.',
radii_help: 'Set up interface edge rounding (in pixels)',
background: 'Background',
foreground: 'Foreground',
text: 'Text',
links: 'Links',
cBlue: 'Blue (Reply, follow)',
cRed: 'Red (Cancel)',
cOrange: 'Orange (Favorite)',
cGreen: 'Green (Retweet)',
btnRadius: 'Buttons',
inputRadius: 'Input fields',
panelRadius: 'Panels',
avatarRadius: 'Avatars',
avatarAltRadius: 'Avatars (Notifications)',
tooltipRadius: 'Tooltips/alerts',
attachmentRadius: 'Attachments',
filtering: 'Filtering',
filtering_explanation: 'All statuses containing these words will be muted, one per line',
attachments: 'Attachments',
hide_attachments_in_tl: 'Hide attachments in timeline',
hide_attachments_in_convo: 'Hide attachments in conversations',
nsfw_clickthrough: 'Enable clickthrough NSFW attachment hiding',
stop_gifs: 'Play-on-hover GIFs',
autoload: 'Enable automatic loading when scrolled to the bottom',
streaming: 'Enable automatic streaming of new posts when scrolled to the top',
pause_on_unfocused: 'Pause streaming when tab is not focused',
loop_video: 'Loop videos',
loop_video_silent_only: 'Loop only videos without sound (i.e. Mastodon\'s "gifs")',
reply_link_preview: 'Enable reply-link preview on mouse hover',
follow_import: 'Follow import',
import_followers_from_a_csv_file: 'Import follows from a csv file',
follows_imported: 'Follows imported! Processing them will take a while.',
follow_import_error: 'Error importing followers',
delete_account: 'Delete Account',
delete_account_description: 'Permanently delete your account and all your messages.',
delete_account_instructions: 'Type your password in the input below to confirm account deletion.',
delete_account_error: 'There was an issue deleting your account. If this persists please contact your instance administrator.',
follow_export: 'Follow export',
follow_export_processing: 'Processing, you\'ll soon be asked to download your file',
follow_export_button: 'Export your follows to a csv file',
change_password: 'Change Password',
current_password: 'Current password',
new_password: 'New password',
confirm_new_password: 'Confirm new password',
changed_password: 'Password changed successfully!',
change_password_error: 'There was an issue changing your password.',
lock_account_description: 'Restrict your account to approved followers only',
- limited_availability: 'Unavailable in your browser'
+ limited_availability: 'Unavailable in your browser',
+ default_vis: 'Default visibility scope',
+ profile_tab: 'Profile',
+ security_tab: 'Security',
+ data_import_export_tab: 'Data Import / Export'
},
notifications: {
notifications: 'Notifications',
read: 'Read!',
followed_you: 'followed you',
favorited_you: 'favorited your status',
repeated_you: 'repeated your status'
},
login: {
login: 'Log in',
username: 'Username',
placeholder: 'e.g. lain',
password: 'Password',
register: 'Register',
logout: 'Log out'
},
registration: {
registration: 'Registration',
fullname: 'Display name',
email: 'Email',
bio: 'Bio',
password_confirm: 'Password confirmation',
token: 'Invite token'
},
post_status: {
posting: 'Posting',
content_warning: 'Subject (optional)',
default: 'Just landed in L.A.',
account_not_locked_warning: 'Your account is not {0}. Anyone can follow you to view your follower-only posts.',
account_not_locked_warning_link: 'locked',
direct_warning: 'This post will only be visible to all the mentioned users.',
scope: {
public: 'Public - Post to public timelines',
unlisted: 'Unlisted - Do not post to public timelines',
private: 'Followers-only - Post to followers only',
direct: 'Direct - Post to mentioned users only'
}
},
finder: {
find_user: 'Find user',
error_fetching_user: 'Error fetching user'
},
general: {
submit: 'Submit',
apply: 'Apply'
},
user_profile: {
timeline_title: 'User Timeline'
}
}
const eo = {
chat: {
title: 'Babilo'
},
nav: {
chat: 'Loka babilo',
timeline: 'Tempovido',
mentions: 'Mencioj',
public_tl: 'Publika tempovido',
twkn: 'Tuta konata reto'
},
user_card: {
follows_you: 'Abonas vin!',
following: 'Abonanta!',
follow: 'Aboni',
blocked: 'Barita!',
block: 'Bari',
statuses: 'Statoj',
mute: 'Silentigi',
muted: 'Silentigita',
followers: 'Abonantoj',
followees: 'Abonatoj',
per_day: 'tage',
remote_follow: 'Fora abono'
},
timeline: {
show_new: 'Montri novajn',
error_fetching: 'Eraro ĝisdatigante',
up_to_date: 'Ĝisdata',
load_older: 'Enlegi pli malnovajn statojn',
conversation: 'Interparolo',
collapse: 'Maletendi',
repeated: 'ripetata'
},
settings: {
user_settings: 'Uzulaj agordoj',
name_bio: 'Nomo kaj prio',
name: 'Nomo',
bio: 'Prio',
avatar: 'Profilbildo',
current_avatar: 'Via nuna profilbildo',
set_new_avatar: 'Agordi novan profilbildon',
profile_banner: 'Profila rubando',
current_profile_banner: 'Via nuna profila rubando',
set_new_profile_banner: 'Agordi novan profilan rubandon',
profile_background: 'Profila fono',
set_new_profile_background: 'Agordi novan profilan fonon',
settings: 'Agordoj',
theme: 'Haŭto',
presets: 'Antaŭmetaĵoj',
theme_help: 'Uzu deksesumajn kolorkodojn (#rrvvbb) por adapti vian koloran haŭton.',
radii_help: 'Agordi fasadan rondigon de randoj (rastrumere)',
background: 'Fono',
foreground: 'Malfono',
text: 'Teksto',
links: 'Ligiloj',
cBlue: 'Blua (Respondo, abono)',
cRed: 'Ruĝa (Nuligo)',
cOrange: 'Orange (Ŝato)',
cGreen: 'Verda (Kunhavigo)',
btnRadius: 'Butonoj',
panelRadius: 'Paneloj',
avatarRadius: 'Profilbildoj',
avatarAltRadius: 'Profilbildoj (Sciigoj)',
tooltipRadius: 'Ŝpruchelpiloj/avertoj',
attachmentRadius: 'Kunsendaĵoj',
filtering: 'Filtrado',
filtering_explanation: 'Ĉiuj statoj kun tiuj ĉi vortoj silentiĝos, po unu linie',
attachments: 'Kunsendaĵoj',
hide_attachments_in_tl: 'Kaŝi kunsendaĵojn en tempovido',
hide_attachments_in_convo: 'Kaŝi kunsendaĵojn en interparoloj',
nsfw_clickthrough: 'Ŝalti traklakan kaŝon de konsternaj kunsendaĵoj',
stop_gifs: 'Movi GIF-bildojn dum ŝvebo',
autoload: 'Ŝalti memfaran enlegadon ĉe subo de paĝo',
streaming: 'Ŝalti memfaran fluigon de novaj afiŝoj ĉe supro de paĝo',
reply_link_preview: 'Ŝalti respond-ligilan antaŭvidon dum ŝvebo',
follow_import: 'Abona enporto',
import_followers_from_a_csv_file: 'Enporti abonojn de CSV-dosiero',
follows_imported: 'Abonoj enportiĝis! Traktado daŭros iom.',
follow_import_error: 'Eraro enportante abonojn'
},
notifications: {
notifications: 'Sciigoj',
read: 'Legita!',
followed_you: 'ekabonis vin',
favorited_you: 'ŝatis vian staton',
repeated_you: 'ripetis vian staton'
},
login: {
login: 'Saluti',
username: 'Salutnomo',
placeholder: 'ekz. lain',
password: 'Pasvorto',
register: 'Registriĝi',
logout: 'Adiaŭi'
},
registration: {
registration: 'Registriĝo',
fullname: 'Vidiga nomo',
email: 'Retpoŝtadreso',
bio: 'Prio',
password_confirm: 'Konfirmo de pasvorto'
},
post_status: {
posting: 'Afiŝanta',
default: 'Ĵus alvenis la universalan kongreson!'
},
finder: {
find_user: 'Trovi uzulon',
error_fetching_user: 'Eraro alportante uzulon'
},
general: {
submit: 'Sendi',
apply: 'Apliki'
},
user_profile: {
timeline_title: 'Uzula tempovido'
}
}
const et = {
nav: {
timeline: 'Ajajoon',
mentions: 'Mainimised',
public_tl: 'Avalik Ajajoon',
twkn: 'Kogu Teadaolev Võrgustik'
},
user_card: {
follows_you: 'Jälgib sind!',
following: 'Jälgin!',
follow: 'Jälgi',
blocked: 'Blokeeritud!',
block: 'Blokeeri',
statuses: 'Staatuseid',
mute: 'Vaigista',
muted: 'Vaigistatud',
followers: 'Jälgijaid',
followees: 'Jälgitavaid',
per_day: 'päevas'
},
timeline: {
show_new: 'Näita uusi',
error_fetching: 'Viga uuenduste laadimisel',
up_to_date: 'Uuendatud',
load_older: 'Kuva vanemaid staatuseid',
conversation: 'Vestlus'
},
settings: {
user_settings: 'Kasutaja sätted',
name_bio: 'Nimi ja Bio',
name: 'Nimi',
bio: 'Bio',
avatar: 'Profiilipilt',
current_avatar: 'Sinu praegune profiilipilt',
set_new_avatar: 'Vali uus profiilipilt',
profile_banner: 'Profiilibänner',
current_profile_banner: 'Praegune profiilibänner',
set_new_profile_banner: 'Vali uus profiilibänner',
profile_background: 'Profiilitaust',
set_new_profile_background: 'Vali uus profiilitaust',
settings: 'Sätted',
theme: 'Teema',
filtering: 'Sisu filtreerimine',
filtering_explanation: 'Kõiki staatuseid, mis sisaldavad neid sõnu, ei kuvata. Üks sõna reale.',
attachments: 'Manused',
hide_attachments_in_tl: 'Peida manused ajajoonel',
hide_attachments_in_convo: 'Peida manused vastlustes',
nsfw_clickthrough: 'Peida tööks-mittesobivad(NSFW) manuste hiireklõpsu taha',
autoload: 'Luba ajajoone automaatne uuendamine kui ajajoon on põhja keritud',
reply_link_preview: 'Luba algpostituse kuvamine vastustes'
},
notifications: {
notifications: 'Teavitused',
read: 'Loe!',
followed_you: 'alustas sinu jälgimist'
},
login: {
login: 'Logi sisse',
username: 'Kasutajanimi',
placeholder: 'nt lain',
password: 'Parool',
register: 'Registreeru',
logout: 'Logi välja'
},
registration: {
registration: 'Registreerimine',
fullname: 'Kuvatav nimi',
email: 'E-post',
bio: 'Bio',
password_confirm: 'Parooli kinnitamine'
},
post_status: {
posting: 'Postitan',
default: 'Just sõitsin elektrirongiga Tallinnast Pääskülla.'
},
finder: {
find_user: 'Otsi kasutajaid',
error_fetching_user: 'Viga kasutaja leidmisel'
},
general: {
submit: 'Postita'
}
}
const hu = {
nav: {
timeline: 'Idővonal',
mentions: 'Említéseim',
public_tl: 'Publikus Idővonal',
twkn: 'Az Egész Ismert Hálózat'
},
user_card: {
follows_you: 'Követ téged!',
following: 'Követve!',
follow: 'Követ',
blocked: 'Letiltva!',
block: 'Letilt',
statuses: 'Állapotok',
mute: 'Némít',
muted: 'Némított',
followers: 'Követők',
followees: 'Követettek',
per_day: 'naponta'
},
timeline: {
show_new: 'Újak mutatása',
error_fetching: 'Hiba a frissítések beszerzésénél',
up_to_date: 'Naprakész',
load_older: 'Régebbi állapotok betöltése',
conversation: 'Társalgás'
},
settings: {
user_settings: 'Felhasználói beállítások',
name_bio: 'Név és Bio',
name: 'Név',
bio: 'Bio',
avatar: 'Avatár',
current_avatar: 'Jelenlegi avatár',
set_new_avatar: 'Új avatár',
profile_banner: 'Profil Banner',
current_profile_banner: 'Jelenlegi profil banner',
set_new_profile_banner: 'Új profil banner',
profile_background: 'Profil háttérkép',
set_new_profile_background: 'Új profil háttér beállítása',
settings: 'Beállítások',
theme: 'Téma',
filtering: 'Szűrés',
filtering_explanation: 'Minden tartalom mely ezen szavakat tartalmazza némítva lesz, soronként egy',
attachments: 'Csatolmányok',
hide_attachments_in_tl: 'Csatolmányok elrejtése az idővonalon',
hide_attachments_in_convo: 'Csatolmányok elrejtése a társalgásokban',
nsfw_clickthrough: 'NSFW átkattintási tartalom elrejtésének engedélyezése',
autoload: 'Autoatikus betöltés engedélyezése lap aljára görgetéskor',
reply_link_preview: 'Válasz-link előzetes mutatása egér rátételkor'
},
notifications: {
notifications: 'Értesítések',
read: 'Olvasva!',
followed_you: 'követ téged'
},
login: {
login: 'Bejelentkezés',
username: 'Felhasználó név',
placeholder: 'e.g. lain',
password: 'Jelszó',
register: 'Feliratkozás',
logout: 'Kijelentkezés'
},
registration: {
registration: 'Feliratkozás',
fullname: 'Teljes név',
email: 'Email',
bio: 'Bio',
password_confirm: 'Jelszó megerősítése'
},
post_status: {
posting: 'Küldés folyamatban',
default: 'Most érkeztem L.A.-be'
},
finder: {
find_user: 'Felhasználó keresése',
error_fetching_user: 'Hiba felhasználó beszerzésével'
},
general: {
submit: 'Elküld'
}
}
const ro = {
nav: {
timeline: 'Cronologie',
mentions: 'Menționări',
public_tl: 'Cronologie Publică',
twkn: 'Toată Reșeaua Cunoscută'
},
user_card: {
follows_you: 'Te urmărește!',
following: 'Urmărit!',
follow: 'Urmărește',
blocked: 'Blocat!',
block: 'Blochează',
statuses: 'Stări',
mute: 'Pune pe mut',
muted: 'Pus pe mut',
followers: 'Următori',
followees: 'Urmărește',
per_day: 'pe zi'
},
timeline: {
show_new: 'Arată cele noi',
error_fetching: 'Erare la preluarea actualizărilor',
up_to_date: 'La zi',
load_older: 'Încarcă stări mai vechi',
conversation: 'Conversație'
},
settings: {
user_settings: 'Setările utilizatorului',
name_bio: 'Nume și Bio',
name: 'Nume',
bio: 'Bio',
avatar: 'Avatar',
current_avatar: 'Avatarul curent',
set_new_avatar: 'Setează avatar nou',
profile_banner: 'Banner de profil',
current_profile_banner: 'Bannerul curent al profilului',
set_new_profile_banner: 'Setează banner nou la profil',
profile_background: 'Fundalul de profil',
set_new_profile_background: 'Setează fundal nou',
settings: 'Setări',
theme: 'Temă',
filtering: 'Filtru',
filtering_explanation: 'Toate stările care conțin aceste cuvinte vor fi puse pe mut, una pe linie',
attachments: 'Atașamente',
hide_attachments_in_tl: 'Ascunde atașamentele în cronologie',
hide_attachments_in_convo: 'Ascunde atașamentele în conversații',
nsfw_clickthrough: 'Permite ascunderea al atașamentelor NSFW',
autoload: 'Permite încărcarea automată când scrolat la capăt',
reply_link_preview: 'Permite previzualizarea linkului de răspuns la planarea de mouse'
},
notifications: {
notifications: 'Notificări',
read: 'Citit!',
followed_you: 'te-a urmărit'
},
login: {
login: 'Loghează',
username: 'Nume utilizator',
placeholder: 'd.e. lain',
password: 'Parolă',
register: 'Înregistrare',
logout: 'Deloghează'
},
registration: {
registration: 'Îregistrare',
fullname: 'Numele întreg',
email: 'Email',
bio: 'Bio',
password_confirm: 'Cofirmă parola'
},
post_status: {
posting: 'Postează',
default: 'Nu de mult am aterizat în L.A.'
},
finder: {
find_user: 'Găsește utilizator',
error_fetching_user: 'Eroare la preluarea utilizatorului'
},
general: {
submit: 'trimite'
}
}
const ja = {
chat: {
title: 'チャット'
},
nav: {
chat: 'ローカルチャット',
timeline: 'タイムライン',
mentions: 'メンション',
public_tl: '公開タイムライン',
twkn: '接続しているすべてのネットワーク'
},
user_card: {
follows_you: 'フォローされました!',
following: 'フォロー中!',
follow: 'フォロー',
blocked: 'ブロック済み!',
block: 'ブロック',
statuses: '投稿',
mute: 'ミュート',
muted: 'ミュート済み',
followers: 'フォロワー',
followees: 'フォロー',
per_day: '/日',
remote_follow: 'リモートフォロー'
},
timeline: {
show_new: '更新',
error_fetching: '更新の取得中にエラーが発生しました。',
up_to_date: '最新',
load_older: '古い投稿を読み込む',
conversation: '会話',
collapse: '折り畳む',
repeated: 'リピート'
},
settings: {
user_settings: 'ユーザー設定',
name_bio: '名前とプロフィール',
name: '名前',
bio: 'プロフィール',
avatar: 'アバター',
current_avatar: 'あなたの現在のアバター',
set_new_avatar: '新しいアバターを設定する',
profile_banner: 'プロフィールバナー',
current_profile_banner: '現在のプロフィールバナー',
set_new_profile_banner: '新しいプロフィールバナーを設定する',
profile_background: 'プロフィールの背景',
set_new_profile_background: '新しいプロフィールの背景を設定する',
settings: '設定',
theme: 'テーマ',
presets: 'プリセット',
theme_help: '16進数カラーコード (#aabbcc) を使用してカラーテーマをカスタマイズ出来ます。',
radii_help: 'インターフェースの縁の丸さを設定する。',
background: '背景',
foreground: '前景',
text: '文字',
links: 'リンク',
cBlue: '青 (返信, フォロー)',
cRed: '赤 (キャンセル)',
cOrange: 'オレンジ (お気に入り)',
cGreen: '緑 (リツイート)',
btnRadius: 'ボタン',
panelRadius: 'パネル',
avatarRadius: 'アバター',
avatarAltRadius: 'アバター (通知)',
tooltipRadius: 'ツールチップ/アラート',
attachmentRadius: 'ファイル',
filtering: 'フィルタリング',
filtering_explanation: 'これらの単語を含むすべてのものがミュートされます。1行に1つの単語を入力してください。',
attachments: 'ファイル',
hide_attachments_in_tl: 'タイムラインのファイルを隠す。',
hide_attachments_in_convo: '会話の中のファイルを隠す。',
nsfw_clickthrough: 'NSFWファイルの非表示を有効にする。',
stop_gifs: 'カーソルを重ねた時にGIFを再生する。',
autoload: '下にスクロールした時に自動で読み込むようにする。',
streaming: '上までスクロールした時に自動でストリーミングされるようにする。',
reply_link_preview: 'マウスカーソルを重ねた時に返信のプレビューを表示するようにする。',
follow_import: 'フォローインポート',
import_followers_from_a_csv_file: 'CSVファイルからフォローをインポートする。',
follows_imported: 'フォローがインポートされました!処理に少し時間がかかるかもしれません。',
follow_import_error: 'フォロワーのインポート中にエラーが発生しました。'
},
notifications: {
notifications: '通知',
read: '読んだ!',
followed_you: 'フォローされました',
favorited_you: 'あなたの投稿がお気に入りされました',
repeated_you: 'あなたの投稿がリピートされました'
},
login: {
login: 'ログイン',
username: 'ユーザー名',
placeholder: '例えば lain',
password: 'パスワード',
register: '登録',
logout: 'ログアウト'
},
registration: {
registration: '登録',
fullname: '表示名',
email: 'Eメール',
bio: 'プロフィール',
password_confirm: 'パスワードの確認'
},
post_status: {
posting: '投稿',
default: 'ちょうどL.A.に着陸しました。'
},
finder: {
find_user: 'ユーザー検索',
error_fetching_user: 'ユーザー検索でエラーが発生しました'
},
general: {
submit: '送信',
apply: '適用'
},
user_profile: {
timeline_title: 'ユーザータイムライン'
}
}
const fr = {
nav: {
chat: 'Chat local',
timeline: 'Journal',
mentions: 'Notifications',
public_tl: 'Statuts locaux',
twkn: 'Le réseau connu'
},
user_card: {
follows_you: 'Vous suit !',
following: 'Suivi !',
follow: 'Suivre',
blocked: 'Bloqué',
block: 'Bloquer',
statuses: 'Statuts',
mute: 'Masquer',
muted: 'Masqué',
followers: 'Vous suivent',
followees: 'Suivis',
per_day: 'par jour',
remote_follow: 'Suivre d\'une autre instance'
},
timeline: {
show_new: 'Afficher plus',
error_fetching: 'Erreur en cherchant les mises à jour',
up_to_date: 'À jour',
load_older: 'Afficher plus',
conversation: 'Conversation',
collapse: 'Fermer',
repeated: 'a partagé'
},
settings: {
user_settings: 'Paramètres utilisateur',
name_bio: 'Nom & Bio',
name: 'Nom',
bio: 'Biographie',
avatar: 'Avatar',
current_avatar: 'Avatar actuel',
set_new_avatar: 'Changer d\'avatar',
profile_banner: 'Bannière de profil',
current_profile_banner: 'Bannière de profil actuelle',
set_new_profile_banner: 'Changer de bannière',
profile_background: 'Image de fond',
set_new_profile_background: 'Changer d\'image de fond',
settings: 'Paramètres',
theme: 'Thème',
filtering: 'Filtre',
filtering_explanation: 'Tous les statuts contenant ces mots seront masqués. Un mot par ligne.',
attachments: 'Pièces jointes',
hide_attachments_in_tl: 'Masquer les pièces jointes dans le journal',
hide_attachments_in_convo: 'Masquer les pièces jointes dans les conversations',
nsfw_clickthrough: 'Masquer les images marquées comme contenu adulte ou sensible',
autoload: 'Charger la suite automatiquement une fois le bas de la page atteint',
reply_link_preview: 'Afficher un aperçu lors du survol de liens vers une réponse',
presets: 'Thèmes prédéfinis',
theme_help: 'Spécifiez des codes couleur hexadécimaux (#aabbcc) pour personnaliser les couleurs du thème',
background: 'Arrière-plan',
foreground: 'Premier plan',
text: 'Texte',
links: 'Liens',
streaming: 'Charger automatiquement les nouveaux statuts lorsque vous êtes au haut de la page',
follow_import: 'Importer des abonnements',
import_followers_from_a_csv_file: 'Importer des abonnements depuis un fichier csv',
follows_imported: 'Abonnements importés ! Le traitement peut prendre un moment.',
follow_import_error: 'Erreur lors de l\'importation des abonnements.',
follow_export: 'Exporter les abonnements',
follow_export_button: 'Exporter les abonnements en csv',
follow_export_processing: 'Exportation en cours…',
cBlue: 'Bleu (Répondre, suivre)',
cRed: 'Rouge (Annuler)',
cOrange: 'Orange (Aimer)',
cGreen: 'Vert (Partager)',
btnRadius: 'Boutons',
panelRadius: 'Fenêtres',
inputRadius: 'Champs de texte',
avatarRadius: 'Avatars',
avatarAltRadius: 'Avatars (Notifications)',
tooltipRadius: 'Info-bulles/alertes ',
attachmentRadius: 'Pièces jointes',
radii_help: 'Vous pouvez ici choisir le niveau d\'arrondi des angles de l\'interface (en pixels)',
stop_gifs: 'N\'animer les GIFS que lors du survol du curseur de la souris',
change_password: 'Modifier son mot de passe',
current_password: 'Mot de passe actuel',
new_password: 'Nouveau mot de passe',
confirm_new_password: 'Confirmation du nouveau mot de passe',
delete_account: 'Supprimer le compte',
delete_account_description: 'Supprimer définitivement votre compte et tous vos statuts.',
delete_account_instructions: 'Indiquez votre mot de passe ci-dessous pour confirmer la suppression de votre compte.',
delete_account_error: 'Il y a eu un problème lors de la tentative de suppression de votre compte. Si le problème persiste, contactez l\'administrateur de cette instance.'
},
notifications: {
notifications: 'Notifications',
read: 'Lu !',
followed_you: 'a commencé à vous suivre',
favorited_you: 'a aimé votre statut',
repeated_you: 'a partagé votre statut'
},
login: {
login: 'Connexion',
username: 'Identifiant',
placeholder: 'p.e. lain',
password: 'Mot de passe',
register: 'S\'inscrire',
logout: 'Déconnexion'
},
registration: {
registration: 'Inscription',
fullname: 'Pseudonyme',
email: 'Adresse email',
bio: 'Biographie',
password_confirm: 'Confirmation du mot de passe'
},
post_status: {
posting: 'Envoi en cours',
default: 'Écrivez ici votre prochain statut.',
account_not_locked_warning: 'Votre compte n’est pas {0}. N’importe qui peut vous suivre pour voir vos billets en Abonné·e·s uniquement.',
account_not_locked_warning_link: 'verrouillé',
direct_warning: 'Ce message sera visible à toutes les personnes mentionnées.',
scope: {
public: 'Publique - Afficher dans les fils publics',
unlisted: 'Non-Listé - Ne pas afficher dans les fils publics',
private: 'Abonné·e·s uniquement - Seul·e·s vos abonné·e·s verront vos billets',
direct: 'Direct - N’envoyer qu’aux personnes mentionnées'
}
},
finder: {
find_user: 'Chercher un utilisateur',
error_fetching_user: 'Erreur lors de la recherche de l\'utilisateur'
},
general: {
submit: 'Envoyer',
apply: 'Appliquer'
},
user_profile: {
timeline_title: 'Journal de l\'utilisateur'
}
}
const it = {
nav: {
timeline: 'Sequenza temporale',
mentions: 'Menzioni',
public_tl: 'Sequenza temporale pubblica',
twkn: 'L\'intiera rete conosciuta'
},
user_card: {
follows_you: 'Ti segue!',
following: 'Lo stai seguendo!',
follow: 'Segui',
statuses: 'Messaggi',
mute: 'Ammutolisci',
muted: 'Ammutoliti',
followers: 'Chi ti segue',
followees: 'Chi stai seguendo',
per_day: 'al giorno'
},
timeline: {
show_new: 'Mostra nuovi',
error_fetching: 'Errori nel prelievo aggiornamenti',
up_to_date: 'Aggiornato',
load_older: 'Carica messaggi più vecchi'
},
settings: {
user_settings: 'Configurazione dell\'utente',
name_bio: 'Nome & Introduzione',
name: 'Nome',
bio: 'Introduzione',
avatar: 'Avatar',
current_avatar: 'Il tuo attuale avatar',
set_new_avatar: 'Scegli un nuovo avatar',
profile_banner: 'Sfondo del tuo profilo',
current_profile_banner: 'Sfondo attuale',
set_new_profile_banner: 'Scegli un nuovo sfondo per il tuo profilo',
profile_background: 'Sfondo della tua pagina',
set_new_profile_background: 'Scegli un nuovo sfondo per la tua pagina',
settings: 'Settaggi',
theme: 'Tema',
filtering: 'Filtri',
filtering_explanation: 'Filtra via le notifiche che contengono le seguenti parole (inserisci rigo per rigo le parole di innesco)',
attachments: 'Allegati',
hide_attachments_in_tl: 'Nascondi gli allegati presenti nella sequenza temporale',
hide_attachments_in_convo: 'Nascondi gli allegati presenti nelle conversazioni',
nsfw_clickthrough: 'Abilita la trasparenza degli allegati NSFW',
autoload: 'Abilita caricamento automatico quando si raggiunge il fondo schermo',
reply_link_preview: 'Ability il reply-link preview al passaggio del mouse'
},
notifications: {
notifications: 'Notifiche',
read: 'Leggi!',
followed_you: 'ti ha seguito'
},
general: {
submit: 'Invia'
}
}
const oc = {
chat: {
title: 'Messatjariá'
},
nav: {
chat: 'Chat local',
timeline: 'Flux d’actualitat',
mentions: 'Notificacions',
public_tl: 'Estatuts locals',
twkn: 'Lo malhum conegut'
},
user_card: {
follows_you: 'Vos sèc !',
following: 'Seguit !',
follow: 'Seguir',
blocked: 'Blocat',
block: 'Blocar',
statuses: 'Estatuts',
mute: 'Amagar',
muted: 'Amagat',
followers: 'Seguidors',
followees: 'Abonaments',
per_day: 'per jorn',
remote_follow: 'Seguir a distància'
},
timeline: {
show_new: 'Ne veire mai',
error_fetching: 'Error en cercant de mesas a jorn',
up_to_date: 'A jorn',
load_older: 'Ne veire mai',
conversation: 'Conversacion',
collapse: 'Tampar',
repeated: 'repetit'
},
settings: {
user_settings: 'Paramètres utilizaire',
name_bio: 'Nom & Bio',
name: 'Nom',
bio: 'Biografia',
avatar: 'Avatar',
current_avatar: 'Vòstre avatar actual',
set_new_avatar: 'Cambiar l’avatar',
profile_banner: 'Bandièra del perfil',
current_profile_banner: 'Bandièra actuala del perfil',
set_new_profile_banner: 'Cambiar de bandièra',
profile_background: 'Imatge de fons',
set_new_profile_background: 'Cambiar l’imatge de fons',
settings: 'Paramètres',
theme: 'Tèma',
presets: 'Pre-enregistrats',
theme_help: 'Emplegatz los còdis de color hex (#rrggbb) per personalizar vòstre tèma de color.',
radii_help: 'Configurar los caires arredondits de l’interfàcia (en pixèls)',
background: 'Rèire plan',
foreground: 'Endavant',
text: 'Tèxte',
links: 'Ligams',
cBlue: 'Blau (Respondre, seguir)',
cRed: 'Roge (Anullar)',
cOrange: 'Irange (Metre en favorit)',
cGreen: 'Verd (Repartajar)',
inputRadius: 'Camps tèxte',
btnRadius: 'Botons',
panelRadius: 'Panèls',
avatarRadius: 'Avatars',
avatarAltRadius: 'Avatars (Notificacions)',
tooltipRadius: 'Astúcias/Alèrta',
attachmentRadius: 'Pèças juntas',
filtering: 'Filtre',
filtering_explanation: 'Totes los estatuts amb aqueles mots seràn en silenci, un mot per linha.',
attachments: 'Pèças juntas',
hide_attachments_in_tl: 'Rescondre las pèças juntas',
hide_attachments_in_convo: 'Rescondre las pèças juntas dins las conversacions',
nsfw_clickthrough: 'Activar lo clic per mostrar los imatges marcats coma pels adults o sensibles',
stop_gifs: 'Lançar los GIFs al subrevòl',
autoload: 'Activar lo cargament automatic un còp arribat al cap de la pagina',
streaming: 'Activar lo cargament automatic dels novèls estatus en anar amont',
reply_link_preview: 'Activar l’apercebut en passar la mirga',
follow_import: 'Importar los abonaments',
import_followers_from_a_csv_file: 'Importar los seguidors d’un fichièr csv',
follows_imported: 'Seguidors importats. Lo tractament pòt trigar una estona.',
follow_import_error: 'Error en important los seguidors'
},
notifications: {
notifications: 'Notficacions',
read: 'Legit !',
followed_you: 'vos sèc',
favorited_you: 'a aimat vòstre estatut',
repeated_you: 'a repetit your vòstre estatut'
},
login: {
login: 'Connexion',
username: 'Nom d’utilizaire',
placeholder: 'e.g. lain',
password: 'Senhal',
register: 'Se marcar',
logout: 'Desconnexion'
},
registration: {
registration: 'Inscripcion',
fullname: 'Nom complèt',
email: 'Adreça de corrièl',
bio: 'Biografia',
password_confirm: 'Confirmar lo senhal'
},
post_status: {
posting: 'Mandadís',
default: 'Escrivètz aquí vòstre estatut.'
},
finder: {
find_user: 'Cercar un utilizaire',
error_fetching_user: 'Error pendent la recèrca d’un utilizaire'
},
general: {
submit: 'Mandar',
apply: 'Aplicar'
},
user_profile: {
timeline_title: 'Flux utilizaire'
}
}
const pl = {
chat: {
title: 'Czat'
},
nav: {
chat: 'Lokalny czat',
timeline: 'Oś czasu',
mentions: 'Wzmianki',
public_tl: 'Publiczna oś czasu',
twkn: 'Cała znana sieć'
},
user_card: {
follows_you: 'Obserwuje cię!',
following: 'Obserwowany!',
follow: 'Obserwuj',
blocked: 'Zablokowany!',
block: 'Zablokuj',
statuses: 'Statusy',
mute: 'Wycisz',
muted: 'Wyciszony',
followers: 'Obserwujący',
followees: 'Obserwowani',
per_day: 'dziennie',
remote_follow: 'Zdalna obserwacja'
},
timeline: {
show_new: 'Pokaż nowe',
error_fetching: 'Błąd pobierania',
up_to_date: 'Na bieżąco',
load_older: 'Załaduj starsze statusy',
conversation: 'Rozmowa',
collapse: 'Zwiń',
repeated: 'powtórzono'
},
settings: {
user_settings: 'Ustawienia użytkownika',
name_bio: 'Imię i bio',
name: 'Imię',
bio: 'Bio',
avatar: 'Awatar',
current_avatar: 'Twój obecny awatar',
set_new_avatar: 'Ustaw nowy awatar',
profile_banner: 'Banner profilu',
current_profile_banner: 'Twój obecny banner profilu',
set_new_profile_banner: 'Ustaw nowy banner profilu',
profile_background: 'Tło profilu',
set_new_profile_background: 'Ustaw nowe tło profilu',
settings: 'Ustawienia',
theme: 'Motyw',
presets: 'Gotowe motywy',
theme_help: 'Użyj kolorów w notacji szesnastkowej (#rrggbb), by stworzyć swój motyw.',
radii_help: 'Ustaw zaokrąglenie krawędzi interfejsu (w pikselach)',
background: 'Tło',
foreground: 'Pierwszy plan',
text: 'Tekst',
links: 'Łącza',
cBlue: 'Niebieski (odpowiedz, obserwuj)',
cRed: 'Czerwony (anuluj)',
cOrange: 'Pomarańczowy (ulubione)',
cGreen: 'Zielony (powtórzenia)',
btnRadius: 'Przyciski',
inputRadius: 'Pola tekstowe',
panelRadius: 'Panele',
avatarRadius: 'Awatary',
avatarAltRadius: 'Awatary (powiadomienia)',
tooltipRadius: 'Etykiety/alerty',
attachmentRadius: 'Załączniki',
filtering: 'Filtrowanie',
filtering_explanation: 'Wszystkie statusy zawierające te słowa będą wyciszone. Jedno słowo na linijkę.',
attachments: 'Załączniki',
hide_attachments_in_tl: 'Ukryj załączniki w osi czasu',
hide_attachments_in_convo: 'Ukryj załączniki w rozmowach',
nsfw_clickthrough: 'Włącz domyślne ukrywanie załączników o treści nieprzyzwoitej (NSFW)',
stop_gifs: 'Odtwarzaj GIFy po najechaniu kursorem',
autoload: 'Włącz automatyczne ładowanie po przewinięciu do końca strony',
streaming: 'Włącz automatycznie strumieniowanie nowych postów gdy na początku strony',
reply_link_preview: 'Włącz dymek z podglądem postu po najechaniu na znak odpowiedzi',
follow_import: 'Import obserwowanych',
import_followers_from_a_csv_file: 'Importuj obserwowanych z pliku CSV',
follows_imported: 'Obserwowani zaimportowani! Przetwarzanie może trochę potrwać.',
follow_import_error: 'Błąd przy importowaniu obserwowanych',
delete_account: 'Usuń konto',
delete_account_description: 'Trwale usuń konto i wszystkie posty.',
delete_account_instructions: 'Wprowadź swoje hasło w poniższe pole aby potwierdzić usunięcie konta.',
delete_account_error: 'Wystąpił problem z usuwaniem twojego konta. Jeżeli problem powtarza się, poinformuj administratora swojej instancji.',
follow_export: 'Eksport obserwowanych',
follow_export_processing: 'Przetwarzanie, wkrótce twój plik zacznie się ściągać.',
follow_export_button: 'Eksportuj swoją listę obserwowanych do pliku CSV',
change_password: 'Zmień hasło',
current_password: 'Obecne hasło',
new_password: 'Nowe hasło',
confirm_new_password: 'Potwierdź nowe hasło',
changed_password: 'Hasło zmienione poprawnie!',
change_password_error: 'Podczas zmiany hasła wystąpił problem.'
},
notifications: {
notifications: 'Powiadomienia',
read: 'Przeczytane!',
followed_you: 'obserwuje cię',
favorited_you: 'dodał twój status do ulubionych',
repeated_you: 'powtórzył twój status'
},
login: {
login: 'Zaloguj',
username: 'Użytkownik',
placeholder: 'n.p. lain',
password: 'Hasło',
register: 'Zarejestruj',
logout: 'Wyloguj'
},
registration: {
registration: 'Rejestracja',
fullname: 'Wyświetlana nazwa profilu',
email: 'Email',
bio: 'Bio',
password_confirm: 'Potwierdzenie hasła'
},
post_status: {
posting: 'Wysyłanie',
default: 'Właśnie wróciłem z kościoła'
},
finder: {
find_user: 'Znajdź użytkownika',
error_fetching_user: 'Błąd przy pobieraniu profilu'
},
general: {
submit: 'Wyślij',
apply: 'Zastosuj'
},
user_profile: {
timeline_title: 'Oś czasu użytkownika'
}
}
const es = {
chat: {
title: 'Chat'
},
nav: {
chat: 'Chat Local',
timeline: 'Línea Temporal',
mentions: 'Menciones',
public_tl: 'Línea Temporal Pública',
twkn: 'Toda La Red Conocida'
},
user_card: {
follows_you: '¡Te sigue!',
following: '¡Siguiendo!',
follow: 'Seguir',
blocked: '¡Bloqueado!',
block: 'Bloquear',
statuses: 'Estados',
mute: 'Silenciar',
muted: 'Silenciado',
followers: 'Seguidores',
followees: 'Siguiendo',
per_day: 'por día',
remote_follow: 'Seguir'
},
timeline: {
show_new: 'Mostrar lo nuevo',
error_fetching: 'Error al cargar las actualizaciones',
up_to_date: 'Actualizado',
load_older: 'Cargar actualizaciones anteriores',
conversation: 'Conversación'
},
settings: {
user_settings: 'Ajustes de Usuario',
name_bio: 'Nombre y Biografía',
name: 'Nombre',
bio: 'Biografía',
avatar: 'Avatar',
current_avatar: 'Tu avatar actual',
set_new_avatar: 'Cambiar avatar',
profile_banner: 'Cabecera del perfil',
current_profile_banner: 'Cabecera actual',
set_new_profile_banner: 'Cambiar cabecera',
profile_background: 'Fondo del Perfil',
set_new_profile_background: 'Cambiar fondo del perfil',
settings: 'Ajustes',
theme: 'Tema',
presets: 'Por defecto',
theme_help: 'Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.',
background: 'Segundo plano',
foreground: 'Primer plano',
text: 'Texto',
links: 'Links',
filtering: 'Filtros',
filtering_explanation: 'Todos los estados que contengan estas palabras serán silenciados, una por línea',
attachments: 'Adjuntos',
hide_attachments_in_tl: 'Ocultar adjuntos en la línea temporal',
hide_attachments_in_convo: 'Ocultar adjuntos en las conversaciones',
nsfw_clickthrough: 'Activar el clic para ocultar los adjuntos NSFW',
autoload: 'Activar carga automática al llegar al final de la página',
streaming: 'Habilite la transmisión automática de nuevas publicaciones cuando se desplaza hacia la parte superior',
reply_link_preview: 'Activar la previsualización del enlace de responder al pasar el ratón por encima',
follow_import: 'Importar personas que tú sigues',
import_followers_from_a_csv_file: 'Importar personas que tú sigues apartir de un archivo csv',
follows_imported: '¡Importado! Procesarlos llevará tiempo.',
follow_import_error: 'Error al importal el archivo'
},
notifications: {
notifications: 'Notificaciones',
read: '¡Leído!',
followed_you: 'empezó a seguirte'
},
login: {
login: 'Identificación',
username: 'Usuario',
placeholder: 'p.ej. lain',
password: 'Contraseña',
register: 'Registrar',
logout: 'Salir'
},
registration: {
registration: 'Registro',
fullname: 'Nombre a mostrar',
email: 'Correo electrónico',
bio: 'Biografía',
password_confirm: 'Confirmación de contraseña'
},
post_status: {
posting: 'Publicando',
default: 'Acabo de aterrizar en L.A.'
},
finder: {
find_user: 'Encontrar usuario',
error_fetching_user: 'Error al buscar usuario'
},
general: {
submit: 'Enviar',
apply: 'Aplicar'
}
}
const pt = {
chat: {
title: 'Chat'
},
nav: {
chat: 'Chat Local',
timeline: 'Linha do tempo',
mentions: 'Menções',
public_tl: 'Linha do tempo pública',
twkn: 'Toda a rede conhecida'
},
user_card: {
follows_you: 'Segue você!',
following: 'Seguindo!',
follow: 'Seguir',
blocked: 'Bloqueado!',
block: 'Bloquear',
statuses: 'Postagens',
mute: 'Silenciar',
muted: 'Silenciado',
followers: 'Seguidores',
followees: 'Seguindo',
per_day: 'por dia',
remote_follow: 'Seguidor Remoto'
},
timeline: {
show_new: 'Mostrar novas',
error_fetching: 'Erro buscando atualizações',
up_to_date: 'Atualizado',
load_older: 'Carregar postagens antigas',
conversation: 'Conversa'
},
settings: {
user_settings: 'Configurações de Usuário',
name_bio: 'Nome & Biografia',
name: 'Nome',
bio: 'Biografia',
avatar: 'Avatar',
current_avatar: 'Seu avatar atual',
set_new_avatar: 'Alterar avatar',
profile_banner: 'Capa de perfil',
current_profile_banner: 'Sua capa de perfil atual',
set_new_profile_banner: 'Alterar capa de perfil',
profile_background: 'Plano de fundo de perfil',
set_new_profile_background: 'Alterar o plano de fundo de perfil',
settings: 'Configurações',
theme: 'Tema',
presets: 'Predefinições',
theme_help: 'Use cores em código hexadecimal (#rrggbb) para personalizar seu esquema de cores.',
background: 'Plano de Fundo',
foreground: 'Primeiro Plano',
text: 'Texto',
links: 'Links',
filtering: 'Filtragem',
filtering_explanation: 'Todas as postagens contendo estas palavras serão silenciadas, uma por linha.',
attachments: 'Anexos',
hide_attachments_in_tl: 'Ocultar anexos na linha do tempo.',
hide_attachments_in_convo: 'Ocultar anexos em conversas',
nsfw_clickthrough: 'Habilitar clique para ocultar anexos NSFW',
autoload: 'Habilitar carregamento automático quando a rolagem chegar ao fim.',
streaming: 'Habilitar o fluxo automático de postagens quando ao topo da página',
reply_link_preview: 'Habilitar a pré-visualização de link de respostas ao passar o mouse.',
follow_import: 'Importar seguidas',
import_followers_from_a_csv_file: 'Importe seguidores a partir de um arquivo CSV',
follows_imported: 'Seguidores importados! O processamento pode demorar um pouco.',
follow_import_error: 'Erro ao importar seguidores'
},
notifications: {
notifications: 'Notificações',
read: 'Ler!',
followed_you: 'seguiu você'
},
login: {
login: 'Entrar',
username: 'Usuário',
placeholder: 'p.e. lain',
password: 'Senha',
register: 'Registrar',
logout: 'Sair'
},
registration: {
registration: 'Registro',
fullname: 'Nome para exibição',
email: 'Correio eletrônico',
bio: 'Biografia',
password_confirm: 'Confirmação de senha'
},
post_status: {
posting: 'Publicando',
default: 'Acabo de aterrizar em L.A.'
},
finder: {
find_user: 'Buscar usuário',
error_fetching_user: 'Erro procurando usuário'
},
general: {
submit: 'Enviar',
apply: 'Aplicar'
}
}
const ru = {
chat: {
title: 'Чат'
},
nav: {
chat: 'Локальный чат',
timeline: 'Лента',
mentions: 'Упоминания',
public_tl: 'Публичная лента',
twkn: 'Федеративная лента'
},
user_card: {
follows_you: 'Читает вас',
following: 'Читаю',
follow: 'Читать',
blocked: 'Заблокирован',
block: 'Заблокировать',
statuses: 'Статусы',
mute: 'Игнорировать',
muted: 'Игнорирую',
followers: 'Читатели',
followees: 'Читаемые',
per_day: 'в день',
remote_follow: 'Читать удалённо'
},
timeline: {
show_new: 'Показать новые',
error_fetching: 'Ошибка при обновлении',
up_to_date: 'Обновлено',
load_older: 'Загрузить старые статусы',
conversation: 'Разговор',
collapse: 'Свернуть',
repeated: 'повторил(а)'
},
settings: {
user_settings: 'Настройки пользователя',
name_bio: 'Имя и описание',
name: 'Имя',
bio: 'Описание',
avatar: 'Аватар',
current_avatar: 'Текущий аватар',
set_new_avatar: 'Загрузить новый аватар',
profile_banner: 'Баннер профиля',
current_profile_banner: 'Текущий баннер профиля',
set_new_profile_banner: 'Загрузить новый баннер профиля',
profile_background: 'Фон профиля',
set_new_profile_background: 'Загрузить новый фон профиля',
settings: 'Настройки',
theme: 'Тема',
presets: 'Пресеты',
theme_help: 'Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.',
radii_help: 'Округление краёв элементов интерфейса (в пикселях)',
background: 'Фон',
foreground: 'Передний план',
text: 'Текст',
links: 'Ссылки',
cBlue: 'Ответить, читать',
cRed: 'Отменить',
cOrange: 'Нравится',
cGreen: 'Повторить',
btnRadius: 'Кнопки',
inputRadius: 'Поля ввода',
panelRadius: 'Панели',
avatarRadius: 'Аватары',
avatarAltRadius: 'Аватары в уведомлениях',
tooltipRadius: 'Всплывающие подсказки/уведомления',
attachmentRadius: 'Прикреплённые файлы',
filtering: 'Фильтрация',
filtering_explanation: 'Все статусы, содержащие данные слова, будут игнорироваться, по одному в строке',
attachments: 'Вложения',
hide_attachments_in_tl: 'Прятать вложения в ленте',
hide_attachments_in_convo: 'Прятать вложения в разговорах',
stop_gifs: 'Проигрывать GIF анимации только при наведении',
nsfw_clickthrough: 'Включить скрытие NSFW вложений',
autoload: 'Включить автоматическую загрузку при прокрутке вниз',
streaming: 'Включить автоматическую загрузку новых сообщений при прокрутке вверх',
pause_on_unfocused: 'Приостановить загрузку когда вкладка не в фокусе',
loop_video: 'Зациливать видео',
loop_video_silent_only: 'Зацикливать только беззвучные видео (т.е. "гифки" с Mastodon)',
reply_link_preview: 'Включить предварительный просмотр ответа при наведении мыши',
follow_import: 'Импортировать читаемых',
import_followers_from_a_csv_file: 'Импортировать читаемых из файла .csv',
follows_imported: 'Список читаемых импортирован. Обработка займёт некоторое время..',
follow_import_error: 'Ошибка при импортировании читаемых.',
delete_account: 'Удалить аккаунт',
delete_account_description: 'Удалить ваш аккаунт и все ваши сообщения.',
delete_account_instructions: 'Введите ваш пароль в поле ниже для подтверждения удаления.',
delete_account_error: 'Возникла ошибка в процессе удаления вашего аккаунта. Если это повторяется, свяжитесь с администратором вашего сервера.',
follow_export: 'Экспортировать читаемых',
follow_export_processing: 'Ведётся обработка, скоро вам будет предложено загрузить файл',
follow_export_button: 'Экспортировать читаемых в файл .csv',
change_password: 'Сменить пароль',
current_password: 'Текущий пароль',
new_password: 'Новый пароль',
confirm_new_password: 'Подтверждение нового пароля',
changed_password: 'Пароль изменён успешно.',
change_password_error: 'Произошла ошибка при попытке изменить пароль.',
limited_availability: 'Не доступно в вашем браузере'
},
notifications: {
notifications: 'Уведомления',
read: 'Прочесть',
followed_you: 'начал(а) читать вас',
favorited_you: 'нравится ваш статус',
repeated_you: 'повторил(а) ваш статус'
},
login: {
login: 'Войти',
username: 'Имя пользователя',
placeholder: 'e.c. lain',
password: 'Пароль',
register: 'Зарегистрироваться',
logout: 'Выйти'
},
registration: {
registration: 'Регистрация',
fullname: 'Отображаемое имя',
email: 'Email',
bio: 'Описание',
password_confirm: 'Подтверждение пароля',
token: 'Код приглашения'
},
post_status: {
posting: 'Отправляется',
default: 'Что нового?'
},
finder: {
find_user: 'Найти пользователя',
error_fetching_user: 'Пользователь не найден'
},
general: {
submit: 'Отправить',
apply: 'Применить'
},
user_profile: {
timeline_title: 'Лента пользователя'
}
}
const nb = {
chat: {
title: 'Chat'
},
nav: {
chat: 'Lokal Chat',
timeline: 'Tidslinje',
mentions: 'Nevnt',
public_tl: 'Offentlig Tidslinje',
twkn: 'Det hele kjente nettverket'
},
user_card: {
follows_you: 'Følger deg!',
following: 'Følger!',
follow: 'Følg',
blocked: 'Blokkert!',
block: 'Blokker',
statuses: 'Statuser',
mute: 'Demp',
muted: 'Dempet',
followers: 'Følgere',
followees: 'Følger',
per_day: 'per dag',
remote_follow: 'Følg eksternt'
},
timeline: {
show_new: 'Vis nye',
error_fetching: 'Feil ved henting av oppdateringer',
up_to_date: 'Oppdatert',
load_older: 'Last eldre statuser',
conversation: 'Samtale',
collapse: 'Sammenfold',
repeated: 'gjentok'
},
settings: {
user_settings: 'Brukerinstillinger',
name_bio: 'Navn & Biografi',
name: 'Navn',
bio: 'Biografi',
avatar: 'Profilbilde',
current_avatar: 'Ditt nåværende profilbilde',
set_new_avatar: 'Rediger profilbilde',
profile_banner: 'Profil-banner',
current_profile_banner: 'Din nåværende profil-banner',
set_new_profile_banner: 'Sett ny profil-banner',
profile_background: 'Profil-bakgrunn',
set_new_profile_background: 'Rediger profil-bakgrunn',
settings: 'Innstillinger',
theme: 'Tema',
presets: 'Forhåndsdefinerte fargekoder',
theme_help: 'Bruk heksadesimale fargekoder (#rrggbb) til å endre farge-temaet ditt.',
radii_help: 'Bestem hvor runde hjørnene i brukergrensesnittet skal være (i piksler)',
background: 'Bakgrunn',
foreground: 'Framgrunn',
text: 'Tekst',
links: 'Linker',
cBlue: 'Blå (Svar, følg)',
cRed: 'Rød (Avbryt)',
cOrange: 'Oransje (Lik)',
cGreen: 'Grønn (Gjenta)',
btnRadius: 'Knapper',
panelRadius: 'Panel',
avatarRadius: 'Profilbilde',
avatarAltRadius: 'Profilbilde (Varslinger)',
tooltipRadius: 'Verktøytips/advarsler',
attachmentRadius: 'Vedlegg',
filtering: 'Filtrering',
filtering_explanation: 'Alle statuser som inneholder disse ordene vil bli dempet, en kombinasjon av tegn per linje',
attachments: 'Vedlegg',
hide_attachments_in_tl: 'Gjem vedlegg på tidslinje',
hide_attachments_in_convo: 'Gjem vedlegg i samtaler',
nsfw_clickthrough: 'Krev trykk for å vise statuser som kan være upassende',
stop_gifs: 'Spill av GIFs når du holder over dem',
autoload: 'Automatisk lasting når du blar ned til bunnen',
streaming: 'Automatisk strømming av nye statuser når du har bladd til toppen',
reply_link_preview: 'Vis en forhåndsvisning når du holder musen over svar til en status',
follow_import: 'Importer følginger',
import_followers_from_a_csv_file: 'Importer følginger fra en csv fil',
follows_imported: 'Følginger imported! Det vil ta litt tid å behandle de.',
follow_import_error: 'Feil ved importering av følginger.'
},
notifications: {
notifications: 'Varslinger',
read: 'Les!',
followed_you: 'fulgte deg',
favorited_you: 'likte din status',
repeated_you: 'Gjentok din status'
},
login: {
login: 'Logg inn',
username: 'Brukernavn',
placeholder: 'f. eks lain',
password: 'Passord',
register: 'Registrer',
logout: 'Logg ut'
},
registration: {
registration: 'Registrering',
fullname: 'Visningsnavn',
email: 'Epost-adresse',
bio: 'Biografi',
password_confirm: 'Bekreft passord'
},
post_status: {
posting: 'Publiserer',
default: 'Landet akkurat i L.A.'
},
finder: {
find_user: 'Finn bruker',
error_fetching_user: 'Feil ved henting av bruker'
},
general: {
submit: 'Legg ut',
apply: 'Bruk'
},
user_profile: {
timeline_title: 'Bruker-tidslinje'
}
}
const he = {
chat: {
title: 'צ\'אט'
},
nav: {
chat: 'צ\'אט מקומי',
timeline: 'ציר הזמן',
mentions: 'אזכורים',
public_tl: 'ציר הזמן הציבורי',
twkn: 'כל הרשת הידועה'
},
user_card: {
follows_you: 'עוקב אחריך!',
following: 'עוקב!',
follow: 'עקוב',
blocked: 'חסום!',
block: 'חסימה',
statuses: 'סטטוסים',
mute: 'השתק',
muted: 'מושתק',
followers: 'עוקבים',
followees: 'נעקבים',
per_day: 'ליום',
remote_follow: 'עקיבה מרחוק'
},
timeline: {
show_new: 'הראה חדש',
error_fetching: 'שגיאה בהבאת הודעות',
up_to_date: 'עדכני',
load_older: 'טען סטטוסים חדשים',
conversation: 'שיחה',
collapse: 'מוטט',
repeated: 'חזר'
},
settings: {
user_settings: 'הגדרות משתמש',
name_bio: 'שם ואודות',
name: 'שם',
bio: 'אודות',
avatar: 'תמונת פרופיל',
current_avatar: 'תמונת הפרופיל הנוכחית שלך',
set_new_avatar: 'קבע תמונת פרופיל חדשה',
profile_banner: 'כרזת הפרופיל',
current_profile_banner: 'כרזת הפרופיל הנוכחית שלך',
set_new_profile_banner: 'קבע כרזת פרופיל חדשה',
profile_background: 'רקע הפרופיל',
set_new_profile_background: 'קבע רקע פרופיל חדש',
settings: 'הגדרות',
theme: 'תמה',
presets: 'ערכים קבועים מראש',
theme_help: 'השתמש בקודי צבע הקס (#אדום-אדום-ירוק-ירוק-כחול-כחול) על מנת להתאים אישית את תמת הצבע שלך.',
radii_help: 'קבע מראש עיגול פינות לממשק (בפיקסלים)',
background: 'רקע',
foreground: 'חזית',
text: 'טקסט',
links: 'לינקים',
cBlue: 'כחול (תגובה, עקיבה)',
cRed: 'אדום (ביטול)',
cOrange: 'כתום (לייק)',
cGreen: 'ירוק (חזרה)',
btnRadius: 'כפתורים',
inputRadius: 'שדות קלט',
panelRadius: 'פאנלים',
avatarRadius: 'תמונות פרופיל',
avatarAltRadius: 'תמונות פרופיל (התראות)',
tooltipRadius: 'טולטיפ \\ התראות',
attachmentRadius: 'צירופים',
filtering: 'סינון',
filtering_explanation: 'כל הסטטוסים הכוללים את המילים הללו יושתקו, אחד לשורה',
attachments: 'צירופים',
hide_attachments_in_tl: 'החבא צירופים בציר הזמן',
hide_attachments_in_convo: 'החבא צירופים בשיחות',
nsfw_clickthrough: 'החל החבאת צירופים לא בטוחים לצפיה בעת עבודה בעזרת לחיצת עכבר',
stop_gifs: 'נגן-בעת-ריחוף GIFs',
autoload: 'החל טעינה אוטומטית בגלילה לתחתית הדף',
streaming: 'החל זרימת הודעות אוטומטית בעת גלילה למעלה הדף',
reply_link_preview: 'החל תצוגה מקדימה של לינק-תגובה בעת ריחוף עם העכבר',
follow_import: 'יבוא עקיבות',
import_followers_from_a_csv_file: 'ייבא את הנעקבים שלך מקובץ csv',
follows_imported: 'נעקבים יובאו! ייקח זמן מה לעבד אותם.',
follow_import_error: 'שגיאה בייבוא נעקבים.',
delete_account: 'מחק משתמש',
delete_account_description: 'מחק לצמיתות את המשתמש שלך ואת כל הודעותיך.',
delete_account_instructions: 'הכנס את סיסמתך בקלט למטה על מנת לאשר מחיקת משתמש.',
delete_account_error: 'הייתה בעיה במחיקת המשתמש. אם זה ממשיך, אנא עדכן את מנהל השרת שלך.',
follow_export: 'יצוא עקיבות',
follow_export_processing: 'טוען. בקרוב תתבקש להוריד את הקובץ את הקובץ שלך',
follow_export_button: 'ייצא את הנעקבים שלך לקובץ csv',
change_password: 'שנה סיסמה',
current_password: 'סיסמה נוכחית',
new_password: 'סיסמה חדשה',
confirm_new_password: 'אשר סיסמה',
changed_password: 'סיסמה שונתה בהצלחה!',
change_password_error: 'הייתה בעיה בשינוי סיסמתך.'
},
notifications: {
notifications: 'התראות',
read: 'קרא!',
followed_you: 'עקב אחריך!',
favorited_you: 'אהב את הסטטוס שלך',
repeated_you: 'חזר על הסטטוס שלך'
},
login: {
login: 'התחבר',
username: 'שם המשתמש',
placeholder: 'למשל lain',
password: 'סיסמה',
register: 'הירשם',
logout: 'התנתק'
},
registration: {
registration: 'הרשמה',
fullname: 'שם תצוגה',
email: 'אימייל',
bio: 'אודות',
password_confirm: 'אישור סיסמה'
},
post_status: {
posting: 'מפרסם',
default: 'הרגע נחת ב-ל.א.'
},
finder: {
find_user: 'מציאת משתמש',
error_fetching_user: 'שגיאה במציאת משתמש'
},
general: {
submit: 'שלח',
apply: 'החל'
},
user_profile: {
timeline_title: 'ציר זמן המשתמש'
}
}
const messages = {
de,
fi,
en,
eo,
et,
hu,
ro,
ja,
fr,
it,
oc,
pl,
es,
pt,
ru,
nb,
he
}
export default messages

File Metadata

Mime Type
text/x-diff
Expires
Fri, Oct 30, 5:31 AM (1 d, 1 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1799553
Default Alt Text
(112 KB)

Event Timeline