Merge branch 'develop' of git.pleroma.social:pleroma/pleroma-fe into hide-statistics

This commit is contained in:
scarlett 2018-10-16 14:09:29 +01:00
commit 4cc1ed6171
50 changed files with 2820 additions and 2257 deletions

View file

@ -27,6 +27,11 @@ module.exports = {
changeOrigin: true, changeOrigin: true,
cookieDomainRewrite: 'localhost' cookieDomainRewrite: 'localhost'
}, },
'/nodeinfo': {
target: 'http://localhost:4000/',
changeOrigin: true,
cookieDomainRewrite: 'localhost'
},
'/socket': { '/socket': {
target: 'http://localhost:4000/', target: 'http://localhost:4000/',
changeOrigin: true, changeOrigin: true,

View file

@ -2,8 +2,9 @@ import UserPanel from './components/user_panel/user_panel.vue'
import NavPanel from './components/nav_panel/nav_panel.vue' import NavPanel from './components/nav_panel/nav_panel.vue'
import Notifications from './components/notifications/notifications.vue' import Notifications from './components/notifications/notifications.vue'
import UserFinder from './components/user_finder/user_finder.vue' import UserFinder from './components/user_finder/user_finder.vue'
import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_panel.vue'
import InstanceSpecificPanel from './components/instance_specific_panel/instance_specific_panel.vue' import InstanceSpecificPanel from './components/instance_specific_panel/instance_specific_panel.vue'
import FeaturesPanel from './components/features_panel/features_panel.vue'
import WhoToFollowPanel from './components/who_to_follow_panel/who_to_follow_panel.vue'
import ChatPanel from './components/chat_panel/chat_panel.vue' import ChatPanel from './components/chat_panel/chat_panel.vue'
export default { export default {
@ -13,8 +14,9 @@ export default {
NavPanel, NavPanel,
Notifications, Notifications,
UserFinder, UserFinder,
WhoToFollowPanel,
InstanceSpecificPanel, InstanceSpecificPanel,
FeaturesPanel,
WhoToFollowPanel,
ChatPanel ChatPanel
}, },
data: () => ({ data: () => ({
@ -34,9 +36,9 @@ export default {
computed: { computed: {
currentUser () { return this.$store.state.users.currentUser }, currentUser () { return this.$store.state.users.currentUser },
background () { background () {
return this.currentUser.background_image || this.$store.state.config.background return this.currentUser.background_image || this.$store.state.instance.background
}, },
enableMask () { return this.supportsMask && this.$store.state.config.logoMask }, enableMask () { return this.supportsMask && this.$store.state.instance.logoMask },
logoStyle () { logoStyle () {
return { return {
'visibility': this.enableMask ? 'hidden' : 'visible' 'visibility': this.enableMask ? 'hidden' : 'visible'
@ -44,24 +46,24 @@ export default {
}, },
logoMaskStyle () { logoMaskStyle () {
return this.enableMask ? { return this.enableMask ? {
'mask-image': `url(${this.$store.state.config.logo})` 'mask-image': `url(${this.$store.state.instance.logo})`
} : { } : {
'background-color': this.enableMask ? '' : 'transparent' 'background-color': this.enableMask ? '' : 'transparent'
} }
}, },
logoBgStyle () { logoBgStyle () {
return Object.assign({ return Object.assign({
'margin': `${this.$store.state.config.logoMargin} 0` 'margin': `${this.$store.state.instance.logoMargin} 0`
}, this.enableMask ? {} : { }, this.enableMask ? {} : {
'background-color': this.enableMask ? '' : 'transparent' 'background-color': this.enableMask ? '' : 'transparent'
}) })
}, },
logo () { return this.$store.state.config.logo }, logo () { return this.$store.state.instance.logo },
style () { return { 'background-image': `url(${this.background})` } }, style () { return { 'background-image': `url(${this.background})` } },
sitename () { return this.$store.state.config.name }, sitename () { return this.$store.state.instance.name },
chat () { return this.$store.state.chat.channel.state === 'joined' }, chat () { return this.$store.state.chat.channel.state === 'joined' },
suggestionsEnabled () { return this.$store.state.config.suggestionsEnabled }, suggestionsEnabled () { return this.$store.state.instance.suggestionsEnabled },
showInstanceSpecificPanel () { return this.$store.state.config.showInstanceSpecificPanel } showInstanceSpecificPanel () { return this.$store.state.instance.showInstanceSpecificPanel }
}, },
methods: { methods: {
activatePanel (panelName) { activatePanel (panelName) {

View file

@ -248,6 +248,7 @@ nav {
justify-content: center; justify-content: center;
flex: 0 0 auto; flex: 0 0 auto;
z-index: -1; z-index: -1;
.mask { .mask {
mask-repeat: no-repeat; mask-repeat: no-repeat;
mask-position: center; mask-position: center;
@ -260,7 +261,10 @@ nav {
left: 0; left: 0;
right: 0; right: 0;
} }
img { img {
height: 100%;
object-fit: contain;
display: block; display: block;
flex: 0; flex: 0;
} }
@ -325,18 +329,35 @@ main-router {
background-size: cover; background-size: cover;
padding: .6em .6em; padding: .6em .6em;
text-align: left; text-align: left;
font-size: 1.3em; line-height: 28px;
line-height: 24px;
background-color: $fallback--btn; background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn); background-color: var(--btn, $fallback--btn);
align-items: baseline; align-items: baseline;
.title { .title {
flex: 1 0 auto; flex: 1 0 auto;
font-size: 1.3em;
}
.alert {
white-space: nowrap;
text-overflow: ellipsis;
overflow-x: hidden;
} }
button { button {
height: 100%; flex-shrink: 0;
}
button, .alert {
// height: 100%;
line-height: 21px;
min-height: 0;
box-sizing: border-box;
margin: 0;
margin-left: .25em;
min-width: 1px;
align-self: stretch;
} }
} }

View file

@ -28,6 +28,7 @@
<user-panel></user-panel> <user-panel></user-panel>
<nav-panel></nav-panel> <nav-panel></nav-panel>
<instance-specific-panel v-if="showInstanceSpecificPanel"></instance-specific-panel> <instance-specific-panel v-if="showInstanceSpecificPanel"></instance-specific-panel>
<features-panel v-if="!currentUser"></features-panel>
<who-to-follow-panel v-if="currentUser && suggestionsEnabled"></who-to-follow-panel> <who-to-follow-panel v-if="currentUser && suggestionsEnabled"></who-to-follow-panel>
<notifications v-if="currentUser"></notifications> <notifications v-if="currentUser"></notifications>
</div> </div>

View file

@ -3,7 +3,7 @@
<div class="panel-heading conversation-heading"> <div class="panel-heading conversation-heading">
<span class="title"> {{ $t('timeline.conversation') }} </span> <span class="title"> {{ $t('timeline.conversation') }} </span>
<span v-if="collapsable"> <span v-if="collapsable">
<small><a href="#" @click.prevent="$emit('toggleExpanded')">{{ $t('timeline.collapse') }}</a></small> <a href="#" @click.prevent="$emit('toggleExpanded')">{{ $t('timeline.collapse') }}</a>
</span> </span>
</div> </div>
<div class="panel-body"> <div class="panel-body">

View file

@ -2,7 +2,9 @@ const FavoriteButton = {
props: ['status', 'loggedIn'], props: ['status', 'loggedIn'],
data () { data () {
return { return {
hidePostStatsLocal: this.$store.state.config.hidePostStats, hidePostStatsLocal: typeof this.$store.state.config.hidePostStats == 'undefined'
? this.$store.state.instance.hidePostStats
: this.$store.state.config.hidePostStats,
animated: false animated: false
} }
}, },

View file

@ -0,0 +1,14 @@
const FeaturesPanel = {
computed: {
chat: function () {
return this.$store.state.instance.chatAvailable && (!this.$store.state.chatDisabled)
},
gopher: function () { return this.$store.state.instance.gopherAvailable },
whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled },
mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable },
scopeOptions: function () { return this.$store.state.instance.scopeOptionsEnabled },
textlimit: function () { return this.$store.state.instance.textlimit }
}
}
export default FeaturesPanel

View file

@ -0,0 +1,29 @@
<template>
<div class="features-panel">
<div class="panel panel-default base01-background">
<div class="panel-heading timeline-heading base02-background base04">
<div class="title">
{{$t('features_panel.title')}}
</div>
</div>
<div class="panel-body features-panel">
<ul>
<li v-if="chat">{{$t('features_panel.chat')}}</li>
<li v-if="gopher">{{$t('features_panel.gopher')}}</li>
<li v-if="whoToFollow">{{$t('features_panel.who_to_follow')}}</li>
<li v-if="mediaProxy">{{$t('features_panel.media_proxy')}}</li>
<li v-if="scopeOptions">{{$t('features_panel.scope_options')}}</li>
<li>{{$t('features_panel.text_limit')}} = {{textlimit}}</li>
</ul>
</div>
</div>
</div>
</template>
<script src="./features_panel.js" ></script>
<style lang="scss">
.features-panel li {
line-height: 24px;
}
</style>

View file

@ -1,7 +1,7 @@
const InstanceSpecificPanel = { const InstanceSpecificPanel = {
computed: { computed: {
instanceSpecificPanelContent () { instanceSpecificPanelContent () {
return this.$store.state.config.instanceSpecificPanelContent return this.$store.state.instance.instanceSpecificPanelContent
} }
} }
} }

View file

@ -5,7 +5,7 @@ const LoginForm = {
}), }),
computed: { computed: {
loggingIn () { return this.$store.state.users.loggingIn }, loggingIn () { return this.$store.state.users.loggingIn },
registrationOpen () { return this.$store.state.config.registrationOpen } registrationOpen () { return this.$store.state.instance.registrationOpen }
}, },
methods: { methods: {
submit () { submit () {

View file

@ -22,10 +22,6 @@
} }
.loadmore-error { .loadmore-error {
min-width: 6em;
text-align: center;
padding: 0 0.25em 0 0.25em;
margin: 0;
color: $fallback--fg; color: $fallback--fg;
color: var(--fg, $fallback--fg); color: var(--fg, $fallback--fg);
} }

View file

@ -75,8 +75,11 @@ const PostStatusForm = {
candidates () { candidates () {
const firstchar = this.textAtCaret.charAt(0) const firstchar = this.textAtCaret.charAt(0)
if (firstchar === '@') { if (firstchar === '@') {
const matchedUsers = filter(this.users, (user) => (String(user.name + user.screen_name)).toUpperCase() const query = this.textAtCaret.slice(1).toUpperCase()
.startsWith(this.textAtCaret.slice(1).toUpperCase())) const matchedUsers = filter(this.users, (user) => {
return user.screen_name.toUpperCase().startsWith(query) ||
user.name && user.name.toUpperCase().startsWith(query)
})
if (matchedUsers.length <= 0) { if (matchedUsers.length <= 0) {
return false return false
} }
@ -99,7 +102,7 @@ const PostStatusForm = {
name: '', name: '',
utf: utf || '', utf: utf || '',
// eslint-disable-next-line camelcase // eslint-disable-next-line camelcase
img: utf ? '' : this.$store.state.config.server + image_url, img: utf ? '' : this.$store.state.instance.server + image_url,
highlighted: index === this.highlighted highlighted: index === this.highlighted
})) }))
} else { } else {
@ -117,16 +120,16 @@ const PostStatusForm = {
return this.$store.state.users.users return this.$store.state.users.users
}, },
emoji () { emoji () {
return this.$store.state.config.emoji || [] return this.$store.state.instance.emoji || []
}, },
customEmoji () { customEmoji () {
return this.$store.state.config.customEmoji || [] return this.$store.state.instance.customEmoji || []
}, },
statusLength () { statusLength () {
return this.newStatus.status.length return this.newStatus.status.length
}, },
statusLengthLimit () { statusLengthLimit () {
return this.$store.state.config.textlimit return this.$store.state.instance.textlimit
}, },
hasStatusLengthLimit () { hasStatusLengthLimit () {
return this.statusLengthLimit > 0 return this.statusLengthLimit > 0
@ -138,10 +141,10 @@ const PostStatusForm = {
return this.hasStatusLengthLimit && (this.statusLength > this.statusLengthLimit) return this.hasStatusLengthLimit && (this.statusLength > this.statusLengthLimit)
}, },
scopeOptionsEnabled () { scopeOptionsEnabled () {
return this.$store.state.config.scopeOptionsEnabled return this.$store.state.instance.scopeOptionsEnabled
}, },
formattingOptionsEnabled () { formattingOptionsEnabled () {
return this.$store.state.config.formattingOptionsEnabled return this.$store.state.instance.formattingOptionsEnabled
} }
}, },
methods: { methods: {

View file

@ -90,8 +90,7 @@
</div> </div>
<div class="upload_settings" v-if="newStatus.files.length > 0"> <div class="upload_settings" v-if="newStatus.files.length > 0">
<input type="checkbox" id="filesSensitive" v-model="newStatus.nsfw"> <input type="checkbox" id="filesSensitive" v-model="newStatus.nsfw">
<label for="filesSensitive" v-if="newStatus.nsfw">{{$t('post_status.attachments_sensitive')}}</label> <label for="filesSensitive">{{$t('post_status.attachments_sensitive')}}</label>
<label for="filesSensitive" v-else v-html="$t('post_status.attachments_not_sensitive')"></label>
</div> </div>
</form> </form>
</div> </div>

View file

@ -5,16 +5,16 @@ const registration = {
registering: false registering: false
}), }),
created () { created () {
if ((!this.$store.state.config.registrationOpen && !this.token) || !!this.$store.state.users.currentUser) { if ((!this.$store.state.instance.registrationOpen && !this.token) || !!this.$store.state.users.currentUser) {
this.$router.push('/main/all') this.$router.push('/main/all')
} }
// Seems like this doesn't work at first page open for some reason // Seems like this doesn't work at first page open for some reason
if (this.$store.state.config.registrationOpen && this.token) { if (this.$store.state.instance.registrationOpen && this.token) {
this.$router.push('/registration') this.$router.push('/registration')
} }
}, },
computed: { computed: {
termsofservice () { return this.$store.state.config.tos }, termsofservice () { return this.$store.state.instance.tos },
token () { return this.$route.params.token } token () { return this.$route.params.token }
}, },
methods: { methods: {

View file

@ -2,7 +2,9 @@ const RetweetButton = {
props: ['status', 'loggedIn', 'visibility'], props: ['status', 'loggedIn', 'visibility'],
data () { data () {
return { return {
hidePostStatsLocal: this.$store.state.config.hidePostStats, hidePostStatsLocal: typeof this.$store.state.config.hidePostStats == 'undefined'
? this.$store.state.instance.hidePostStats
: this.$store.state.config.hidePostStats,
animated: false animated: false
} }
}, },

View file

@ -6,23 +6,35 @@ import { filter, trim } from 'lodash'
const settings = { const settings = {
data () { data () {
const user = this.$store.state.config
const instance = this.$store.state.instance
return { return {
hideAttachmentsLocal: this.$store.state.config.hideAttachments, hideAttachmentsLocal: user.hideAttachments,
hideAttachmentsInConvLocal: this.$store.state.config.hideAttachmentsInConv, hideAttachmentsInConvLocal: user.hideAttachmentsInConv,
hideNsfwLocal: this.$store.state.config.hideNsfw, hideNsfwLocal: user.hideNsfw,
hidePostStatsLocal: this.$store.state.config.hidePostStats, hidePostStatsLocal: typeof user.hidePostStats === 'undefined'
hideUserStatsLocal: this.$store.state.config.hideUserStats, ? instance.hidePostStats
notificationVisibilityLocal: this.$store.state.config.notificationVisibility, : user.hidePostStats,
replyVisibilityLocal: this.$store.state.config.replyVisibility, hidePostStatsDefault : this.$t('settings.values.' + instance.hidePostStats),
loopVideoLocal: this.$store.state.config.loopVideo, hideUserStatsLocal: typeof user.hideUserStats === 'undefined'
loopVideoSilentOnlyLocal: this.$store.state.config.loopVideoSilentOnly, ? instance.hideUserStats
muteWordsString: this.$store.state.config.muteWords.join('\n'), : user.hideUserStats,
autoLoadLocal: this.$store.state.config.autoLoad, hideUserStatsDefault : this.$t('settings.values.' + instance.hideUserStats),
streamingLocal: this.$store.state.config.streaming, notificationVisibilityLocal: user.notificationVisibility,
pauseOnUnfocusedLocal: this.$store.state.config.pauseOnUnfocused, replyVisibilityLocal: user.replyVisibility,
hoverPreviewLocal: this.$store.state.config.hoverPreview, loopVideoLocal: user.loopVideo,
collapseMessageWithSubjectLocal: this.$store.state.config.collapseMessageWithSubject, loopVideoSilentOnlyLocal: user.loopVideoSilentOnly,
stopGifs: this.$store.state.config.stopGifs, muteWordsString: user.muteWords.join('\n'),
autoLoadLocal: user.autoLoad,
streamingLocal: user.streaming,
pauseOnUnfocusedLocal: user.pauseOnUnfocused,
hoverPreviewLocal: user.hoverPreview,
collapseMessageWithSubjectLocal: typeof user.collapseMessageWithSubject === 'undefined'
? instance.collapseMessageWithSubject
: user.collapseMessageWithSubject,
collapseMessageWithSubjectDefault: this.$t('settings.values.' + instance.collapseMessageWithSubject),
stopGifs: user.stopGifs,
loopSilentAvailable: loopSilentAvailable:
// Firefox // Firefox
Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') || Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') ||
@ -40,6 +52,9 @@ const settings = {
computed: { computed: {
user () { user () {
return this.$store.state.users.currentUser return this.$store.state.users.currentUser
},
currentSaveStateNotice () {
return this.$store.state.interface.settings.currentSaveStateNotice
} }
}, },
watch: { watch: {

View file

@ -1,7 +1,21 @@
<template> <template>
<div class="settings panel panel-default"> <div class="settings panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
{{$t('settings.settings')}} <div class="title">
{{$t('settings.settings')}}
</div>
<transition name="fade">
<template v-if="currentSaveStateNotice">
<div @click.prevent class="alert error" v-if="currentSaveStateNotice.error">
{{ $t('settings.saving_err') }}
</div>
<div @click.prevent class="alert transparent" v-if="!currentSaveStateNotice.error">
{{ $t('settings.saving_ok') }}
</div>
</template>
</transition>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<tab-switcher> <tab-switcher>
@ -15,7 +29,9 @@
<ul class="setting-list"> <ul class="setting-list">
<li> <li>
<input type="checkbox" id="collapseMessageWithSubject" v-model="collapseMessageWithSubjectLocal"> <input type="checkbox" id="collapseMessageWithSubject" v-model="collapseMessageWithSubjectLocal">
<label for="collapseMessageWithSubject">{{$t('settings.collapse_subject')}}</label> <label for="collapseMessageWithSubject">
{{$t('settings.collapse_subject')}} {{$t('settings.instance_default', { value: collapseMessageWithSubjectDefault })}}
</label>
</li> </li>
<li> <li>
<input type="checkbox" id="streaming" v-model="streamingLocal"> <input type="checkbox" id="streaming" v-model="streamingLocal">
@ -124,11 +140,15 @@
</div> </div>
<div> <div>
<input type="checkbox" id="hidePostStats" v-model="hidePostStatsLocal"> <input type="checkbox" id="hidePostStats" v-model="hidePostStatsLocal">
<label for="hidePostStats">{{$t('settings.hide_post_stats')}}</label> <label for="hidePostStats">
{{$t('settings.hide_post_stats')}} {{$t('settings.instance_default', { value: hidePostStatsDefault })}}
</label>
</div> </div>
<div> <div>
<input type="checkbox" id="hideUserStats" v-model="hideUserStatsLocal"> <input type="checkbox" id="hideUserStats" v-model="hideUserStatsLocal">
<label for="hideUserStats">{{$t('settings.hide_user_stats')}}</label> <label for="hideUserStats">
{{$t('settings.hide_user_stats')}} {{$t('settings.instance_default', { value: hideUserStatsDefault })}}
</label>
</div> </div>
</div> </div>
<div class="setting-item"> <div class="setting-item">

View file

@ -23,6 +23,7 @@
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain;
} }
&.animated { &.animated {

View file

@ -4,12 +4,12 @@
<div class="title"> <div class="title">
{{title}} {{title}}
</div> </div>
<button @click.prevent="showNewStatuses" class="loadmore-button" v-if="timeline.newStatusCount > 0 && !timelineError">
{{$t('timeline.show_new')}}{{newStatusCountStr}}
</button>
<div @click.prevent class="loadmore-error alert error" v-if="timelineError"> <div @click.prevent class="loadmore-error alert error" v-if="timelineError">
{{$t('timeline.error_fetching')}} {{$t('timeline.error_fetching')}}
</div> </div>
<button @click.prevent="showNewStatuses" class="loadmore-button" v-if="timeline.newStatusCount > 0 && !timelineError">
{{$t('timeline.show_new')}}{{newStatusCountStr}}
</button>
<div @click.prevent class="loadmore-text" v-if="!timeline.newStatusCount > 0 && !timelineError"> <div @click.prevent class="loadmore-text" v-if="!timeline.newStatusCount > 0 && !timelineError">
{{$t('timeline.up_to_date')}} {{$t('timeline.up_to_date')}}
</div> </div>
@ -58,7 +58,6 @@
.timeline { .timeline {
.loadmore-text { .loadmore-text {
font-size: 14px;
opacity: 0.8; opacity: 0.8;
background-color: transparent; background-color: transparent;
color: $fallback--faint; color: $fallback--faint;
@ -66,11 +65,6 @@
} }
.loadmore-error { .loadmore-error {
font-size: 14px;
min-width: 6em;
text-align: center;
padding: 0 0.25em 0 0.25em;
margin: 0;
color: $fallback--fg; color: $fallback--fg;
color: var(--fg, $fallback--fg); color: var(--fg, $fallback--fg);
} }

View file

@ -5,7 +5,9 @@ export default {
props: [ 'user', 'switcher', 'selected', 'hideBio' ], props: [ 'user', 'switcher', 'selected', 'hideBio' ],
data () { data () {
return { return {
hideUserStatsLocal: this.$store.state.config.hideUserStats hideUserStatsLocal: typeof this.$store.state.config.hideUserStats === 'undefined'
? this.$store.state.instance.hideUserStats
: this.$store.state.config.hideUserStats
} }
}, },
computed: { computed: {

View file

@ -14,8 +14,10 @@
<style lang="scss"> <style lang="scss">
.user-panel { .user-panel {
.profile-panel-background .panel-heading { .profile-panel-background .panel-heading {
background: transparent; background: transparent;
} flex-direction: column;
align-items: stretch;
}
} }
</style> </style>

View file

@ -7,6 +7,7 @@ const UserSettings = {
newname: this.$store.state.users.currentUser.name, newname: this.$store.state.users.currentUser.name,
newbio: this.$store.state.users.currentUser.description, newbio: this.$store.state.users.currentUser.description,
newlocked: this.$store.state.users.currentUser.locked, newlocked: this.$store.state.users.currentUser.locked,
newnorichtext: this.$store.state.users.currentUser.no_rich_text,
newdefaultScope: this.$store.state.users.currentUser.default_scope, newdefaultScope: this.$store.state.users.currentUser.default_scope,
followList: null, followList: null,
followImportError: false, followImportError: false,
@ -32,10 +33,10 @@ const UserSettings = {
return this.$store.state.users.currentUser return this.$store.state.users.currentUser
}, },
pleromaBackend () { pleromaBackend () {
return this.$store.state.config.pleromaBackend return this.$store.state.instance.pleromaBackend
}, },
scopeOptionsEnabled () { scopeOptionsEnabled () {
return this.$store.state.config.scopeOptionsEnabled return this.$store.state.instance.scopeOptionsEnabled
}, },
vis () { vis () {
return { return {
@ -53,7 +54,8 @@ const UserSettings = {
const locked = this.newlocked const locked = this.newlocked
/* eslint-disable camelcase */ /* eslint-disable camelcase */
const default_scope = this.newdefaultScope const default_scope = this.newdefaultScope
this.$store.state.api.backendInteractor.updateProfile({params: {name, description, locked, default_scope}}).then((user) => { const no_rich_text = this.newnorichtext
this.$store.state.api.backendInteractor.updateProfile({params: {name, description, locked, default_scope, no_rich_text}}).then((user) => {
if (!user.error) { if (!user.error) {
this.$store.commit('addNewUsers', [user]) this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user) this.$store.commit('setCurrentUser', user)

View file

@ -25,6 +25,10 @@
<i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public"></i> <i v-on:click="changeVis('public')" class="icon-globe" :class="vis.public"></i>
</div> </div>
</div> </div>
<p>
<input type="checkbox" v-model="newnorichtext" id="account-no-rich-text">
<label for="account-no-rich-text">{{$t('settings.no_rich_text_description')}}</label>
</p>
<button :disabled='newname.length <= 0' class="btn btn-default" @click="updateProfile">{{$t('general.submit')}}</button> <button :disabled='newname.length <= 0' class="btn btn-default" @click="updateProfile">{{$t('general.submit')}}</button>
</div> </div>
<div class="setting-item"> <div class="setting-item">

View file

@ -3,9 +3,10 @@ import apiService from '../../services/api/api.service.js'
function showWhoToFollow (panel, reply) { function showWhoToFollow (panel, reply) {
var users = reply var users = reply
var cn var cn
var index = 0 var index
var random = Math.floor(Math.random() * 10) var step = 7
for (cn = random; cn < users.length; cn = cn + 10) { cn = Math.floor(Math.random() * step)
for (index = 0; index < 3; index++) {
var user var user
user = users[cn] user = users[cn]
var img var img
@ -46,10 +47,7 @@ function showWhoToFollow (panel, reply) {
} }
}) })
} }
index = index + 1 cn = (cn + step) % users.length
if (index > 2) {
break
}
} }
} }
@ -85,14 +83,14 @@ const WhoToFollowPanel = {
moreUrl: function () { moreUrl: function () {
var host = window.location.hostname var host = window.location.hostname
var user = this.user var user = this.user
var suggestionsWeb = this.$store.state.config.suggestionsWeb var suggestionsWeb = this.$store.state.instance.suggestionsWeb
var url var url
url = suggestionsWeb.replace(/{{host}}/g, encodeURIComponent(host)) url = suggestionsWeb.replace(/{{host}}/g, encodeURIComponent(host))
url = url.replace(/{{user}}/g, encodeURIComponent(user)) url = url.replace(/{{user}}/g, encodeURIComponent(user))
return url return url
}, },
suggestionsEnabled () { suggestionsEnabled () {
return this.$store.state.config.suggestionsEnabled return this.$store.state.instance.suggestionsEnabled
} }
}, },
watch: { watch: {

View file

@ -11,7 +11,7 @@
<img v-bind:src="img1"/> <router-link :to="{ name: 'user-profile', params: { id: id1 } }">{{ name1 }}</router-link><br> <img v-bind:src="img1"/> <router-link :to="{ name: 'user-profile', params: { id: id1 } }">{{ name1 }}</router-link><br>
<img v-bind:src="img2"/> <router-link :to="{ name: 'user-profile', params: { id: id2 } }">{{ name2 }}</router-link><br> <img v-bind:src="img2"/> <router-link :to="{ name: 'user-profile', params: { id: id2 } }">{{ name2 }}</router-link><br>
<img v-bind:src="img3"/> <router-link :to="{ name: 'user-profile', params: { id: id3 } }">{{ name3 }}</router-link><br> <img v-bind:src="img3"/> <router-link :to="{ name: 'user-profile', params: { id: id3 } }">{{ name3 }}</router-link><br>
<img v-bind:src="$store.state.config.logo"> <a v-bind:href="moreUrl" target="_blank">{{$t('who_to_follow.more')}}</a> <img v-bind:src="$store.state.instance.logo"> <a v-bind:href="moreUrl" target="_blank">{{$t('who_to_follow.more')}}</a>
</p> </p>
</div> </div>
</div> </div>

49
src/i18n/compare.js Executable file
View file

@ -0,0 +1,49 @@
#!/usr/bin/env node
const arg = process.argv[2]
if (typeof arg === 'undefined') {
console.log('This is a very simple and tiny tool that checks en.json with any other language and')
console.log('outputs all the things present in english but missing in foreign language.')
console.log('')
console.log('Usage: ./compare.js <lang> ')
console.log(' or')
console.log(' node ./compare.js <lang>')
console.log('')
console.log('Where <lang> is name of .json file containing language. For ./fi.json it should be:')
console.log(' ./compare.js fi ')
console.log('')
console.log('Limitations: ')
console.log('* This program does not work with languages left over in messages.js')
console.log('* This program does not check for extra strings present in foreign language but missing')
console.log(' in english.js (for now)')
console.log('')
console.log('There are no other arguments or options. Make an issue if you encounter a bug or want')
console.log('some feature to be implemented. Merge requests are welcome as well.')
return
}
const english = require('./en.json')
const foreign = require(`./${arg}.json`)
function walker (a, b, path = []) {
Object.keys(a).forEach(k => {
const aVal = a[k]
const bVal = b[k]
const aType = typeof aVal
const bType = typeof bVal
const currentPath = [...path, k]
const article = aType[0] === 'o' ? 'an' : 'a'
if (bType === 'undefined') {
console.log(`Foreign language is missing ${article} ${aType} at path ${currentPath.join('.')}`)
} else if (aType === 'object') {
if (bType !== 'object') {
console.log(`Type mismatch! English has ${aType} while foreign has ${bType} at path ${currentPath.join['.']}`)
} else {
walker(aVal, bVal, currentPath)
}
}
})
}
walker(english, foreign)

150
src/i18n/de.json Normal file
View file

@ -0,0 +1,150 @@
{
"chat": {
"title": "Chat"
},
"finder": {
"error_fetching_user": "Fehler beim Suchen des Benutzers",
"find_user": "Finde Benutzer"
},
"general": {
"apply": "Anwenden",
"submit": "Absenden"
},
"login": {
"login": "Anmelden",
"logout": "Abmelden",
"password": "Passwort",
"placeholder": "z.B. lain",
"register": "Registrieren",
"username": "Benutzername"
},
"nav": {
"chat": "Lokaler Chat",
"friend_requests": "Followanfragen",
"mentions": "Erwähnungen",
"public_tl": "Lokale Zeitleiste",
"timeline": "Zeitleiste",
"twkn": "Das gesamte Netzwerk"
},
"notifications": {
"favorited_you": "favorisierte deine Nachricht",
"followed_you": "folgt dir",
"notifications": "Benachrichtigungen",
"read": "Gelesen!",
"repeated_you": "wiederholte deine Nachricht"
},
"post_status": {
"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",
"default": "Sitze gerade im Hofbräuhaus.",
"direct_warning": "Dieser Beitrag wird nur für die erwähnten Nutzer sichtbar sein.",
"posting": "Veröffentlichen",
"scope": {
"direct": "Direkt - Beitrag nur an erwähnte Profile",
"private": "Nur Follower - Beitrag nur für Follower sichtbar",
"public": "Öffentlich - Beitrag an öffentliche Zeitleisten",
"unlisted": "Nicht gelistet - Nicht in öffentlichen Zeitleisten anzeigen"
}
},
"registration": {
"bio": "Bio",
"email": "Email",
"fullname": "Angezeigter Name",
"password_confirm": "Passwort bestätigen",
"registration": "Registrierung",
"token": "Einladungsschlüssel"
},
"settings": {
"attachmentRadius": "Anhänge",
"attachments": "Anhänge",
"autoload": "Aktiviere automatisches Laden von älteren Beiträgen beim scrollen",
"avatar": "Avatar",
"avatarAltRadius": "Avatare (Benachrichtigungen)",
"avatarRadius": "Avatare",
"background": "Hintergrund",
"bio": "Bio",
"btnRadius": "Buttons",
"cBlue": "Blau (Antworten, Folgt dir)",
"cGreen": "Grün (Retweet)",
"cOrange": "Orange (Favorisieren)",
"cRed": "Rot (Abbrechen)",
"change_password": "Passwort ändern",
"change_password_error": "Es gab ein Problem bei der Änderung des Passworts.",
"changed_password": "Passwort erfolgreich geändert!",
"confirm_new_password": "Neues Passwort bestätigen",
"current_avatar": "Dein derzeitiger Avatar",
"current_password": "Aktuelles Passwort",
"current_profile_banner": "Der derzeitige Banner deines Profils",
"delete_account": "Account löschen",
"delete_account_description": "Lösche deinen Account und alle deine Nachrichten unwiderruflich.",
"delete_account_error": "Es ist ein Fehler beim löschen deines Accounts aufgetreten. Tritt dies weiterhin auf, wende dich an den Administrator der Instanz.",
"delete_account_instructions": "Tippe dein Passwort unten in das Feld ein, um die Löschung deines Accounts zu bestätigen.",
"export_theme": "Farbschema speichern",
"filtering": "Filter",
"filtering_explanation": "Alle Beiträge die diese Wörter enthalten werden ausgeblendet. Ein Wort pro Zeile.",
"follow_export": "Follower exportieren",
"follow_export_button": "Liste (.csv) erstellen",
"follow_export_processing": "In Bearbeitung. Die Liste steht gleich zum herunterladen bereit.",
"follow_import": "Followers importieren",
"follow_import_error": "Fehler beim importieren der Follower",
"follows_imported": "Followers importiert! Die Bearbeitung kann eine Zeit lang dauern.",
"foreground": "Vordergrund",
"hide_attachments_in_convo": "Anhänge in Unterhaltungen ausblenden",
"hide_attachments_in_tl": "Anhänge in der Zeitleiste ausblenden",
"import_followers_from_a_csv_file": "Importiere Follower, denen du folgen möchtest, aus einer CSV-Datei",
"import_theme": "Farbschema laden",
"inputRadius": "Eingabefelder",
"invalid_theme_imported": "Die ausgewählte Datei ist kein unterstütztes Pleroma-Theme. Keine Änderungen wurden vorgenommen.",
"links": "Links",
"lock_account_description": "Sperre deinen Account, um neue Follower zu genehmigen oder abzulehnen",
"name": "Name",
"name_bio": "Name & Bio",
"new_password": "Neues Passwort",
"nsfw_clickthrough": "Aktiviere ausblendbares Overlay für Anhänge, die als NSFW markiert sind",
"panelRadius": "Panel",
"presets": "Voreinstellungen",
"profile_background": "Profil Hintergrund",
"profile_banner": "Profil Banner",
"radii_help": "Kantenrundung (in Pixel) der Oberfläche anpassen",
"reply_link_preview": "Aktiviere reply-link Vorschau bei Maus-Hover",
"set_new_avatar": "Setze einen neuen Avatar",
"set_new_profile_background": "Setze einen neuen Hintergrund für dein Profil",
"set_new_profile_banner": "Setze einen neuen Banner für dein Profil",
"settings": "Einstellungen",
"stop_gifs": "Play-on-hover GIFs",
"streaming": "Aktiviere automatisches Laden (Streaming) von neuen Beiträgen",
"text": "Text",
"theme": "Farbschema",
"theme_help": "Benutze HTML Farbcodes (#rrggbb) um dein Farbschema anzupassen",
"tooltipRadius": "Tooltips/Warnungen",
"user_settings": "Benutzereinstellungen"
},
"timeline": {
"collapse": "Einklappen",
"conversation": "Unterhaltung",
"error_fetching": "Fehler beim Laden",
"load_older": "Lade ältere Beiträge",
"repeated": "wiederholte",
"show_new": "Zeige Neuere",
"up_to_date": "Aktuell"
},
"user_card": {
"approve": "Genehmigen",
"block": "Blockieren",
"blocked": "Blockiert!",
"deny": "Ablehnen",
"follow": "Folgen",
"followees": "Folgt",
"followers": "Followers",
"following": "Folgst du!",
"follows_you": "Folgt dir!",
"mute": "Stummschalten",
"muted": "Stummgeschaltet",
"per_day": "pro Tag",
"remote_follow": "Folgen",
"statuses": "Beiträge"
},
"user_profile": {
"timeline_title": "Beiträge"
}
}

201
src/i18n/en.json Normal file
View file

@ -0,0 +1,201 @@
{
"chat": {
"title": "Chat"
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Media proxy",
"scope_options": "Scope options",
"text_limit": "Text limit",
"title": "Features",
"who_to_follow": "Who to follow"
},
"finder": {
"error_fetching_user": "Error fetching user",
"find_user": "Find user"
},
"general": {
"apply": "Apply",
"submit": "Submit"
},
"login": {
"login": "Log in",
"logout": "Log out",
"password": "Password",
"placeholder": "e.g. lain",
"register": "Register",
"username": "Username"
},
"nav": {
"chat": "Local Chat",
"friend_requests": "Follow Requests",
"mentions": "Mentions",
"public_tl": "Public Timeline",
"timeline": "Timeline",
"twkn": "The Whole Known Network"
},
"notifications": {
"broken_favorite": "Unknown status, searching for it...",
"favorited_you": "favorited your status",
"followed_you": "followed you",
"load_older": "Load older notifications",
"notifications": "Notifications",
"read": "Read!",
"repeated_you": "repeated your status"
},
"post_status": {
"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",
"attachments_sensitive": "Mark attachments as sensitive",
"content_type": {
"plain_text": "Plain text"
},
"content_warning": "Subject (optional)",
"default": "Just landed in L.A.",
"direct_warning": "This post will only be visible to all the mentioned users.",
"posting": "Posting",
"scope": {
"direct": "Direct - Post to mentioned users only",
"private": "Followers-only - Post to followers only",
"public": "Public - Post to public timelines",
"unlisted": "Unlisted - Do not post to public timelines"
}
},
"registration": {
"bio": "Bio",
"email": "Email",
"fullname": "Display name",
"password_confirm": "Password confirmation",
"registration": "Registration",
"token": "Invite token"
},
"settings": {
"attachmentRadius": "Attachments",
"attachments": "Attachments",
"autoload": "Enable automatic loading when scrolled to the bottom",
"avatar": "Avatar",
"avatarAltRadius": "Avatars (Notifications)",
"avatarRadius": "Avatars",
"background": "Background",
"bio": "Bio",
"btnRadius": "Buttons",
"cBlue": "Blue (Reply, follow)",
"cGreen": "Green (Retweet)",
"cOrange": "Orange (Favorite)",
"cRed": "Red (Cancel)",
"change_password": "Change Password",
"change_password_error": "There was an issue changing your password.",
"changed_password": "Password changed successfully!",
"collapse_subject": "Collapse posts with subjects",
"confirm_new_password": "Confirm new password",
"current_avatar": "Your current avatar",
"current_password": "Current password",
"current_profile_banner": "Your current profile banner",
"data_import_export_tab": "Data Import / Export",
"default_vis": "Default visibility scope",
"delete_account": "Delete Account",
"delete_account_description": "Permanently delete your account and all your messages.",
"delete_account_error": "There was an issue deleting your account. If this persists please contact your instance administrator.",
"delete_account_instructions": "Type your password in the input below to confirm account deletion.",
"export_theme": "Save preset",
"filtering": "Filtering",
"filtering_explanation": "All statuses containing these words will be muted, one per line",
"follow_export": "Follow export",
"follow_export_button": "Export your follows to a csv file",
"follow_export_processing": "Processing, you'll soon be asked to download your file",
"follow_import": "Follow import",
"follow_import_error": "Error importing followers",
"follows_imported": "Follows imported! Processing them will take a while.",
"foreground": "Foreground",
"general": "General",
"hide_attachments_in_convo": "Hide attachments in conversations",
"hide_attachments_in_tl": "Hide attachments in timeline",
"hide_post_stats": "Hide post statistics (e.g. the number of favorites)",
"hide_user_stats": "Hide user statistics (e.g. the number of followers)",
"import_followers_from_a_csv_file": "Import follows from a csv file",
"import_theme": "Load preset",
"inputRadius": "Input fields",
"instance_default": "(default: {value})",
"interfaceLanguage": "Interface language",
"invalid_theme_imported": "The selected file is not a supported Pleroma theme. No changes to your theme were made.",
"limited_availability": "Unavailable in your browser",
"links": "Links",
"lock_account_description": "Restrict your account to approved followers only",
"loop_video": "Loop videos",
"loop_video_silent_only": "Loop only videos without sound (i.e. Mastodon's \"gifs\")",
"name": "Name",
"name_bio": "Name & Bio",
"new_password": "New password",
"notification_visibility": "Types of notifications to show",
"notification_visibility_follows": "Follows",
"notification_visibility_likes": "Likes",
"notification_visibility_mentions": "Mentions",
"notification_visibility_repeats": "Repeats",
"no_rich_text_description": "Strip rich text formatting from all posts",
"nsfw_clickthrough": "Enable clickthrough NSFW attachment hiding",
"panelRadius": "Panels",
"pause_on_unfocused": "Pause streaming when tab is not focused",
"presets": "Presets",
"profile_background": "Profile Background",
"profile_banner": "Profile Banner",
"profile_tab": "Profile",
"radii_help": "Set up interface edge rounding (in pixels)",
"replies_in_timeline": "Replies in timeline",
"reply_link_preview": "Enable reply-link preview on mouse hover",
"reply_visibility_all": "Show all replies",
"reply_visibility_following": "Only show replies directed at me or users I'm following",
"reply_visibility_self": "Only show replies directed at me",
"saving_err": "Error saving settings",
"saving_ok": "Settings saved",
"security_tab": "Security",
"set_new_avatar": "Set new avatar",
"set_new_profile_background": "Set new profile background",
"set_new_profile_banner": "Set new profile banner",
"settings": "Settings",
"stop_gifs": "Play-on-hover GIFs",
"streaming": "Enable automatic streaming of new posts when scrolled to the top",
"text": "Text",
"theme": "Theme",
"theme_help": "Use hex color codes (#rrggbb) to customize your color theme.",
"tooltipRadius": "Tooltips/alerts",
"user_settings": "User Settings",
"values": {
"false": "no",
"true": "yes"
}
},
"timeline": {
"collapse": "Collapse",
"conversation": "Conversation",
"error_fetching": "Error fetching updates",
"load_older": "Load older statuses",
"no_retweet_hint": "Post is marked as followers-only or direct and cannot be repeated",
"repeated": "repeated",
"show_new": "Show new",
"up_to_date": "Up-to-date"
},
"user_card": {
"approve": "Approve",
"block": "Block",
"blocked": "Blocked!",
"deny": "Deny",
"follow": "Follow",
"followees": "Following",
"followers": "Followers",
"following": "Following!",
"follows_you": "Follows you!",
"mute": "Mute",
"muted": "Muted",
"per_day": "per day",
"remote_follow": "Remote follow",
"statuses": "Statuses"
},
"user_profile": {
"timeline_title": "User Timeline"
},
"who_to_follow": {
"more": "More",
"who_to_follow": "Who to follow"
}
}

119
src/i18n/eo.json Normal file
View file

@ -0,0 +1,119 @@
{
"chat": {
"title": "Babilejo"
},
"finder": {
"error_fetching_user": "Eraro alportante uzanton",
"find_user": "Trovi uzanton"
},
"general": {
"apply": "Apliki",
"submit": "Sendi"
},
"login": {
"login": "Ensaluti",
"logout": "Elsaluti",
"password": "Pasvorto",
"placeholder": "ekz. lain",
"register": "Registriĝi",
"username": "Salutnomo"
},
"nav": {
"chat": "Loka babilejo",
"mentions": "Mencioj",
"public_tl": "Publika tempolinio",
"timeline": "Tempolinio",
"twkn": "La tuta konata reto"
},
"notifications": {
"favorited_you": "ŝatis vian staton",
"followed_you": "ekabonis vin",
"notifications": "Sciigoj",
"read": "Legite!",
"repeated_you": "ripetis vian staton"
},
"post_status": {
"default": "Ĵus alvenis al la Universala Kongreso!",
"posting": "Afiŝante"
},
"registration": {
"bio": "Priskribo",
"email": "Retpoŝtadreso",
"fullname": "Vidiga nomo",
"password_confirm": "Konfirmo de pasvorto",
"registration": "Registriĝo"
},
"settings": {
"attachmentRadius": "Kunsendaĵoj",
"attachments": "Kunsendaĵoj",
"autoload": "Ŝalti memfaran ŝarĝadon ĉe subo de paĝo",
"avatar": "Profilbildo",
"avatarAltRadius": "Profilbildoj (sciigoj)",
"avatarRadius": "Profilbildoj",
"background": "Fono",
"bio": "Priskribo",
"btnRadius": "Butonoj",
"cBlue": "Blua (Respondo, abono)",
"cGreen": "Verda (Kunhavigo)",
"cOrange": "Oranĝa (Ŝato)",
"cRed": "Ruĝa (Nuligo)",
"current_avatar": "Via nuna profilbildo",
"current_profile_banner": "Via nuna profila rubando",
"filtering": "Filtrado",
"filtering_explanation": "Ĉiuj statoj kun tiuj ĉi vortoj silentiĝos, po unu linie",
"follow_import": "Abona enporto",
"follow_import_error": "Eraro enportante abonojn",
"follows_imported": "Abonoj enportiĝis! Traktado daŭros iom.",
"foreground": "Malfono",
"hide_attachments_in_convo": "Kaŝi kunsendaĵojn en interparoloj",
"hide_attachments_in_tl": "Kaŝi kunsendaĵojn en tempolinio",
"import_followers_from_a_csv_file": "Enporti abonojn el CSV-dosiero",
"links": "Ligiloj",
"name": "Nomo",
"name_bio": "Nomo kaj priskribo",
"nsfw_clickthrough": "Ŝalti traklakan kaŝon de konsternaj kunsendaĵoj",
"panelRadius": "Paneloj",
"presets": "Antaŭagordoj",
"profile_background": "Profila fono",
"profile_banner": "Profila rubando",
"radii_help": "Agordi fasadan rondigon de randoj (rastrumere)",
"reply_link_preview": "Ŝalti respond-ligilan antaŭvidon dum ŝvebo",
"set_new_avatar": "Agordi novan profilbildon",
"set_new_profile_background": "Agordi novan profilan fonon",
"set_new_profile_banner": "Agordi novan profilan rubandon",
"settings": "Agordoj",
"stop_gifs": "Movi GIF-bildojn dum ŝvebo",
"streaming": "Ŝalti memfaran fluigon de novaj afiŝoj ĉe la supro de la paĝo",
"text": "Teksto",
"theme": "Etoso",
"theme_help": "Uzu deksesumajn kolorkodojn (#rrvvbb) por adapti vian koloran etoson.",
"tooltipRadius": "Ŝpruchelpiloj/avertoj",
"user_settings": "Uzantaj agordoj"
},
"timeline": {
"collapse": "Maletendi",
"conversation": "Interparolo",
"error_fetching": "Eraro dum ĝisdatigo",
"load_older": "Montri pli malnovajn statojn",
"repeated": "ripetata",
"show_new": "Montri novajn",
"up_to_date": "Ĝisdata"
},
"user_card": {
"block": "Bari",
"blocked": "Barita!",
"follow": "Aboni",
"followees": "Abonatoj",
"followers": "Abonantoj",
"following": "Abonanta!",
"follows_you": "Abonas vin!",
"mute": "Silentigi",
"muted": "Silentigitaj",
"per_day": "tage",
"remote_follow": "Fore aboni",
"statuses": "Statoj"
},
"user_profile": {
"timeline_title": "Uzanta tempolinio"
}
}

100
src/i18n/es.json Normal file
View file

@ -0,0 +1,100 @@
{
"chat": {
"title": "Chat"
},
"finder": {
"error_fetching_user": "Error al buscar usuario",
"find_user": "Encontrar usuario"
},
"general": {
"apply": "Aplicar",
"submit": "Enviar"
},
"login": {
"login": "Identificación",
"logout": "Salir",
"password": "Contraseña",
"placeholder": "p.ej. lain",
"register": "Registrar",
"username": "Usuario"
},
"nav": {
"chat": "Chat Local",
"mentions": "Menciones",
"public_tl": "Línea Temporal Pública",
"timeline": "Línea Temporal",
"twkn": "Toda La Red Conocida"
},
"notifications": {
"followed_you": "empezó a seguirte",
"notifications": "Notificaciones",
"read": "¡Leído!"
},
"post_status": {
"default": "Acabo de aterrizar en L.A.",
"posting": "Publicando"
},
"registration": {
"bio": "Biografía",
"email": "Correo electrónico",
"fullname": "Nombre a mostrar",
"password_confirm": "Confirmación de contraseña",
"registration": "Registro"
},
"settings": {
"attachments": "Adjuntos",
"autoload": "Activar carga automática al llegar al final de la página",
"avatar": "Avatar",
"background": "Segundo plano",
"bio": "Biografía",
"current_avatar": "Tu avatar actual",
"current_profile_banner": "Cabecera actual",
"filtering": "Filtros",
"filtering_explanation": "Todos los estados que contengan estas palabras serán silenciados, una por línea",
"follow_import": "Importar personas que tú sigues",
"follow_import_error": "Error al importal el archivo",
"follows_imported": "¡Importado! Procesarlos llevará tiempo.",
"foreground": "Primer plano",
"hide_attachments_in_convo": "Ocultar adjuntos en las conversaciones",
"hide_attachments_in_tl": "Ocultar adjuntos en la línea temporal",
"import_followers_from_a_csv_file": "Importar personas que tú sigues apartir de un archivo csv",
"links": "Links",
"name": "Nombre",
"name_bio": "Nombre y Biografía",
"nsfw_clickthrough": "Activar el clic para ocultar los adjuntos NSFW",
"presets": "Por defecto",
"profile_background": "Fondo del Perfil",
"profile_banner": "Cabecera del perfil",
"reply_link_preview": "Activar la previsualización del enlace de responder al pasar el ratón por encima",
"set_new_avatar": "Cambiar avatar",
"set_new_profile_background": "Cambiar fondo del perfil",
"set_new_profile_banner": "Cambiar cabecera",
"settings": "Ajustes",
"streaming": "Habilite la transmisión automática de nuevas publicaciones cuando se desplaza hacia la parte superior",
"text": "Texto",
"theme": "Tema",
"theme_help": "Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.",
"user_settings": "Ajustes de Usuario"
},
"timeline": {
"conversation": "Conversación",
"error_fetching": "Error al cargar las actualizaciones",
"load_older": "Cargar actualizaciones anteriores",
"show_new": "Mostrar lo nuevo",
"up_to_date": "Actualizado"
},
"user_card": {
"block": "Bloquear",
"blocked": "¡Bloqueado!",
"follow": "Seguir",
"followees": "Siguiendo",
"followers": "Seguidores",
"following": "¡Siguiendo!",
"follows_you": "¡Te sigue!",
"mute": "Silenciar",
"muted": "Silenciado",
"per_day": "por día",
"remote_follow": "Seguir",
"statuses": "Estados"
}
}

83
src/i18n/et.json Normal file
View file

@ -0,0 +1,83 @@
{
"finder": {
"error_fetching_user": "Viga kasutaja leidmisel",
"find_user": "Otsi kasutajaid"
},
"general": {
"submit": "Postita"
},
"login": {
"login": "Logi sisse",
"logout": "Logi välja",
"password": "Parool",
"placeholder": "nt lain",
"register": "Registreeru",
"username": "Kasutajanimi"
},
"nav": {
"mentions": "Mainimised",
"public_tl": "Avalik Ajajoon",
"timeline": "Ajajoon",
"twkn": "Kogu Teadaolev Võrgustik"
},
"notifications": {
"followed_you": "alustas sinu jälgimist",
"notifications": "Teavitused",
"read": "Loe!"
},
"post_status": {
"default": "Just sõitsin elektrirongiga Tallinnast Pääskülla.",
"posting": "Postitan"
},
"registration": {
"bio": "Bio",
"email": "E-post",
"fullname": "Kuvatav nimi",
"password_confirm": "Parooli kinnitamine",
"registration": "Registreerimine"
},
"settings": {
"attachments": "Manused",
"autoload": "Luba ajajoone automaatne uuendamine kui ajajoon on põhja keritud",
"avatar": "Profiilipilt",
"bio": "Bio",
"current_avatar": "Sinu praegune profiilipilt",
"current_profile_banner": "Praegune profiilibänner",
"filtering": "Sisu filtreerimine",
"filtering_explanation": "Kõiki staatuseid, mis sisaldavad neid sõnu, ei kuvata. Üks sõna reale.",
"hide_attachments_in_convo": "Peida manused vastlustes",
"hide_attachments_in_tl": "Peida manused ajajoonel",
"name": "Nimi",
"name_bio": "Nimi ja Bio",
"nsfw_clickthrough": "Peida tööks-mittesobivad(NSFW) manuste hiireklõpsu taha",
"profile_background": "Profiilitaust",
"profile_banner": "Profiilibänner",
"reply_link_preview": "Luba algpostituse kuvamine vastustes",
"set_new_avatar": "Vali uus profiilipilt",
"set_new_profile_background": "Vali uus profiilitaust",
"set_new_profile_banner": "Vali uus profiilibänner",
"settings": "Sätted",
"theme": "Teema",
"user_settings": "Kasutaja sätted"
},
"timeline": {
"conversation": "Vestlus",
"error_fetching": "Viga uuenduste laadimisel",
"load_older": "Kuva vanemaid staatuseid",
"show_new": "Näita uusi",
"up_to_date": "Uuendatud"
},
"user_card": {
"block": "Blokeeri",
"blocked": "Blokeeritud!",
"follow": "Jälgi",
"followees": "Jälgitavaid",
"followers": "Jälgijaid",
"following": "Jälgin!",
"follows_you": "Jälgib sind!",
"mute": "Vaigista",
"muted": "Vaigistatud",
"per_day": "päevas",
"statuses": "Staatuseid"
}
}

93
src/i18n/fi.json Normal file
View file

@ -0,0 +1,93 @@
{
"finder": {
"error_fetching_user": "Virhe hakiessa käyttäjää",
"find_user": "Hae käyttäjä"
},
"general": {
"apply": "Aseta",
"submit": "Lähetä"
},
"login": {
"login": "Kirjaudu sisään",
"logout": "Kirjaudu ulos",
"password": "Salasana",
"placeholder": "esim. lain",
"register": "Rekisteröidy",
"username": "Käyttäjänimi"
},
"nav": {
"mentions": "Maininnat",
"public_tl": "Julkinen Aikajana",
"timeline": "Aikajana",
"twkn": "Koko Tunnettu Verkosto"
},
"notifications": {
"favorited_you": "tykkäsi viestistäsi",
"followed_you": "seuraa sinua",
"notifications": "Ilmoitukset",
"read": "Lue!",
"repeated_you": "toisti viestisi"
},
"post_status": {
"default": "Tulin juuri saunasta.",
"posting": "Lähetetään"
},
"registration": {
"bio": "Kuvaus",
"email": "Sähköposti",
"fullname": "Koko nimi",
"password_confirm": "Salasanan vahvistaminen",
"registration": "Rekisteröityminen"
},
"settings": {
"attachments": "Liitteet",
"autoload": "Lataa vanhempia viestejä automaattisesti ruudun pohjalla",
"avatar": "Profiilikuva",
"background": "Tausta",
"bio": "Kuvaus",
"current_avatar": "Nykyinen profiilikuvasi",
"current_profile_banner": "Nykyinen julisteesi",
"filtering": "Suodatus",
"filtering_explanation": "Kaikki viestit, jotka sisältävät näitä sanoja, suodatetaan. Yksi sana per rivi.",
"foreground": "Korostus",
"hide_attachments_in_convo": "Piilota liitteet keskusteluissa",
"hide_attachments_in_tl": "Piilota liitteet aikajanalla",
"links": "Linkit",
"name": "Nimi",
"name_bio": "Nimi ja kuvaus",
"nsfw_clickthrough": "Piilota NSFW liitteet klikkauksen taakse.",
"presets": "Valmiit teemat",
"profile_background": "Taustakuva",
"profile_banner": "Juliste",
"reply_link_preview": "Keskusteluiden vastauslinkkien esikatselu",
"set_new_avatar": "Aseta uusi profiilikuva",
"set_new_profile_background": "Aseta uusi taustakuva",
"set_new_profile_banner": "Aseta uusi juliste",
"settings": "Asetukset",
"streaming": "Näytä uudet viestit automaattisesti ollessasi ruudun huipulla",
"text": "Teksti",
"theme": "Teema",
"theme_help": "Käytä heksadesimaalivärejä muokataksesi väriteemaasi.",
"user_settings": "Käyttäjän asetukset"
},
"timeline": {
"collapse": "Sulje",
"conversation": "Keskustelu",
"error_fetching": "Virhe ladatessa viestejä",
"load_older": "Lataa vanhempia viestejä",
"repeated": "toisti",
"show_new": "Näytä uudet",
"up_to_date": "Ajantasalla"
},
"user_card": {
"follow": "Seuraa",
"followees": "Seuraa",
"followers": "Seuraajat",
"following": "Seuraat!",
"follows_you": "Seuraa sinua!",
"mute": "Hiljennä",
"muted": "Hiljennetty",
"per_day": "päivässä",
"statuses": "Viestit"
}
}

199
src/i18n/fr.json Normal file
View file

@ -0,0 +1,199 @@
{
"chat": {
"title": "Chat"
},
"features_panel": {
"chat": "Chat",
"gopher": "Gopher",
"media_proxy": "Proxy média",
"scope_options": "Options de visibilité",
"text_limit": "Limite du texte",
"title": "Caractéristiques",
"who_to_follow": "Qui s'abonner"
},
"finder": {
"error_fetching_user": "Erreur lors de la recherche de l'utilisateur",
"find_user": "Chercher un utilisateur"
},
"general": {
"apply": "Appliquer",
"submit": "Envoyer"
},
"login": {
"login": "Connexion",
"logout": "Déconnexion",
"password": "Mot de passe",
"placeholder": "p.e. lain",
"register": "S'inscrire",
"username": "Identifiant"
},
"nav": {
"chat": "Chat local",
"friend_requests": "Demandes d'ami",
"mentions": "Notifications",
"public_tl": "Statuts locaux",
"timeline": "Journal",
"twkn": "Le réseau connu"
},
"notifications": {
"broken_favorite": "Chargement d'un message inconnu ...",
"favorited_you": "a aimé votre statut",
"followed_you": "a commencé à vous suivre",
"load_older": "Charger les notifications précédentes",
"notifications": "Notifications",
"read": "Lu !",
"repeated_you": "a partagé votre statut"
},
"post_status": {
"account_not_locked_warning": "Votre compte n'est pas {0}. N'importe qui peut vous suivre pour voir vos billets en Abonné·e·s uniquement.",
"account_not_locked_warning_link": "verrouillé",
"attachments_sensitive": "Marquer le média comme sensible",
"content_type": {
"plain_text": "Texte brut"
},
"content_warning": "Sujet (optionnel)",
"default": "Écrivez ici votre prochain statut.",
"direct_warning": "Ce message sera visible à toutes les personnes mentionnées.",
"posting": "Envoi en cours",
"scope": {
"direct": "Direct - N'envoyer qu'aux personnes mentionnées",
"private": "Abonné·e·s uniquement - Seul·e·s vos abonné·e·s verront vos billets",
"public": "Publique - Afficher dans les fils publics",
"unlisted": "Non-Listé - Ne pas afficher dans les fils publics"
}
},
"registration": {
"bio": "Biographie",
"email": "Adresse email",
"fullname": "Pseudonyme",
"password_confirm": "Confirmation du mot de passe",
"registration": "Inscription",
"token": "Jeton d'invitation"
},
"settings": {
"attachmentRadius": "Pièces jointes",
"attachments": "Pièces jointes",
"autoload": "Charger la suite automatiquement une fois le bas de la page atteint",
"avatar": "Avatar",
"avatarAltRadius": "Avatars (Notifications)",
"avatarRadius": "Avatars",
"background": "Arrière-plan",
"bio": "Biographie",
"btnRadius": "Boutons",
"cBlue": "Bleu (Répondre, suivre)",
"cGreen": "Vert (Partager)",
"cOrange": "Orange (Aimer)",
"cRed": "Rouge (Annuler)",
"change_password": "Changez votre mot de passe",
"change_password_error": "Il y a eu un problème pour changer votre mot de passe.",
"changed_password": "Mot de passe changé avec succès!",
"collapse_subject": "Réduire les messages avec des sujets",
"confirm_new_password": "Confirmation du nouveau mot de passe",
"current_avatar": "Avatar actuel",
"current_password": "Mot de passe actuel",
"current_profile_banner": "Bannière de profil actuelle",
"data_import_export_tab": "Import / Export des Données",
"default_vis": "Portée de visibilité par défaut",
"delete_account": "Supprimer le compte",
"delete_account_description": "Supprimer définitivement votre compte et tous vos statuts.",
"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.",
"delete_account_instructions": "Indiquez votre mot de passe ci-dessous pour confirmer la suppression de votre compte.",
"export_theme": "Enregistrer le thème",
"filtering": "Filtre",
"filtering_explanation": "Tous les statuts contenant ces mots seront masqués. Un mot par ligne.",
"follow_export": "Exporter les abonnements",
"follow_export_button": "Exporter les abonnements en csv",
"follow_export_processing": "Exportation en cours…",
"follow_import": "Importer des abonnements",
"follow_import_error": "Erreur lors de l'importation des abonnements.",
"follows_imported": "Abonnements importés ! Le traitement peut prendre un moment.",
"foreground": "Premier plan",
"general": "Général",
"hide_attachments_in_convo": "Masquer les pièces jointes dans les conversations",
"hide_attachments_in_tl": "Masquer les pièces jointes dans le journal",
"import_followers_from_a_csv_file": "Importer des abonnements depuis un fichier csv",
"import_theme": "Charger le thème",
"inputRadius": "Champs de texte",
"instance_default": "(default: {value})",
"interfaceLanguage": "Langue de l'interface",
"invalid_theme_imported": "Le fichier sélectionné n'est pas un thème Pleroma pris en charge. Aucun changement n'a été apporté à votre thème.",
"limited_availability": "Non disponible dans votre navigateur",
"links": "Liens",
"lock_account_description": "Limitez votre compte aux abonnés acceptés uniquement",
"loop_video": "Vidéos en boucle",
"loop_video_silent_only": "Boucle uniquement les vidéos sans le son (les «gifs» de Mastodon)",
"name": "Nom",
"name_bio": "Nom & Bio",
"new_password": "Nouveau mot de passe",
"no_rich_text_description": "Ne formatez pas le texte",
"notification_visibility": "Types de notifications à afficher",
"notification_visibility_follows": "Abonnements",
"notification_visibility_likes": "Jaime",
"notification_visibility_mentions": "Mentionnés",
"notification_visibility_repeats": "Partages",
"nsfw_clickthrough": "Masquer les images marquées comme contenu adulte ou sensible",
"panelRadius": "Fenêtres",
"pause_on_unfocused": "Suspendre le streaming lorsque l'onglet n'est pas centré",
"presets": "Thèmes prédéfinis",
"profile_background": "Image de fond",
"profile_banner": "Bannière de profil",
"profile_tab": "Profil",
"radii_help": "Vous pouvez ici choisir le niveau d'arrondi des angles de l'interface (en pixels)",
"replies_in_timeline": "Réponses au journal",
"reply_link_preview": "Afficher un aperçu lors du survol de liens vers une réponse",
"reply_visibility_all": "Montrer toutes les réponses",
"reply_visibility_following": "Afficher uniquement les réponses adressées à moi ou aux utilisateurs que je suis",
"reply_visibility_self": "Afficher uniquement les réponses adressées à moi",
"saving_err": "Erreur lors de l'enregistrement des paramètres",
"saving_ok": "Paramètres enregistrés",
"security_tab": "Sécurité",
"set_new_avatar": "Changer d'avatar",
"set_new_profile_background": "Changer d'image de fond",
"set_new_profile_banner": "Changer de bannière",
"settings": "Paramètres",
"stop_gifs": "N'animer les GIFS que lors du survol du curseur de la souris",
"streaming": "Charger automatiquement les nouveaux statuts lorsque vous êtes au haut de la page",
"text": "Texte",
"theme": "Thème",
"theme_help": "Spécifiez des codes couleur hexadécimaux (#aabbcc) pour personnaliser les couleurs du thème",
"tooltipRadius": "Info-bulles/alertes ",
"user_settings": "Paramètres utilisateur",
"values": {
"false": "non",
"true": "oui"
}
},
"timeline": {
"collapse": "Fermer",
"conversation": "Conversation",
"error_fetching": "Erreur en cherchant les mises à jour",
"load_older": "Afficher plus",
"no_retweet_hint": "Le message est marqué en abonnés-seulement ou direct et ne peut pas être répété",
"repeated": "a partagé",
"show_new": "Afficher plus",
"up_to_date": "À jour"
},
"user_card": {
"approve": "Accepter",
"block": "Bloquer",
"blocked": "Bloqué",
"deny": "Rejeter",
"follow": "Suivre",
"followees": "Suivis",
"followers": "Vous suivent",
"following": "Suivi !",
"follows_you": "Vous suit !",
"mute": "Masquer",
"muted": "Masqué",
"per_day": "par jour",
"remote_follow": "Suivre d'une autre instance",
"statuses": "Statuts"
},
"user_profile": {
"timeline_title": "Journal de l'utilisateur"
},
"who_to_follow": {
"more": "Plus",
"who_to_follow": "Qui s'abonner"
}
}

190
src/i18n/he.json Normal file
View file

@ -0,0 +1,190 @@
{
"chat": {
"title": "צ'אט"
},
"features_panel": {
"chat": "צ'אט",
"gopher": "גופר",
"media_proxy": "מדיה פרוקסי",
"scope_options": "אפשרויות טווח",
"text_limit": "מגבלת טקסט",
"title": "מאפיינים",
"who_to_follow": "אחרי מי לעקוב"
},
"finder": {
"error_fetching_user": "שגיאה במציאת משתמש",
"find_user": "מציאת משתמש"
},
"general": {
"apply": "החל",
"submit": "שלח"
},
"login": {
"login": "התחבר",
"logout": "התנתק",
"password": "סיסמה",
"placeholder": "למשל lain",
"register": "הירשם",
"username": "שם המשתמש"
},
"nav": {
"chat": "צ'אט מקומי",
"friend_requests": "בקשות עקיבה",
"mentions": "אזכורים",
"public_tl": "ציר הזמן הציבורי",
"timeline": "ציר הזמן",
"twkn": "כל הרשת הידועה"
},
"notifications": {
"broken_favorite": "סטאטוס לא ידוע, מחפש...",
"favorited_you": "אהב את הסטטוס שלך",
"followed_you": "עקב אחריך!",
"load_older": "טען התראות ישנות",
"notifications": "התראות",
"read": "קרא!",
"repeated_you": "חזר על הסטטוס שלך"
},
"post_status": {
"account_not_locked_warning": "המשתמש שלך אינו {0}. כל אחד יכול לעקוב אחריך ולראות את ההודעות לעוקבים-בלבד שלך.",
"account_not_locked_warning_link": "נעול",
"attachments_sensitive": "סמן מסמכים מצורפים כלא בטוחים לצפייה",
"content_type": {
"plain_text": "טקסט פשוט"
},
"content_warning": "נושא (נתון לבחירה)",
"default": "הרגע נחת ב-ל.א.",
"direct_warning": "הודעה זו תהיה זמינה רק לאנשים המוזכרים.",
"posting": "מפרסם",
"scope": {
"direct": "ישיר - שלח לאנשים המוזכרים בלבד",
"private": "עוקבים-בלבד - שלח לעוקבים בלבד",
"public": "ציבורי - שלח לציר הזמן הציבורי",
"unlisted": "מחוץ לרשימה - אל תשלח לציר הזמן הציבורי"
}
},
"registration": {
"bio": "אודות",
"email": "אימייל",
"fullname": "שם תצוגה",
"password_confirm": "אישור סיסמה",
"registration": "הרשמה",
"token": "טוקן הזמנה"
},
"settings": {
"attachmentRadius": "צירופים",
"attachments": "צירופים",
"autoload": "החל טעינה אוטומטית בגלילה לתחתית הדף",
"avatar": "תמונת פרופיל",
"avatarAltRadius": "תמונות פרופיל (התראות)",
"avatarRadius": "תמונות פרופיל",
"background": "רקע",
"bio": "אודות",
"btnRadius": "כפתורים",
"cBlue": "כחול (תגובה, עקיבה)",
"cGreen": "ירוק (חזרה)",
"cOrange": "כתום (לייק)",
"cRed": "אדום (ביטול)",
"change_password": "שנה סיסמה",
"change_password_error": "הייתה בעיה בשינוי סיסמתך.",
"changed_password": "סיסמה שונתה בהצלחה!",
"collapse_subject": "מזער הודעות עם נושאים",
"confirm_new_password": "אשר סיסמה",
"current_avatar": "תמונת הפרופיל הנוכחית שלך",
"current_password": "סיסמה נוכחית",
"current_profile_banner": "כרזת הפרופיל הנוכחית שלך",
"data_import_export_tab": "ייבוא או ייצוא מידע",
"default_vis": "ברירת מחדל לטווח הנראות",
"delete_account": "מחק משתמש",
"delete_account_description": "מחק לצמיתות את המשתמש שלך ואת כל הודעותיך.",
"delete_account_error": "הייתה בעיה במחיקת המשתמש. אם זה ממשיך, אנא עדכן את מנהל השרת שלך.",
"delete_account_instructions": "הכנס את סיסמתך בקלט למטה על מנת לאשר מחיקת משתמש.",
"export_theme": "שמור ערכים",
"filtering": "סינון",
"filtering_explanation": "כל הסטטוסים הכוללים את המילים הללו יושתקו, אחד לשורה",
"follow_export": "יצוא עקיבות",
"follow_export_button": "ייצא את הנעקבים שלך לקובץ csv",
"follow_export_processing": "טוען. בקרוב תתבקש להוריד את הקובץ את הקובץ שלך",
"follow_import": "יבוא עקיבות",
"follow_import_error": "שגיאה בייבוא נעקבים.",
"follows_imported": "נעקבים יובאו! ייקח זמן מה לעבד אותם.",
"foreground": "חזית",
"hide_attachments_in_convo": "החבא צירופים בשיחות",
"hide_attachments_in_tl": "החבא צירופים בציר הזמן",
"import_followers_from_a_csv_file": "ייבא את הנעקבים שלך מקובץ csv",
"import_theme": "טען ערכים",
"inputRadius": "שדות קלט",
"interfaceLanguage": "שפת הממשק",
"invalid_theme_imported": "הקובץ הנבחר אינו תמה הנתמכת ע\"י פלרומה. שום שינויים לא נעשו לתמה שלך.",
"limited_availability": "לא זמין בדפדפן שלך",
"links": "לינקים",
"lock_account_description": "הגבל את המשתמש לעוקבים מאושרים בלבד",
"loop_video": "נגן סרטונים ללא הפסקה",
"loop_video_silent_only": "נגן רק סרטונים חסרי קול ללא הפסקה",
"name": "שם",
"name_bio": "שם ואודות",
"new_password": "סיסמה חדשה",
"notification_visibility": "סוג ההתראות שתרצו לראות",
"notification_visibility_follows": "עקיבות",
"notification_visibility_likes": "לייקים",
"notification_visibility_mentions": "אזכורים",
"notification_visibility_repeats": "חזרות",
"nsfw_clickthrough": "החל החבאת צירופים לא בטוחים לצפיה בעת עבודה בעזרת לחיצת עכבר",
"panelRadius": "פאנלים",
"pause_on_unfocused": "השהה זרימת הודעות כשהחלון לא בפוקוס",
"presets": "ערכים קבועים מראש",
"profile_background": "רקע הפרופיל",
"profile_banner": "כרזת הפרופיל",
"profile_tab": "פרופיל",
"radii_help": "קבע מראש עיגול פינות לממשק (בפיקסלים)",
"replies_in_timeline": "תגובות בציר הזמן",
"reply_link_preview": "החל תצוגה מקדימה של לינק-תגובה בעת ריחוף עם העכבר",
"reply_visibility_all": "הראה את כל התגובות",
"reply_visibility_following": "הראה תגובות שמופנות אליי או לעקובים שלי בלבד",
"reply_visibility_self": "הראה תגובות שמופנות אליי בלבד",
"security_tab": "ביטחון",
"set_new_avatar": "קבע תמונת פרופיל חדשה",
"set_new_profile_background": "קבע רקע פרופיל חדש",
"set_new_profile_banner": "קבע כרזת פרופיל חדשה",
"settings": "הגדרות",
"stop_gifs": "נגן-בעת-ריחוף GIFs",
"streaming": "החל זרימת הודעות אוטומטית בעת גלילה למעלה הדף",
"text": "טקסט",
"theme": "תמה",
"theme_help": "השתמש בקודי צבע הקס (#אדום-אדום-ירוק-ירוק-כחול-כחול) על מנת להתאים אישית את תמת הצבע שלך.",
"tooltipRadius": "טולטיפ \\ התראות",
"user_settings": "הגדרות משתמש"
},
"timeline": {
"collapse": "מוטט",
"conversation": "שיחה",
"error_fetching": "שגיאה בהבאת הודעות",
"load_older": "טען סטטוסים חדשים",
"no_retweet_hint": "ההודעה מסומנת כ\"לעוקבים-בלבד\" ולא ניתן לחזור עליה",
"repeated": "חזר",
"show_new": "הראה חדש",
"up_to_date": "עדכני"
},
"user_card": {
"approve": "אשר",
"block": "חסימה",
"blocked": "חסום!",
"deny": "דחה",
"follow": "עקוב",
"followees": "נעקבים",
"followers": "עוקבים",
"following": "עוקב!",
"follows_you": "עוקב אחריך!",
"mute": "השתק",
"muted": "מושתק",
"per_day": "ליום",
"remote_follow": "עקיבה מרחוק",
"statuses": "סטטוסים"
},
"user_profile": {
"timeline_title": "ציר זמן המשתמש"
},
"who_to_follow": {
"more": "עוד",
"who_to_follow": "אחרי מי לעקוב"
}
}

83
src/i18n/hu.json Normal file
View file

@ -0,0 +1,83 @@
{
"finder": {
"error_fetching_user": "Hiba felhasználó beszerzésével",
"find_user": "Felhasználó keresése"
},
"general": {
"submit": "Elküld"
},
"login": {
"login": "Bejelentkezés",
"logout": "Kijelentkezés",
"password": "Jelszó",
"placeholder": "e.g. lain",
"register": "Feliratkozás",
"username": "Felhasználó név"
},
"nav": {
"mentions": "Említéseim",
"public_tl": "Publikus Idővonal",
"timeline": "Idővonal",
"twkn": "Az Egész Ismert Hálózat"
},
"notifications": {
"followed_you": "követ téged",
"notifications": "Értesítések",
"read": "Olvasva!"
},
"post_status": {
"default": "Most érkeztem L.A.-be",
"posting": "Küldés folyamatban"
},
"registration": {
"bio": "Bio",
"email": "Email",
"fullname": "Teljes név",
"password_confirm": "Jelszó megerősítése",
"registration": "Feliratkozás"
},
"settings": {
"attachments": "Csatolmányok",
"autoload": "Autoatikus betöltés engedélyezése lap aljára görgetéskor",
"avatar": "Avatár",
"bio": "Bio",
"current_avatar": "Jelenlegi avatár",
"current_profile_banner": "Jelenlegi profil banner",
"filtering": "Szűrés",
"filtering_explanation": "Minden tartalom mely ezen szavakat tartalmazza némítva lesz, soronként egy",
"hide_attachments_in_convo": "Csatolmányok elrejtése a társalgásokban",
"hide_attachments_in_tl": "Csatolmányok elrejtése az idővonalon",
"name": "Név",
"name_bio": "Név és Bio",
"nsfw_clickthrough": "NSFW átkattintási tartalom elrejtésének engedélyezése",
"profile_background": "Profil háttérkép",
"profile_banner": "Profil Banner",
"reply_link_preview": "Válasz-link előzetes mutatása egér rátételkor",
"set_new_avatar": "Új avatár",
"set_new_profile_background": "Új profil háttér beállítása",
"set_new_profile_banner": "Új profil banner",
"settings": "Beállítások",
"theme": "Téma",
"user_settings": "Felhasználói beállítások"
},
"timeline": {
"conversation": "Társalgás",
"error_fetching": "Hiba a frissítések beszerzésénél",
"load_older": "Régebbi állapotok betöltése",
"show_new": "Újak mutatása",
"up_to_date": "Naprakész"
},
"user_card": {
"block": "Letilt",
"blocked": "Letiltva!",
"follow": "Követ",
"followees": "Követettek",
"followers": "Követők",
"following": "Követve!",
"follows_you": "Követ téged!",
"mute": "Némít",
"muted": "Némított",
"per_day": "naponta",
"statuses": "Állapotok"
}
}

57
src/i18n/it.json Normal file
View file

@ -0,0 +1,57 @@
{
"general": {
"submit": "Invia"
},
"nav": {
"mentions": "Menzioni",
"public_tl": "Sequenza temporale pubblica",
"timeline": "Sequenza temporale",
"twkn": "L'intiera rete conosciuta"
},
"notifications": {
"followed_you": "ti ha seguito",
"notifications": "Notifiche",
"read": "Leggi!"
},
"settings": {
"attachments": "Allegati",
"autoload": "Abilita caricamento automatico quando si raggiunge il fondo schermo",
"avatar": "Avatar",
"bio": "Introduzione",
"current_avatar": "Il tuo attuale avatar",
"current_profile_banner": "Sfondo attuale",
"filtering": "Filtri",
"filtering_explanation": "Filtra via le notifiche che contengono le seguenti parole (inserisci rigo per rigo le parole di innesco)",
"hide_attachments_in_convo": "Nascondi gli allegati presenti nelle conversazioni",
"hide_attachments_in_tl": "Nascondi gli allegati presenti nella sequenza temporale",
"name": "Nome",
"name_bio": "Nome & Introduzione",
"nsfw_clickthrough": "Abilita la trasparenza degli allegati NSFW",
"profile_background": "Sfondo della tua pagina",
"profile_banner": "Sfondo del tuo profilo",
"reply_link_preview": "Ability il reply-link preview al passaggio del mouse",
"set_new_avatar": "Scegli un nuovo avatar",
"set_new_profile_background": "Scegli un nuovo sfondo per la tua pagina",
"set_new_profile_banner": "Scegli un nuovo sfondo per il tuo profilo",
"settings": "Settaggi",
"theme": "Tema",
"user_settings": "Configurazione dell'utente"
},
"timeline": {
"error_fetching": "Errori nel prelievo aggiornamenti",
"load_older": "Carica messaggi più vecchi",
"show_new": "Mostra nuovi",
"up_to_date": "Aggiornato"
},
"user_card": {
"follow": "Segui",
"followees": "Chi stai seguendo",
"followers": "Chi ti segue",
"following": "Lo stai seguendo!",
"follows_you": "Ti segue!",
"mute": "Ammutolisci",
"muted": "Ammutoliti",
"per_day": "al giorno",
"statuses": "Messaggi"
}
}

199
src/i18n/ja.json Normal file
View file

@ -0,0 +1,199 @@
{
"chat": {
"title": "チャット"
},
"features_panel": {
"chat": "チャット",
"gopher": "Gopher",
"media_proxy": "メディアプロクシ",
"scope_options": "こうかいはんいせんたく",
"text_limit": "もじのかず",
"title": "ゆうこうなきのう",
"who_to_follow": "おすすめユーザー"
},
"finder": {
"error_fetching_user": "ユーザーけんさくがエラーになりました。",
"find_user": "ユーザーをさがす"
},
"general": {
"apply": "てきよう",
"submit": "そうしん"
},
"login": {
"login": "ログイン",
"logout": "ログアウト",
"password": "パスワード",
"placeholder": "れい: lain",
"register": "はじめる",
"username": "ユーザーめい"
},
"nav": {
"chat": "ローカルチャット",
"friend_requests": "フォローリクエスト",
"mentions": "メンション",
"public_tl": "パブリックタイムライン",
"timeline": "タイムライン",
"twkn": "つながっているすべてのネットワーク"
},
"notifications": {
"broken_favorite": "ステータスがみつかりません。さがしています...",
"favorited_you": "あなたのステータスがおきにいりされました",
"followed_you": "フォローされました",
"load_older": "ふるいつうちをみる",
"notifications": "つうち",
"read": "よんだ!",
"repeated_you": "あなたのステータスがリピートされました"
},
"post_status": {
"account_not_locked_warning": "あなたのアカウントは {0} ではありません。あなたをフォローすれば、だれでも、フォロワーげんていのステータスをよむことができます。",
"account_not_locked_warning_link": "ロックされたアカウント",
"attachments_sensitive": "ファイルをNSFWにする",
"content_type": {
"plain_text": "プレーンテキスト"
},
"content_warning": "せつめい (かかなくてもよい)",
"default": "はねだくうこうに、つきました。",
"direct_warning": "このステータスは、メンションされたユーザーだけが、よむことができます。",
"posting": "とうこう",
"scope": {
"direct": "ダイレクト: メンションされたユーザーのみにとどきます。",
"private": "フォロワーげんてい: フォロワーのみにとどきます。",
"public": "パブリック: パブリックタイムラインにとどきます。",
"unlisted": "アンリステッド: パブリックタイムラインにとどきません。"
}
},
"registration": {
"bio": "プロフィール",
"email": "Eメール",
"fullname": "スクリーンネーム",
"password_confirm": "パスワードのかくにん",
"registration": "はじめる",
"token": "しょうたいトークン"
},
"settings": {
"attachmentRadius": "ファイル",
"attachments": "ファイル",
"autoload": "したにスクロールしたとき、じどうてきによみこむ。",
"avatar": "アバター",
"avatarAltRadius": "つうちのアバター",
"avatarRadius": "アバター",
"background": "バックグラウンド",
"bio": "プロフィール",
"btnRadius": "ボタン",
"cBlue": "リプライとフォロー",
"cGreen": "リピート",
"cOrange": "おきにいり",
"cRed": "キャンセル",
"change_password": "パスワードをかえる",
"change_password_error": "パスワードをかえることが、できなかったかもしれません。",
"changed_password": "パスワードが、かわりました!",
"collapse_subject": "せつめいのあるとうこうをたたむ",
"confirm_new_password": "あたらしいパスワードのかくにん",
"current_avatar": "いまのアバター",
"current_password": "いまのパスワード",
"current_profile_banner": "いまのプロフィールバナー",
"data_import_export_tab": "インポートとエクスポート",
"default_vis": "デフォルトのこうかいはんい",
"delete_account": "アカウントをけす",
"delete_account_description": "あなたのアカウントとメッセージが、きえます。",
"delete_account_error": "アカウントをけすことが、できなかったかもしれません。インスタンスのかんりしゃに、れんらくしてください。",
"delete_account_instructions": "ほんとうにアカウントをけしてもいいなら、パスワードをかいてください。",
"export_theme": "セーブ",
"filtering": "フィルタリング",
"filtering_explanation": "これらのことばをふくむすべてのものがミュートされます。1ぎょうに1つのことばをかいてください。",
"follow_export": "フォローのエクスポート",
"follow_export_button": "エクスポート",
"follow_export_processing": "おまちください。まもなくファイルをダウンロードできます。",
"follow_import": "フォローインポート",
"follow_import_error": "フォローのインポートがエラーになりました。",
"follows_imported": "フォローがインポートされました! すこしじかんがかかるかもしれません。",
"foreground": "フォアグラウンド",
"general": "ぜんぱん",
"hide_attachments_in_convo": "スレッドのファイルをかくす",
"hide_attachments_in_tl": "タイムラインのファイルをかくす",
"import_followers_from_a_csv_file": "CSVファイルからフォローをインポートする",
"import_theme": "ロード",
"inputRadius": "インプットフィールド",
"instance_default": "(デフォルト: {value})",
"interfaceLanguage": "インターフェースのことば",
"invalid_theme_imported": "このファイルはPleromaのテーマではありません。テーマはへんこうされませんでした。",
"limited_availability": "あなたのブラウザではできません",
"links": "リンク",
"lock_account_description": "あなたがみとめたひとだけ、あなたのアカウントをフォローできます",
"loop_video": "ビデオをくりかえす",
"loop_video_silent_only": "おとのないビデオだけくりかえす",
"name": "なまえ",
"name_bio": "なまえとプロフィール",
"new_password": "あたらしいパスワード",
"notification_visibility": "ひょうじするつうち",
"notification_visibility_follows": "フォロー",
"notification_visibility_likes": "おきにいり",
"notification_visibility_mentions": "メンション",
"notification_visibility_repeats": "リピート",
"no_rich_text_description": "リッチテキストをつかわない",
"nsfw_clickthrough": "NSFWなファイルをかくす",
"panelRadius": "パネル",
"pause_on_unfocused": "タブにフォーカスがないときストリーミングをとめる",
"presets": "プリセット",
"profile_background": "プロフィールのバックグラウンド",
"profile_banner": "プロフィールバナー",
"profile_tab": "プロフィール",
"radii_help": "インターフェースのまるさをせっていする。",
"replies_in_timeline": "タイムラインのリプライ",
"reply_link_preview": "カーソルをかさねたとき、リプライのプレビューをみる",
"reply_visibility_all": "すべてのリプライをみる",
"reply_visibility_following": "わたしにあてられたリプライと、フォローしているひとからのリプライをみる",
"reply_visibility_self": "わたしにあてられたリプライをみる",
"saving_err": "せっていをセーブできませんでした",
"saving_ok": "せっていをセーブしました",
"security_tab": "セキュリティ",
"set_new_avatar": "あたらしいアバターをせっていする",
"set_new_profile_background": "あたらしいプロフィールのバックグラウンドをせっていする",
"set_new_profile_banner": "あたらしいプロフィールバナーを設定する",
"settings": "せってい",
"stop_gifs": "カーソルをかさねたとき、GIFをうごかす",
"streaming": "うえまでスクロールしたとき、じどうてきにストリーミングする",
"text": "もじ",
"theme": "テーマ",
"theme_help": "カラーテーマをカスタマイズできます",
"tooltipRadius": "ツールチップとアラート",
"user_settings": "ユーザーせってい",
"values": {
"false": "いいえ",
"true": "はい"
}
},
"timeline": {
"collapse": "たたむ",
"conversation": "スレッド",
"error_fetching": "よみこみがエラーになりました",
"load_older": "ふるいステータス",
"no_retweet_hint": "とうこうを「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります",
"repeated": "リピート",
"show_new": "よみこみ",
"up_to_date": "さいしん"
},
"user_card": {
"approve": "うけいれ",
"block": "ブロック",
"blocked": "ブロックしています!",
"deny": "おことわり",
"follow": "フォロー",
"followees": "フォロー",
"followers": "フォロワー",
"following": "フォローしています!",
"follows_you": "フォローされました!",
"mute": "ミュート",
"muted": "ミュートしています!",
"per_day": "/日",
"remote_follow": "リモートフォロー",
"statuses": "ステータス"
},
"user_profile": {
"timeline_title": "ユーザータイムライン"
},
"who_to_follow": {
"more": "くわしく",
"who_to_follow": "おすすめユーザー"
}
}

File diff suppressed because it is too large Load diff

199
src/i18n/nb.json Normal file
View file

@ -0,0 +1,199 @@
{
"chat": {
"title": "Nettprat"
},
"features_panel": {
"chat": "Nettprat",
"gopher": "Gopher",
"media_proxy": "Media proxy",
"scope_options": "Velg mottakere",
"text_limit": "Tekst-grense",
"title": "Egenskaper",
"who_to_follow": "Hvem å følge"
},
"finder": {
"error_fetching_user": "Feil ved henting av bruker",
"find_user": "Finn bruker"
},
"general": {
"apply": "Bruk",
"submit": "Send"
},
"login": {
"login": "Logg inn",
"logout": "Logg ut",
"password": "Passord",
"placeholder": "f. eks lain",
"register": "Registrer",
"username": "Brukernavn"
},
"nav": {
"chat": "Lokal nettprat",
"friend_requests": "Følgeforespørsler",
"mentions": "Nevnt",
"public_tl": "Offentlig Tidslinje",
"timeline": "Tidslinje",
"twkn": "Det hele kjente nettverket"
},
"notifications": {
"broken_favorite": "Ukjent status, leter etter den...",
"favorited_you": "likte din status",
"followed_you": "fulgte deg",
"load_older": "Last eldre varsler",
"notifications": "Varslinger",
"read": "Les!",
"repeated_you": "Gjentok din status"
},
"post_status": {
"account_not_locked_warning": "Kontoen din er ikke {0}. Hvem som helst kan følge deg for å se dine statuser til følgere",
"account_not_locked_warning_link": "låst",
"attachments_sensitive": "Merk vedlegg som sensitive",
"content_type": {
"plain_text": "Klar tekst"
},
"content_warning": "Tema (valgfritt)",
"default": "Landet akkurat i L.A.",
"direct_warning": "Denne statusen vil kun bli sett av nevnte brukere",
"posting": "Publiserer",
"scope": {
"direct": "Direkte, publiser bare til nevnte brukere",
"private": "Bare følgere, publiser bare til brukere som følger deg",
"public": "Offentlig, publiser til offentlige tidslinjer",
"unlisted": "Uoppført, ikke publiser til offentlige tidslinjer"
}
},
"registration": {
"bio": "Biografi",
"email": "Epost-adresse",
"fullname": "Visningsnavn",
"password_confirm": "Bekreft passord",
"registration": "Registrering",
"token": "Invitasjons-bevis"
},
"settings": {
"attachmentRadius": "Vedlegg",
"attachments": "Vedlegg",
"autoload": "Automatisk lasting når du blar ned til bunnen",
"avatar": "Profilbilde",
"avatarAltRadius": "Profilbilde (Varslinger)",
"avatarRadius": "Profilbilde",
"background": "Bakgrunn",
"bio": "Biografi",
"btnRadius": "Knapper",
"cBlue": "Blå (Svar, følg)",
"cGreen": "Grønn (Gjenta)",
"cOrange": "Oransje (Lik)",
"cRed": "Rød (Avbryt)",
"change_password": "Endre passord",
"change_password_error": "Feil ved endring av passord",
"changed_password": "Passord endret",
"collapse_subject": "Sammenfold statuser med tema",
"confirm_new_password": "Bekreft nytt passord",
"current_avatar": "Ditt nåværende profilbilde",
"current_password": "Nåværende passord",
"current_profile_banner": "Din nåværende profil-banner",
"data_import_export_tab": "Data import / eksport",
"default_vis": "Standard visnings-omfang",
"delete_account": "Slett konto",
"delete_account_description": "Slett din konto og alle dine statuser",
"delete_account_error": "Det oppsto et problem ved sletting av kontoen din, hvis dette problemet forblir kontakt din administrator",
"delete_account_instructions": "Skriv inn ditt passord i feltet nedenfor for å bekrefte sletting av konto",
"export_theme": "Lagre tema",
"filtering": "Filtrering",
"filtering_explanation": "Alle statuser som inneholder disse ordene vil bli dempet, en kombinasjon av tegn per linje",
"follow_export": "Eksporter følginger",
"follow_export_button": "Eksporter følgingene dine til en .csv fil",
"follow_export_processing": "Jobber, du vil snart bli spurt om å laste ned filen din.",
"follow_import": "Importer følginger",
"follow_import_error": "Feil ved importering av følginger.",
"follows_imported": "Følginger importert! Behandling vil ta litt tid.",
"foreground": "Forgrunn",
"general": "Generell",
"hide_attachments_in_convo": "Gjem vedlegg i samtaler",
"hide_attachments_in_tl": "Gjem vedlegg på tidslinje",
"import_followers_from_a_csv_file": "Importer følginger fra en csv fil",
"import_theme": "Last tema",
"inputRadius": "Input felt",
"instance_default": "(standard: {value})",
"interfaceLanguage": "Grensesnitt-språk",
"invalid_theme_imported": "Den valgte filen er ikke ett støttet Pleroma-tema, ingen endringer til ditt tema ble gjort",
"limited_availability": "Ikke tilgjengelig i din nettleser",
"links": "Linker",
"lock_account_description": "Begrens din konto til bare godkjente følgere",
"loop_video": "Gjenta videoer",
"loop_video_silent_only": "Gjenta bare videoer uten lyd, (for eksempel Mastodon sine \"gifs\")",
"name": "Navn",
"name_bio": "Navn & Biografi",
"new_password": "Nytt passord",
"notification_visibility": "Typer varsler som skal vises",
"notification_visibility_follows": "Følginger",
"notification_visibility_likes": "Likes",
"notification_visibility_mentions": "Nevnt",
"notification_visibility_repeats": "Gjentakelser",
"no_rich_text_description": "Fjern all formatering fra statuser",
"nsfw_clickthrough": "Krev trykk for å vise statuser som kan være upassende",
"panelRadius": "Panel",
"pause_on_unfocused": "Stopp henting av poster når vinduet ikke er i fokus",
"presets": "Forhåndsdefinerte tema",
"profile_background": "Profil-bakgrunn",
"profile_banner": "Profil-banner",
"profile_tab": "Profil",
"radii_help": "Bestem hvor runde hjørnene i brukergrensesnittet skal være (i piksler)",
"replies_in_timeline": "Svar på tidslinje",
"reply_link_preview": "Vis en forhåndsvisning når du holder musen over svar til en status",
"reply_visibility_all": "Vis alle svar",
"reply_visibility_following": "Vis bare svar som er til meg eller folk jeg følger",
"reply_visibility_self": "Vis bare svar som er til meg",
"saving_err": "Feil ved lagring av innstillinger",
"saving_ok": "Innstillinger lagret",
"security_tab": "Sikkerhet",
"set_new_avatar": "Rediger profilbilde",
"set_new_profile_background": "Rediger profil-bakgrunn",
"set_new_profile_banner": "Sett ny profil-banner",
"settings": "Innstillinger",
"stop_gifs": "Spill av GIFs når du holder over dem",
"streaming": "Automatisk strømming av nye statuser når du har bladd til toppen",
"text": "Tekst",
"theme": "Tema",
"theme_help": "Bruk heksadesimale fargekoder (#rrggbb) til å endre farge-temaet ditt.",
"tooltipRadius": "Verktøytips/advarsler",
"user_settings": "Brukerinstillinger",
"values": {
"false": "nei",
"true": "ja"
}
},
"timeline": {
"collapse": "Sammenfold",
"conversation": "Samtale",
"error_fetching": "Feil ved henting av oppdateringer",
"load_older": "Last eldre statuser",
"no_retweet_hint": "Status er markert som bare til følgere eller direkte og kan ikke gjentas",
"repeated": "gjentok",
"show_new": "Vis nye",
"up_to_date": "Oppdatert"
},
"user_card": {
"approve": "Godkjenn",
"block": "Blokker",
"blocked": "Blokkert!",
"deny": "Avslå",
"follow": "Følg",
"followees": "Følger",
"followers": "Følgere",
"following": "Følger!",
"follows_you": "Følger deg!",
"mute": "Demp",
"muted": "Dempet",
"per_day": "per dag",
"remote_follow": "Følg eksternt",
"statuses": "Statuser"
},
"user_profile": {
"timeline_title": "Bruker-tidslinje"
},
"who_to_follow": {
"more": "Mer",
"who_to_follow": "Hvem å følge"
}
}

134
src/i18n/oc.json Normal file
View file

@ -0,0 +1,134 @@
{
"chat": {
"title": "Messatjariá"
},
"finder": {
"error_fetching_user": "Error pendent la recèrca dun utilizaire",
"find_user": "Cercar un utilizaire"
},
"general": {
"apply": "Aplicar",
"submit": "Mandar"
},
"login": {
"login": "Connexion",
"logout": "Desconnexion",
"password": "Senhal",
"placeholder": "e.g. lain",
"register": "Se marcar",
"username": "Nom dutilizaire"
},
"nav": {
"chat": "Chat local",
"mentions": "Notificacions",
"public_tl": "Estatuts locals",
"timeline": "Flux dactualitat",
"twkn": "Lo malhum conegut"
},
"notifications": {
"favorited_you": "a aimat vòstre estatut",
"followed_you": "vos a seguit",
"notifications": "Notficacions",
"read": "Legit!",
"repeated_you": "a repetit your vòstre estatut"
},
"post_status": {
"content_warning": "Avís de contengut (opcional)",
"default": "Escrivètz aquí vòstre estatut.",
"posting": "Mandadís"
},
"registration": {
"bio": "Biografia",
"email": "Adreça de corrièl",
"fullname": "Nom complèt",
"password_confirm": "Confirmar lo senhal",
"registration": "Inscripcion"
},
"settings": {
"attachmentRadius": "Pèças juntas",
"attachments": "Pèças juntas",
"autoload": "Activar lo cargament automatic un còp arribat al cap de la pagina",
"avatar": "Avatar",
"avatarAltRadius": "Avatars (Notificacions)",
"avatarRadius": "Avatars",
"background": "Rèire plan",
"bio": "Biografia",
"btnRadius": "Botons",
"cBlue": "Blau (Respondre, seguir)",
"cGreen": "Verd (Repartajar)",
"cOrange": "Irange (Aimar)",
"cRed": "Roge (Anullar)",
"change_password": "Cambiar lo senhal",
"change_password_error": "Una error ses producha en cambiant lo senhal.",
"changed_password": "Senhal corrèctament cambiat",
"confirm_new_password": "Confirmatz lo nòu senhal",
"current_avatar": "Vòstre avatar actual",
"current_password": "Senhal actual",
"current_profile_banner": "Bandièra actuala del perfil",
"delete_account": "Suprimir lo compte",
"delete_account_description": "Suprimir vòstre compte e los messatges per sempre.",
"delete_account_error": "Una error ses producha en suprimir lo compte. Saquò ten darribar mercés de contactar vòstre administrador dinstància.",
"delete_account_instructions": "Picatz vòstre senhal dins lo camp tèxte çai-jos per confirmar la supression del compte.",
"filtering": "Filtre",
"filtering_explanation": "Totes los estatuts amb aqueles mots seràn en silenci, un mot per linha.",
"follow_export": "Exportar los abonaments",
"follow_export_button": "Exportar vòstres abonaments dins un fichièr csv",
"follow_export_processing": "Tractament, vos demandarem lèu de telecargar lo fichièr",
"follow_import": "Importar los abonaments",
"follow_import_error": "Error en important los seguidors",
"follows_imported": "Seguidors importats. Lo tractament pòt trigar una estona.",
"foreground": "Endavant",
"hide_attachments_in_convo": "Rescondre las pèças juntas dins las conversacions",
"hide_attachments_in_tl": "Rescondre las pèças juntas",
"import_followers_from_a_csv_file": "Importar los seguidors dun fichièr csv",
"inputRadius": "Camps tèxte",
"links": "Ligams",
"name": "Nom",
"name_bio": "Nom & Bio",
"new_password": "Nòu senhal",
"nsfw_clickthrough": "Activar lo clic per mostrar los imatges marcats coma pels adults o sensibles",
"panelRadius": "Panèls",
"presets": "Pre-enregistrats",
"profile_background": "Imatge de fons",
"profile_banner": "Bandièra del perfil",
"radii_help": "Configurar los caires arredondits de linterfàcia (en pixèls)",
"reply_link_preview": "Activar lapercebut en passar la mirga",
"set_new_avatar": "Cambiar lavatar",
"set_new_profile_background": "Cambiar limatge de fons",
"set_new_profile_banner": "Cambiar de bandièra",
"settings": "Paramètres",
"stop_gifs": "Lançar los GIFs al subrevòl",
"streaming": "Activar lo cargament automatic dels novèls estatus en anar amont",
"text": "Tèxte",
"theme": "Tèma",
"theme_help": "Emplegatz los còdis de color hex (#rrggbb) per personalizar vòstre tèma de color.",
"tooltipRadius": "Astúcias/Alèrta",
"user_settings": "Paramètres utilizaire"
},
"timeline": {
"collapse": "Tampar",
"conversation": "Conversacion",
"error_fetching": "Error en cercant de mesas a jorn",
"load_older": "Ne veire mai",
"repeated": "repetit",
"show_new": "Ne veire mai",
"up_to_date": "A jorn"
},
"user_card": {
"block": "Blocar",
"blocked": "Blocat",
"follow": "Seguir",
"followees": "Abonaments",
"followers": "Seguidors",
"following": "Seguit!",
"follows_you": "Vos sèc!",
"mute": "Amagar",
"muted": "Amagat",
"per_day": "per jorn",
"remote_follow": "Seguir a distància",
"statuses": "Estatuts"
},
"user_profile": {
"timeline_title": "Flux utilizaire"
}
}

133
src/i18n/pl.json Normal file
View file

@ -0,0 +1,133 @@
{
"chat": {
"title": "Czat"
},
"finder": {
"error_fetching_user": "Błąd przy pobieraniu profilu",
"find_user": "Znajdź użytkownika"
},
"general": {
"apply": "Zastosuj",
"submit": "Wyślij"
},
"login": {
"login": "Zaloguj",
"logout": "Wyloguj",
"password": "Hasło",
"placeholder": "n.p. lain",
"register": "Zarejestruj",
"username": "Użytkownik"
},
"nav": {
"chat": "Lokalny czat",
"mentions": "Wzmianki",
"public_tl": "Publiczna oś czasu",
"timeline": "Oś czasu",
"twkn": "Cała znana sieć"
},
"notifications": {
"favorited_you": "dodał twój status do ulubionych",
"followed_you": "obserwuje cię",
"notifications": "Powiadomienia",
"read": "Przeczytane!",
"repeated_you": "powtórzył twój status"
},
"post_status": {
"default": "Właśnie wróciłem z kościoła",
"posting": "Wysyłanie"
},
"registration": {
"bio": "Bio",
"email": "Email",
"fullname": "Wyświetlana nazwa profilu",
"password_confirm": "Potwierdzenie hasła",
"registration": "Rejestracja"
},
"settings": {
"attachmentRadius": "Załączniki",
"attachments": "Załączniki",
"autoload": "Włącz automatyczne ładowanie po przewinięciu do końca strony",
"avatar": "Awatar",
"avatarAltRadius": "Awatary (powiadomienia)",
"avatarRadius": "Awatary",
"background": "Tło",
"bio": "Bio",
"btnRadius": "Przyciski",
"cBlue": "Niebieski (odpowiedz, obserwuj)",
"cGreen": "Zielony (powtórzenia)",
"cOrange": "Pomarańczowy (ulubione)",
"cRed": "Czerwony (anuluj)",
"change_password": "Zmień hasło",
"change_password_error": "Podczas zmiany hasła wystąpił problem.",
"changed_password": "Hasło zmienione poprawnie!",
"confirm_new_password": "Potwierdź nowe hasło",
"current_avatar": "Twój obecny awatar",
"current_password": "Obecne hasło",
"current_profile_banner": "Twój obecny banner profilu",
"delete_account": "Usuń konto",
"delete_account_description": "Trwale usuń konto i wszystkie posty.",
"delete_account_error": "Wystąpił problem z usuwaniem twojego konta. Jeżeli problem powtarza się, poinformuj administratora swojej instancji.",
"delete_account_instructions": "Wprowadź swoje hasło w poniższe pole aby potwierdzić usunięcie konta.",
"filtering": "Filtrowanie",
"filtering_explanation": "Wszystkie statusy zawierające te słowa będą wyciszone. Jedno słowo na linijkę.",
"follow_export": "Eksport obserwowanych",
"follow_export_button": "Eksportuj swoją listę obserwowanych do pliku CSV",
"follow_export_processing": "Przetwarzanie, wkrótce twój plik zacznie się ściągać.",
"follow_import": "Import obserwowanych",
"follow_import_error": "Błąd przy importowaniu obserwowanych",
"follows_imported": "Obserwowani zaimportowani! Przetwarzanie może trochę potrwać.",
"foreground": "Pierwszy plan",
"hide_attachments_in_convo": "Ukryj załączniki w rozmowach",
"hide_attachments_in_tl": "Ukryj załączniki w osi czasu",
"import_followers_from_a_csv_file": "Importuj obserwowanych z pliku CSV",
"inputRadius": "Pola tekstowe",
"links": "Łącza",
"name": "Imię",
"name_bio": "Imię i bio",
"new_password": "Nowe hasło",
"nsfw_clickthrough": "Włącz domyślne ukrywanie załączników o treści nieprzyzwoitej (NSFW)",
"panelRadius": "Panele",
"presets": "Gotowe motywy",
"profile_background": "Tło profilu",
"profile_banner": "Banner profilu",
"radii_help": "Ustaw zaokrąglenie krawędzi interfejsu (w pikselach)",
"reply_link_preview": "Włącz dymek z podglądem postu po najechaniu na znak odpowiedzi",
"set_new_avatar": "Ustaw nowy awatar",
"set_new_profile_background": "Ustaw nowe tło profilu",
"set_new_profile_banner": "Ustaw nowy banner profilu",
"settings": "Ustawienia",
"stop_gifs": "Odtwarzaj GIFy po najechaniu kursorem",
"streaming": "Włącz automatycznie strumieniowanie nowych postów gdy na początku strony",
"text": "Tekst",
"theme": "Motyw",
"theme_help": "Użyj kolorów w notacji szesnastkowej (#rrggbb), by stworzyć swój motyw.",
"tooltipRadius": "Etykiety/alerty",
"user_settings": "Ustawienia użytkownika"
},
"timeline": {
"collapse": "Zwiń",
"conversation": "Rozmowa",
"error_fetching": "Błąd pobierania",
"load_older": "Załaduj starsze statusy",
"repeated": "powtórzono",
"show_new": "Pokaż nowe",
"up_to_date": "Na bieżąco"
},
"user_card": {
"block": "Zablokuj",
"blocked": "Zablokowany!",
"follow": "Obserwuj",
"followees": "Obserwowani",
"followers": "Obserwujący",
"following": "Obserwowany!",
"follows_you": "Obserwuje cię!",
"mute": "Wycisz",
"muted": "Wyciszony",
"per_day": "dziennie",
"remote_follow": "Zdalna obserwacja",
"statuses": "Statusy"
},
"user_profile": {
"timeline_title": "Oś czasu użytkownika"
}
}

117
src/i18n/pt.json Normal file
View file

@ -0,0 +1,117 @@
{
"chat": {
"title": "Chat"
},
"finder": {
"error_fetching_user": "Erro procurando usuário",
"find_user": "Buscar usuário"
},
"general": {
"apply": "Aplicar",
"submit": "Enviar"
},
"login": {
"login": "Entrar",
"logout": "Sair",
"password": "Senha",
"placeholder": "p.e. lain",
"register": "Registrar",
"username": "Usuário"
},
"nav": {
"chat": "Chat local",
"mentions": "Menções",
"public_tl": "Linha do tempo pública",
"timeline": "Linha do tempo",
"twkn": "Toda a rede conhecida"
},
"notifications": {
"favorited_you": "favoritou sua postagem",
"followed_you": "seguiu você",
"notifications": "Notificações",
"read": "Lido!",
"repeated_you": "repetiu sua postagem"
},
"post_status": {
"default": "Acabei de chegar no Rio!",
"posting": "Publicando"
},
"registration": {
"bio": "Biografia",
"email": "Correio eletrônico",
"fullname": "Nome para exibição",
"password_confirm": "Confirmação de senha",
"registration": "Registro"
},
"settings": {
"attachmentRadius": "Anexos",
"attachments": "Anexos",
"autoload": "Habilitar carregamento automático quando a rolagem chegar ao fim.",
"avatar": "Avatar",
"avatarAltRadius": "Avatares (Notificações)",
"avatarRadius": "Avatares",
"background": "Plano de Fundo",
"bio": "Biografia",
"btnRadius": "Botões",
"cBlue": "Azul (Responder, seguir)",
"cGreen": "Verde (Repetir)",
"cOrange": "Laranja (Favoritar)",
"cRed": "Vermelho (Cancelar)",
"current_avatar": "Seu avatar atual",
"current_profile_banner": "Sua capa de perfil atual",
"filtering": "Filtragem",
"filtering_explanation": "Todas as postagens contendo estas palavras serão silenciadas, uma por linha.",
"follow_import": "Importar seguidas",
"follow_import_error": "Erro ao importar seguidores",
"follows_imported": "Seguidores importados! O processamento pode demorar um pouco.",
"foreground": "Primeiro Plano",
"hide_attachments_in_convo": "Ocultar anexos em conversas",
"hide_attachments_in_tl": "Ocultar anexos na linha do tempo.",
"import_followers_from_a_csv_file": "Importe seguidores a partir de um arquivo CSV",
"links": "Links",
"name": "Nome",
"name_bio": "Nome & Biografia",
"nsfw_clickthrough": "Habilitar clique para ocultar anexos NSFW",
"panelRadius": "Paineis",
"presets": "Predefinições",
"profile_background": "Plano de fundo de perfil",
"profile_banner": "Capa de perfil",
"radii_help": "Arredondar arestas da interface (em píxeis)",
"reply_link_preview": "Habilitar a pré-visualização de link de respostas ao passar o mouse.",
"set_new_avatar": "Alterar avatar",
"set_new_profile_background": "Alterar o plano de fundo de perfil",
"set_new_profile_banner": "Alterar capa de perfil",
"settings": "Configurações",
"stop_gifs": "Reproduzir GIFs ao passar o cursor em cima",
"streaming": "Habilitar o fluxo automático de postagens quando ao topo da página",
"text": "Texto",
"theme": "Tema",
"theme_help": "Use cores em código hexadecimal (#rrggbb) para personalizar seu esquema de cores.",
"tooltipRadius": "Dicass/alertas",
"user_settings": "Configurações de Usuário"
},
"timeline": {
"conversation": "Conversa",
"error_fetching": "Erro buscando atualizações",
"load_older": "Carregar postagens antigas",
"show_new": "Mostrar novas",
"up_to_date": "Atualizado"
},
"user_card": {
"block": "Bloquear",
"blocked": "Bloqueado!",
"follow": "Seguir",
"followees": "Seguindo",
"followers": "Seguidores",
"following": "Seguindo!",
"follows_you": "Segue você!",
"mute": "Silenciar",
"muted": "Silenciado",
"per_day": "por dia",
"remote_follow": "Seguidor Remoto",
"statuses": "Postagens"
},
"user_profile": {
"timeline_title": "Linha do tempo do usuário"
}
}

83
src/i18n/ro.json Normal file
View file

@ -0,0 +1,83 @@
{
"finder": {
"error_fetching_user": "Eroare la preluarea utilizatorului",
"find_user": "Găsește utilizator"
},
"general": {
"submit": "trimite"
},
"login": {
"login": "Loghează",
"logout": "Deloghează",
"password": "Parolă",
"placeholder": "d.e. lain",
"register": "Înregistrare",
"username": "Nume utilizator"
},
"nav": {
"mentions": "Menționări",
"public_tl": "Cronologie Publică",
"timeline": "Cronologie",
"twkn": "Toată Reșeaua Cunoscută"
},
"notifications": {
"followed_you": "te-a urmărit",
"notifications": "Notificări",
"read": "Citit!"
},
"post_status": {
"default": "Nu de mult am aterizat în L.A.",
"posting": "Postează"
},
"registration": {
"bio": "Bio",
"email": "Email",
"fullname": "Numele întreg",
"password_confirm": "Cofirmă parola",
"registration": "Îregistrare"
},
"settings": {
"attachments": "Atașamente",
"autoload": "Permite încărcarea automată când scrolat la capăt",
"avatar": "Avatar",
"bio": "Bio",
"current_avatar": "Avatarul curent",
"current_profile_banner": "Bannerul curent al profilului",
"filtering": "Filtru",
"filtering_explanation": "Toate stările care conțin aceste cuvinte vor fi puse pe mut, una pe linie",
"hide_attachments_in_convo": "Ascunde atașamentele în conversații",
"hide_attachments_in_tl": "Ascunde atașamentele în cronologie",
"name": "Nume",
"name_bio": "Nume și Bio",
"nsfw_clickthrough": "Permite ascunderea al atașamentelor NSFW",
"profile_background": "Fundalul de profil",
"profile_banner": "Banner de profil",
"reply_link_preview": "Permite previzualizarea linkului de răspuns la planarea de mouse",
"set_new_avatar": "Setează avatar nou",
"set_new_profile_background": "Setează fundal nou",
"set_new_profile_banner": "Setează banner nou la profil",
"settings": "Setări",
"theme": "Temă",
"user_settings": "Setările utilizatorului"
},
"timeline": {
"conversation": "Conversație",
"error_fetching": "Erare la preluarea actualizărilor",
"load_older": "Încarcă stări mai vechi",
"show_new": "Arată cele noi",
"up_to_date": "La zi"
},
"user_card": {
"block": "Blochează",
"blocked": "Blocat!",
"follow": "Urmărește",
"followees": "Urmărește",
"followers": "Următori",
"following": "Urmărit!",
"follows_you": "Te urmărește!",
"mute": "Pune pe mut",
"muted": "Pus pe mut",
"per_day": "pe zi",
"statuses": "Stări"
}
}

171
src/i18n/ru.json Normal file
View file

@ -0,0 +1,171 @@
{
"chat": {
"title": "Чат"
},
"finder": {
"error_fetching_user": "Пользователь не найден",
"find_user": "Найти пользователя"
},
"general": {
"apply": "Применить",
"submit": "Отправить"
},
"login": {
"login": "Войти",
"logout": "Выйти",
"password": "Пароль",
"placeholder": "e.c. lain",
"register": "Зарегистрироваться",
"username": "Имя пользователя"
},
"nav": {
"chat": "Локальный чат",
"mentions": "Упоминания",
"public_tl": "Публичная лента",
"timeline": "Лента",
"twkn": "Федеративная лента"
},
"notifications": {
"broken_favorite": "Неизвестный статус, ищем...",
"favorited_you": "нравится ваш статус",
"followed_you": "начал(а) читать вас",
"load_older": "Загрузить старые уведомления",
"notifications": "Уведомления",
"read": "Прочесть",
"repeated_you": "повторил(а) ваш статус"
},
"post_status": {
"account_not_locked_warning": "Ваш аккаунт не {0}. Кто угодно может зафоловить вас чтобы прочитать посты только для подписчиков",
"account_not_locked_warning_link": "залочен",
"attachments_sensitive": "Вложения содержат чувствительный контент",
"content_warning": "Тема (не обязательно)",
"default": "Что нового?",
"direct_warning": "Этот пост будет видет только упомянутым пользователям",
"posting": "Отправляется",
"scope": {
"direct": "Личное - этот пост видят только те кто в нём упомянут",
"private": "Для подписчиков - этот пост видят только подписчики",
"public": "Публичный - этот пост виден всем",
"unlisted": "Непубличный - этот пост не виден на публичных лентах"
}
},
"registration": {
"bio": "Описание",
"email": "Email",
"fullname": "Отображаемое имя",
"password_confirm": "Подтверждение пароля",
"registration": "Регистрация",
"token": "Код приглашения"
},
"settings": {
"attachmentRadius": "Прикреплённые файлы",
"attachments": "Вложения",
"autoload": "Включить автоматическую загрузку при прокрутке вниз",
"avatar": "Аватар",
"avatarAltRadius": "Аватары в уведомлениях",
"avatarRadius": "Аватары",
"background": "Фон",
"bio": "Описание",
"btnRadius": "Кнопки",
"cBlue": "Ответить, читать",
"cGreen": "Повторить",
"cOrange": "Нравится",
"cRed": "Отменить",
"change_password": "Сменить пароль",
"change_password_error": "Произошла ошибка при попытке изменить пароль.",
"changed_password": "Пароль изменён успешно.",
"collapse_subject": "Сворачивать посты с темой",
"confirm_new_password": "Подтверждение нового пароля",
"current_avatar": "Текущий аватар",
"current_password": "Текущий пароль",
"current_profile_banner": "Текущий баннер профиля",
"data_import_export_tab": "Импорт / Экспорт данных",
"delete_account": "Удалить аккаунт",
"delete_account_description": "Удалить ваш аккаунт и все ваши сообщения.",
"delete_account_error": "Возникла ошибка в процессе удаления вашего аккаунта. Если это повторяется, свяжитесь с администратором вашего сервера.",
"delete_account_instructions": "Введите ваш пароль в поле ниже для подтверждения удаления.",
"export_theme": "Сохранить Тему",
"filtering": "Фильтрация",
"filtering_explanation": "Все статусы, содержащие данные слова, будут игнорироваться, по одному в строке",
"follow_export": "Экспортировать читаемых",
"follow_export_button": "Экспортировать читаемых в файл .csv",
"follow_export_processing": "Ведётся обработка, скоро вам будет предложено загрузить файл",
"follow_import": "Импортировать читаемых",
"follow_import_error": "Ошибка при импортировании читаемых.",
"follows_imported": "Список читаемых импортирован. Обработка займёт некоторое время..",
"foreground": "Передний план",
"general": "Общие",
"hide_attachments_in_convo": "Прятать вложения в разговорах",
"hide_attachments_in_tl": "Прятать вложения в ленте",
"import_followers_from_a_csv_file": "Импортировать читаемых из файла .csv",
"import_theme": "Загрузить Тему",
"inputRadius": "Поля ввода",
"interfaceLanguage": "Язык интерфейса",
"limited_availability": "Не доступно в вашем браузере",
"links": "Ссылки",
"lock_account_description": "Аккаунт доступен только подтверждённым подписчикам",
"loop_video": "Зациливать видео",
"loop_video_silent_only": "Зацикливать только беззвучные видео (т.е. \"гифки\" с Mastodon)",
"name": "Имя",
"name_bio": "Имя и описание",
"new_password": "Новый пароль",
"notification_visibility": "Показывать уведомления",
"notification_visibility_follows": "Подписки",
"notification_visibility_likes": "Лайки",
"notification_visibility_mentions": "Упоминания",
"notification_visibility_repeats": "Повторы",
"no_rich_text_description": "Убрать форматирование из всех постов",
"nsfw_clickthrough": "Включить скрытие NSFW вложений",
"panelRadius": "Панели",
"pause_on_unfocused": "Приостановить загрузку когда вкладка не в фокусе",
"presets": "Пресеты",
"profile_background": "Фон профиля",
"profile_banner": "Баннер профиля",
"profile_tab": "Профиль",
"radii_help": "Скругление углов элементов интерфейса (в пикселях)",
"replies_in_timeline": "Ответы в ленте",
"reply_link_preview": "Включить предварительный просмотр ответа при наведении мыши",
"reply_visibility_all": "Показывать все ответы",
"reply_visibility_following": "Показывать только ответы мне и тех на кого я подписан",
"reply_visibility_self": "Показывать только ответы мне",
"security_tab": "Безопасность",
"set_new_avatar": "Загрузить новый аватар",
"set_new_profile_background": "Загрузить новый фон профиля",
"set_new_profile_banner": "Загрузить новый баннер профиля",
"settings": "Настройки",
"stop_gifs": "Проигрывать GIF анимации только при наведении",
"streaming": "Включить автоматическую загрузку новых сообщений при прокрутке вверх",
"text": "Текст",
"theme": "Тема",
"theme_help": "Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.",
"tooltipRadius": "Всплывающие подсказки/уведомления",
"user_settings": "Настройки пользователя"
},
"timeline": {
"collapse": "Свернуть",
"conversation": "Разговор",
"error_fetching": "Ошибка при обновлении",
"load_older": "Загрузить старые статусы",
"no_retweet_hint": "Пост помечен как \"только для подписчиков\" или \"личное\" и поэтому не может быть повторён",
"repeated": "повторил(а)",
"show_new": "Показать новые",
"up_to_date": "Обновлено"
},
"user_card": {
"block": "Заблокировать",
"blocked": "Заблокирован",
"follow": "Читать",
"followees": "Читаемые",
"followers": "Читатели",
"following": "Читаю",
"follows_you": "Читает вас",
"mute": "Игнорировать",
"muted": "Игнорирую",
"per_day": "в день",
"remote_follow": "Читать удалённо",
"statuses": "Статусы"
},
"user_profile": {
"timeline_title": "Лента пользователя"
}
}

View file

@ -1,7 +1,7 @@
import merge from 'lodash.merge' import merge from 'lodash.merge'
import objectPath from 'object-path' import objectPath from 'object-path'
import localforage from 'localforage' import localforage from 'localforage'
import { throttle, each } from 'lodash' import { each } from 'lodash'
let loaded = false let loaded = false
@ -12,18 +12,18 @@ const defaultReducer = (state, paths) => (
}, {}) }, {})
) )
const saveImmedeatelyActions = [
'markNotificationsAsSeen',
'clearCurrentUser',
'setCurrentUser',
'setHighlight',
'setOption'
]
const defaultStorage = (() => { const defaultStorage = (() => {
return localforage return localforage
})() })()
const defaultSetState = (key, state, storage) => {
if (!loaded) {
console.log('waiting for old state to be loaded...')
} else {
return storage.setItem(key, state)
}
}
export default function createPersistedState ({ export default function createPersistedState ({
key = 'vuex-lz', key = 'vuex-lz',
paths = [], paths = [],
@ -31,7 +31,14 @@ export default function createPersistedState ({
let value = storage.getItem(key) let value = storage.getItem(key)
return value return value
}, },
setState = throttle(defaultSetState, 60000), setState = (key, state, storage) => {
if (!loaded) {
console.log('waiting for old state to be loaded...')
return Promise.resolve()
} else {
return storage.setItem(key, state)
}
},
reducer = defaultReducer, reducer = defaultReducer,
storage = defaultStorage, storage = defaultStorage,
subscriber = store => handler => store.subscribe(handler) subscriber = store => handler => store.subscribe(handler)
@ -72,7 +79,20 @@ export default function createPersistedState ({
subscriber(store)((mutation, state) => { subscriber(store)((mutation, state) => {
try { try {
setState(key, reducer(state, paths), storage) if (saveImmedeatelyActions.includes(mutation.type)) {
setState(key, reducer(state, paths), storage)
.then(success => {
if (typeof success !== 'undefined') {
if (mutation.type === 'setOption') {
store.dispatch('settingsSaved', { success })
}
}
}, error => {
if (mutation.type === 'setOption') {
store.dispatch('settingsSaved', { error })
}
})
}
} catch (e) { } catch (e) {
console.log("Couldn't persist state:") console.log("Couldn't persist state:")
console.log(e) console.log(e)

View file

@ -14,6 +14,8 @@ import Registration from './components/registration/registration.vue'
import UserSettings from './components/user_settings/user_settings.vue' import UserSettings from './components/user_settings/user_settings.vue'
import FollowRequests from './components/follow_requests/follow_requests.vue' import FollowRequests from './components/follow_requests/follow_requests.vue'
import interfaceModule from './modules/interface.js'
import instanceModule from './modules/instance.js'
import statusesModule from './modules/statuses.js' import statusesModule from './modules/statuses.js'
import usersModule from './modules/users.js' import usersModule from './modules/users.js'
import apiModule from './modules/api.js' import apiModule from './modules/api.js'
@ -45,25 +47,7 @@ Vue.use(VueChatScroll)
const persistedStateOptions = { const persistedStateOptions = {
paths: [ paths: [
'config.collapseMessageWithSubject', 'config',
'config.hideAttachments',
'config.hideAttachmentsInConv',
'config.hidePostStats',
'config.hideUserStats',
'config.hideNsfw',
'config.replyVisibility',
'config.notificationVisibility',
'config.autoLoad',
'config.hoverPreview',
'config.streaming',
'config.muteWords',
'config.customTheme',
'config.highlight',
'config.loopVideo',
'config.loopVideoSilentOnly',
'config.pauseOnUnfocused',
'config.stopGifs',
'config.interfaceLanguage',
'users.lastLoginName', 'users.lastLoginName',
'statuses.notifications.maxSavedId' 'statuses.notifications.maxSavedId'
] ]
@ -71,6 +55,8 @@ const persistedStateOptions = {
const store = new Vuex.Store({ const store = new Vuex.Store({
modules: { modules: {
interface: interfaceModule,
instance: instanceModule,
statuses: statusesModule, statuses: statusesModule,
users: usersModule, users: usersModule,
api: apiModule, api: apiModule,
@ -94,102 +80,104 @@ window.fetch('/api/statusnet/config.json')
.then((data) => { .then((data) => {
const {name, closed: registrationClosed, textlimit, server} = data.site const {name, closed: registrationClosed, textlimit, server} = data.site
store.dispatch('setOption', { name: 'name', value: name }) store.dispatch('setInstanceOption', { name: 'name', value: name })
store.dispatch('setOption', { name: 'registrationOpen', value: (registrationClosed === '0') }) store.dispatch('setInstanceOption', { name: 'registrationOpen', value: (registrationClosed === '0') })
store.dispatch('setOption', { name: 'textlimit', value: parseInt(textlimit) }) store.dispatch('setInstanceOption', { name: 'textlimit', value: parseInt(textlimit) })
store.dispatch('setOption', { name: 'server', value: server }) store.dispatch('setInstanceOption', { name: 'server', value: server })
var apiConfig = data.site.pleromafe var apiConfig = data.site.pleromafe
window.fetch('/static/config.json') window.fetch('/static/config.json')
.then((res) => res.json()) .then((res) => res.json())
.then((data) => { .catch((err) => {
var staticConfig = data console.warn('Failed to load static/config.json, continuing without it.')
// This takes static config and overrides properties that are present in apiConfig console.warn(err)
var config = Object.assign({}, staticConfig, apiConfig) return {}
})
.then((staticConfig) => {
// This takes static config and overrides properties that are present in apiConfig
var config = Object.assign({}, staticConfig, apiConfig)
var theme = (config.theme) var theme = (config.theme)
var background = (config.background) var background = (config.background)
var logo = (config.logo) var hidePostStats = (config.hidePostStats)
var logoMask = (typeof config.logoMask === 'undefined' ? true : config.logoMask) var hideUserStats = (config.hideUserStats)
var logoMargin = (typeof config.logoMargin === 'undefined' ? 0 : config.logoMargin) var logo = (config.logo)
var redirectRootNoLogin = (config.redirectRootNoLogin) var logoMask = (typeof config.logoMask === 'undefined' ? true : config.logoMask)
var redirectRootLogin = (config.redirectRootLogin) var logoMargin = (typeof config.logoMargin === 'undefined' ? 0 : config.logoMargin)
var chatDisabled = (config.chatDisabled) var redirectRootNoLogin = (config.redirectRootNoLogin)
var showWhoToFollowPanel = (config.showWhoToFollowPanel) var redirectRootLogin = (config.redirectRootLogin)
var whoToFollowProvider = (config.whoToFollowProvider) var chatDisabled = (config.chatDisabled)
var whoToFollowLink = (config.whoToFollowLink) var showInstanceSpecificPanel = (config.showInstanceSpecificPanel)
var showInstanceSpecificPanel = (config.showInstanceSpecificPanel) var scopeOptionsEnabled = (config.scopeOptionsEnabled)
var scopeOptionsEnabled = (config.scopeOptionsEnabled) var formattingOptionsEnabled = (config.formattingOptionsEnabled)
var formattingOptionsEnabled = (config.formattingOptionsEnabled) var collapseMessageWithSubject = (config.collapseMessageWithSubject)
var collapseMessageWithSubject = (config.collapseMessageWithSubject)
var hidePostStats = (config.hidePostStats)
var hideUserStats = (config.hideUserStats)
store.dispatch('setOption', { name: 'theme', value: theme }) store.dispatch('setInstanceOption', { name: 'theme', value: theme })
store.dispatch('setOption', { name: 'background', value: background }) store.dispatch('setInstanceOption', { name: 'background', value: background })
store.dispatch('setOption', { name: 'logo', value: logo }) store.dispatch('setInstanceOption', { name: 'hidePostStats', value: hidePostStats })
store.dispatch('setOption', { name: 'logoMask', value: logoMask }) store.dispatch('setInstanceOption', { name: 'hideUserStats', value: hideUserStats })
store.dispatch('setOption', { name: 'logoMargin', value: logoMargin }) store.dispatch('setInstanceOption', { name: 'logo', value: logo })
store.dispatch('setOption', { name: 'showWhoToFollowPanel', value: showWhoToFollowPanel }) store.dispatch('setInstanceOption', { name: 'logoMask', value: logoMask })
store.dispatch('setOption', { name: 'whoToFollowProvider', value: whoToFollowProvider }) store.dispatch('setInstanceOption', { name: 'logoMargin', value: logoMargin })
store.dispatch('setOption', { name: 'whoToFollowLink', value: whoToFollowLink }) store.dispatch('setInstanceOption', { name: 'redirectRootNoLogin', value: redirectRootNoLogin })
store.dispatch('setOption', { name: 'showInstanceSpecificPanel', value: showInstanceSpecificPanel }) store.dispatch('setInstanceOption', { name: 'redirectRootLogin', value: redirectRootLogin })
store.dispatch('setOption', { name: 'scopeOptionsEnabled', value: scopeOptionsEnabled }) store.dispatch('setInstanceOption', { name: 'showInstanceSpecificPanel', value: showInstanceSpecificPanel })
store.dispatch('setOption', { name: 'formattingOptionsEnabled', value: formattingOptionsEnabled }) store.dispatch('setInstanceOption', { name: 'scopeOptionsEnabled', value: scopeOptionsEnabled })
store.dispatch('setOption', { name: 'collapseMessageWithSubject', value: collapseMessageWithSubject }) store.dispatch('setInstanceOption', { name: 'formattingOptionsEnabled', value: formattingOptionsEnabled })
store.dispatch('setOption', { name: 'hidePostStats', value: hidePostStats }) store.dispatch('setInstanceOption', { name: 'collapseMessageWithSubject', value: collapseMessageWithSubject })
store.dispatch('setOption', { name: 'hideUserStats', value: hideUserStats }) if (chatDisabled) {
if (chatDisabled) { store.dispatch('disableChat')
store.dispatch('disableChat')
}
const routes = [
{ name: 'root',
path: '/',
redirect: to => {
return (store.state.users.currentUser ? redirectRootLogin : redirectRootNoLogin) || '/main/all'
}},
{ path: '/main/all', component: PublicAndExternalTimeline },
{ path: '/main/public', component: PublicTimeline },
{ path: '/main/friends', component: FriendsTimeline },
{ path: '/tag/:tag', component: TagTimeline },
{ name: 'conversation', path: '/notice/:id', component: ConversationPage, meta: { dontScroll: true } },
{ name: 'user-profile', path: '/users/:id', component: UserProfile },
{ name: 'mentions', path: '/:username/mentions', component: Mentions },
{ name: 'settings', path: '/settings', component: Settings },
{ name: 'registration', path: '/registration', component: Registration },
{ name: 'registration', path: '/registration/:token', component: Registration },
{ name: 'friend-requests', path: '/friend-requests', component: FollowRequests },
{ name: 'user-settings', path: '/user-settings', component: UserSettings }
]
const router = new VueRouter({
mode: 'history',
routes,
scrollBehavior: (to, from, savedPosition) => {
if (to.matched.some(m => m.meta.dontScroll)) {
return false
}
return savedPosition || { x: 0, y: 0 }
} }
})
/* eslint-disable no-new */ const routes = [
new Vue({ { name: 'root',
router, path: '/',
store, redirect: to => {
i18n, return (store.state.users.currentUser
el: '#app', ? store.state.instance.redirectRootLogin
render: h => h(App) : store.state.instance.redirectRootNoLogin) || '/main/all'
}},
{ path: '/main/all', component: PublicAndExternalTimeline },
{ path: '/main/public', component: PublicTimeline },
{ path: '/main/friends', component: FriendsTimeline },
{ path: '/tag/:tag', component: TagTimeline },
{ name: 'conversation', path: '/notice/:id', component: ConversationPage, meta: { dontScroll: true } },
{ name: 'user-profile', path: '/users/:id', component: UserProfile },
{ name: 'mentions', path: '/:username/mentions', component: Mentions },
{ name: 'settings', path: '/settings', component: Settings },
{ name: 'registration', path: '/registration', component: Registration },
{ name: 'registration', path: '/registration/:token', component: Registration },
{ name: 'friend-requests', path: '/friend-requests', component: FollowRequests },
{ name: 'user-settings', path: '/user-settings', component: UserSettings }
]
const router = new VueRouter({
mode: 'history',
routes,
scrollBehavior: (to, from, savedPosition) => {
if (to.matched.some(m => m.meta.dontScroll)) {
return false
}
return savedPosition || { x: 0, y: 0 }
}
})
/* eslint-disable no-new */
new Vue({
router,
store,
i18n,
el: '#app',
render: h => h(App)
})
}) })
})
}) })
window.fetch('/static/terms-of-service.html') window.fetch('/static/terms-of-service.html')
.then((res) => res.text()) .then((res) => res.text())
.then((html) => { .then((html) => {
store.dispatch('setOption', { name: 'tos', value: html }) store.dispatch('setInstanceOption', { name: 'tos', value: html })
}) })
window.fetch('/api/pleroma/emoji.json') window.fetch('/api/pleroma/emoji.json')
@ -200,11 +188,11 @@ window.fetch('/api/pleroma/emoji.json')
const emoji = Object.keys(values).map((key) => { const emoji = Object.keys(values).map((key) => {
return { shortcode: key, image_url: values[key] } return { shortcode: key, image_url: values[key] }
}) })
store.dispatch('setOption', { name: 'customEmoji', value: emoji }) store.dispatch('setInstanceOption', { name: 'customEmoji', value: emoji })
store.dispatch('setOption', { name: 'pleromaBackend', value: true }) store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: true })
}, },
(failure) => { (failure) => {
store.dispatch('setOption', { name: 'pleromaBackend', value: false }) store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: false })
} }
), ),
(error) => console.log(error) (error) => console.log(error)
@ -216,19 +204,24 @@ window.fetch('/static/emoji.json')
const emoji = Object.keys(values).map((key) => { const emoji = Object.keys(values).map((key) => {
return { shortcode: key, image_url: false, 'utf': values[key] } return { shortcode: key, image_url: false, 'utf': values[key] }
}) })
store.dispatch('setOption', { name: 'emoji', value: emoji }) store.dispatch('setInstanceOption', { name: 'emoji', value: emoji })
}) })
window.fetch('/instance/panel.html') window.fetch('/instance/panel.html')
.then((res) => res.text()) .then((res) => res.text())
.then((html) => { .then((html) => {
store.dispatch('setOption', { name: 'instanceSpecificPanelContent', value: html }) store.dispatch('setInstanceOption', { name: 'instanceSpecificPanelContent', value: html })
}) })
window.fetch('/nodeinfo/2.0.json') window.fetch('/nodeinfo/2.0.json')
.then((res) => res.json()) .then((res) => res.json())
.then((data) => { .then((data) => {
const suggestions = data.metadata.suggestions const metadata = data.metadata
store.dispatch('setOption', { name: 'suggestionsEnabled', value: suggestions.enabled }) store.dispatch('setInstanceOption', { name: 'mediaProxyAvailable', value: data.metadata.mediaProxy })
store.dispatch('setOption', { name: 'suggestionsWeb', value: suggestions.web }) store.dispatch('setInstanceOption', { name: 'chatAvailable', value: data.metadata.chat })
store.dispatch('setInstanceOption', { name: 'gopherAvailable', value: data.metadata.gopher })
const suggestions = metadata.suggestions
store.dispatch('setInstanceOption', { name: 'suggestionsEnabled', value: suggestions.enabled })
store.dispatch('setInstanceOption', { name: 'suggestionsWeb', value: suggestions.web })
}) })

View file

@ -4,13 +4,10 @@ import StyleSetter from '../services/style_setter/style_setter.js'
const browserLocale = (window.navigator.language || 'en').split('-')[0] const browserLocale = (window.navigator.language || 'en').split('-')[0]
const defaultState = { const defaultState = {
name: 'Pleroma FE',
colors: {}, colors: {},
collapseMessageWithSubject: false, collapseMessageWithSubject: false,
hideAttachments: false, hideAttachments: false,
hideAttachmentsInConv: false, hideAttachmentsInConv: false,
hidePostStats: false,
hideUserStats: false,
hideNsfw: true, hideNsfw: true,
loopVideo: true, loopVideo: true,
loopVideoSilentOnly: true, loopVideoSilentOnly: true,
@ -47,18 +44,12 @@ const config = {
} }
}, },
actions: { actions: {
setPageTitle ({state}, option = '') {
document.title = `${option} ${state.name}`
},
setHighlight ({ commit, dispatch }, { user, color, type }) { setHighlight ({ commit, dispatch }, { user, color, type }) {
commit('setHighlight', {user, color, type}) commit('setHighlight', {user, color, type})
}, },
setOption ({ commit, dispatch }, { name, value }) { setOption ({ commit, dispatch }, { name, value }) {
commit('setOption', {name, value}) commit('setOption', {name, value})
switch (name) { switch (name) {
case 'name':
dispatch('setPageTitle')
break
case 'theme': case 'theme':
StyleSetter.setPreset(value, commit) StyleSetter.setPreset(value, commit)
break break

65
src/modules/instance.js Normal file
View file

@ -0,0 +1,65 @@
import { set } from 'vue'
import StyleSetter from '../services/style_setter/style_setter.js'
const defaultState = {
// Stuff from static/config.json and apiConfig
name: 'Pleroma FE',
registrationOpen: true,
textlimit: 5000,
server: 'http://localhost:4040/',
theme: 'pleroma-dark',
background: '/static/aurora_borealis.jpg',
logo: '/static/logo.png',
logoMask: true,
logoMargin: '.2em',
redirectRootNoLogin: '/main/all',
redirectRootLogin: '/main/friends',
showInstanceSpecificPanel: false,
scopeOptionsEnabled: true,
formattingOptionsEnabled: false,
collapseMessageWithSubject: false,
hidePostStats: false,
hideUserStats: false,
disableChat: false,
// Nasty stuff
pleromaBackend: true,
emoji: [],
customEmoji: [],
// Feature-set, apparently, not everything here is reported...
mediaProxyAvailable: false,
chatAvailable: false,
gopherAvailable: false,
suggestionsEnabled: false,
suggestionsWeb: '',
// Html stuff
instanceSpecificPanelContent: '',
tos: ''
}
const instance = {
state: defaultState,
mutations: {
setInstanceOption (state, { name, value }) {
if (typeof value !== 'undefined') {
set(state, name, value)
}
}
},
actions: {
setInstanceOption ({ commit, dispatch }, { name, value }) {
commit('setInstanceOption', {name, value})
switch (name) {
case 'name':
dispatch('setPageTitle')
break
case 'theme':
StyleSetter.setPreset(value, commit)
}
}
}
}
export default instance

36
src/modules/interface.js Normal file
View file

@ -0,0 +1,36 @@
import { set, delete as del } from 'vue'
const defaultState = {
settings: {
currentSaveStateNotice: null,
noticeClearTimeout: null
}
}
const interfaceMod = {
state: defaultState,
mutations: {
settingsSaved (state, { success, error }) {
if (success) {
if (state.noticeClearTimeout) {
clearTimeout(state.noticeClearTimeout)
}
set(state.settings, 'currentSaveStateNotice', { error: false, data: success })
set(state.settings, 'noticeClearTimeout',
setTimeout(() => del(state.settings, 'currentSaveStateNotice'), 2000))
} else {
set(state.settings, 'currentSaveStateNotice', { error: true, errorData: error })
}
}
},
actions: {
setPageTitle ({ rootState }, option = '') {
document.title = `${option} ${rootState.instance.name}`
},
settingsSaved ({ commit, dispatch }, { success, error }) {
commit('settingsSaved', { success, error })
}
}
}
export default interfaceMod

View file

@ -133,13 +133,11 @@ const updateBanner = ({credentials, params}) => {
const updateProfile = ({credentials, params}) => { const updateProfile = ({credentials, params}) => {
let url = PROFILE_UPDATE_URL let url = PROFILE_UPDATE_URL
console.log(params)
const form = new FormData() const form = new FormData()
each(params, (value, key) => { each(params, (value, key) => {
/* Always include description and locked, because it might be empty or false */ /* Always include description, no_rich_text and locked, because it might be empty or false */
if (key === 'description' || key === 'locked' || value) { if (key === 'description' || key === 'locked' || key === 'no_rich_text' || value) {
form.append(key, value) form.append(key, value)
} }
}) })
@ -335,7 +333,14 @@ const fetchTimeline = ({timeline, credentials, since = false, until = false, use
const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&') const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&')
url += `?${queryString}` url += `?${queryString}`
return fetch(url, { headers: authHeaders(credentials) }).then((data) => data.json()) return fetch(url, { headers: authHeaders(credentials) })
.then((data) => {
if (data.ok) {
return data
}
throw new Error('Error fetching timeline')
})
.then((data) => data.json())
} }
const verifyCredentials = (user) => { const verifyCredentials = (user) => {