diff --git a/config/index.js b/config/index.js
index 5d2cb833..7b0ef26c 100644
--- a/config/index.js
+++ b/config/index.js
@@ -27,6 +27,11 @@ module.exports = {
changeOrigin: true,
cookieDomainRewrite: 'localhost'
},
+ '/nodeinfo': {
+ target: 'http://localhost:4000/',
+ changeOrigin: true,
+ cookieDomainRewrite: 'localhost'
+ },
'/socket': {
target: 'http://localhost:4000/',
changeOrigin: true,
diff --git a/src/App.js b/src/App.js
index c455c18c..05e3eda3 100644
--- a/src/App.js
+++ b/src/App.js
@@ -2,8 +2,9 @@ import UserPanel from './components/user_panel/user_panel.vue'
import NavPanel from './components/nav_panel/nav_panel.vue'
import Notifications from './components/notifications/notifications.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 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'
export default {
@@ -13,8 +14,9 @@ export default {
NavPanel,
Notifications,
UserFinder,
- WhoToFollowPanel,
InstanceSpecificPanel,
+ FeaturesPanel,
+ WhoToFollowPanel,
ChatPanel
},
data: () => ({
@@ -34,9 +36,9 @@ export default {
computed: {
currentUser () { return this.$store.state.users.currentUser },
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 () {
return {
'visibility': this.enableMask ? 'hidden' : 'visible'
@@ -44,24 +46,24 @@ export default {
},
logoMaskStyle () {
return this.enableMask ? {
- 'mask-image': `url(${this.$store.state.config.logo})`
+ 'mask-image': `url(${this.$store.state.instance.logo})`
} : {
'background-color': this.enableMask ? '' : 'transparent'
}
},
logoBgStyle () {
return Object.assign({
- 'margin': `${this.$store.state.config.logoMargin} 0`
+ 'margin': `${this.$store.state.instance.logoMargin} 0`
}, this.enableMask ? {} : {
'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})` } },
- sitename () { return this.$store.state.config.name },
+ sitename () { return this.$store.state.instance.name },
chat () { return this.$store.state.chat.channel.state === 'joined' },
- suggestionsEnabled () { return this.$store.state.config.suggestionsEnabled },
- showInstanceSpecificPanel () { return this.$store.state.config.showInstanceSpecificPanel }
+ suggestionsEnabled () { return this.$store.state.instance.suggestionsEnabled },
+ showInstanceSpecificPanel () { return this.$store.state.instance.showInstanceSpecificPanel }
},
methods: {
activatePanel (panelName) {
diff --git a/src/App.scss b/src/App.scss
index dd43c5ca..056a235e 100644
--- a/src/App.scss
+++ b/src/App.scss
@@ -248,6 +248,7 @@ nav {
justify-content: center;
flex: 0 0 auto;
z-index: -1;
+
.mask {
mask-repeat: no-repeat;
mask-position: center;
@@ -260,7 +261,10 @@ nav {
left: 0;
right: 0;
}
+
img {
+ height: 100%;
+ object-fit: contain;
display: block;
flex: 0;
}
@@ -325,18 +329,35 @@ main-router {
background-size: cover;
padding: .6em .6em;
text-align: left;
- font-size: 1.3em;
- line-height: 24px;
+ line-height: 28px;
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
align-items: baseline;
.title {
flex: 1 0 auto;
+ font-size: 1.3em;
+ }
+
+ .alert {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow-x: hidden;
}
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;
}
}
diff --git a/src/App.vue b/src/App.vue
index fc446c57..059460f9 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -28,6 +28,7 @@
+
diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue
index e41929fd..5528fef6 100644
--- a/src/components/conversation/conversation.vue
+++ b/src/components/conversation/conversation.vue
@@ -3,7 +3,7 @@
diff --git a/src/components/favorite_button/favorite_button.js b/src/components/favorite_button/favorite_button.js
index 80893719..1621341e 100644
--- a/src/components/favorite_button/favorite_button.js
+++ b/src/components/favorite_button/favorite_button.js
@@ -2,7 +2,9 @@ const FavoriteButton = {
props: ['status', 'loggedIn'],
data () {
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
}
},
diff --git a/src/components/features_panel/features_panel.js b/src/components/features_panel/features_panel.js
new file mode 100644
index 00000000..e0b7a118
--- /dev/null
+++ b/src/components/features_panel/features_panel.js
@@ -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
diff --git a/src/components/features_panel/features_panel.vue b/src/components/features_panel/features_panel.vue
new file mode 100644
index 00000000..445143e9
--- /dev/null
+++ b/src/components/features_panel/features_panel.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+ {{$t('features_panel.title')}}
+
+
+
+
+ - {{$t('features_panel.chat')}}
+ - {{$t('features_panel.gopher')}}
+ - {{$t('features_panel.who_to_follow')}}
+ - {{$t('features_panel.media_proxy')}}
+ - {{$t('features_panel.scope_options')}}
+ - {{$t('features_panel.text_limit')}} = {{textlimit}}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/instance_specific_panel/instance_specific_panel.js b/src/components/instance_specific_panel/instance_specific_panel.js
index abd408c8..09e3d055 100644
--- a/src/components/instance_specific_panel/instance_specific_panel.js
+++ b/src/components/instance_specific_panel/instance_specific_panel.js
@@ -1,7 +1,7 @@
const InstanceSpecificPanel = {
computed: {
instanceSpecificPanelContent () {
- return this.$store.state.config.instanceSpecificPanelContent
+ return this.$store.state.instance.instanceSpecificPanelContent
}
}
}
diff --git a/src/components/login_form/login_form.js b/src/components/login_form/login_form.js
index a117b76f..4405fb92 100644
--- a/src/components/login_form/login_form.js
+++ b/src/components/login_form/login_form.js
@@ -5,7 +5,7 @@ const LoginForm = {
}),
computed: {
loggingIn () { return this.$store.state.users.loggingIn },
- registrationOpen () { return this.$store.state.config.registrationOpen }
+ registrationOpen () { return this.$store.state.instance.registrationOpen }
},
methods: {
submit () {
diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss
index 4dbceede..a137ccd5 100644
--- a/src/components/notifications/notifications.scss
+++ b/src/components/notifications/notifications.scss
@@ -22,10 +22,6 @@
}
.loadmore-error {
- min-width: 6em;
- text-align: center;
- padding: 0 0.25em 0 0.25em;
- margin: 0;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
}
diff --git a/src/components/post_status_form/post_status_form.js b/src/components/post_status_form/post_status_form.js
index d7f1ffb2..a84e764c 100644
--- a/src/components/post_status_form/post_status_form.js
+++ b/src/components/post_status_form/post_status_form.js
@@ -75,8 +75,11 @@ const PostStatusForm = {
candidates () {
const firstchar = this.textAtCaret.charAt(0)
if (firstchar === '@') {
- const matchedUsers = filter(this.users, (user) => (String(user.name + user.screen_name)).toUpperCase()
- .startsWith(this.textAtCaret.slice(1).toUpperCase()))
+ const query = 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) {
return false
}
@@ -99,7 +102,7 @@ const PostStatusForm = {
name: '',
utf: utf || '',
// 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
}))
} else {
@@ -117,16 +120,16 @@ const PostStatusForm = {
return this.$store.state.users.users
},
emoji () {
- return this.$store.state.config.emoji || []
+ return this.$store.state.instance.emoji || []
},
customEmoji () {
- return this.$store.state.config.customEmoji || []
+ return this.$store.state.instance.customEmoji || []
},
statusLength () {
return this.newStatus.status.length
},
statusLengthLimit () {
- return this.$store.state.config.textlimit
+ return this.$store.state.instance.textlimit
},
hasStatusLengthLimit () {
return this.statusLengthLimit > 0
@@ -138,10 +141,10 @@ const PostStatusForm = {
return this.hasStatusLengthLimit && (this.statusLength > this.statusLengthLimit)
},
scopeOptionsEnabled () {
- return this.$store.state.config.scopeOptionsEnabled
+ return this.$store.state.instance.scopeOptionsEnabled
},
formattingOptionsEnabled () {
- return this.$store.state.config.formattingOptionsEnabled
+ return this.$store.state.instance.formattingOptionsEnabled
}
},
methods: {
diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue
index 559ad016..42e9c65c 100644
--- a/src/components/post_status_form/post_status_form.vue
+++ b/src/components/post_status_form/post_status_form.vue
@@ -90,8 +90,7 @@
-
-
+
diff --git a/src/components/registration/registration.js b/src/components/registration/registration.js
index 73840608..8f59878d 100644
--- a/src/components/registration/registration.js
+++ b/src/components/registration/registration.js
@@ -5,16 +5,16 @@ const registration = {
registering: false
}),
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')
}
// 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')
}
},
computed: {
- termsofservice () { return this.$store.state.config.tos },
+ termsofservice () { return this.$store.state.instance.tos },
token () { return this.$route.params.token }
},
methods: {
diff --git a/src/components/retweet_button/retweet_button.js b/src/components/retweet_button/retweet_button.js
index ef2f271a..1527afc8 100644
--- a/src/components/retweet_button/retweet_button.js
+++ b/src/components/retweet_button/retweet_button.js
@@ -2,7 +2,9 @@ const RetweetButton = {
props: ['status', 'loggedIn', 'visibility'],
data () {
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
}
},
diff --git a/src/components/settings/settings.js b/src/components/settings/settings.js
index 1dd53ab2..fe8a2d9e 100644
--- a/src/components/settings/settings.js
+++ b/src/components/settings/settings.js
@@ -6,23 +6,35 @@ import { filter, trim } from 'lodash'
const settings = {
data () {
+ const user = this.$store.state.config
+ const instance = this.$store.state.instance
+
return {
- hideAttachmentsLocal: this.$store.state.config.hideAttachments,
- hideAttachmentsInConvLocal: this.$store.state.config.hideAttachmentsInConv,
- hideNsfwLocal: this.$store.state.config.hideNsfw,
- hidePostStatsLocal: this.$store.state.config.hidePostStats,
- hideUserStatsLocal: this.$store.state.config.hideUserStats,
- notificationVisibilityLocal: this.$store.state.config.notificationVisibility,
- replyVisibilityLocal: this.$store.state.config.replyVisibility,
- loopVideoLocal: this.$store.state.config.loopVideo,
- loopVideoSilentOnlyLocal: this.$store.state.config.loopVideoSilentOnly,
- muteWordsString: this.$store.state.config.muteWords.join('\n'),
- autoLoadLocal: this.$store.state.config.autoLoad,
- streamingLocal: this.$store.state.config.streaming,
- pauseOnUnfocusedLocal: this.$store.state.config.pauseOnUnfocused,
- hoverPreviewLocal: this.$store.state.config.hoverPreview,
- collapseMessageWithSubjectLocal: this.$store.state.config.collapseMessageWithSubject,
- stopGifs: this.$store.state.config.stopGifs,
+ hideAttachmentsLocal: user.hideAttachments,
+ hideAttachmentsInConvLocal: user.hideAttachmentsInConv,
+ hideNsfwLocal: user.hideNsfw,
+ hidePostStatsLocal: typeof user.hidePostStats === 'undefined'
+ ? instance.hidePostStats
+ : user.hidePostStats,
+ hidePostStatsDefault : this.$t('settings.values.' + instance.hidePostStats),
+ hideUserStatsLocal: typeof user.hideUserStats === 'undefined'
+ ? instance.hideUserStats
+ : user.hideUserStats,
+ hideUserStatsDefault : this.$t('settings.values.' + instance.hideUserStats),
+ notificationVisibilityLocal: user.notificationVisibility,
+ replyVisibilityLocal: user.replyVisibility,
+ loopVideoLocal: user.loopVideo,
+ loopVideoSilentOnlyLocal: user.loopVideoSilentOnly,
+ 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:
// Firefox
Object.getOwnPropertyDescriptor(HTMLVideoElement.prototype, 'mozHasAudio') ||
@@ -40,6 +52,9 @@ const settings = {
computed: {
user () {
return this.$store.state.users.currentUser
+ },
+ currentSaveStateNotice () {
+ return this.$store.state.interface.settings.currentSaveStateNotice
}
},
watch: {
diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue
index 18e8e244..652bdcc1 100644
--- a/src/components/settings/settings.vue
+++ b/src/components/settings/settings.vue
@@ -1,7 +1,21 @@
- {{$t('settings.settings')}}
+
+ {{$t('settings.settings')}}
+
+
+
+
+
+ {{ $t('settings.saving_err') }}
+
+
+
+ {{ $t('settings.saving_ok') }}
+
+
+
-
+
-
+
diff --git a/src/components/still-image/still-image.vue b/src/components/still-image/still-image.vue
index e23f8bc1..1dcb7ce6 100644
--- a/src/components/still-image/still-image.vue
+++ b/src/components/still-image/still-image.vue
@@ -23,6 +23,7 @@
img {
width: 100%;
height: 100%;
+ object-fit: contain;
}
&.animated {
diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue
index e42c0c4b..2dd4376a 100644
--- a/src/components/timeline/timeline.vue
+++ b/src/components/timeline/timeline.vue
@@ -4,12 +4,12 @@
{{title}}
-
{{$t('timeline.error_fetching')}}
+
{{$t('timeline.up_to_date')}}
@@ -58,7 +58,6 @@
.timeline {
.loadmore-text {
- font-size: 14px;
opacity: 0.8;
background-color: transparent;
color: $fallback--faint;
@@ -66,11 +65,6 @@
}
.loadmore-error {
- font-size: 14px;
- min-width: 6em;
- text-align: center;
- padding: 0 0.25em 0 0.25em;
- margin: 0;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
}
diff --git a/src/components/user_card_content/user_card_content.js b/src/components/user_card_content/user_card_content.js
index eefa65f3..b5dd9b91 100644
--- a/src/components/user_card_content/user_card_content.js
+++ b/src/components/user_card_content/user_card_content.js
@@ -5,7 +5,9 @@ export default {
props: [ 'user', 'switcher', 'selected', 'hideBio' ],
data () {
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: {
diff --git a/src/components/user_panel/user_panel.vue b/src/components/user_panel/user_panel.vue
index 3d4f873d..2d5cb500 100644
--- a/src/components/user_panel/user_panel.vue
+++ b/src/components/user_panel/user_panel.vue
@@ -14,8 +14,10 @@
diff --git a/src/components/user_settings/user_settings.js b/src/components/user_settings/user_settings.js
index 0b13a668..a6203962 100644
--- a/src/components/user_settings/user_settings.js
+++ b/src/components/user_settings/user_settings.js
@@ -7,6 +7,7 @@ const UserSettings = {
newname: this.$store.state.users.currentUser.name,
newbio: this.$store.state.users.currentUser.description,
newlocked: this.$store.state.users.currentUser.locked,
+ newnorichtext: this.$store.state.users.currentUser.no_rich_text,
newdefaultScope: this.$store.state.users.currentUser.default_scope,
followList: null,
followImportError: false,
@@ -32,10 +33,10 @@ const UserSettings = {
return this.$store.state.users.currentUser
},
pleromaBackend () {
- return this.$store.state.config.pleromaBackend
+ return this.$store.state.instance.pleromaBackend
},
scopeOptionsEnabled () {
- return this.$store.state.config.scopeOptionsEnabled
+ return this.$store.state.instance.scopeOptionsEnabled
},
vis () {
return {
@@ -53,7 +54,8 @@ const UserSettings = {
const locked = this.newlocked
/* eslint-disable camelcase */
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) {
this.$store.commit('addNewUsers', [user])
this.$store.commit('setCurrentUser', user)
diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue
index 9daafdce..a2a101dc 100644
--- a/src/components/user_settings/user_settings.vue
+++ b/src/components/user_settings/user_settings.vue
@@ -25,6 +25,10 @@
+
+
+
+
diff --git a/src/components/who_to_follow_panel/who_to_follow_panel.js b/src/components/who_to_follow_panel/who_to_follow_panel.js
index 6766e561..49b8f5b6 100644
--- a/src/components/who_to_follow_panel/who_to_follow_panel.js
+++ b/src/components/who_to_follow_panel/who_to_follow_panel.js
@@ -3,9 +3,10 @@ import apiService from '../../services/api/api.service.js'
function showWhoToFollow (panel, reply) {
var users = reply
var cn
- var index = 0
- var random = Math.floor(Math.random() * 10)
- for (cn = random; cn < users.length; cn = cn + 10) {
+ var index
+ var step = 7
+ cn = Math.floor(Math.random() * step)
+ for (index = 0; index < 3; index++) {
var user
user = users[cn]
var img
@@ -46,10 +47,7 @@ function showWhoToFollow (panel, reply) {
}
})
}
- index = index + 1
- if (index > 2) {
- break
- }
+ cn = (cn + step) % users.length
}
}
@@ -85,14 +83,14 @@ const WhoToFollowPanel = {
moreUrl: function () {
var host = window.location.hostname
var user = this.user
- var suggestionsWeb = this.$store.state.config.suggestionsWeb
+ var suggestionsWeb = this.$store.state.instance.suggestionsWeb
var url
url = suggestionsWeb.replace(/{{host}}/g, encodeURIComponent(host))
url = url.replace(/{{user}}/g, encodeURIComponent(user))
return url
},
suggestionsEnabled () {
- return this.$store.state.config.suggestionsEnabled
+ return this.$store.state.instance.suggestionsEnabled
}
},
watch: {
diff --git a/src/components/who_to_follow_panel/who_to_follow_panel.vue b/src/components/who_to_follow_panel/who_to_follow_panel.vue
index 8b3abe70..d031318d 100644
--- a/src/components/who_to_follow_panel/who_to_follow_panel.vue
+++ b/src/components/who_to_follow_panel/who_to_follow_panel.vue
@@ -11,7 +11,7 @@
{{ name1 }}
{{ name2 }}
{{ name3 }}
-
{{$t('who_to_follow.more')}}
+
{{$t('who_to_follow.more')}}
diff --git a/src/i18n/compare.js b/src/i18n/compare.js
new file mode 100755
index 00000000..e9314376
--- /dev/null
+++ b/src/i18n/compare.js
@@ -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 ')
+ console.log(' or')
+ console.log(' node ./compare.js ')
+ console.log('')
+ console.log('Where 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)
diff --git a/src/i18n/de.json b/src/i18n/de.json
new file mode 100644
index 00000000..4e742bad
--- /dev/null
+++ b/src/i18n/de.json
@@ -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"
+ }
+}
diff --git a/src/i18n/en.json b/src/i18n/en.json
new file mode 100644
index 00000000..8963e479
--- /dev/null
+++ b/src/i18n/en.json
@@ -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"
+ }
+}
diff --git a/src/i18n/eo.json b/src/i18n/eo.json
new file mode 100644
index 00000000..ed4b50e3
--- /dev/null
+++ b/src/i18n/eo.json
@@ -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"
+ }
+}
diff --git a/src/i18n/es.json b/src/i18n/es.json
new file mode 100644
index 00000000..3391c6af
--- /dev/null
+++ b/src/i18n/es.json
@@ -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"
+ }
+}
diff --git a/src/i18n/et.json b/src/i18n/et.json
new file mode 100644
index 00000000..5262b2a4
--- /dev/null
+++ b/src/i18n/et.json
@@ -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"
+ }
+}
diff --git a/src/i18n/fi.json b/src/i18n/fi.json
new file mode 100644
index 00000000..08cfb617
--- /dev/null
+++ b/src/i18n/fi.json
@@ -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"
+ }
+}
diff --git a/src/i18n/fr.json b/src/i18n/fr.json
new file mode 100644
index 00000000..2140ef7f
--- /dev/null
+++ b/src/i18n/fr.json
@@ -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": "J’aime",
+ "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"
+ }
+}
diff --git a/src/i18n/he.json b/src/i18n/he.json
new file mode 100644
index 00000000..99ae9551
--- /dev/null
+++ b/src/i18n/he.json
@@ -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": "אחרי מי לעקוב"
+ }
+}
diff --git a/src/i18n/hu.json b/src/i18n/hu.json
new file mode 100644
index 00000000..e98fdc44
--- /dev/null
+++ b/src/i18n/hu.json
@@ -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"
+ }
+}
diff --git a/src/i18n/it.json b/src/i18n/it.json
new file mode 100644
index 00000000..c61e8c71
--- /dev/null
+++ b/src/i18n/it.json
@@ -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"
+ }
+}
diff --git a/src/i18n/ja.json b/src/i18n/ja.json
new file mode 100644
index 00000000..5a31c58f
--- /dev/null
+++ b/src/i18n/ja.json
@@ -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": "おすすめユーザー"
+ }
+}
diff --git a/src/i18n/messages.js b/src/i18n/messages.js
index 56cc7b49..3a2da643 100644
--- a/src/i18n/messages.js
+++ b/src/i18n/messages.js
@@ -1,2048 +1,29 @@
-const de = {
- chat: {
- title: 'Chat'
- },
- nav: {
- chat: 'Lokaler Chat',
- timeline: 'Zeitleiste',
- mentions: 'Erwähnungen',
- public_tl: 'Lokale Zeitleiste',
- twkn: 'Das gesamte Netzwerk'
- },
- user_card: {
- follows_you: 'Folgt dir!',
- following: 'Folgst du!',
- follow: 'Folgen',
- blocked: 'Blockiert!',
- block: 'Blockieren',
- statuses: 'Beiträge',
- mute: 'Stummschalten',
- muted: 'Stummgeschaltet',
- followers: 'Folgende',
- followees: 'Folgt',
- per_day: 'pro Tag',
- remote_follow: 'Remote Follow'
- },
- timeline: {
- show_new: 'Zeige Neuere',
- error_fetching: 'Fehler beim Laden',
- up_to_date: 'Aktuell',
- load_older: 'Lade ältere Beiträge',
- conversation: 'Unterhaltung',
- collapse: 'Einklappen',
- repeated: 'wiederholte'
- },
- settings: {
- user_settings: 'Benutzereinstellungen',
- name_bio: 'Name & Bio',
- name: 'Name',
- bio: 'Bio',
- avatar: 'Avatar',
- current_avatar: 'Dein derzeitiger Avatar',
- set_new_avatar: 'Setze neuen Avatar',
- profile_banner: 'Profil Banner',
- current_profile_banner: 'Dein derzeitiger Profil Banner',
- set_new_profile_banner: 'Setze neuen Profil Banner',
- profile_background: 'Profil Hintergrund',
- set_new_profile_background: 'Setze neuen Profil Hintergrund',
- settings: 'Einstellungen',
- theme: 'Farbschema',
- presets: 'Voreinstellungen',
- export_theme: 'Farbschema speichern',
- import_theme: 'Farbschema laden',
- invalid_theme_imported: 'Die ausgewählte Datei ist kein unterstütztes Pleroma-Theme. Keine Änderungen wurden vorgenommen.',
- theme_help: 'Benutze HTML Farbcodes (#rrggbb) um dein Farbschema anzupassen',
- radii_help: 'Kantenrundung (in Pixel) der Oberfläche anpassen',
- background: 'Hintergrund',
- foreground: 'Vordergrund',
- text: 'Text',
- links: 'Links',
- cBlue: 'Blau (Antworten, Folgt dir)',
- cRed: 'Rot (Abbrechen)',
- cOrange: 'Orange (Favorisieren)',
- cGreen: 'Grün (Retweet)',
- btnRadius: 'Buttons',
- inputRadius: 'Eingabefelder',
- panelRadius: 'Panel',
- avatarRadius: 'Avatare',
- avatarAltRadius: 'Avatare (Benachrichtigungen)',
- tooltipRadius: 'Tooltips/Warnungen',
- attachmentRadius: 'Anhänge',
- filtering: 'Filter',
- filtering_explanation: 'Alle Beiträge die diese Wörter enthalten werden ausgeblendet. Ein Wort pro Zeile.',
- attachments: 'Anhänge',
- hide_attachments_in_tl: 'Anhänge in der Zeitleiste ausblenden',
- hide_attachments_in_convo: 'Anhänge in Unterhaltungen ausblenden',
- nsfw_clickthrough: 'Aktiviere ausblendbares Overlay für Anhänge, die als NSFW markiert sind',
- stop_gifs: 'Play-on-hover GIFs',
- autoload: 'Aktiviere automatisches Laden von älteren Beiträgen beim scrollen',
- streaming: 'Aktiviere automatisches Laden (Streaming) von neuen Beiträgen',
- reply_link_preview: 'Aktiviere reply-link Vorschau bei Maus-Hover',
- follow_import: 'Folgeliste importieren',
- import_followers_from_a_csv_file: 'Importiere Kontakte, denen du folgen möchtest, aus einer CSV-Datei',
- follows_imported: 'Folgeliste importiert! Die Bearbeitung kann eine Zeit lang dauern.',
- follow_import_error: 'Fehler beim importieren der Folgeliste',
- delete_account: 'Account löschen',
- delete_account_description: 'Lösche deinen Account und alle deine Nachrichten dauerhaft.',
- delete_account_instructions: 'Tippe dein Passwort unten in das Feld ein um die Löschung deines Accounts zu bestätigen.',
- delete_account_error: 'Es ist ein Fehler beim löschen deines Accounts aufgetreten. Tritt dies weiterhin auf, wende dich an den Administrator der Instanz.',
- follow_export: 'Folgeliste exportieren',
- follow_export_processing: 'In Bearbeitung. Die Liste steht gleich zum herunterladen bereit.',
- follow_export_button: 'Liste (.csv) erstellen',
- change_password: 'Passwort ändern',
- current_password: 'Aktuelles Passwort',
- new_password: 'Neues Passwort',
- confirm_new_password: 'Neues Passwort bestätigen',
- changed_password: 'Passwort erfolgreich geändert!',
- change_password_error: 'Es gab ein Problem bei der Änderung des Passworts.'
- },
- notifications: {
- notifications: 'Benachrichtigungen',
- read: 'Gelesen!',
- followed_you: 'folgt dir',
- favorited_you: 'favorisierte deine Nachricht',
- repeated_you: 'wiederholte deine Nachricht'
- },
- login: {
- login: 'Anmelden',
- username: 'Benutzername',
- placeholder: 'z.B. lain',
- password: 'Passwort',
- register: 'Registrieren',
- logout: 'Abmelden'
- },
- registration: {
- registration: 'Registrierung',
- fullname: 'Angezeigter Name',
- email: 'Email',
- bio: 'Bio',
- password_confirm: 'Passwort bestätigen'
- },
- post_status: {
- posting: 'Veröffentlichen',
- default: 'Sitze gerade im Hofbräuhaus.',
- account_not_locked_warning: 'Dein Profil ist nicht {0}. Wer dir folgen will, kann das jederzeit tun und dann auch deine privaten Beiträge sehen.',
- account_not_locked_warning_link: 'gesperrt',
- direct_warning: 'Dieser Beitrag wird nur für die erwähnten Nutzer sichtbar sein.',
- scope: {
- public: 'Öffentlich - Beitrag an öffentliche Zeitleisten',
- unlisted: 'Nicht gelistet - Nicht in öffentlichen Zeitleisten anzeigen',
- private: 'Nur Folgende - Beitrag nur an Folgende',
- direct: 'Direkt - Beitrag nur an erwähnte Profile'
- }
- },
- finder: {
- find_user: 'Finde Benutzer',
- error_fetching_user: 'Fehler beim Suchen des Benutzers'
- },
- general: {
- submit: 'Absenden',
- apply: 'Anwenden'
- },
- user_profile: {
- timeline_title: 'Beiträge'
- }
-}
+// When contributing, please sort JSON before committing so it would be easier to see what's missing and what's being added compared to English and other languages. It's not obligatory, but just an advice.
+// To sort json use jq https://stedolan.github.io/jq and invoke it like `jq -S . xx.json > xx.sorted.json`, AFAIK, there's no inplace edit option like in sed
-const fi = {
- nav: {
- timeline: 'Aikajana',
- mentions: 'Maininnat',
- public_tl: 'Julkinen Aikajana',
- twkn: 'Koko Tunnettu Verkosto'
- },
- user_card: {
- follows_you: 'Seuraa sinua!',
- following: 'Seuraat!',
- follow: 'Seuraa',
- statuses: 'Viestit',
- mute: 'Hiljennä',
- muted: 'Hiljennetty',
- followers: 'Seuraajat',
- followees: 'Seuraa',
- per_day: 'päivässä'
- },
- timeline: {
- show_new: 'Näytä uudet',
- error_fetching: 'Virhe ladatessa viestejä',
- up_to_date: 'Ajantasalla',
- load_older: 'Lataa vanhempia viestejä',
- conversation: 'Keskustelu',
- collapse: 'Sulje',
- repeated: 'toisti'
- },
- settings: {
- user_settings: 'Käyttäjän asetukset',
- name_bio: 'Nimi ja kuvaus',
- name: 'Nimi',
- bio: 'Kuvaus',
- avatar: 'Profiilikuva',
- current_avatar: 'Nykyinen profiilikuvasi',
- set_new_avatar: 'Aseta uusi profiilikuva',
- profile_banner: 'Juliste',
- current_profile_banner: 'Nykyinen julisteesi',
- set_new_profile_banner: 'Aseta uusi juliste',
- profile_background: 'Taustakuva',
- set_new_profile_background: 'Aseta uusi taustakuva',
- settings: 'Asetukset',
- theme: 'Teema',
- presets: 'Valmiit teemat',
- theme_help: 'Käytä heksadesimaalivärejä muokataksesi väriteemaasi.',
- background: 'Tausta',
- foreground: 'Korostus',
- text: 'Teksti',
- links: 'Linkit',
- filtering: 'Suodatus',
- filtering_explanation: 'Kaikki viestit, jotka sisältävät näitä sanoja, suodatetaan. Yksi sana per rivi.',
- attachments: 'Liitteet',
- hide_attachments_in_tl: 'Piilota liitteet aikajanalla',
- hide_attachments_in_convo: 'Piilota liitteet keskusteluissa',
- nsfw_clickthrough: 'Piilota NSFW liitteet klikkauksen taakse.',
- autoload: 'Lataa vanhempia viestejä automaattisesti ruudun pohjalla',
- streaming: 'Näytä uudet viestit automaattisesti ollessasi ruudun huipulla',
- reply_link_preview: 'Keskusteluiden vastauslinkkien esikatselu'
- },
- notifications: {
- notifications: 'Ilmoitukset',
- read: 'Lue!',
- followed_you: 'seuraa sinua',
- favorited_you: 'tykkäsi viestistäsi',
- repeated_you: 'toisti viestisi'
- },
- login: {
- login: 'Kirjaudu sisään',
- username: 'Käyttäjänimi',
- placeholder: 'esim. lain',
- password: 'Salasana',
- register: 'Rekisteröidy',
- logout: 'Kirjaudu ulos'
- },
- registration: {
- registration: 'Rekisteröityminen',
- fullname: 'Koko nimi',
- email: 'Sähköposti',
- bio: 'Kuvaus',
- password_confirm: 'Salasanan vahvistaminen'
- },
- post_status: {
- posting: 'Lähetetään',
- default: 'Tulin juuri saunasta.'
- },
- finder: {
- find_user: 'Hae käyttäjä',
- error_fetching_user: 'Virhe hakiessa käyttäjää'
- },
- general: {
- submit: 'Lähetä',
- apply: 'Aseta'
- }
-}
-
-const en = {
- chat: {
- title: 'Chat'
- },
- nav: {
- chat: 'Local Chat',
- timeline: 'Timeline',
- mentions: 'Mentions',
- public_tl: 'Public Timeline',
- twkn: 'The Whole Known Network',
- friend_requests: 'Follow Requests'
- },
- user_card: {
- follows_you: 'Follows you!',
- following: 'Following!',
- follow: 'Follow',
- blocked: 'Blocked!',
- block: 'Block',
- statuses: 'Statuses',
- mute: 'Mute',
- muted: 'Muted',
- followers: 'Followers',
- followees: 'Following',
- per_day: 'per day',
- remote_follow: 'Remote follow',
- approve: 'Approve',
- deny: 'Deny'
- },
- timeline: {
- show_new: 'Show new',
- error_fetching: 'Error fetching updates',
- up_to_date: 'Up-to-date',
- load_older: 'Load older statuses',
- conversation: 'Conversation',
- collapse: 'Collapse',
- repeated: 'repeated',
- no_retweet_hint: 'Post is marked as followers-only or direct and cannot be repeated'
- },
- settings: {
- general: 'General',
- user_settings: 'User Settings',
- name_bio: 'Name & Bio',
- name: 'Name',
- bio: 'Bio',
- avatar: 'Avatar',
- current_avatar: 'Your current avatar',
- set_new_avatar: 'Set new avatar',
- profile_banner: 'Profile Banner',
- current_profile_banner: 'Your current profile banner',
- set_new_profile_banner: 'Set new profile banner',
- profile_background: 'Profile Background',
- set_new_profile_background: 'Set new profile background',
- settings: 'Settings',
- theme: 'Theme',
- presets: 'Presets',
- export_theme: 'Save preset',
- import_theme: 'Load preset',
- theme_help: 'Use hex color codes (#rrggbb) to customize your color theme.',
- invalid_theme_imported: 'The selected file is not a supported Pleroma theme. No changes to your theme were made.',
- radii_help: 'Set up interface edge rounding (in pixels)',
- background: 'Background',
- foreground: 'Foreground',
- text: 'Text',
- links: 'Links',
- cBlue: 'Blue (Reply, follow)',
- cRed: 'Red (Cancel)',
- cOrange: 'Orange (Favorite)',
- cGreen: 'Green (Retweet)',
- btnRadius: 'Buttons',
- inputRadius: 'Input fields',
- panelRadius: 'Panels',
- avatarRadius: 'Avatars',
- avatarAltRadius: 'Avatars (Notifications)',
- tooltipRadius: 'Tooltips/alerts',
- attachmentRadius: 'Attachments',
- filtering: 'Filtering',
- filtering_explanation: 'All statuses containing these words will be muted, one per line',
- attachments: 'Attachments',
- hide_attachments_in_tl: 'Hide attachments in timeline',
- hide_attachments_in_convo: 'Hide attachments in conversations',
- nsfw_clickthrough: 'Enable clickthrough NSFW attachment hiding',
- collapse_subject: 'Collapse posts with subjects',
- stop_gifs: 'Play-on-hover GIFs',
- autoload: 'Enable automatic loading when scrolled to the bottom',
- streaming: 'Enable automatic streaming of new posts when scrolled to the top',
- pause_on_unfocused: 'Pause streaming when tab is not focused',
- loop_video: 'Loop videos',
- loop_video_silent_only: 'Loop only videos without sound (i.e. Mastodon\'s "gifs")',
- reply_link_preview: 'Enable reply-link preview on mouse hover',
- replies_in_timeline: 'Replies in timeline',
- hide_post_stats: 'Hide post statistics (e.g. repeat and favorite counts)',
- hide_user_stats: 'Hide user statistics (e.g. status and follower counts)',
- 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',
- notification_visibility: 'Types of notifications to show',
- notification_visibility_likes: 'Likes',
- notification_visibility_mentions: 'Mentions',
- notification_visibility_repeats: 'Repeats',
- notification_visibility_follows: 'Follows',
- follow_import: 'Follow import',
- import_followers_from_a_csv_file: 'Import follows from a csv file',
- follows_imported: 'Follows imported! Processing them will take a while.',
- follow_import_error: 'Error importing followers',
- delete_account: 'Delete Account',
- delete_account_description: 'Permanently delete your account and all your messages.',
- delete_account_instructions: 'Type your password in the input below to confirm account deletion.',
- delete_account_error: 'There was an issue deleting your account. If this persists please contact your instance administrator.',
- follow_export: 'Follow export',
- follow_export_processing: 'Processing, you\'ll soon be asked to download your file',
- follow_export_button: 'Export your follows to a csv file',
- change_password: 'Change Password',
- current_password: 'Current password',
- new_password: 'New password',
- confirm_new_password: 'Confirm new password',
- changed_password: 'Password changed successfully!',
- change_password_error: 'There was an issue changing your password.',
- lock_account_description: 'Restrict your account to approved followers only',
- limited_availability: 'Unavailable in your browser',
- default_vis: 'Default visibility scope',
- profile_tab: 'Profile',
- security_tab: 'Security',
- data_import_export_tab: 'Data Import / Export',
- interfaceLanguage: 'Interface language'
- },
- notifications: {
- notifications: 'Notifications',
- read: 'Read!',
- followed_you: 'followed you',
- favorited_you: 'favorited your status',
- repeated_you: 'repeated your status',
- broken_favorite: 'Unknown status, searching for it...',
- load_older: 'Load older notifications'
- },
- login: {
- login: 'Log in',
- username: 'Username',
- placeholder: 'e.g. lain',
- password: 'Password',
- register: 'Register',
- logout: 'Log out'
- },
- registration: {
- registration: 'Registration',
- fullname: 'Display name',
- email: 'Email',
- bio: 'Bio',
- password_confirm: 'Password confirmation',
- token: 'Invite token'
- },
- post_status: {
- posting: 'Posting',
- content_warning: 'Subject (optional)',
- default: 'Just landed in L.A.',
- account_not_locked_warning: 'Your account is not {0}. Anyone can follow you to view your follower-only posts.',
- account_not_locked_warning_link: 'locked',
- direct_warning: 'This post will only be visible to all the mentioned users.',
- attachments_sensitive: 'Attachments marked sensitive',
- attachments_not_sensitive: 'Attachments not marked sensitive',
- scope: {
- public: 'Public - Post to public timelines',
- unlisted: 'Unlisted - Do not post to public timelines',
- private: 'Followers-only - Post to followers only',
- direct: 'Direct - Post to mentioned users only'
- },
- content_type: {
- plain_text: 'Plain text'
- }
- },
- finder: {
- find_user: 'Find user',
- error_fetching_user: 'Error fetching user'
- },
- general: {
- submit: 'Submit',
- apply: 'Apply'
- },
- user_profile: {
- timeline_title: 'User Timeline'
- },
- who_to_follow: {
- who_to_follow: 'Who to follow',
- more: 'More'
- }
-}
-
-const eo = {
- chat: {
- title: 'Babilo'
- },
- nav: {
- chat: 'Loka babilo',
- timeline: 'Tempovido',
- mentions: 'Mencioj',
- public_tl: 'Publika tempovido',
- twkn: 'Tuta konata reto'
- },
- user_card: {
- follows_you: 'Abonas vin!',
- following: 'Abonanta!',
- follow: 'Aboni',
- blocked: 'Barita!',
- block: 'Bari',
- statuses: 'Statoj',
- mute: 'Silentigi',
- muted: 'Silentigita',
- followers: 'Abonantoj',
- followees: 'Abonatoj',
- per_day: 'tage',
- remote_follow: 'Fora abono'
- },
- timeline: {
- show_new: 'Montri novajn',
- error_fetching: 'Eraro ĝisdatigante',
- up_to_date: 'Ĝisdata',
- load_older: 'Enlegi pli malnovajn statojn',
- conversation: 'Interparolo',
- collapse: 'Maletendi',
- repeated: 'ripetata'
- },
- settings: {
- user_settings: 'Uzulaj agordoj',
- name_bio: 'Nomo kaj prio',
- name: 'Nomo',
- bio: 'Prio',
- avatar: 'Profilbildo',
- current_avatar: 'Via nuna profilbildo',
- set_new_avatar: 'Agordi novan profilbildon',
- profile_banner: 'Profila rubando',
- current_profile_banner: 'Via nuna profila rubando',
- set_new_profile_banner: 'Agordi novan profilan rubandon',
- profile_background: 'Profila fono',
- set_new_profile_background: 'Agordi novan profilan fonon',
- settings: 'Agordoj',
- theme: 'Haŭto',
- presets: 'Antaŭmetaĵoj',
- theme_help: 'Uzu deksesumajn kolorkodojn (#rrvvbb) por adapti vian koloran haŭton.',
- radii_help: 'Agordi fasadan rondigon de randoj (rastrumere)',
- background: 'Fono',
- foreground: 'Malfono',
- text: 'Teksto',
- links: 'Ligiloj',
- cBlue: 'Blua (Respondo, abono)',
- cRed: 'Ruĝa (Nuligo)',
- cOrange: 'Orange (Ŝato)',
- cGreen: 'Verda (Kunhavigo)',
- btnRadius: 'Butonoj',
- panelRadius: 'Paneloj',
- avatarRadius: 'Profilbildoj',
- avatarAltRadius: 'Profilbildoj (Sciigoj)',
- tooltipRadius: 'Ŝpruchelpiloj/avertoj',
- attachmentRadius: 'Kunsendaĵoj',
- filtering: 'Filtrado',
- filtering_explanation: 'Ĉiuj statoj kun tiuj ĉi vortoj silentiĝos, po unu linie',
- attachments: 'Kunsendaĵoj',
- hide_attachments_in_tl: 'Kaŝi kunsendaĵojn en tempovido',
- hide_attachments_in_convo: 'Kaŝi kunsendaĵojn en interparoloj',
- nsfw_clickthrough: 'Ŝalti traklakan kaŝon de konsternaj kunsendaĵoj',
- stop_gifs: 'Movi GIF-bildojn dum ŝvebo',
- autoload: 'Ŝalti memfaran enlegadon ĉe subo de paĝo',
- streaming: 'Ŝalti memfaran fluigon de novaj afiŝoj ĉe supro de paĝo',
- reply_link_preview: 'Ŝalti respond-ligilan antaŭvidon dum ŝvebo',
- follow_import: 'Abona enporto',
- import_followers_from_a_csv_file: 'Enporti abonojn de CSV-dosiero',
- follows_imported: 'Abonoj enportiĝis! Traktado daŭros iom.',
- follow_import_error: 'Eraro enportante abonojn'
- },
- notifications: {
- notifications: 'Sciigoj',
- read: 'Legita!',
- followed_you: 'ekabonis vin',
- favorited_you: 'ŝatis vian staton',
- repeated_you: 'ripetis vian staton'
- },
- login: {
- login: 'Saluti',
- username: 'Salutnomo',
- placeholder: 'ekz. lain',
- password: 'Pasvorto',
- register: 'Registriĝi',
- logout: 'Adiaŭi'
- },
- registration: {
- registration: 'Registriĝo',
- fullname: 'Vidiga nomo',
- email: 'Retpoŝtadreso',
- bio: 'Prio',
- password_confirm: 'Konfirmo de pasvorto'
- },
- post_status: {
- posting: 'Afiŝanta',
- default: 'Ĵus alvenis la universalan kongreson!'
- },
- finder: {
- find_user: 'Trovi uzulon',
- error_fetching_user: 'Eraro alportante uzulon'
- },
- general: {
- submit: 'Sendi',
- apply: 'Apliki'
- },
- user_profile: {
- timeline_title: 'Uzula tempovido'
- }
-}
-
-const et = {
- nav: {
- timeline: 'Ajajoon',
- mentions: 'Mainimised',
- public_tl: 'Avalik Ajajoon',
- twkn: 'Kogu Teadaolev Võrgustik'
- },
- user_card: {
- follows_you: 'Jälgib sind!',
- following: 'Jälgin!',
- follow: 'Jälgi',
- blocked: 'Blokeeritud!',
- block: 'Blokeeri',
- statuses: 'Staatuseid',
- mute: 'Vaigista',
- muted: 'Vaigistatud',
- followers: 'Jälgijaid',
- followees: 'Jälgitavaid',
- per_day: 'päevas'
- },
- timeline: {
- show_new: 'Näita uusi',
- error_fetching: 'Viga uuenduste laadimisel',
- up_to_date: 'Uuendatud',
- load_older: 'Kuva vanemaid staatuseid',
- conversation: 'Vestlus'
- },
- settings: {
- user_settings: 'Kasutaja sätted',
- name_bio: 'Nimi ja Bio',
- name: 'Nimi',
- bio: 'Bio',
- avatar: 'Profiilipilt',
- current_avatar: 'Sinu praegune profiilipilt',
- set_new_avatar: 'Vali uus profiilipilt',
- profile_banner: 'Profiilibänner',
- current_profile_banner: 'Praegune profiilibänner',
- set_new_profile_banner: 'Vali uus profiilibänner',
- profile_background: 'Profiilitaust',
- set_new_profile_background: 'Vali uus profiilitaust',
- settings: 'Sätted',
- theme: 'Teema',
- filtering: 'Sisu filtreerimine',
- filtering_explanation: 'Kõiki staatuseid, mis sisaldavad neid sõnu, ei kuvata. Üks sõna reale.',
- attachments: 'Manused',
- hide_attachments_in_tl: 'Peida manused ajajoonel',
- hide_attachments_in_convo: 'Peida manused vastlustes',
- nsfw_clickthrough: 'Peida tööks-mittesobivad(NSFW) manuste hiireklõpsu taha',
- autoload: 'Luba ajajoone automaatne uuendamine kui ajajoon on põhja keritud',
- reply_link_preview: 'Luba algpostituse kuvamine vastustes'
- },
- notifications: {
- notifications: 'Teavitused',
- read: 'Loe!',
- followed_you: 'alustas sinu jälgimist'
- },
- login: {
- login: 'Logi sisse',
- username: 'Kasutajanimi',
- placeholder: 'nt lain',
- password: 'Parool',
- register: 'Registreeru',
- logout: 'Logi välja'
- },
- registration: {
- registration: 'Registreerimine',
- fullname: 'Kuvatav nimi',
- email: 'E-post',
- bio: 'Bio',
- password_confirm: 'Parooli kinnitamine'
- },
- post_status: {
- posting: 'Postitan',
- default: 'Just sõitsin elektrirongiga Tallinnast Pääskülla.'
- },
- finder: {
- find_user: 'Otsi kasutajaid',
- error_fetching_user: 'Viga kasutaja leidmisel'
- },
- general: {
- submit: 'Postita'
- }
-}
-
-const hu = {
- nav: {
- timeline: 'Idővonal',
- mentions: 'Említéseim',
- public_tl: 'Publikus Idővonal',
- twkn: 'Az Egész Ismert Hálózat'
- },
- user_card: {
- follows_you: 'Követ téged!',
- following: 'Követve!',
- follow: 'Követ',
- blocked: 'Letiltva!',
- block: 'Letilt',
- statuses: 'Állapotok',
- mute: 'Némít',
- muted: 'Némított',
- followers: 'Követők',
- followees: 'Követettek',
- per_day: 'naponta'
- },
- timeline: {
- show_new: 'Újak mutatása',
- error_fetching: 'Hiba a frissítések beszerzésénél',
- up_to_date: 'Naprakész',
- load_older: 'Régebbi állapotok betöltése',
- conversation: 'Társalgás'
- },
- settings: {
- user_settings: 'Felhasználói beállítások',
- name_bio: 'Név és Bio',
- name: 'Név',
- bio: 'Bio',
- avatar: 'Avatár',
- current_avatar: 'Jelenlegi avatár',
- set_new_avatar: 'Új avatár',
- profile_banner: 'Profil Banner',
- current_profile_banner: 'Jelenlegi profil banner',
- set_new_profile_banner: 'Új profil banner',
- profile_background: 'Profil háttérkép',
- set_new_profile_background: 'Új profil háttér beállítása',
- settings: 'Beállítások',
- theme: 'Téma',
- filtering: 'Szűrés',
- filtering_explanation: 'Minden tartalom mely ezen szavakat tartalmazza némítva lesz, soronként egy',
- attachments: 'Csatolmányok',
- hide_attachments_in_tl: 'Csatolmányok elrejtése az idővonalon',
- hide_attachments_in_convo: 'Csatolmányok elrejtése a társalgásokban',
- nsfw_clickthrough: 'NSFW átkattintási tartalom elrejtésének engedélyezése',
- autoload: 'Autoatikus betöltés engedélyezése lap aljára görgetéskor',
- reply_link_preview: 'Válasz-link előzetes mutatása egér rátételkor'
- },
- notifications: {
- notifications: 'Értesítések',
- read: 'Olvasva!',
- followed_you: 'követ téged'
- },
- login: {
- login: 'Bejelentkezés',
- username: 'Felhasználó név',
- placeholder: 'e.g. lain',
- password: 'Jelszó',
- register: 'Feliratkozás',
- logout: 'Kijelentkezés'
- },
- registration: {
- registration: 'Feliratkozás',
- fullname: 'Teljes név',
- email: 'Email',
- bio: 'Bio',
- password_confirm: 'Jelszó megerősítése'
- },
- post_status: {
- posting: 'Küldés folyamatban',
- default: 'Most érkeztem L.A.-be'
- },
- finder: {
- find_user: 'Felhasználó keresése',
- error_fetching_user: 'Hiba felhasználó beszerzésével'
- },
- general: {
- submit: 'Elküld'
- }
-}
-
-const ro = {
- nav: {
- timeline: 'Cronologie',
- mentions: 'Menționări',
- public_tl: 'Cronologie Publică',
- twkn: 'Toată Reșeaua Cunoscută'
- },
- user_card: {
- follows_you: 'Te urmărește!',
- following: 'Urmărit!',
- follow: 'Urmărește',
- blocked: 'Blocat!',
- block: 'Blochează',
- statuses: 'Stări',
- mute: 'Pune pe mut',
- muted: 'Pus pe mut',
- followers: 'Următori',
- followees: 'Urmărește',
- per_day: 'pe zi'
- },
- timeline: {
- show_new: 'Arată cele noi',
- error_fetching: 'Erare la preluarea actualizărilor',
- up_to_date: 'La zi',
- load_older: 'Încarcă stări mai vechi',
- conversation: 'Conversație'
- },
- settings: {
- user_settings: 'Setările utilizatorului',
- name_bio: 'Nume și Bio',
- name: 'Nume',
- bio: 'Bio',
- avatar: 'Avatar',
- current_avatar: 'Avatarul curent',
- set_new_avatar: 'Setează avatar nou',
- profile_banner: 'Banner de profil',
- current_profile_banner: 'Bannerul curent al profilului',
- set_new_profile_banner: 'Setează banner nou la profil',
- profile_background: 'Fundalul de profil',
- set_new_profile_background: 'Setează fundal nou',
- settings: 'Setări',
- theme: 'Temă',
- filtering: 'Filtru',
- filtering_explanation: 'Toate stările care conțin aceste cuvinte vor fi puse pe mut, una pe linie',
- attachments: 'Atașamente',
- hide_attachments_in_tl: 'Ascunde atașamentele în cronologie',
- hide_attachments_in_convo: 'Ascunde atașamentele în conversații',
- nsfw_clickthrough: 'Permite ascunderea al atașamentelor NSFW',
- autoload: 'Permite încărcarea automată când scrolat la capăt',
- reply_link_preview: 'Permite previzualizarea linkului de răspuns la planarea de mouse'
- },
- notifications: {
- notifications: 'Notificări',
- read: 'Citit!',
- followed_you: 'te-a urmărit'
- },
- login: {
- login: 'Loghează',
- username: 'Nume utilizator',
- placeholder: 'd.e. lain',
- password: 'Parolă',
- register: 'Înregistrare',
- logout: 'Deloghează'
- },
- registration: {
- registration: 'Îregistrare',
- fullname: 'Numele întreg',
- email: 'Email',
- bio: 'Bio',
- password_confirm: 'Cofirmă parola'
- },
- post_status: {
- posting: 'Postează',
- default: 'Nu de mult am aterizat în L.A.'
- },
- finder: {
- find_user: 'Găsește utilizator',
- error_fetching_user: 'Eroare la preluarea utilizatorului'
- },
- general: {
- submit: 'trimite'
- }
-}
-
-const ja = {
- chat: {
- title: 'チャット'
- },
- nav: {
- chat: 'ローカルチャット',
- timeline: 'タイムライン',
- mentions: 'メンション',
- public_tl: 'パブリックタイムライン',
- twkn: 'つながっているすべてのネットワーク',
- friend_requests: 'Follow Requests'
- },
- user_card: {
- follows_you: 'フォローされました!',
- following: 'フォローしています!',
- follow: 'フォロー',
- blocked: 'ブロックしています!',
- block: 'ブロック',
- statuses: 'ステータス',
- mute: 'ミュート',
- muted: 'ミュートしています!',
- followers: 'フォロワー',
- followees: 'フォロー',
- per_day: '/日',
- remote_follow: 'リモートフォロー',
- approve: 'Approve',
- deny: 'Deny'
- },
- timeline: {
- show_new: 'よみこみ',
- error_fetching: 'よみこみがエラーになりました。',
- up_to_date: 'さいしん',
- load_older: 'ふるいステータス',
- conversation: 'スレッド',
- collapse: 'たたむ',
- repeated: 'リピート'
- },
- settings: {
- user_settings: 'ユーザーせってい',
- name_bio: 'なまえとプロフィール',
- name: 'なまえ',
- bio: 'プロフィール',
- avatar: 'アバター',
- current_avatar: 'いまのアバター',
- set_new_avatar: 'あたらしいアバターをせっていする',
- profile_banner: 'プロフィールバナー',
- current_profile_banner: 'いまのプロフィールバナー',
- set_new_profile_banner: 'あたらしいプロフィールバナーを設定する',
- profile_background: 'プロフィールのバックグラウンド',
- set_new_profile_background: 'あたらしいプロフィールのバックグラウンドをせっていする',
- settings: 'せってい',
- theme: 'テーマ',
- presets: 'プリセット',
- theme_help: 'カラーテーマをカスタマイズできます。',
- radii_help: 'インターフェースのまるさをせっていする。',
- background: 'バックグラウンド',
- foreground: 'フォアグラウンド',
- text: 'もじ',
- links: 'リンク',
- cBlue: 'あお (リプライ, フォロー)',
- cRed: 'あか (キャンセル)',
- cOrange: 'オレンジ (おきにいり)',
- cGreen: 'みどり (リピート)',
- btnRadius: 'ボタン',
- inputRadius: 'Input fields',
- panelRadius: 'パネル',
- avatarRadius: 'アバター',
- avatarAltRadius: 'アバター (つうち)',
- tooltipRadius: 'ツールチップ/アラート',
- attachmentRadius: 'ファイル',
- filtering: 'フィルタリング',
- filtering_explanation: 'これらのことばをふくむすべてのものがミュートされます。1行に1つのことばをかいてください。',
- attachments: 'ファイル',
- hide_attachments_in_tl: 'タイムラインのファイルをかくす。',
- hide_attachments_in_convo: 'スレッドのファイルをかくす。',
- nsfw_clickthrough: 'NSFWなファイルをかくす。',
- stop_gifs: 'カーソルをかさねたとき、GIFをうごかす。',
- autoload: 'したにスクロールしたとき、じどうてきによみこむ。',
- streaming: 'うえまでスクロールしたとき、じどうてきにストリーミングする。',
- reply_link_preview: 'カーソルをかさねたとき、リプライのプレビューをみる。',
- follow_import: 'フォローインポート',
- import_followers_from_a_csv_file: 'CSVファイルからフォローをインポートする。',
- follows_imported: 'フォローがインポートされました! すこしじかんがかかるかもしれません。',
- follow_import_error: 'フォローのインポートがエラーになりました。',
- delete_account: 'アカウントをけす',
- delete_account_description: 'あなたのアカウントとメッセージが、きえます。',
- delete_account_instructions: 'ほんとうにアカウントをけしてもいいなら、パスワードをかいてください。',
- delete_account_error: 'アカウントをけすことが、できなかったかもしれません。インスタンスのかんりしゃに、れんらくしてください。',
- follow_export: 'フォローのエクスポート',
- follow_export_processing: 'おまちください。まもなくファイルをダウンロードできます。',
- follow_export_button: 'エクスポート',
- change_password: 'パスワードをかえる',
- current_password: 'いまのパスワード',
- new_password: 'あたらしいパスワード',
- confirm_new_password: 'あたらしいパスワードのかくにん',
- changed_password: 'パスワードが、かわりました!',
- change_password_error: 'パスワードをかえることが、できなかったかもしれません。',
- lock_account_description: 'あなたがみとめたひとだけ、あなたのアカウントをフォローできます。'
- },
- notifications: {
- notifications: 'つうち',
- read: 'よんだ!',
- followed_you: 'フォローされました',
- favorited_you: 'あなたのステータスがおきにいりされました',
- repeated_you: 'あなたのステータスがリピートされました'
- },
- login: {
- login: 'ログイン',
- username: 'ユーザーめい',
- placeholder: 'れい: lain',
- password: 'パスワード',
- register: 'はじめる',
- logout: 'ログアウト'
- },
- registration: {
- registration: 'はじめる',
- fullname: 'スクリーンネーム',
- email: 'Eメール',
- bio: 'プロフィール',
- password_confirm: 'パスワードのかくにん'
- },
- post_status: {
- posting: 'とうこう',
- content_warning: 'せつめい (かかなくてもよい)',
- default: 'はねだくうこうに、つきました。',
- account_not_locked_warning: 'あなたのアカウントは {0} ではありません。あなたをフォローすれば、だれでも、フォロワーげんていのステータスをよむことができます。',
- account_not_locked_warning_link: 'ロックされたアカウント',
- direct_warning: 'このステータスは、メンションされたユーザーだけが、よむことができます。',
- scope: {
- public: 'パブリック - パブリックタイムラインにとどきます。',
- unlisted: 'アンリステッド - パブリックタイムラインにとどきません。',
- private: 'フォロワーげんてい - フォロワーのみにとどきます。',
- direct: 'ダイレクト - メンションされたユーザーのみにとどきます。'
- }
- },
- finder: {
- find_user: 'ユーザーをさがす',
- error_fetching_user: 'ユーザーけんさくがエラーになりました。'
- },
- general: {
- submit: 'そうしん',
- apply: 'てきよう'
- },
- user_profile: {
- timeline_title: 'ユーザータイムライン'
- },
- who_to_follow: {
- who_to_follow: 'おすすめユーザー',
- more: 'くわしく'
- }
-}
-
-const fr = {
- nav: {
- chat: 'Chat local',
- timeline: 'Journal',
- mentions: 'Notifications',
- public_tl: 'Statuts locaux',
- twkn: 'Le réseau connu'
- },
- user_card: {
- follows_you: 'Vous suit !',
- following: 'Suivi !',
- follow: 'Suivre',
- blocked: 'Bloqué',
- block: 'Bloquer',
- statuses: 'Statuts',
- mute: 'Masquer',
- muted: 'Masqué',
- followers: 'Vous suivent',
- followees: 'Suivis',
- per_day: 'par jour',
- remote_follow: 'Suivre d\'une autre instance'
- },
- timeline: {
- show_new: 'Afficher plus',
- error_fetching: 'Erreur en cherchant les mises à jour',
- up_to_date: 'À jour',
- load_older: 'Afficher plus',
- conversation: 'Conversation',
- collapse: 'Fermer',
- repeated: 'a partagé'
- },
- settings: {
- user_settings: 'Paramètres utilisateur',
- name_bio: 'Nom & Bio',
- name: 'Nom',
- bio: 'Biographie',
- avatar: 'Avatar',
- current_avatar: 'Avatar actuel',
- set_new_avatar: 'Changer d\'avatar',
- profile_banner: 'Bannière de profil',
- current_profile_banner: 'Bannière de profil actuelle',
- set_new_profile_banner: 'Changer de bannière',
- profile_background: 'Image de fond',
- set_new_profile_background: 'Changer d\'image de fond',
- settings: 'Paramètres',
- theme: 'Thème',
- filtering: 'Filtre',
- filtering_explanation: 'Tous les statuts contenant ces mots seront masqués. Un mot par ligne.',
- attachments: 'Pièces jointes',
- hide_attachments_in_tl: 'Masquer les pièces jointes dans le journal',
- hide_attachments_in_convo: 'Masquer les pièces jointes dans les conversations',
- nsfw_clickthrough: 'Masquer les images marquées comme contenu adulte ou sensible',
- autoload: 'Charger la suite automatiquement une fois le bas de la page atteint',
- reply_link_preview: 'Afficher un aperçu lors du survol de liens vers une réponse',
- presets: 'Thèmes prédéfinis',
- theme_help: 'Spécifiez des codes couleur hexadécimaux (#aabbcc) pour personnaliser les couleurs du thème',
- background: 'Arrière-plan',
- foreground: 'Premier plan',
- text: 'Texte',
- links: 'Liens',
- streaming: 'Charger automatiquement les nouveaux statuts lorsque vous êtes au haut de la page',
- follow_import: 'Importer des abonnements',
- import_followers_from_a_csv_file: 'Importer des abonnements depuis un fichier csv',
- follows_imported: 'Abonnements importés ! Le traitement peut prendre un moment.',
- follow_import_error: 'Erreur lors de l\'importation des abonnements.',
- follow_export: 'Exporter les abonnements',
- follow_export_button: 'Exporter les abonnements en csv',
- follow_export_processing: 'Exportation en cours…',
- cBlue: 'Bleu (Répondre, suivre)',
- cRed: 'Rouge (Annuler)',
- cOrange: 'Orange (Aimer)',
- cGreen: 'Vert (Partager)',
- btnRadius: 'Boutons',
- panelRadius: 'Fenêtres',
- inputRadius: 'Champs de texte',
- avatarRadius: 'Avatars',
- avatarAltRadius: 'Avatars (Notifications)',
- tooltipRadius: 'Info-bulles/alertes ',
- attachmentRadius: 'Pièces jointes',
- radii_help: 'Vous pouvez ici choisir le niveau d\'arrondi des angles de l\'interface (en pixels)',
- stop_gifs: 'N\'animer les GIFS que lors du survol du curseur de la souris',
- change_password: 'Modifier son mot de passe',
- current_password: 'Mot de passe actuel',
- new_password: 'Nouveau mot de passe',
- confirm_new_password: 'Confirmation du nouveau mot de passe',
- delete_account: 'Supprimer le compte',
- delete_account_description: 'Supprimer définitivement votre compte et tous vos statuts.',
- delete_account_instructions: 'Indiquez votre mot de passe ci-dessous pour confirmer la suppression de votre compte.',
- delete_account_error: 'Il y a eu un problème lors de la tentative de suppression de votre compte. Si le problème persiste, contactez l\'administrateur de cette instance.'
- },
- notifications: {
- notifications: 'Notifications',
- read: 'Lu !',
- followed_you: 'a commencé à vous suivre',
- favorited_you: 'a aimé votre statut',
- repeated_you: 'a partagé votre statut'
- },
- login: {
- login: 'Connexion',
- username: 'Identifiant',
- placeholder: 'p.e. lain',
- password: 'Mot de passe',
- register: 'S\'inscrire',
- logout: 'Déconnexion'
- },
- registration: {
- registration: 'Inscription',
- fullname: 'Pseudonyme',
- email: 'Adresse email',
- bio: 'Biographie',
- password_confirm: 'Confirmation du mot de passe'
- },
- post_status: {
- posting: 'Envoi en cours',
- default: 'Écrivez ici votre prochain statut.',
- account_not_locked_warning: 'Votre compte n’est pas {0}. N’importe qui peut vous suivre pour voir vos billets en Abonné·e·s uniquement.',
- account_not_locked_warning_link: 'verrouillé',
- direct_warning: 'Ce message sera visible à toutes les personnes mentionnées.',
- scope: {
- public: 'Publique - Afficher dans les fils publics',
- unlisted: 'Non-Listé - Ne pas afficher dans les fils publics',
- private: 'Abonné·e·s uniquement - Seul·e·s vos abonné·e·s verront vos billets',
- direct: 'Direct - N’envoyer qu’aux personnes mentionnées'
- }
- },
- finder: {
- find_user: 'Chercher un utilisateur',
- error_fetching_user: 'Erreur lors de la recherche de l\'utilisateur'
- },
- general: {
- submit: 'Envoyer',
- apply: 'Appliquer'
- },
- user_profile: {
- timeline_title: 'Journal de l\'utilisateur'
- }
-}
-
-const it = {
- nav: {
- timeline: 'Sequenza temporale',
- mentions: 'Menzioni',
- public_tl: 'Sequenza temporale pubblica',
- twkn: 'L\'intiera rete conosciuta'
- },
- user_card: {
- follows_you: 'Ti segue!',
- following: 'Lo stai seguendo!',
- follow: 'Segui',
- statuses: 'Messaggi',
- mute: 'Ammutolisci',
- muted: 'Ammutoliti',
- followers: 'Chi ti segue',
- followees: 'Chi stai seguendo',
- per_day: 'al giorno'
- },
- timeline: {
- show_new: 'Mostra nuovi',
- error_fetching: 'Errori nel prelievo aggiornamenti',
- up_to_date: 'Aggiornato',
- load_older: 'Carica messaggi più vecchi'
- },
- settings: {
- user_settings: 'Configurazione dell\'utente',
- name_bio: 'Nome & Introduzione',
- name: 'Nome',
- bio: 'Introduzione',
- avatar: 'Avatar',
- current_avatar: 'Il tuo attuale avatar',
- set_new_avatar: 'Scegli un nuovo avatar',
- profile_banner: 'Sfondo del tuo profilo',
- current_profile_banner: 'Sfondo attuale',
- set_new_profile_banner: 'Scegli un nuovo sfondo per il tuo profilo',
- profile_background: 'Sfondo della tua pagina',
- set_new_profile_background: 'Scegli un nuovo sfondo per la tua pagina',
- settings: 'Settaggi',
- theme: 'Tema',
- filtering: 'Filtri',
- filtering_explanation: 'Filtra via le notifiche che contengono le seguenti parole (inserisci rigo per rigo le parole di innesco)',
- attachments: 'Allegati',
- hide_attachments_in_tl: 'Nascondi gli allegati presenti nella sequenza temporale',
- hide_attachments_in_convo: 'Nascondi gli allegati presenti nelle conversazioni',
- nsfw_clickthrough: 'Abilita la trasparenza degli allegati NSFW',
- autoload: 'Abilita caricamento automatico quando si raggiunge il fondo schermo',
- reply_link_preview: 'Ability il reply-link preview al passaggio del mouse'
- },
- notifications: {
- notifications: 'Notifiche',
- read: 'Leggi!',
- followed_you: 'ti ha seguito'
- },
- general: {
- submit: 'Invia'
- }
-}
-
-const oc = {
- chat: {
- title: 'Messatjariá'
- },
- nav: {
- chat: 'Chat local',
- timeline: 'Flux d’actualitat',
- mentions: 'Notificacions',
- public_tl: 'Estatuts locals',
- twkn: 'Lo malhum conegut'
- },
- user_card: {
- follows_you: 'Vos sèc !',
- following: 'Seguit !',
- follow: 'Seguir',
- blocked: 'Blocat',
- block: 'Blocar',
- statuses: 'Estatuts',
- mute: 'Amagar',
- muted: 'Amagat',
- followers: 'Seguidors',
- followees: 'Abonaments',
- per_day: 'per jorn',
- remote_follow: 'Seguir a distància'
- },
- timeline: {
- show_new: 'Ne veire mai',
- error_fetching: 'Error en cercant de mesas a jorn',
- up_to_date: 'A jorn',
- load_older: 'Ne veire mai',
- conversation: 'Conversacion',
- collapse: 'Tampar',
- repeated: 'repetit'
- },
- settings: {
- user_settings: 'Paramètres utilizaire',
- name_bio: 'Nom & Bio',
- name: 'Nom',
- bio: 'Biografia',
- avatar: 'Avatar',
- current_avatar: 'Vòstre avatar actual',
- set_new_avatar: 'Cambiar l’avatar',
- profile_banner: 'Bandièra del perfil',
- current_profile_banner: 'Bandièra actuala del perfil',
- set_new_profile_banner: 'Cambiar de bandièra',
- profile_background: 'Imatge de fons',
- set_new_profile_background: 'Cambiar l’imatge de fons',
- settings: 'Paramètres',
- theme: 'Tèma',
- presets: 'Pre-enregistrats',
- theme_help: 'Emplegatz los còdis de color hex (#rrggbb) per personalizar vòstre tèma de color.',
- radii_help: 'Configurar los caires arredondits de l’interfàcia (en pixèls)',
- background: 'Rèire plan',
- foreground: 'Endavant',
- text: 'Tèxte',
- links: 'Ligams',
- cBlue: 'Blau (Respondre, seguir)',
- cRed: 'Roge (Anullar)',
- cOrange: 'Irange (Metre en favorit)',
- cGreen: 'Verd (Repartajar)',
- inputRadius: 'Camps tèxte',
- btnRadius: 'Botons',
- panelRadius: 'Panèls',
- avatarRadius: 'Avatars',
- avatarAltRadius: 'Avatars (Notificacions)',
- tooltipRadius: 'Astúcias/Alèrta',
- attachmentRadius: 'Pèças juntas',
- filtering: 'Filtre',
- filtering_explanation: 'Totes los estatuts amb aqueles mots seràn en silenci, un mot per linha.',
- attachments: 'Pèças juntas',
- hide_attachments_in_tl: 'Rescondre las pèças juntas',
- hide_attachments_in_convo: 'Rescondre las pèças juntas dins las conversacions',
- nsfw_clickthrough: 'Activar lo clic per mostrar los imatges marcats coma pels adults o sensibles',
- stop_gifs: 'Lançar los GIFs al subrevòl',
- autoload: 'Activar lo cargament automatic un còp arribat al cap de la pagina',
- streaming: 'Activar lo cargament automatic dels novèls estatus en anar amont',
- reply_link_preview: 'Activar l’apercebut en passar la mirga',
- follow_import: 'Importar los abonaments',
- import_followers_from_a_csv_file: 'Importar los seguidors d’un fichièr csv',
- follows_imported: 'Seguidors importats. Lo tractament pòt trigar una estona.',
- follow_import_error: 'Error en important los seguidors'
- },
- notifications: {
- notifications: 'Notficacions',
- read: 'Legit !',
- followed_you: 'vos sèc',
- favorited_you: 'a aimat vòstre estatut',
- repeated_you: 'a repetit your vòstre estatut'
- },
- login: {
- login: 'Connexion',
- username: 'Nom d’utilizaire',
- placeholder: 'e.g. lain',
- password: 'Senhal',
- register: 'Se marcar',
- logout: 'Desconnexion'
- },
- registration: {
- registration: 'Inscripcion',
- fullname: 'Nom complèt',
- email: 'Adreça de corrièl',
- bio: 'Biografia',
- password_confirm: 'Confirmar lo senhal'
- },
- post_status: {
- posting: 'Mandadís',
- default: 'Escrivètz aquí vòstre estatut.'
- },
- finder: {
- find_user: 'Cercar un utilizaire',
- error_fetching_user: 'Error pendent la recèrca d’un utilizaire'
- },
- general: {
- submit: 'Mandar',
- apply: 'Aplicar'
- },
- user_profile: {
- timeline_title: 'Flux utilizaire'
- }
-}
-
-const pl = {
- chat: {
- title: 'Czat'
- },
- nav: {
- chat: 'Lokalny czat',
- timeline: 'Oś czasu',
- mentions: 'Wzmianki',
- public_tl: 'Publiczna oś czasu',
- twkn: 'Cała znana sieć'
- },
- user_card: {
- follows_you: 'Obserwuje cię!',
- following: 'Obserwowany!',
- follow: 'Obserwuj',
- blocked: 'Zablokowany!',
- block: 'Zablokuj',
- statuses: 'Statusy',
- mute: 'Wycisz',
- muted: 'Wyciszony',
- followers: 'Obserwujący',
- followees: 'Obserwowani',
- per_day: 'dziennie',
- remote_follow: 'Zdalna obserwacja'
- },
- timeline: {
- show_new: 'Pokaż nowe',
- error_fetching: 'Błąd pobierania',
- up_to_date: 'Na bieżąco',
- load_older: 'Załaduj starsze statusy',
- conversation: 'Rozmowa',
- collapse: 'Zwiń',
- repeated: 'powtórzono'
- },
- settings: {
- user_settings: 'Ustawienia użytkownika',
- name_bio: 'Imię i bio',
- name: 'Imię',
- bio: 'Bio',
- avatar: 'Awatar',
- current_avatar: 'Twój obecny awatar',
- set_new_avatar: 'Ustaw nowy awatar',
- profile_banner: 'Banner profilu',
- current_profile_banner: 'Twój obecny banner profilu',
- set_new_profile_banner: 'Ustaw nowy banner profilu',
- profile_background: 'Tło profilu',
- set_new_profile_background: 'Ustaw nowe tło profilu',
- settings: 'Ustawienia',
- theme: 'Motyw',
- presets: 'Gotowe motywy',
- theme_help: 'Użyj kolorów w notacji szesnastkowej (#rrggbb), by stworzyć swój motyw.',
- radii_help: 'Ustaw zaokrąglenie krawędzi interfejsu (w pikselach)',
- background: 'Tło',
- foreground: 'Pierwszy plan',
- text: 'Tekst',
- links: 'Łącza',
- cBlue: 'Niebieski (odpowiedz, obserwuj)',
- cRed: 'Czerwony (anuluj)',
- cOrange: 'Pomarańczowy (ulubione)',
- cGreen: 'Zielony (powtórzenia)',
- btnRadius: 'Przyciski',
- inputRadius: 'Pola tekstowe',
- panelRadius: 'Panele',
- avatarRadius: 'Awatary',
- avatarAltRadius: 'Awatary (powiadomienia)',
- tooltipRadius: 'Etykiety/alerty',
- attachmentRadius: 'Załączniki',
- filtering: 'Filtrowanie',
- filtering_explanation: 'Wszystkie statusy zawierające te słowa będą wyciszone. Jedno słowo na linijkę.',
- attachments: 'Załączniki',
- hide_attachments_in_tl: 'Ukryj załączniki w osi czasu',
- hide_attachments_in_convo: 'Ukryj załączniki w rozmowach',
- nsfw_clickthrough: 'Włącz domyślne ukrywanie załączników o treści nieprzyzwoitej (NSFW)',
- stop_gifs: 'Odtwarzaj GIFy po najechaniu kursorem',
- autoload: 'Włącz automatyczne ładowanie po przewinięciu do końca strony',
- streaming: 'Włącz automatycznie strumieniowanie nowych postów gdy na początku strony',
- reply_link_preview: 'Włącz dymek z podglądem postu po najechaniu na znak odpowiedzi',
- follow_import: 'Import obserwowanych',
- import_followers_from_a_csv_file: 'Importuj obserwowanych z pliku CSV',
- follows_imported: 'Obserwowani zaimportowani! Przetwarzanie może trochę potrwać.',
- follow_import_error: 'Błąd przy importowaniu obserwowanych',
- delete_account: 'Usuń konto',
- delete_account_description: 'Trwale usuń konto i wszystkie posty.',
- delete_account_instructions: 'Wprowadź swoje hasło w poniższe pole aby potwierdzić usunięcie konta.',
- delete_account_error: 'Wystąpił problem z usuwaniem twojego konta. Jeżeli problem powtarza się, poinformuj administratora swojej instancji.',
- follow_export: 'Eksport obserwowanych',
- follow_export_processing: 'Przetwarzanie, wkrótce twój plik zacznie się ściągać.',
- follow_export_button: 'Eksportuj swoją listę obserwowanych do pliku CSV',
- change_password: 'Zmień hasło',
- current_password: 'Obecne hasło',
- new_password: 'Nowe hasło',
- confirm_new_password: 'Potwierdź nowe hasło',
- changed_password: 'Hasło zmienione poprawnie!',
- change_password_error: 'Podczas zmiany hasła wystąpił problem.'
- },
- notifications: {
- notifications: 'Powiadomienia',
- read: 'Przeczytane!',
- followed_you: 'obserwuje cię',
- favorited_you: 'dodał twój status do ulubionych',
- repeated_you: 'powtórzył twój status'
- },
- login: {
- login: 'Zaloguj',
- username: 'Użytkownik',
- placeholder: 'n.p. lain',
- password: 'Hasło',
- register: 'Zarejestruj',
- logout: 'Wyloguj'
- },
- registration: {
- registration: 'Rejestracja',
- fullname: 'Wyświetlana nazwa profilu',
- email: 'Email',
- bio: 'Bio',
- password_confirm: 'Potwierdzenie hasła'
- },
- post_status: {
- posting: 'Wysyłanie',
- default: 'Właśnie wróciłem z kościoła'
- },
- finder: {
- find_user: 'Znajdź użytkownika',
- error_fetching_user: 'Błąd przy pobieraniu profilu'
- },
- general: {
- submit: 'Wyślij',
- apply: 'Zastosuj'
- },
- user_profile: {
- timeline_title: 'Oś czasu użytkownika'
- }
-}
-
-const es = {
- chat: {
- title: 'Chat'
- },
- nav: {
- chat: 'Chat Local',
- timeline: 'Línea Temporal',
- mentions: 'Menciones',
- public_tl: 'Línea Temporal Pública',
- twkn: 'Toda La Red Conocida'
- },
- user_card: {
- follows_you: '¡Te sigue!',
- following: '¡Siguiendo!',
- follow: 'Seguir',
- blocked: '¡Bloqueado!',
- block: 'Bloquear',
- statuses: 'Estados',
- mute: 'Silenciar',
- muted: 'Silenciado',
- followers: 'Seguidores',
- followees: 'Siguiendo',
- per_day: 'por día',
- remote_follow: 'Seguir'
- },
- timeline: {
- show_new: 'Mostrar lo nuevo',
- error_fetching: 'Error al cargar las actualizaciones',
- up_to_date: 'Actualizado',
- load_older: 'Cargar actualizaciones anteriores',
- conversation: 'Conversación'
- },
- settings: {
- user_settings: 'Ajustes de Usuario',
- name_bio: 'Nombre y Biografía',
- name: 'Nombre',
- bio: 'Biografía',
- avatar: 'Avatar',
- current_avatar: 'Tu avatar actual',
- set_new_avatar: 'Cambiar avatar',
- profile_banner: 'Cabecera del perfil',
- current_profile_banner: 'Cabecera actual',
- set_new_profile_banner: 'Cambiar cabecera',
- profile_background: 'Fondo del Perfil',
- set_new_profile_background: 'Cambiar fondo del perfil',
- settings: 'Ajustes',
- theme: 'Tema',
- presets: 'Por defecto',
- theme_help: 'Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.',
- background: 'Segundo plano',
- foreground: 'Primer plano',
- text: 'Texto',
- links: 'Links',
- filtering: 'Filtros',
- filtering_explanation: 'Todos los estados que contengan estas palabras serán silenciados, una por línea',
- attachments: 'Adjuntos',
- hide_attachments_in_tl: 'Ocultar adjuntos en la línea temporal',
- hide_attachments_in_convo: 'Ocultar adjuntos en las conversaciones',
- nsfw_clickthrough: 'Activar el clic para ocultar los adjuntos NSFW',
- autoload: 'Activar carga automática al llegar al final de la página',
- streaming: 'Habilite la transmisión automática de nuevas publicaciones cuando se desplaza hacia la parte superior',
- reply_link_preview: 'Activar la previsualización del enlace de responder al pasar el ratón por encima',
- follow_import: 'Importar personas que tú sigues',
- import_followers_from_a_csv_file: 'Importar personas que tú sigues apartir de un archivo csv',
- follows_imported: '¡Importado! Procesarlos llevará tiempo.',
- follow_import_error: 'Error al importal el archivo'
- },
- notifications: {
- notifications: 'Notificaciones',
- read: '¡Leído!',
- followed_you: 'empezó a seguirte'
- },
- login: {
- login: 'Identificación',
- username: 'Usuario',
- placeholder: 'p.ej. lain',
- password: 'Contraseña',
- register: 'Registrar',
- logout: 'Salir'
- },
- registration: {
- registration: 'Registro',
- fullname: 'Nombre a mostrar',
- email: 'Correo electrónico',
- bio: 'Biografía',
- password_confirm: 'Confirmación de contraseña'
- },
- post_status: {
- posting: 'Publicando',
- default: 'Acabo de aterrizar en L.A.'
- },
- finder: {
- find_user: 'Encontrar usuario',
- error_fetching_user: 'Error al buscar usuario'
- },
- general: {
- submit: 'Enviar',
- apply: 'Aplicar'
- }
-}
-
-const pt = {
- chat: {
- title: 'Chat'
- },
- nav: {
- chat: 'Chat Local',
- timeline: 'Linha do tempo',
- mentions: 'Menções',
- public_tl: 'Linha do tempo pública',
- twkn: 'Toda a rede conhecida'
- },
- user_card: {
- follows_you: 'Segue você!',
- following: 'Seguindo!',
- follow: 'Seguir',
- blocked: 'Bloqueado!',
- block: 'Bloquear',
- statuses: 'Postagens',
- mute: 'Silenciar',
- muted: 'Silenciado',
- followers: 'Seguidores',
- followees: 'Seguindo',
- per_day: 'por dia',
- remote_follow: 'Seguidor Remoto'
- },
- timeline: {
- show_new: 'Mostrar novas',
- error_fetching: 'Erro buscando atualizações',
- up_to_date: 'Atualizado',
- load_older: 'Carregar postagens antigas',
- conversation: 'Conversa'
- },
- settings: {
- user_settings: 'Configurações de Usuário',
- name_bio: 'Nome & Biografia',
- name: 'Nome',
- bio: 'Biografia',
- avatar: 'Avatar',
- current_avatar: 'Seu avatar atual',
- set_new_avatar: 'Alterar avatar',
- profile_banner: 'Capa de perfil',
- current_profile_banner: 'Sua capa de perfil atual',
- set_new_profile_banner: 'Alterar capa de perfil',
- profile_background: 'Plano de fundo de perfil',
- set_new_profile_background: 'Alterar o plano de fundo de perfil',
- settings: 'Configurações',
- theme: 'Tema',
- presets: 'Predefinições',
- theme_help: 'Use cores em código hexadecimal (#rrggbb) para personalizar seu esquema de cores.',
- background: 'Plano de Fundo',
- foreground: 'Primeiro Plano',
- text: 'Texto',
- links: 'Links',
- filtering: 'Filtragem',
- filtering_explanation: 'Todas as postagens contendo estas palavras serão silenciadas, uma por linha.',
- attachments: 'Anexos',
- hide_attachments_in_tl: 'Ocultar anexos na linha do tempo.',
- hide_attachments_in_convo: 'Ocultar anexos em conversas',
- nsfw_clickthrough: 'Habilitar clique para ocultar anexos NSFW',
- autoload: 'Habilitar carregamento automático quando a rolagem chegar ao fim.',
- streaming: 'Habilitar o fluxo automático de postagens quando ao topo da página',
- reply_link_preview: 'Habilitar a pré-visualização de link de respostas ao passar o mouse.',
- follow_import: 'Importar seguidas',
- import_followers_from_a_csv_file: 'Importe seguidores a partir de um arquivo CSV',
- follows_imported: 'Seguidores importados! O processamento pode demorar um pouco.',
- follow_import_error: 'Erro ao importar seguidores'
- },
- notifications: {
- notifications: 'Notificações',
- read: 'Ler!',
- followed_you: 'seguiu você'
- },
- login: {
- login: 'Entrar',
- username: 'Usuário',
- placeholder: 'p.e. lain',
- password: 'Senha',
- register: 'Registrar',
- logout: 'Sair'
- },
- registration: {
- registration: 'Registro',
- fullname: 'Nome para exibição',
- email: 'Correio eletrônico',
- bio: 'Biografia',
- password_confirm: 'Confirmação de senha'
- },
- post_status: {
- posting: 'Publicando',
- default: 'Acabo de aterrizar em L.A.'
- },
- finder: {
- find_user: 'Buscar usuário',
- error_fetching_user: 'Erro procurando usuário'
- },
- general: {
- submit: 'Enviar',
- apply: 'Aplicar'
- }
-}
-
-const ru = {
- chat: {
- title: 'Чат'
- },
- nav: {
- chat: 'Локальный чат',
- timeline: 'Лента',
- mentions: 'Упоминания',
- public_tl: 'Публичная лента',
- twkn: 'Федеративная лента'
- },
- user_card: {
- follows_you: 'Читает вас',
- following: 'Читаю',
- follow: 'Читать',
- blocked: 'Заблокирован',
- block: 'Заблокировать',
- statuses: 'Статусы',
- mute: 'Игнорировать',
- muted: 'Игнорирую',
- followers: 'Читатели',
- followees: 'Читаемые',
- per_day: 'в день',
- remote_follow: 'Читать удалённо'
- },
- timeline: {
- show_new: 'Показать новые',
- error_fetching: 'Ошибка при обновлении',
- up_to_date: 'Обновлено',
- load_older: 'Загрузить старые статусы',
- conversation: 'Разговор',
- collapse: 'Свернуть',
- repeated: 'повторил(а)',
- no_retweet_hint: 'Пост помечен как "только для подписчиков" или "личное" и поэтому не может быть повторён'
- },
- settings: {
- general: 'Общие',
- user_settings: 'Настройки пользователя',
- name_bio: 'Имя и описание',
- name: 'Имя',
- bio: 'Описание',
- avatar: 'Аватар',
- current_avatar: 'Текущий аватар',
- set_new_avatar: 'Загрузить новый аватар',
- profile_banner: 'Баннер профиля',
- current_profile_banner: 'Текущий баннер профиля',
- set_new_profile_banner: 'Загрузить новый баннер профиля',
- profile_background: 'Фон профиля',
- set_new_profile_background: 'Загрузить новый фон профиля',
- settings: 'Настройки',
- theme: 'Тема',
- export_theme: 'Сохранить Тему',
- import_theme: 'Загрузить Тему',
- presets: 'Пресеты',
- theme_help: 'Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.',
- radii_help: 'Скругление углов элементов интерфейса (в пикселях)',
- background: 'Фон',
- foreground: 'Передний план',
- text: 'Текст',
- links: 'Ссылки',
- cBlue: 'Ответить, читать',
- cRed: 'Отменить',
- cOrange: 'Нравится',
- cGreen: 'Повторить',
- btnRadius: 'Кнопки',
- inputRadius: 'Поля ввода',
- panelRadius: 'Панели',
- avatarRadius: 'Аватары',
- avatarAltRadius: 'Аватары в уведомлениях',
- tooltipRadius: 'Всплывающие подсказки/уведомления',
- attachmentRadius: 'Прикреплённые файлы',
- filtering: 'Фильтрация',
- filtering_explanation: 'Все статусы, содержащие данные слова, будут игнорироваться, по одному в строке',
- attachments: 'Вложения',
- hide_attachments_in_tl: 'Прятать вложения в ленте',
- hide_attachments_in_convo: 'Прятать вложения в разговорах',
- stop_gifs: 'Проигрывать GIF анимации только при наведении',
- nsfw_clickthrough: 'Включить скрытие NSFW вложений',
- autoload: 'Включить автоматическую загрузку при прокрутке вниз',
- streaming: 'Включить автоматическую загрузку новых сообщений при прокрутке вверх',
- pause_on_unfocused: 'Приостановить загрузку когда вкладка не в фокусе',
- loop_video: 'Зациливать видео',
- loop_video_silent_only: 'Зацикливать только беззвучные видео (т.е. "гифки" с Mastodon)',
- reply_link_preview: 'Включить предварительный просмотр ответа при наведении мыши',
- replies_in_timeline: 'Ответы в ленте',
- reply_visibility_all: 'Показывать все ответы',
- reply_visibility_following: 'Показывать только ответы мне и тех на кого я подписан',
- reply_visibility_self: 'Показывать только ответы мне',
- notification_visibility: 'Показывать уведомления',
- notification_visibility_likes: 'Лайки',
- notification_visibility_mentions: 'Упоминания',
- notification_visibility_repeats: 'Повторы',
- notification_visibility_follows: 'Подписки',
- follow_import: 'Импортировать читаемых',
- import_followers_from_a_csv_file: 'Импортировать читаемых из файла .csv',
- follows_imported: 'Список читаемых импортирован. Обработка займёт некоторое время..',
- follow_import_error: 'Ошибка при импортировании читаемых.',
- delete_account: 'Удалить аккаунт',
- delete_account_description: 'Удалить ваш аккаунт и все ваши сообщения.',
- delete_account_instructions: 'Введите ваш пароль в поле ниже для подтверждения удаления.',
- delete_account_error: 'Возникла ошибка в процессе удаления вашего аккаунта. Если это повторяется, свяжитесь с администратором вашего сервера.',
- follow_export: 'Экспортировать читаемых',
- follow_export_processing: 'Ведётся обработка, скоро вам будет предложено загрузить файл',
- follow_export_button: 'Экспортировать читаемых в файл .csv',
- change_password: 'Сменить пароль',
- current_password: 'Текущий пароль',
- new_password: 'Новый пароль',
- confirm_new_password: 'Подтверждение нового пароля',
- changed_password: 'Пароль изменён успешно.',
- change_password_error: 'Произошла ошибка при попытке изменить пароль.',
- lock_account_description: 'Аккаунт доступен только подтверждённым подписчикам',
- limited_availability: 'Не доступно в вашем браузере',
- profile_tab: 'Профиль',
- security_tab: 'Безопасность',
- data_import_export_tab: 'Импорт / Экспорт данных',
- collapse_subject: 'Сворачивать посты с темой',
- interfaceLanguage: 'Язык интерфейса'
- },
- notifications: {
- notifications: 'Уведомления',
- read: 'Прочесть',
- followed_you: 'начал(а) читать вас',
- favorited_you: 'нравится ваш статус',
- repeated_you: 'повторил(а) ваш статус',
- broken_favorite: 'Неизвестный статус, ищем...',
- load_older: 'Загрузить старые уведомления'
- },
- login: {
- login: 'Войти',
- username: 'Имя пользователя',
- placeholder: 'e.c. lain',
- password: 'Пароль',
- register: 'Зарегистрироваться',
- logout: 'Выйти'
- },
- registration: {
- registration: 'Регистрация',
- fullname: 'Отображаемое имя',
- email: 'Email',
- bio: 'Описание',
- password_confirm: 'Подтверждение пароля',
- token: 'Код приглашения'
- },
- post_status: {
- posting: 'Отправляется',
- content_warning: 'Тема (не обязательно)',
- default: 'Что нового?',
- account_not_locked_warning: 'Ваш аккаунт не {0}. Кто угодно может зафоловить вас чтобы прочитать посты только для подписчиков',
- account_not_locked_warning_link: 'залочен',
- direct_warning: 'Этот пост будет видет только упомянутым пользователям',
- attachments_sensitive: 'Вложения содержат чувствительный контент',
- scope: {
- public: 'Публичный - этот пост виден всем',
- unlisted: 'Непубличный - этот пост не виден на публичных лентах',
- private: 'Для подписчиков - этот пост видят только подписчики',
- direct: 'Личное - этот пост видят только те кто в нём упомянут'
- }
- },
- finder: {
- find_user: 'Найти пользователя',
- error_fetching_user: 'Пользователь не найден'
- },
- general: {
- submit: 'Отправить',
- apply: 'Применить'
- },
- user_profile: {
- timeline_title: 'Лента пользователя'
- }
-}
-const nb = {
- chat: {
- title: 'Chat'
- },
- nav: {
- chat: 'Lokal Chat',
- timeline: 'Tidslinje',
- mentions: 'Nevnt',
- public_tl: 'Offentlig Tidslinje',
- twkn: 'Det hele kjente nettverket'
- },
- user_card: {
- follows_you: 'Følger deg!',
- following: 'Følger!',
- follow: 'Følg',
- blocked: 'Blokkert!',
- block: 'Blokker',
- statuses: 'Statuser',
- mute: 'Demp',
- muted: 'Dempet',
- followers: 'Følgere',
- followees: 'Følger',
- per_day: 'per dag',
- remote_follow: 'Følg eksternt'
- },
- timeline: {
- show_new: 'Vis nye',
- error_fetching: 'Feil ved henting av oppdateringer',
- up_to_date: 'Oppdatert',
- load_older: 'Last eldre statuser',
- conversation: 'Samtale',
- collapse: 'Sammenfold',
- repeated: 'gjentok'
- },
- settings: {
- user_settings: 'Brukerinstillinger',
- name_bio: 'Navn & Biografi',
- name: 'Navn',
- bio: 'Biografi',
- avatar: 'Profilbilde',
- current_avatar: 'Ditt nåværende profilbilde',
- set_new_avatar: 'Rediger profilbilde',
- profile_banner: 'Profil-banner',
- current_profile_banner: 'Din nåværende profil-banner',
- set_new_profile_banner: 'Sett ny profil-banner',
- profile_background: 'Profil-bakgrunn',
- set_new_profile_background: 'Rediger profil-bakgrunn',
- settings: 'Innstillinger',
- theme: 'Tema',
- presets: 'Forhåndsdefinerte fargekoder',
- theme_help: 'Bruk heksadesimale fargekoder (#rrggbb) til å endre farge-temaet ditt.',
- radii_help: 'Bestem hvor runde hjørnene i brukergrensesnittet skal være (i piksler)',
- background: 'Bakgrunn',
- foreground: 'Framgrunn',
- text: 'Tekst',
- links: 'Linker',
- cBlue: 'Blå (Svar, følg)',
- cRed: 'Rød (Avbryt)',
- cOrange: 'Oransje (Lik)',
- cGreen: 'Grønn (Gjenta)',
- btnRadius: 'Knapper',
- panelRadius: 'Panel',
- avatarRadius: 'Profilbilde',
- avatarAltRadius: 'Profilbilde (Varslinger)',
- tooltipRadius: 'Verktøytips/advarsler',
- attachmentRadius: 'Vedlegg',
- filtering: 'Filtrering',
- filtering_explanation: 'Alle statuser som inneholder disse ordene vil bli dempet, en kombinasjon av tegn per linje',
- attachments: 'Vedlegg',
- hide_attachments_in_tl: 'Gjem vedlegg på tidslinje',
- hide_attachments_in_convo: 'Gjem vedlegg i samtaler',
- nsfw_clickthrough: 'Krev trykk for å vise statuser som kan være upassende',
- stop_gifs: 'Spill av GIFs når du holder over dem',
- autoload: 'Automatisk lasting når du blar ned til bunnen',
- streaming: 'Automatisk strømming av nye statuser når du har bladd til toppen',
- reply_link_preview: 'Vis en forhåndsvisning når du holder musen over svar til en status',
- follow_import: 'Importer følginger',
- import_followers_from_a_csv_file: 'Importer følginger fra en csv fil',
- follows_imported: 'Følginger imported! Det vil ta litt tid å behandle de.',
- follow_import_error: 'Feil ved importering av følginger.'
- },
- notifications: {
- notifications: 'Varslinger',
- read: 'Les!',
- followed_you: 'fulgte deg',
- favorited_you: 'likte din status',
- repeated_you: 'Gjentok din status'
- },
- login: {
- login: 'Logg inn',
- username: 'Brukernavn',
- placeholder: 'f. eks lain',
- password: 'Passord',
- register: 'Registrer',
- logout: 'Logg ut'
- },
- registration: {
- registration: 'Registrering',
- fullname: 'Visningsnavn',
- email: 'Epost-adresse',
- bio: 'Biografi',
- password_confirm: 'Bekreft passord'
- },
- post_status: {
- posting: 'Publiserer',
- default: 'Landet akkurat i L.A.'
- },
- finder: {
- find_user: 'Finn bruker',
- error_fetching_user: 'Feil ved henting av bruker'
- },
- general: {
- submit: 'Legg ut',
- apply: 'Bruk'
- },
- user_profile: {
- timeline_title: 'Bruker-tidslinje'
- }
-}
-
-const he = {
- chat: {
- title: 'צ\'אט'
- },
- nav: {
- chat: 'צ\'אט מקומי',
- timeline: 'ציר הזמן',
- mentions: 'אזכורים',
- public_tl: 'ציר הזמן הציבורי',
- twkn: 'כל הרשת הידועה'
- },
- user_card: {
- follows_you: 'עוקב אחריך!',
- following: 'עוקב!',
- follow: 'עקוב',
- blocked: 'חסום!',
- block: 'חסימה',
- statuses: 'סטטוסים',
- mute: 'השתק',
- muted: 'מושתק',
- followers: 'עוקבים',
- followees: 'נעקבים',
- per_day: 'ליום',
- remote_follow: 'עקיבה מרחוק'
- },
- timeline: {
- show_new: 'הראה חדש',
- error_fetching: 'שגיאה בהבאת הודעות',
- up_to_date: 'עדכני',
- load_older: 'טען סטטוסים חדשים',
- conversation: 'שיחה',
- collapse: 'מוטט',
- repeated: 'חזר'
- },
- settings: {
- user_settings: 'הגדרות משתמש',
- name_bio: 'שם ואודות',
- name: 'שם',
- bio: 'אודות',
- avatar: 'תמונת פרופיל',
- current_avatar: 'תמונת הפרופיל הנוכחית שלך',
- set_new_avatar: 'קבע תמונת פרופיל חדשה',
- profile_banner: 'כרזת הפרופיל',
- current_profile_banner: 'כרזת הפרופיל הנוכחית שלך',
- set_new_profile_banner: 'קבע כרזת פרופיל חדשה',
- profile_background: 'רקע הפרופיל',
- set_new_profile_background: 'קבע רקע פרופיל חדש',
- settings: 'הגדרות',
- theme: 'תמה',
- presets: 'ערכים קבועים מראש',
- theme_help: 'השתמש בקודי צבע הקס (#אדום-אדום-ירוק-ירוק-כחול-כחול) על מנת להתאים אישית את תמת הצבע שלך.',
- radii_help: 'קבע מראש עיגול פינות לממשק (בפיקסלים)',
- background: 'רקע',
- foreground: 'חזית',
- text: 'טקסט',
- links: 'לינקים',
- cBlue: 'כחול (תגובה, עקיבה)',
- cRed: 'אדום (ביטול)',
- cOrange: 'כתום (לייק)',
- cGreen: 'ירוק (חזרה)',
- btnRadius: 'כפתורים',
- inputRadius: 'שדות קלט',
- panelRadius: 'פאנלים',
- avatarRadius: 'תמונות פרופיל',
- avatarAltRadius: 'תמונות פרופיל (התראות)',
- tooltipRadius: 'טולטיפ \\ התראות',
- attachmentRadius: 'צירופים',
- filtering: 'סינון',
- filtering_explanation: 'כל הסטטוסים הכוללים את המילים הללו יושתקו, אחד לשורה',
- attachments: 'צירופים',
- hide_attachments_in_tl: 'החבא צירופים בציר הזמן',
- hide_attachments_in_convo: 'החבא צירופים בשיחות',
- nsfw_clickthrough: 'החל החבאת צירופים לא בטוחים לצפיה בעת עבודה בעזרת לחיצת עכבר',
- stop_gifs: 'נגן-בעת-ריחוף GIFs',
- autoload: 'החל טעינה אוטומטית בגלילה לתחתית הדף',
- streaming: 'החל זרימת הודעות אוטומטית בעת גלילה למעלה הדף',
- reply_link_preview: 'החל תצוגה מקדימה של לינק-תגובה בעת ריחוף עם העכבר',
- follow_import: 'יבוא עקיבות',
- import_followers_from_a_csv_file: 'ייבא את הנעקבים שלך מקובץ csv',
- follows_imported: 'נעקבים יובאו! ייקח זמן מה לעבד אותם.',
- follow_import_error: 'שגיאה בייבוא נעקבים.',
- delete_account: 'מחק משתמש',
- delete_account_description: 'מחק לצמיתות את המשתמש שלך ואת כל הודעותיך.',
- delete_account_instructions: 'הכנס את סיסמתך בקלט למטה על מנת לאשר מחיקת משתמש.',
- delete_account_error: 'הייתה בעיה במחיקת המשתמש. אם זה ממשיך, אנא עדכן את מנהל השרת שלך.',
- follow_export: 'יצוא עקיבות',
- follow_export_processing: 'טוען. בקרוב תתבקש להוריד את הקובץ את הקובץ שלך',
- follow_export_button: 'ייצא את הנעקבים שלך לקובץ csv',
- change_password: 'שנה סיסמה',
- current_password: 'סיסמה נוכחית',
- new_password: 'סיסמה חדשה',
- confirm_new_password: 'אשר סיסמה',
- changed_password: 'סיסמה שונתה בהצלחה!',
- change_password_error: 'הייתה בעיה בשינוי סיסמתך.'
- },
- notifications: {
- notifications: 'התראות',
- read: 'קרא!',
- followed_you: 'עקב אחריך!',
- favorited_you: 'אהב את הסטטוס שלך',
- repeated_you: 'חזר על הסטטוס שלך'
- },
- login: {
- login: 'התחבר',
- username: 'שם המשתמש',
- placeholder: 'למשל lain',
- password: 'סיסמה',
- register: 'הירשם',
- logout: 'התנתק'
- },
- registration: {
- registration: 'הרשמה',
- fullname: 'שם תצוגה',
- email: 'אימייל',
- bio: 'אודות',
- password_confirm: 'אישור סיסמה'
- },
- post_status: {
- posting: 'מפרסם',
- default: 'הרגע נחת ב-ל.א.'
- },
- finder: {
- find_user: 'מציאת משתמש',
- error_fetching_user: 'שגיאה במציאת משתמש'
- },
- general: {
- submit: 'שלח',
- apply: 'החל'
- },
- user_profile: {
- timeline_title: 'ציר זמן המשתמש'
- }
-}
+// For anyone contributing to old huge messages.js and in need to quickly convert it to JSON
+// sed command for converting currently formatted JS to JSON:
+// sed -i -e "s/'//gm" -e 's/"/\\"/gm' -re 's/^( +)(.+?): ((.+?))?(,?)(\{?)$/\1"\2": "\4"/gm' -e 's/\"\{\"/{/g' -e 's/,"$/",/g' file.json
+// There's only problem that apostrophe character ' gets replaced by \\ so you have to fix it manually, sorry.
const messages = {
- de,
- fi,
- en,
- eo,
- et,
- hu,
- ro,
- ja,
- fr,
- it,
- oc,
- pl,
- es,
- pt,
- ru,
- nb,
- he
+ de: require('./de.json'),
+ fi: require('./fi.json'),
+ en: require('./en.json'),
+ eo: require('./eo.json'),
+ et: require('./et.json'),
+ hu: require('./hu.json'),
+ ro: require('./ro.json'),
+ ja: require('./ja.json'),
+ fr: require('./fr.json'),
+ it: require('./it.json'),
+ oc: require('./oc.json'),
+ pl: require('./pl.json'),
+ es: require('./es.json'),
+ pt: require('./pt.json'),
+ ru: require('./ru.json'),
+ nb: require('./nb.json'),
+ he: require('./he.json')
}
export default messages
diff --git a/src/i18n/nb.json b/src/i18n/nb.json
new file mode 100644
index 00000000..0f4dca58
--- /dev/null
+++ b/src/i18n/nb.json
@@ -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"
+ }
+}
diff --git a/src/i18n/oc.json b/src/i18n/oc.json
new file mode 100644
index 00000000..0f3320ca
--- /dev/null
+++ b/src/i18n/oc.json
@@ -0,0 +1,134 @@
+{
+ "chat": {
+ "title": "Messatjariá"
+ },
+ "finder": {
+ "error_fetching_user": "Error pendent la recèrca d’un 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 d’utilizaire"
+ },
+ "nav": {
+ "chat": "Chat local",
+ "mentions": "Notificacions",
+ "public_tl": "Estatuts locals",
+ "timeline": "Flux d’actualitat",
+ "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 s’es 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 s’es producha en suprimir lo compte. S’aquò ten d’arribar mercés de contactar vòstre administrador d’instà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 d’un 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 l’interfàcia (en pixèls)",
+ "reply_link_preview": "Activar l’apercebut en passar la mirga",
+ "set_new_avatar": "Cambiar l’avatar",
+ "set_new_profile_background": "Cambiar l’imatge 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"
+ }
+}
diff --git a/src/i18n/pl.json b/src/i18n/pl.json
new file mode 100644
index 00000000..a3952d4f
--- /dev/null
+++ b/src/i18n/pl.json
@@ -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"
+ }
+}
diff --git a/src/i18n/pt.json b/src/i18n/pt.json
new file mode 100644
index 00000000..544eacdf
--- /dev/null
+++ b/src/i18n/pt.json
@@ -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"
+ }
+}
diff --git a/src/i18n/ro.json b/src/i18n/ro.json
new file mode 100644
index 00000000..3cee264f
--- /dev/null
+++ b/src/i18n/ro.json
@@ -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"
+ }
+}
diff --git a/src/i18n/ru.json b/src/i18n/ru.json
new file mode 100644
index 00000000..921bf67e
--- /dev/null
+++ b/src/i18n/ru.json
@@ -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": "Лента пользователя"
+ }
+}
diff --git a/src/lib/persisted_state.js b/src/lib/persisted_state.js
index 60811e65..006107e2 100644
--- a/src/lib/persisted_state.js
+++ b/src/lib/persisted_state.js
@@ -1,7 +1,7 @@
import merge from 'lodash.merge'
import objectPath from 'object-path'
import localforage from 'localforage'
-import { throttle, each } from 'lodash'
+import { each } from 'lodash'
let loaded = false
@@ -12,18 +12,18 @@ const defaultReducer = (state, paths) => (
}, {})
)
+const saveImmedeatelyActions = [
+ 'markNotificationsAsSeen',
+ 'clearCurrentUser',
+ 'setCurrentUser',
+ 'setHighlight',
+ 'setOption'
+]
+
const defaultStorage = (() => {
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 ({
key = 'vuex-lz',
paths = [],
@@ -31,7 +31,14 @@ export default function createPersistedState ({
let value = storage.getItem(key)
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,
storage = defaultStorage,
subscriber = store => handler => store.subscribe(handler)
@@ -72,7 +79,20 @@ export default function createPersistedState ({
subscriber(store)((mutation, state) => {
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) {
console.log("Couldn't persist state:")
console.log(e)
diff --git a/src/main.js b/src/main.js
index c69ca6c3..1b1780df 100644
--- a/src/main.js
+++ b/src/main.js
@@ -14,6 +14,8 @@ import Registration from './components/registration/registration.vue'
import UserSettings from './components/user_settings/user_settings.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 usersModule from './modules/users.js'
import apiModule from './modules/api.js'
@@ -45,25 +47,7 @@ Vue.use(VueChatScroll)
const persistedStateOptions = {
paths: [
- 'config.collapseMessageWithSubject',
- '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',
+ 'config',
'users.lastLoginName',
'statuses.notifications.maxSavedId'
]
@@ -71,6 +55,8 @@ const persistedStateOptions = {
const store = new Vuex.Store({
modules: {
+ interface: interfaceModule,
+ instance: instanceModule,
statuses: statusesModule,
users: usersModule,
api: apiModule,
@@ -94,102 +80,104 @@ window.fetch('/api/statusnet/config.json')
.then((data) => {
const {name, closed: registrationClosed, textlimit, server} = data.site
- store.dispatch('setOption', { name: 'name', value: name })
- store.dispatch('setOption', { name: 'registrationOpen', value: (registrationClosed === '0') })
- store.dispatch('setOption', { name: 'textlimit', value: parseInt(textlimit) })
- store.dispatch('setOption', { name: 'server', value: server })
+ store.dispatch('setInstanceOption', { name: 'name', value: name })
+ store.dispatch('setInstanceOption', { name: 'registrationOpen', value: (registrationClosed === '0') })
+ store.dispatch('setInstanceOption', { name: 'textlimit', value: parseInt(textlimit) })
+ store.dispatch('setInstanceOption', { name: 'server', value: server })
var apiConfig = data.site.pleromafe
window.fetch('/static/config.json')
- .then((res) => res.json())
- .then((data) => {
- var staticConfig = data
- // This takes static config and overrides properties that are present in apiConfig
- var config = Object.assign({}, staticConfig, apiConfig)
+ .then((res) => res.json())
+ .catch((err) => {
+ console.warn('Failed to load static/config.json, continuing without it.')
+ console.warn(err)
+ 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 background = (config.background)
- var logo = (config.logo)
- var logoMask = (typeof config.logoMask === 'undefined' ? true : config.logoMask)
- var logoMargin = (typeof config.logoMargin === 'undefined' ? 0 : config.logoMargin)
- var redirectRootNoLogin = (config.redirectRootNoLogin)
- var redirectRootLogin = (config.redirectRootLogin)
- var chatDisabled = (config.chatDisabled)
- var showWhoToFollowPanel = (config.showWhoToFollowPanel)
- var whoToFollowProvider = (config.whoToFollowProvider)
- var whoToFollowLink = (config.whoToFollowLink)
- var showInstanceSpecificPanel = (config.showInstanceSpecificPanel)
- var scopeOptionsEnabled = (config.scopeOptionsEnabled)
- var formattingOptionsEnabled = (config.formattingOptionsEnabled)
- var collapseMessageWithSubject = (config.collapseMessageWithSubject)
- var hidePostStats = (config.hidePostStats)
- var hideUserStats = (config.hideUserStats)
+ var theme = (config.theme)
+ var background = (config.background)
+ var hidePostStats = (config.hidePostStats)
+ var hideUserStats = (config.hideUserStats)
+ var logo = (config.logo)
+ var logoMask = (typeof config.logoMask === 'undefined' ? true : config.logoMask)
+ var logoMargin = (typeof config.logoMargin === 'undefined' ? 0 : config.logoMargin)
+ var redirectRootNoLogin = (config.redirectRootNoLogin)
+ var redirectRootLogin = (config.redirectRootLogin)
+ var chatDisabled = (config.chatDisabled)
+ var showInstanceSpecificPanel = (config.showInstanceSpecificPanel)
+ var scopeOptionsEnabled = (config.scopeOptionsEnabled)
+ var formattingOptionsEnabled = (config.formattingOptionsEnabled)
+ var collapseMessageWithSubject = (config.collapseMessageWithSubject)
- store.dispatch('setOption', { name: 'theme', value: theme })
- store.dispatch('setOption', { name: 'background', value: background })
- store.dispatch('setOption', { name: 'logo', value: logo })
- store.dispatch('setOption', { name: 'logoMask', value: logoMask })
- store.dispatch('setOption', { name: 'logoMargin', value: logoMargin })
- store.dispatch('setOption', { name: 'showWhoToFollowPanel', value: showWhoToFollowPanel })
- store.dispatch('setOption', { name: 'whoToFollowProvider', value: whoToFollowProvider })
- store.dispatch('setOption', { name: 'whoToFollowLink', value: whoToFollowLink })
- store.dispatch('setOption', { name: 'showInstanceSpecificPanel', value: showInstanceSpecificPanel })
- store.dispatch('setOption', { name: 'scopeOptionsEnabled', value: scopeOptionsEnabled })
- store.dispatch('setOption', { name: 'formattingOptionsEnabled', value: formattingOptionsEnabled })
- store.dispatch('setOption', { name: 'collapseMessageWithSubject', value: collapseMessageWithSubject })
- store.dispatch('setOption', { name: 'hidePostStats', value: hidePostStats })
- store.dispatch('setOption', { name: 'hideUserStats', value: hideUserStats })
- if (chatDisabled) {
- 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 }
+ store.dispatch('setInstanceOption', { name: 'theme', value: theme })
+ store.dispatch('setInstanceOption', { name: 'background', value: background })
+ store.dispatch('setInstanceOption', { name: 'hidePostStats', value: hidePostStats })
+ store.dispatch('setInstanceOption', { name: 'hideUserStats', value: hideUserStats })
+ store.dispatch('setInstanceOption', { name: 'logo', value: logo })
+ store.dispatch('setInstanceOption', { name: 'logoMask', value: logoMask })
+ store.dispatch('setInstanceOption', { name: 'logoMargin', value: logoMargin })
+ store.dispatch('setInstanceOption', { name: 'redirectRootNoLogin', value: redirectRootNoLogin })
+ store.dispatch('setInstanceOption', { name: 'redirectRootLogin', value: redirectRootLogin })
+ store.dispatch('setInstanceOption', { name: 'showInstanceSpecificPanel', value: showInstanceSpecificPanel })
+ store.dispatch('setInstanceOption', { name: 'scopeOptionsEnabled', value: scopeOptionsEnabled })
+ store.dispatch('setInstanceOption', { name: 'formattingOptionsEnabled', value: formattingOptionsEnabled })
+ store.dispatch('setInstanceOption', { name: 'collapseMessageWithSubject', value: collapseMessageWithSubject })
+ if (chatDisabled) {
+ store.dispatch('disableChat')
}
- })
- /* eslint-disable no-new */
- new Vue({
- router,
- store,
- i18n,
- el: '#app',
- render: h => h(App)
+ const routes = [
+ { name: 'root',
+ path: '/',
+ redirect: to => {
+ return (store.state.users.currentUser
+ ? store.state.instance.redirectRootLogin
+ : 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')
.then((res) => res.text())
.then((html) => {
- store.dispatch('setOption', { name: 'tos', value: html })
+ store.dispatch('setInstanceOption', { name: 'tos', value: html })
})
window.fetch('/api/pleroma/emoji.json')
@@ -200,11 +188,11 @@ window.fetch('/api/pleroma/emoji.json')
const emoji = Object.keys(values).map((key) => {
return { shortcode: key, image_url: values[key] }
})
- store.dispatch('setOption', { name: 'customEmoji', value: emoji })
- store.dispatch('setOption', { name: 'pleromaBackend', value: true })
+ store.dispatch('setInstanceOption', { name: 'customEmoji', value: emoji })
+ store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: true })
},
(failure) => {
- store.dispatch('setOption', { name: 'pleromaBackend', value: false })
+ store.dispatch('setInstanceOption', { name: 'pleromaBackend', value: false })
}
),
(error) => console.log(error)
@@ -216,19 +204,24 @@ window.fetch('/static/emoji.json')
const emoji = Object.keys(values).map((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')
.then((res) => res.text())
.then((html) => {
- store.dispatch('setOption', { name: 'instanceSpecificPanelContent', value: html })
+ store.dispatch('setInstanceOption', { name: 'instanceSpecificPanelContent', value: html })
})
window.fetch('/nodeinfo/2.0.json')
.then((res) => res.json())
.then((data) => {
- const suggestions = data.metadata.suggestions
- store.dispatch('setOption', { name: 'suggestionsEnabled', value: suggestions.enabled })
- store.dispatch('setOption', { name: 'suggestionsWeb', value: suggestions.web })
+ const metadata = data.metadata
+ store.dispatch('setInstanceOption', { name: 'mediaProxyAvailable', value: data.metadata.mediaProxy })
+ 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 })
})
diff --git a/src/modules/config.js b/src/modules/config.js
index dae58eb1..375d0167 100644
--- a/src/modules/config.js
+++ b/src/modules/config.js
@@ -4,13 +4,10 @@ import StyleSetter from '../services/style_setter/style_setter.js'
const browserLocale = (window.navigator.language || 'en').split('-')[0]
const defaultState = {
- name: 'Pleroma FE',
colors: {},
collapseMessageWithSubject: false,
hideAttachments: false,
hideAttachmentsInConv: false,
- hidePostStats: false,
- hideUserStats: false,
hideNsfw: true,
loopVideo: true,
loopVideoSilentOnly: true,
@@ -47,18 +44,12 @@ const config = {
}
},
actions: {
- setPageTitle ({state}, option = '') {
- document.title = `${option} ${state.name}`
- },
setHighlight ({ commit, dispatch }, { user, color, type }) {
commit('setHighlight', {user, color, type})
},
setOption ({ commit, dispatch }, { name, value }) {
commit('setOption', {name, value})
switch (name) {
- case 'name':
- dispatch('setPageTitle')
- break
case 'theme':
StyleSetter.setPreset(value, commit)
break
diff --git a/src/modules/instance.js b/src/modules/instance.js
new file mode 100644
index 00000000..d61ca842
--- /dev/null
+++ b/src/modules/instance.js
@@ -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
diff --git a/src/modules/interface.js b/src/modules/interface.js
new file mode 100644
index 00000000..07489685
--- /dev/null
+++ b/src/modules/interface.js
@@ -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
diff --git a/src/services/api/api.service.js b/src/services/api/api.service.js
index 87315657..ab746918 100644
--- a/src/services/api/api.service.js
+++ b/src/services/api/api.service.js
@@ -133,13 +133,11 @@ const updateBanner = ({credentials, params}) => {
const updateProfile = ({credentials, params}) => {
let url = PROFILE_UPDATE_URL
- console.log(params)
-
const form = new FormData()
each(params, (value, key) => {
- /* Always include description and locked, because it might be empty or false */
- if (key === 'description' || key === 'locked' || value) {
+ /* Always include description, no_rich_text and locked, because it might be empty or false */
+ if (key === 'description' || key === 'locked' || key === 'no_rich_text' || 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('&')
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) => {