Merge remote-tracking branch 'origin/develop' into shigusegubu

* origin/develop: (30 commits)
  Translated using Weblate (Italian)
  Translated using Weblate (Russian)
  add fade-in fade-out
  remove useless captures
  update changelog
  changelog
  attempt to fix that one bug with submitting on copy-pasting
  add better visual indication for dropping files, make dropzone bigger
  Messages: DRY things up a bit.
  Apply suggestion to CHANGELOG.md
  Update changelog.
  Linting.
  MediaUpload: Correctly handle multiple uploads.
  Messages: Load languages asynchronously.
  MediaUpload: Allow drag-and-drop of multiple files at once
  Autocomplete domain mutes from list of known instances
  indent 2
  Fix the cropped button shadow in 2FA settings
  Translated using Weblate (Italian)
  Translated using Weblate (Estonian)
  ...
This commit is contained in:
Henry Jameson 2020-06-11 11:23:25 +03:00
commit aeae52ed24
30 changed files with 6426 additions and 5709 deletions

View file

@ -7,24 +7,28 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Removed the use of with_move parameters when fetching notifications - Removed the use of with_move parameters when fetching notifications
### Fixed ### Fixed
- Weird bug related to post being sent seemingly after pasting with keyboard (hopefully)
- Multiple issues with muted statuses/notifications - Multiple issues with muted statuses/notifications
## [Unreleased patch] ## [Unreleased patch]
### Add ### Add
- Added private notifications option for push notifications - Added private notifications option for push notifications
- 'Copy link' button for statuses (in the ellipsis menu) - 'Copy link' button for statuses (in the ellipsis menu)
- Autocomplete domains from list of known instances
### Changed ### Changed
- Registration page no longer requires email if the server is configured not to require it - Registration page no longer requires email if the server is configured not to require it
- Change heart to thumbs up in reaction picker - Change heart to thumbs up in reaction picker
- Close the media modal on navigation events - Close the media modal on navigation events
- Add colons to the emoji alt text, to make them copyable - Add colons to the emoji alt text, to make them copyable
- Add better visual indication for drag-and-drop for files
### Fixed ### Fixed
- Status ellipsis menu closes properly when selecting certain options - Status ellipsis menu closes properly when selecting certain options
- Cropped images look correct in Chrome - Cropped images look correct in Chrome
- Newlines in the muted words settings work again - Newlines in the muted words settings work again
- Clicking on non-latin hashtags won't open a new window - Clicking on non-latin hashtags won't open a new window
- Uploading and drag-dropping multiple files works correctly now.
## [2.0.3] - 2020-05-02 ## [2.0.3] - 2020-05-02
### Fixed ### Fixed

View file

@ -47,7 +47,8 @@ export default {
}), }),
created () { created () {
// Load the locale from the storage // Load the locale from the storage
this.$i18n.locale = this.$store.getters.mergedConfig.interfaceLanguage const val = this.$store.getters.mergedConfig.interfaceLanguage
this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val })
window.addEventListener('resize', this.updateMobileState) window.addEventListener('resize', this.updateMobileState)
}, },
destroyed () { destroyed () {

View file

@ -5,9 +5,20 @@ const DomainMuteCard = {
components: { components: {
ProgressButton ProgressButton
}, },
computed: {
user () {
return this.$store.state.users.currentUser
},
muted () {
return this.user.domainMutes.includes(this.domain)
}
},
methods: { methods: {
unmuteDomain () { unmuteDomain () {
return this.$store.dispatch('unmuteDomain', this.domain) return this.$store.dispatch('unmuteDomain', this.domain)
},
muteDomain () {
return this.$store.dispatch('muteDomain', this.domain)
} }
} }
} }

View file

@ -4,6 +4,7 @@
{{ domain }} {{ domain }}
</div> </div>
<ProgressButton <ProgressButton
v-if="muted"
:click="unmuteDomain" :click="unmuteDomain"
class="btn btn-default" class="btn btn-default"
> >
@ -12,6 +13,16 @@
{{ $t('domain_mute_card.unmute_progress') }} {{ $t('domain_mute_card.unmute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
<ProgressButton
v-else
:click="muteDomain"
class="btn btn-default"
>
{{ $t('domain_mute_card.mute') }}
<template slot="progress">
{{ $t('domain_mute_card.mute_progress') }}
</template>
</ProgressButton>
</div> </div>
</template> </template>
@ -34,5 +45,9 @@
button { button {
width: 10em; width: 10em;
} }
.autosuggest-results & {
padding-left: 1em;
}
} }
</style> </style>

View file

@ -32,7 +32,7 @@ import _ from 'lodash'
export default { export default {
computed: { computed: {
languageCodes () { languageCodes () {
return Object.keys(languagesObject) return languagesObject.languages
}, },
languageNames () { languageNames () {
@ -43,7 +43,6 @@ export default {
get: function () { return this.$store.getters.mergedConfig.interfaceLanguage }, get: function () { return this.$store.getters.mergedConfig.interfaceLanguage },
set: function (val) { set: function (val) {
this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val }) this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val })
this.$i18n.locale = val
} }
} }
}, },

View file

@ -5,10 +5,15 @@ import fileSizeFormatService from '../../services/file_size_format/file_size_for
const mediaUpload = { const mediaUpload = {
data () { data () {
return { return {
uploading: false, uploadCount: 0,
uploadReady: true uploadReady: true
} }
}, },
computed: {
uploading () {
return this.uploadCount > 0
}
},
methods: { methods: {
uploadFile (file) { uploadFile (file) {
const self = this const self = this
@ -23,29 +28,21 @@ const mediaUpload = {
formData.append('file', file) formData.append('file', file)
self.$emit('uploading') self.$emit('uploading')
self.uploading = true self.uploadCount++
statusPosterService.uploadMedia({ store, formData }) statusPosterService.uploadMedia({ store, formData })
.then((fileData) => { .then((fileData) => {
self.$emit('uploaded', fileData) self.$emit('uploaded', fileData)
self.uploading = false self.decreaseUploadCount()
}, (error) => { // eslint-disable-line handle-callback-err }, (error) => { // eslint-disable-line handle-callback-err
self.$emit('upload-failed', 'default') self.$emit('upload-failed', 'default')
self.uploading = false self.decreaseUploadCount()
}) })
}, },
fileDrop (e) { decreaseUploadCount () {
if (e.dataTransfer.files.length > 0) { this.uploadCount--
e.preventDefault() // allow dropping text like before if (this.uploadCount === 0) {
this.uploadFile(e.dataTransfer.files[0]) this.$emit('all-uploaded')
}
},
fileDrag (e) {
let types = e.dataTransfer.types
if (types.contains('Files')) {
e.dataTransfer.dropEffect = 'copy'
} else {
e.dataTransfer.dropEffect = 'none'
} }
}, },
clearFile () { clearFile () {
@ -54,11 +51,13 @@ const mediaUpload = {
this.uploadReady = true this.uploadReady = true
}) })
}, },
change ({ target }) { multiUpload (files) {
for (var i = 0; i < target.files.length; i++) { for (const file of files) {
let file = target.files[i]
this.uploadFile(file) this.uploadFile(file)
} }
},
change ({ target }) {
this.multiUpload(target.files)
} }
}, },
props: [ props: [
@ -67,7 +66,7 @@ const mediaUpload = {
watch: { watch: {
'dropFiles': function (fileInfos) { 'dropFiles': function (fileInfos) {
if (!this.uploading) { if (!this.uploading) {
this.uploadFile(fileInfos[0]) this.multiUpload(fileInfos)
} }
} }
} }

View file

@ -1,10 +1,5 @@
<template> <template>
<div <div class="media-upload">
class="media-upload"
@drop.prevent
@dragover.prevent="fileDrag"
@drop="fileDrop"
>
<label <label
class="label" class="label"
:title="$t('tool_tip.media_upload')" :title="$t('tool_tip.media_upload')"

View file

@ -82,7 +82,9 @@ const PostStatusForm = {
contentType contentType
}, },
caret: 0, caret: 0,
pollFormVisible: false pollFormVisible: false,
showDropIcon: 'hide',
dropStopTimeout: null
} }
}, },
computed: { computed: {
@ -218,7 +220,6 @@ const PostStatusForm = {
}, },
addMediaFile (fileInfo) { addMediaFile (fileInfo) {
this.newStatus.files.push(fileInfo) this.newStatus.files.push(fileInfo)
this.enableSubmit()
}, },
removeMediaFile (fileInfo) { removeMediaFile (fileInfo) {
let index = this.newStatus.files.indexOf(fileInfo) let index = this.newStatus.files.indexOf(fileInfo)
@ -227,7 +228,6 @@ const PostStatusForm = {
uploadFailed (errString, templateArgs) { uploadFailed (errString, templateArgs) {
templateArgs = templateArgs || {} templateArgs = templateArgs || {}
this.error = this.$t('upload.error.base') + ' ' + this.$t('upload.error.' + errString, templateArgs) this.error = this.$t('upload.error.base') + ' ' + this.$t('upload.error.' + errString, templateArgs)
this.enableSubmit()
}, },
disableSubmit () { disableSubmit () {
this.submitDisabled = true this.submitDisabled = true
@ -250,13 +250,27 @@ const PostStatusForm = {
} }
}, },
fileDrop (e) { fileDrop (e) {
if (e.dataTransfer.files.length > 0) { if (e.dataTransfer && e.dataTransfer.types.includes('Files')) {
e.preventDefault() // allow dropping text like before e.preventDefault() // allow dropping text like before
this.dropFiles = e.dataTransfer.files this.dropFiles = e.dataTransfer.files
clearTimeout(this.dropStopTimeout)
this.showDropIcon = 'hide'
} }
}, },
fileDragStop (e) {
// The false-setting is done with delay because just using leave-events
// directly caused unwanted flickering, this is not perfect either but
// much less noticable.
clearTimeout(this.dropStopTimeout)
this.showDropIcon = 'fade'
this.dropStopTimeout = setTimeout(() => (this.showDropIcon = 'hide'), 500)
},
fileDrag (e) { fileDrag (e) {
e.dataTransfer.dropEffect = 'copy' e.dataTransfer.dropEffect = 'copy'
if (e.dataTransfer && e.dataTransfer.types.includes('Files')) {
clearTimeout(this.dropStopTimeout)
this.showDropIcon = 'show'
}
}, },
onEmojiInputInput (e) { onEmojiInputInput (e) {
this.$nextTick(() => { this.$nextTick(() => {

View file

@ -6,7 +6,15 @@
<form <form
autocomplete="off" autocomplete="off"
@submit.prevent="postStatus(newStatus)" @submit.prevent="postStatus(newStatus)"
@dragover.prevent="fileDrag"
> >
<div
v-show="showDropIcon !== 'hide'"
:style="{ animation: showDropIcon === 'show' ? 'fade-in 0.25s' : 'fade-out 0.5s' }"
class="drop-indicator icon-upload"
@dragleave="fileDragStop"
@drop.stop="fileDrop"
/>
<div class="form-group"> <div class="form-group">
<i18n <i18n
v-if="!$store.state.users.currentUser.locked && newStatus.visibility == 'private'" v-if="!$store.state.users.currentUser.locked && newStatus.visibility == 'private'"
@ -96,9 +104,7 @@
:disabled="posting" :disabled="posting"
class="form-post-body" class="form-post-body"
@keydown.meta.enter="postStatus(newStatus)" @keydown.meta.enter="postStatus(newStatus)"
@keyup.ctrl.enter="postStatus(newStatus)" @keydown.ctrl.enter="postStatus(newStatus)"
@drop="fileDrop"
@dragover.prevent="fileDrag"
@input="resize" @input="resize"
@compositionupdate="resize" @compositionupdate="resize"
@paste="paste" @paste="paste"
@ -172,6 +178,7 @@
@uploading="disableSubmit" @uploading="disableSubmit"
@uploaded="addMediaFile" @uploaded="addMediaFile"
@upload-failed="uploadFailed" @upload-failed="uploadFailed"
@all-uploaded="enableSubmit"
/> />
<div <div
class="emoji-icon" class="emoji-icon"
@ -460,7 +467,8 @@
form { form {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 0.6em; margin: 0.6em;
position: relative;
} }
.form-group { .form-group {
@ -518,5 +526,35 @@
cursor: pointer; cursor: pointer;
z-index: 4; z-index: 4;
} }
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 0.6; }
}
@keyframes fade-out {
from { opacity: 0.6; }
to { opacity: 0; }
}
.drop-indicator {
position: absolute;
z-index: 1;
width: 100%;
height: 100%;
font-size: 5em;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.6;
color: $fallback--text;
color: var(--text, $fallback--text);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
border: 2px dashed $fallback--text;
border: 2px dashed var(--text, $fallback--text);
}
} }
</style> </style>

View file

@ -32,12 +32,12 @@ const DomainMuteList = withSubscription({
const MutesAndBlocks = { const MutesAndBlocks = {
data () { data () {
return { return {
activeTab: 'profile', activeTab: 'profile'
newDomainToMute: ''
} }
}, },
created () { created () {
this.$store.dispatch('fetchTokens') this.$store.dispatch('fetchTokens')
this.$store.dispatch('getKnownDomains')
}, },
components: { components: {
TabSwitcher, TabSwitcher,
@ -51,6 +51,14 @@ const MutesAndBlocks = {
Autosuggest, Autosuggest,
Checkbox Checkbox
}, },
computed: {
knownDomains () {
return this.$store.state.instance.knownDomains
},
user () {
return this.$store.state.users.currentUser
}
},
methods: { methods: {
importFollows (file) { importFollows (file) {
return this.$store.state.api.backendInteractor.importFollows({ file }) return this.$store.state.api.backendInteractor.importFollows({ file })
@ -86,13 +94,13 @@ const MutesAndBlocks = {
filterUnblockedUsers (userIds) { filterUnblockedUsers (userIds) {
return reject(userIds, (userId) => { return reject(userIds, (userId) => {
const relationship = this.$store.getters.relationship(this.userId) const relationship = this.$store.getters.relationship(this.userId)
return relationship.blocking || userId === this.$store.state.users.currentUser.id return relationship.blocking || userId === this.user.id
}) })
}, },
filterUnMutedUsers (userIds) { filterUnMutedUsers (userIds) {
return reject(userIds, (userId) => { return reject(userIds, (userId) => {
const relationship = this.$store.getters.relationship(this.userId) const relationship = this.$store.getters.relationship(this.userId)
return relationship.muting || userId === this.$store.state.users.currentUser.id return relationship.muting || userId === this.user.id
}) })
}, },
queryUserIds (query) { queryUserIds (query) {
@ -111,12 +119,16 @@ const MutesAndBlocks = {
unmuteUsers (ids) { unmuteUsers (ids) {
return this.$store.dispatch('unmuteUsers', ids) return this.$store.dispatch('unmuteUsers', ids)
}, },
filterUnMutedDomains (urls) {
return urls.filter(url => !this.user.domainMutes.includes(url))
},
queryKnownDomains (query) {
return new Promise((resolve, reject) => {
resolve(this.knownDomains.filter(url => url.toLowerCase().includes(query)))
})
},
unmuteDomains (domains) { unmuteDomains (domains) {
return this.$store.dispatch('unmuteDomains', domains) return this.$store.dispatch('unmuteDomains', domains)
},
muteDomain () {
return this.$store.dispatch('muteDomain', this.newDomainToMute)
.then(() => { this.newDomainToMute = '' })
} }
} }
} }

View file

@ -119,21 +119,16 @@
<div :label="$t('settings.domain_mutes')"> <div :label="$t('settings.domain_mutes')">
<div class="domain-mute-form"> <div class="domain-mute-form">
<input <Autosuggest
v-model="newDomainToMute" :filter="filterUnMutedDomains"
:query="queryKnownDomains"
:placeholder="$t('settings.type_domains_to_mute')" :placeholder="$t('settings.type_domains_to_mute')"
type="text"
@keyup.enter="muteDomain"
> >
<ProgressButton <DomainMuteCard
class="btn btn-default domain-mute-button" slot-scope="row"
:click="muteDomain" :domain="row.item"
> />
{{ $t('domain_mute_card.mute') }} </Autosuggest>
<template slot="progress">
{{ $t('domain_mute_card.mute_progress') }}
</template>
</ProgressButton>
</div> </div>
<DomainMuteList <DomainMuteList
:refresh="true" :refresh="true"

View file

@ -140,7 +140,6 @@
@import '../../../../_variables.scss'; @import '../../../../_variables.scss';
.mfa-settings { .mfa-settings {
.mfa-heading, .method-item { .mfa-heading, .method-item {
overflow: hidden;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: space-between; justify-content: space-between;

View file

@ -34,9 +34,9 @@
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Mute", "mute": "Mute",
"mute_progress": "Muting...", "mute_progress": "Muting",
"unmute": "Unmute", "unmute": "Unmute",
"unmute_progress": "Unmuting..." "unmute_progress": "Unmuting"
}, },
"exporter": { "exporter": {
"export": "Export", "export": "Export",
@ -126,7 +126,7 @@
"preferences": "Preferences" "preferences": "Preferences"
}, },
"notifications": { "notifications": {
"broken_favorite": "Unknown status, searching for it...", "broken_favorite": "Unknown status, searching for it",
"favorited_you": "favorited your status", "favorited_you": "favorited your status",
"followed_you": "followed you", "followed_you": "followed you",
"follow_request": "wants to follow you", "follow_request": "wants to follow you",
@ -239,7 +239,7 @@
"generate_new_recovery_codes": "Generate new recovery codes", "generate_new_recovery_codes": "Generate new recovery codes",
"warning_of_generate_new_codes": "When you generate new recovery codes, your old codes wont work anymore.", "warning_of_generate_new_codes": "When you generate new recovery codes, your old codes wont work anymore.",
"recovery_codes": "Recovery codes.", "recovery_codes": "Recovery codes.",
"waiting_a_recovery_codes": "Receiving backup codes...", "waiting_a_recovery_codes": "Receiving backup codes",
"recovery_codes_warning": "Write the codes down or save them somewhere secure - otherwise you won't see them again. If you lose access to your 2FA app and recovery codes you'll be locked out of your account.", "recovery_codes_warning": "Write the codes down or save them somewhere secure - otherwise you won't see them again. If you lose access to your 2FA app and recovery codes you'll be locked out of your account.",
"authentication_methods": "Authentication methods", "authentication_methods": "Authentication methods",
"scan": { "scan": {
@ -401,7 +401,7 @@
"theme_help_v2_1": "You can also override certain component's colors and opacity by toggling the checkbox, use \"Clear all\" button to clear all overrides.", "theme_help_v2_1": "You can also override certain component's colors and opacity by toggling the checkbox, use \"Clear all\" button to clear all overrides.",
"theme_help_v2_2": "Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.", "theme_help_v2_2": "Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.",
"tooltipRadius": "Tooltips/alerts", "tooltipRadius": "Tooltips/alerts",
"type_domains_to_mute": "Type in domains to mute", "type_domains_to_mute": "Search domains to mute",
"upload_a_photo": "Upload a photo", "upload_a_photo": "Upload a photo",
"user_settings": "User Settings", "user_settings": "User Settings",
"values": { "values": {
@ -660,11 +660,11 @@
"subscribe": "Subscribe", "subscribe": "Subscribe",
"unsubscribe": "Unsubscribe", "unsubscribe": "Unsubscribe",
"unblock": "Unblock", "unblock": "Unblock",
"unblock_progress": "Unblocking...", "unblock_progress": "Unblocking",
"block_progress": "Blocking...", "block_progress": "Blocking",
"unmute": "Unmute", "unmute": "Unmute",
"unmute_progress": "Unmuting...", "unmute_progress": "Unmuting",
"mute_progress": "Muting...", "mute_progress": "Muting",
"hide_repeats": "Hide repeats", "hide_repeats": "Hide repeats",
"show_repeats": "Show repeats", "show_repeats": "Show repeats",
"admin_menu": { "admin_menu": {

View file

@ -103,7 +103,7 @@
"single_choice": "Elección única", "single_choice": "Elección única",
"multiple_choices": "Elección múltiple", "multiple_choices": "Elección múltiple",
"expiry": "Tiempo de vida de la encuesta", "expiry": "Tiempo de vida de la encuesta",
"expires_in": "La encuensta termina en {0}", "expires_in": "La encuesta termina en {0}",
"expired": "La encuesta terminó hace {0}", "expired": "La encuesta terminó hace {0}",
"not_enough_options": "Muy pocas opciones únicas en la encuesta" "not_enough_options": "Muy pocas opciones únicas en la encuesta"
}, },
@ -137,7 +137,7 @@
}, },
"content_warning": "Tema (opcional)", "content_warning": "Tema (opcional)",
"default": "Acabo de aterrizar en L.A.", "default": "Acabo de aterrizar en L.A.",
"direct_warning_to_all": "Esta publicación será visible para todos los usarios mencionados.", "direct_warning_to_all": "Esta publicación será visible para todos los usuarios mencionados.",
"direct_warning_to_first_only": "Esta publicación solo será visible para los usuarios mencionados al comienzo del mensaje.", "direct_warning_to_first_only": "Esta publicación solo será visible para los usuarios mencionados al comienzo del mensaje.",
"posting": "Publicando", "posting": "Publicando",
"scope_notice": { "scope_notice": {
@ -146,7 +146,7 @@
"unlisted": "Esta publicación no será visible en la Línea Temporal Pública ni en Toda La Red Conocida" "unlisted": "Esta publicación no será visible en la Línea Temporal Pública ni en Toda La Red Conocida"
}, },
"scope": { "scope": {
"direct": "Directo - Solo para los usuarios mencionados.", "direct": "Directo - Solo para los usuarios mencionados",
"private": "Solo-seguidores - Solo tus seguidores leerán la publicación", "private": "Solo-seguidores - Solo tus seguidores leerán la publicación",
"public": "Público - Entradas visibles en las Líneas Temporales Públicas", "public": "Público - Entradas visibles en las Líneas Temporales Públicas",
"unlisted": "Sin listar - Entradas no visibles en las Líneas Temporales Públicas" "unlisted": "Sin listar - Entradas no visibles en las Líneas Temporales Públicas"
@ -210,7 +210,7 @@
"background": "Fondo", "background": "Fondo",
"bio": "Biografía", "bio": "Biografía",
"block_export": "Exportar usuarios bloqueados", "block_export": "Exportar usuarios bloqueados",
"block_export_button": "Exporta la lista de tus usarios bloqueados a un archivo csv", "block_export_button": "Exporta la lista de tus usuarios bloqueados a un archivo csv",
"block_import": "Importar usuarios bloqueados", "block_import": "Importar usuarios bloqueados",
"block_import_error": "Error importando la lista de usuarios bloqueados", "block_import_error": "Error importando la lista de usuarios bloqueados",
"blocks_imported": "¡Lista de usuarios bloqueados importada! El procesado puede tardar un poco.", "blocks_imported": "¡Lista de usuarios bloqueados importada! El procesado puede tardar un poco.",
@ -222,7 +222,7 @@
"cRed": "Rojo (Cancelar)", "cRed": "Rojo (Cancelar)",
"change_password": "Cambiar contraseña", "change_password": "Cambiar contraseña",
"change_password_error": "Hubo un problema cambiando la contraseña.", "change_password_error": "Hubo un problema cambiando la contraseña.",
"changed_password": "Contraseña cambiada correctamente!", "changed_password": "¡Contraseña cambiada correctamente!",
"collapse_subject": "Colapsar entradas con tema", "collapse_subject": "Colapsar entradas con tema",
"composing": "Redactando", "composing": "Redactando",
"confirm_new_password": "Confirmar la nueva contraseña", "confirm_new_password": "Confirmar la nueva contraseña",
@ -286,7 +286,7 @@
"notification_visibility_repeats": "Repeticiones (Repeats)", "notification_visibility_repeats": "Repeticiones (Repeats)",
"no_rich_text_description": "Eliminar el formato de texto enriquecido de todas las entradas", "no_rich_text_description": "Eliminar el formato de texto enriquecido de todas las entradas",
"no_blocks": "No hay usuarios bloqueados", "no_blocks": "No hay usuarios bloqueados",
"no_mutes": "No hay usuarios sinlenciados", "no_mutes": "No hay usuarios silenciados",
"hide_follows_description": "No mostrar a quién sigo", "hide_follows_description": "No mostrar a quién sigo",
"hide_followers_description": "No mostrar quién me sigue", "hide_followers_description": "No mostrar quién me sigue",
"hide_follows_count_description": "No mostrar el número de cuentas que sigo", "hide_follows_count_description": "No mostrar el número de cuentas que sigo",
@ -305,7 +305,7 @@
"profile_background": "Fondo del Perfil", "profile_background": "Fondo del Perfil",
"profile_banner": "Cabecera del Perfil", "profile_banner": "Cabecera del Perfil",
"profile_tab": "Perfil", "profile_tab": "Perfil",
"radii_help": "Estable el redondeo de las esquinas de la interfaz (en píxeles)", "radii_help": "Establezca el redondeo de las esquinas de la interfaz (en píxeles)",
"replies_in_timeline": "Réplicas en la línea temporal", "replies_in_timeline": "Réplicas en la línea temporal",
"reply_link_preview": "Activar la previsualización del enlace de responder al pasar el ratón por encima", "reply_link_preview": "Activar la previsualización del enlace de responder al pasar el ratón por encima",
"reply_visibility_all": "Mostrar todas las réplicas", "reply_visibility_all": "Mostrar todas las réplicas",

View file

@ -4,7 +4,19 @@
"find_user": "Otsi kasutajaid" "find_user": "Otsi kasutajaid"
}, },
"general": { "general": {
"submit": "Postita" "submit": "Postita",
"verify": "Kinnita",
"confirm": "Kinnita",
"enable": "Luba",
"disable": "Keela",
"cancel": "Tühista",
"dismiss": "Olgu",
"show_less": "Kuva vähem",
"show_more": "Kuva rohkem",
"optional": "valikuline",
"generic_error": "Esines viga",
"more": "Rohkem",
"apply": "Rakenda"
}, },
"login": { "login": {
"login": "Logi sisse", "login": "Logi sisse",
@ -12,29 +24,95 @@
"password": "Parool", "password": "Parool",
"placeholder": "nt lain", "placeholder": "nt lain",
"register": "Registreeru", "register": "Registreeru",
"username": "Kasutajanimi" "username": "Kasutajanimi",
"heading": {
"recovery": "Kaheastmelise autentimise taaste",
"totp": "Kaheastmeline autentimine"
},
"recovery_code": "Taastekood",
"enter_two_factor_code": "Sisesta kaheastmelise autentimise kood",
"enter_recovery_code": "Sisesta taastekood",
"authentication_code": "Autentimiskood",
"hint": "Logi sisse, et liituda vestlusega",
"description": "Logi sisse OAuthiga"
}, },
"nav": { "nav": {
"mentions": "Mainimised", "mentions": "Mainimised",
"public_tl": "Avalik Ajajoon", "public_tl": "Avalik Ajajoon",
"timeline": "Ajajoon", "timeline": "Ajajoon",
"twkn": "Kogu Teadaolev Võrgustik" "twkn": "Kogu Teadaolev Võrgustik",
"preferences": "Eelistused",
"who_to_follow": "Keda jälgida",
"search": "Otsing",
"user_search": "Kasutajaotsing",
"dms": "Privaatsõnumid",
"interactions": "Interaktsioonid",
"friend_requests": "Jägimistaotlused",
"chat": "Kohalik vestlus",
"back": "Tagasi",
"administration": "Administreerimine",
"about": "Meist"
}, },
"notifications": { "notifications": {
"followed_you": "alustas sinu jälgimist", "followed_you": "alustas sinu jälgimist",
"notifications": "Teavitused", "notifications": "Teated",
"read": "Loe!" "read": "Loe!",
"reacted_with": "reageeris {0}",
"migrated_to": "kolis",
"no_more_notifications": "Rohkem teateid ei ole",
"repeated_you": "taaspostitas su staatuse",
"load_older": "Laadi vanemad teated",
"follow_request": "soovib Teid jälgida",
"favorited_you": "lisas su staatuse lemmikuks",
"broken_favorite": "Tundmatu staatus, otsin…"
}, },
"post_status": { "post_status": {
"default": "Just sõitsin elektrirongiga Tallinnast Pääskülla.", "default": "Just sõitsin elektrirongiga Tallinnast Pääskülla.",
"posting": "Postitan" "posting": "Postitan",
"scope": {
"unlisted": "Peidetud - Ära postita avalikele ajajoontele",
"public": "Avalil - Postita avalikele ajajoontele",
"private": "Jälgijatele - Postita ainult jälgijatele",
"direct": "Privaatne - Postita ainult mainitud kasutajatele"
},
"scope_notice": {
"unlisted": "See postitus ei ole nähtav avalikul ega kogu võrgu ajajoonel",
"private": "See postitus on nähtav ainult Teie jälgijatele",
"public": "See postitus on nähtav kõigile"
},
"direct_warning_to_first_only": "See postitus on nähtav ainult kirja alguses mainitud kasutajatele.",
"direct_warning_to_all": "See postitus on nähtav kõikidele mainitud kasutajatele.",
"content_warning": "Pealkiri (valikuline)",
"content_type": {
"text/bbcode": "BBCode",
"text/markdown": "Markdown",
"text/html": "HTML",
"text/plain": "Lihttekst"
},
"attachments_sensitive": "Märgi manused sensitiivseks",
"account_not_locked_warning_link": "lukus",
"account_not_locked_warning": "Teie konto ei ole {0}. Kõik võivad Teid jälgida, et näha Teie ainult-jälgijatele postitusi.",
"new_status": "Postita uus staatus"
}, },
"registration": { "registration": {
"bio": "Bio", "bio": "Bio",
"email": "E-post", "email": "E-post",
"fullname": "Kuvatav nimi", "fullname": "Kuvatav nimi",
"password_confirm": "Parooli kinnitamine", "password_confirm": "Parooli kinnitamine",
"registration": "Registreerimine" "registration": "Registreerimine",
"validations": {
"password_confirmation_match": "peaks olema sama kui salasõna",
"password_confirmation_required": "ei saa jätta tühjaks",
"password_required": "ei saa jätta tühjaks",
"email_required": "ei saa jätta tühjaks",
"fullname_required": "ei saa jätta tühjaks",
"username_required": "ei saa jätta tühjaks"
},
"fullname_placeholder": "Näiteks Lain Iwakura",
"username_placeholder": "Näiteks lain",
"new_captcha": "Vajuta pildile, et saada uus captcha",
"captcha": "CAPTCHA",
"token": "Kutse võti"
}, },
"settings": { "settings": {
"attachments": "Manused", "attachments": "Manused",
@ -44,7 +122,7 @@
"current_avatar": "Sinu praegune profiilipilt", "current_avatar": "Sinu praegune profiilipilt",
"current_profile_banner": "Praegune profiilibänner", "current_profile_banner": "Praegune profiilibänner",
"filtering": "Sisu filtreerimine", "filtering": "Sisu filtreerimine",
"filtering_explanation": "Kõiki staatuseid, mis sisaldavad neid sõnu, ei kuvata. Üks sõna reale.", "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_convo": "Peida manused vastlustes",
"hide_attachments_in_tl": "Peida manused ajajoonel", "hide_attachments_in_tl": "Peida manused ajajoonel",
"name": "Nimi", "name": "Nimi",
@ -58,7 +136,201 @@
"set_new_profile_banner": "Vali uus profiilibänner", "set_new_profile_banner": "Vali uus profiilibänner",
"settings": "Sätted", "settings": "Sätted",
"theme": "Teema", "theme": "Teema",
"user_settings": "Kasutaja sätted" "user_settings": "Kasutaja sätted",
"subject_line_noop": "Ära kopeeri",
"subject_line_mastodon": "Nagu mastodon: kopeeri nagu on",
"subject_line_email": "Nagu e-post: \"vs: pealkiri\"",
"subject_line_behavior": "Kopeeri pealkiri vastamisel",
"subject_input_always_show": "Alati kuva pealkirja välja",
"minimal_scopes_mode": "Peida postituse nähtavussätted",
"scope_copy": "Kopeeri nähtavussätted vastamisel (Privaatsed on alati kopeeritud)",
"security_tab": "Turvalisus",
"search_user_to_mute": "Otsi, keda soovid vaigistada",
"search_user_to_block": "Otsi, keda soovid blokeerida",
"saving_ok": "Sätted salvestatud",
"saving_err": "Sätete salvestamine ebaõnnestus",
"autohide_floating_post_button": "Automaatselt peida uue postituse nupp (mobiilil)",
"reply_visibility_self": "Näita ainult vastuseid, mis on suunatud mulle",
"reply_visibility_following": "Näita ainult vastuseid, mis on suunatud mulle või kasutajatele, keda jälgin",
"reply_visibility_all": "Näita kõiki vastuseid",
"replies_in_timeline": "Vastused ajajoonel",
"radii_help": "Liidese ümardamine (pikslites)",
"profile_tab": "Profiil",
"presets": "Salvestatud sätted",
"pause_on_unfocused": "Peata reaalajas voog kui leht pole fookuses",
"panelRadius": "Paneelid",
"revoke_token": "Keela",
"valid_until": "Kehtiv kuni",
"refresh_token": "Värskendustoken",
"token": "Token",
"oauth_tokens": "OAuth tokenid",
"show_moderator_badge": "Näita Moderaator silti mu profiilil",
"show_admin_badge": "Näita Admin silti mu profiilil",
"hide_followers_count_description": "Ära näita minu jälgijate arvu",
"hide_follows_count_description": "Ära näita minu jälgimiste arvu",
"hide_followers_description": "Ära näita minu jälgijaid",
"hide_follows_description": "Ära näita minu jälgimisi",
"no_mutes": "Vaigistusi pole",
"no_blocks": "Blokeeringuid pole",
"no_rich_text_description": "Muuda kõik postitused lihttekstiks",
"notification_visibility_emoji_reactions": "Reaktsioonid",
"notification_visibility_moves": "Kasutaja kolimised",
"notification_visibility_repeats": "Taaspostitused",
"notification_visibility_mentions": "Mainimised",
"notification_visibility_likes": "Lemmikud",
"notification_visibility_follows": "Jälgimised",
"notification_visibility": "Milliseid teateid kuvatakse",
"new_password": "Uus salasõna",
"new_email": "Uus e-post",
"use_contain_fit": "Näita eelvaadetes täis suuruses pilte",
"play_videos_in_modal": "Näita videoid eraldi raamis",
"mutes_tab": "Vaigistused",
"loop_video_silent_only": "Loop videod, millel pole heli (nt. Mastodoni \"gifid\")",
"loop_video": "Loop videod",
"lock_account_description": "Piira oma konto ainult lubatud jälgijatele",
"links": "Lingid",
"limited_availability": "Pole Teie veebilehitsejas saadaval",
"invalid_theme_imported": "Valitud fail ei ole Pleroma kujundus. Kujundusele muudatusi ei tehtud.",
"interfaceLanguage": "Liidese keel",
"interface": "Liides",
"instance_default_simple": "(vaikimisi)",
"instance_default": "(vaikimisi: {value})",
"checkboxRadius": "Märkeruudud",
"inputRadius": "Sisestuskastid",
"import_theme": "Lae sätted",
"import_followers_from_a_csv_file": "Impordi jälgimised csv failist",
"import_blocks_from_a_csv_file": "Impordi blokeeringud csv failist",
"hide_filtered_statuses": "Peida filtreeritud staatused",
"hide_user_stats": "Peida kasutaja statistika (nt. jälgijate arv)",
"hide_post_stats": "Peida postituse statistika (nt. lemmikute arv)",
"use_one_click_nsfw": "Ava NSFW manused ühe klikiga",
"preload_images": "Piltide eellaadimine",
"hide_isp": "Peida instantsipõhine paneel",
"max_thumbnails": "Maksimaalne lubatud eelvaadete arv postituste kohta",
"hide_muted_posts": "Peida vaigistatud kasutajate postitused",
"general": "Üldine",
"foreground": "Esiplaan",
"accent": "Rõhk",
"follows_imported": "Jälgimised imporditud! Nende töötlemine võtab natuke aega.",
"follow_import_error": "Jälgimiste importimisel tekkis viga",
"follow_import": "Impordi jälgimised",
"follow_export_button": "Ekspordi oma jälgimised csv failiks",
"follow_export": "Ekspordi jälgimised",
"export_theme": "Salvesta sätted",
"emoji_reactions_on_timeline": "Näita reaktsioone ajajoonel",
"pad_emoji": "Lisa emotikonidele tühikud ette ja järgi neid menüüst valides",
"avatar_size_instruction": "Profiilipildi soovitatud minimaalne suurus on 150x150 pikslit.",
"domain_mutes": "Domeenid",
"discoverable": "Luba selle konto ilmumine otsingutulemustes ning muudes teenustes",
"delete_account_instructions": "Konto kustutamise kinnitamiseks sisestage oma salasõna.",
"delete_account_error": "Teie konto kustutamisel tekkis viga. Kui see jätkub, palun võtke kontakti administraatoriga.",
"delete_account_description": "Jäädavalt kustuta oma andmed ja konto.",
"delete_account": "Kustuta konto",
"default_vis": "Vaikimisi nähtavus",
"data_import_export_tab": "Andmete import / eksport",
"current_password": "Praegune salasõna",
"confirm_new_password": "Kinnita uus salasõna",
"composing": "Koostamine",
"collapse_subject": "Peida postituste pealkirjad",
"changed_password": "Salasõna edukalt muudetud!",
"change_password_error": "Esines viga salasõna muutmisel.",
"change_password": "Muuda salasõna",
"changed_email": "E-post edukalt muudetud!",
"change_email_error": "Esines viga e-posti muutmisel.",
"change_email": "Muuda e-posti",
"cRed": "Punane (Tühista)",
"cOrange": "Oranž (Lisa lemmikuks)",
"cGreen": "Roheline (Taaspostita)",
"cBlue": "Sinine (Vasta, jälgi)",
"btnRadius": "Nupud",
"blocks_tab": "Blokeeringud",
"blocks_imported": "Blokeeringud imporditud! Nende töötlemine võtab natuke aega.",
"block_import_error": "Blokeeringute importimisel esines viga",
"block_import": "Blokeeringute import",
"block_export_button": "Ekspordi oma blokeeringud csv failiks",
"block_export": "Blokeeringute eksport",
"background": "Taust",
"avatarRadius": "Profiilipildid",
"avatarAltRadius": "Profiilipildid (Teated)",
"attachmentRadius": "Manused",
"allow_following_move": "Luba automaatjälgimine kui jälgitav konto kolib",
"mfa": {
"verify": {
"desc": "Et lubada kaheastmelist autentimist, sisestage kood oma äpist:"
},
"scan": {
"desc": "Kasutades oma kaheastmelise autentimise äppi, skännige see QR kood või sisestage tekstiline võti:",
"secret_code": "Võti",
"title": "Skänni"
},
"authentication_methods": "Autentimismeetodid",
"recovery_codes_warning": "Kirjutage need koodid üles ning hoidke need kindlas kohas. Kui Te kaotate ligipääsu oma kaheastmelise autentimise äppile ning nendele koodidele, ei ole Teil võimalik oma kontosse sisse logida.",
"waiting_a_recovery_codes": "Laen taastekoode…",
"recovery_codes": "Taastekoodid.",
"warning_of_generate_new_codes": "Kui Te loote uued taastekoodid, Teie vanad koodid ei tööta enam.",
"generate_new_recovery_codes": "Loo uued taastekoodid",
"title": "Kaheastmeline autentimine",
"confirm_and_enable": "Kinnita & luba OTP",
"wait_pre_setup_otp": "sean üles OTP",
"setup_otp": "Sea üles OTP",
"otp": "OTP"
},
"enter_current_password_to_confirm": "Sisetage isiku tõestamiseks oma salasõna",
"security": "Turvalisus",
"app_name": "Rakenduse nimi",
"style": {
"switcher": {
"help": {
"snapshot_present": "Kujunduse eelvaade on laetud, nii et kõik väärtused on üle kirjutatud. Te saate laadida ka kujunduse päris sisu.",
"older_version_imported": "Teie imporditud fail oli loodud vanemas versioonis.",
"future_version_imported": "Teie imporditud fail oli loodud uuemas versioonis.",
"v2_imported": "Teie imporditud fail oli vanema versiooni jaoks. Me üritame hoida ühilduvust, kuid ikkagi võib esineda erinevusi.",
"upgraded_from_v2": "PleromaFE-d uuendati, teie kujundus võib välja näha natuke erinev, kui mäletate."
},
"use_source": "Uus versioon",
"use_snapshot": "Vana versioon",
"keep_as_is": "Jäta nii, nagu on",
"load_theme": "Lae kujundus",
"clear_opacity": "Tühista läbipaistvus",
"clear_all": "Tühista kõik",
"reset": "Taasta algne",
"keep_fonts": "Jäta fondid",
"keep_roundness": "Jäta ümarus",
"keep_opacity": "Jäta läbipaistvus",
"keep_shadows": "Jäta varjud",
"keep_color": "Jäta värvid"
}
},
"enable_web_push_notifications": "Luba veebipõhised push-teated",
"notification_blocks": "Kasutaja blokeerimisel ei tule neilt enam teateid ning nendele teilt ka mitte.",
"notification_setting_privacy_option": "Peida saatja ning sisu push-teadetelt",
"notification_setting": "Saa teateid nendelt:",
"notifications": "Teated",
"notification_mutes": "Kui soovid mõnelt kasutajalt mitte teateid saada, kasuta vaigistust.",
"notification_setting_privacy": "Privaatsus",
"notification_setting_non_followers": "Kasutajatelt, kes sind ei jälgi",
"notification_setting_followers": "Kasutajatelt, kes jälgivad sind",
"notification_setting_non_follows": "Kasutajatelt, keda sa ei jälgi",
"notification_setting_follows": "Kasutajatelt, keda jälgid",
"notification_setting_filters": "Filtrid",
"greentext": "Meemi nooled",
"fun": "Naljad",
"values": {
"true": "jah",
"false": "ei"
},
"upload_a_photo": "Lae üles foto",
"type_domains_to_mute": "Trüki siia domeene, mida vaigistada",
"tooltipRadius": "Vihjed/hoiatused",
"theme_help_v2_1": "Te saate ka mõndade komponentide värvust ning läbipaistvust üle kirjutada vajutades ruudule. Kasuta \"Tühista kõik\" nuppu, et need tühistada.",
"theme_help": "Kasuta hex värvikoode (#rrggbb) oma kujunduse isikupärastamiseks.",
"text": "Tekst",
"useStreamingApiWarning": "(Pole soovituslik, eksperimentaalne, on teada, et jätab postitusi vahele)",
"useStreamingApi": "Saa postitusi ning teateid reaalajas",
"user_mutes": "Kasutajad",
"streaming": "Luba uute postituste automaatvoog kui oled lehekülje alguses",
"stop_gifs": "Mängi GIFid hiirega ületades",
"post_status_content_type": "Postituse sisutüüp"
}, },
"timeline": { "timeline": {
"conversation": "Vestlus", "conversation": "Vestlus",
@ -79,5 +351,111 @@
"muted": "Vaigistatud", "muted": "Vaigistatud",
"per_day": "päevas", "per_day": "päevas",
"statuses": "Staatuseid" "statuses": "Staatuseid"
},
"about": {
"mrf": {
"mrf_policies_desc": "MRF poliitikad mõjutavad selle instansi föderatsiooni käitumist. Järgmised poliitikad on lubatud:",
"simple": {
"media_nsfw_desc": "See instants määrab nendest instantsidest postituste meedia sensitiivseks:",
"media_nsfw": "Meedia määratakse sensitiivseks",
"media_removal_desc": "See instants eemaldab meedia postitustelt nendest instantsidest:",
"media_removal": "Meedia eemaldamine",
"ftl_removal_desc": "See instants eemaldab postitused nendelt instantsidest \"Kogu teatud võrgu\" ajajoonelt:",
"ftl_removal": "\"Kogu teatud võrgu\" ajajoonelt eemaldamine",
"quarantine_desc": "See instants saadab ainult avalikke postitusi järgmistele instantsidele:",
"quarantine": "Karantiini",
"reject_desc": "See instants ei luba sõnumeid nendest instantsidest:",
"reject": "Keela",
"accept_desc": "See instants lubab sõnumeid ainult nendest instantsidest:",
"accept": "Luba",
"simple_policies": "Instansi-omased poliitikad"
},
"mrf_policies": "Lubatud MRF poliitikad",
"keyword": {
"is_replaced_by": "→",
"replace": "Vaheta",
"reject": "Lükka tagasi",
"ftl_removal": "\"Kogu teatud võrgu\" ajajoonelt eemaldamine",
"keyword_policies": "Võtmesõna poliitikad"
},
"federation": "Föderatsioon"
},
"staff": "Personal"
},
"selectable_list": {
"select_all": "Vali kõik"
},
"remote_user_resolver": {
"error": "Ei leitud.",
"searching_for": "Otsin",
"remote_user_resolver": "Kaugkasutaja leidja"
},
"interactions": {
"load_older": "Laadi vanemad interaktsioonid",
"moves": "Kasutaja kolimised",
"follows": "Uued jälgimised",
"favs_repeats": "Taaspostitused ja lemmikud"
},
"emoji": {
"load_all": "Laen kõik {emojiAmount} emotikoni",
"load_all_hint": "Laadisin esimesed {saneAmount} emotikoni, kõike laadides võib esineda probleeme jõudlusega.",
"unicode": "Unicode emotikonid",
"custom": "Kohandatud emotikonid",
"add_emoji": "Lisa emotikon",
"search_emoji": "Otsi emotikone",
"keep_open": "Hoia valija lahti",
"emoji": "Emotikonid",
"stickers": "Kleepsud"
},
"polls": {
"not_enough_options": "Liiga vähe unikaalseid valikuid hääletuses",
"expired": "Hääletus lõppes {0} tagasi",
"expires_in": "Hääletus lõppeb {0}",
"expiry": "Hääletuse vanus",
"multiple_choices": "Mitu vastust",
"single_choice": "Üks vastus",
"type": "Hääletuse tüüp",
"vote": "Hääleta",
"votes": "häält",
"option": "Valik",
"add_option": "Lisa valik",
"add_poll": "Lisa küsitlus"
},
"media_modal": {
"next": "Järgmine",
"previous": "Eelmine"
},
"importer": {
"error": "Faili importimisel tekkis viga.",
"success": "Import õnnestus.",
"submit": "Esita"
},
"image_cropper": {
"cancel": "Tühista",
"save_without_cropping": "Salvesta muudatusteta",
"save": "Salvesta",
"crop_picture": "Modifitseeri pilti"
},
"features_panel": {
"who_to_follow": "Keda jälgida",
"title": "Featuurid",
"text_limit": "Tekstilimiit",
"scope_options": "Ulatuse valikud",
"media_proxy": "Meedia proksi",
"gopher": "Gopher",
"chat": "Vestlus"
},
"exporter": {
"processing": "Töötlemine, Teilt küsitakse varsti faili allalaadimist",
"export": "Ekspordi"
},
"domain_mute_card": {
"unmute_progress": "Eemaldan vaigistuse…",
"unmute": "Ära vaigista",
"mute_progress": "Vaigistan…",
"mute": "Vaigista"
},
"chat": {
"title": "Vestlus"
} }
} }

View file

@ -31,7 +31,8 @@
"disable": "Désactiver", "disable": "Désactiver",
"enable": "Activer", "enable": "Activer",
"confirm": "Confirmer", "confirm": "Confirmer",
"verify": "Vérifier" "verify": "Vérifier",
"dismiss": "Rejeter"
}, },
"image_cropper": { "image_cropper": {
"crop_picture": "Rogner l'image", "crop_picture": "Rogner l'image",
@ -167,7 +168,7 @@
"generate_new_recovery_codes": "Générer de nouveaux codes de récupération", "generate_new_recovery_codes": "Générer de nouveaux codes de récupération",
"warning_of_generate_new_codes": "Quand vous générez de nouveauc codes de récupération, vos anciens codes ne fonctionnerons plus.", "warning_of_generate_new_codes": "Quand vous générez de nouveauc codes de récupération, vos anciens codes ne fonctionnerons plus.",
"recovery_codes": "Codes de récupération.", "recovery_codes": "Codes de récupération.",
"waiting_a_recovery_codes": "Récéption des codes de récupération…", "waiting_a_recovery_codes": "Réception des codes de récupération…",
"recovery_codes_warning": "Écrivez les codes ou sauvez les quelquepart sécurisé - sinon vous ne les verrez plus jamais. Si vous perdez l'accès à votre application de double authentification et codes de récupération vous serez vérouillé en dehors de votre compte.", "recovery_codes_warning": "Écrivez les codes ou sauvez les quelquepart sécurisé - sinon vous ne les verrez plus jamais. Si vous perdez l'accès à votre application de double authentification et codes de récupération vous serez vérouillé en dehors de votre compte.",
"authentication_methods": "Methodes d'authentification", "authentication_methods": "Methodes d'authentification",
"scan": { "scan": {
@ -210,7 +211,7 @@
"data_import_export_tab": "Import / Export des Données", "data_import_export_tab": "Import / Export des Données",
"default_vis": "Visibilité par défaut", "default_vis": "Visibilité par défaut",
"delete_account": "Supprimer le compte", "delete_account": "Supprimer le compte",
"delete_account_description": "Supprimer définitivement votre compte et tous vos statuts.", "delete_account_description": "Supprimer définitivement vos données et désactiver 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⋅ice de cette instance.", "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⋅ice de cette instance.",
"delete_account_instructions": "Indiquez votre mot de passe ci-dessous pour confirmer la suppression de votre compte.", "delete_account_instructions": "Indiquez votre mot de passe ci-dessous pour confirmer la suppression de votre compte.",
"avatar_size_instruction": "La taille minimale recommandée pour l'image de l'avatar est de 150x150 pixels.", "avatar_size_instruction": "La taille minimale recommandée pour l'image de l'avatar est de 150x150 pixels.",
@ -343,7 +344,13 @@
"upgraded_from_v2": "PleromaFE à été mis à jour, le thème peut être un peu différent que dans vos souvenirs.", "upgraded_from_v2": "PleromaFE à été mis à jour, le thème peut être un peu différent que dans vos souvenirs.",
"v2_imported": "Le fichier que vous avez importé vient d'un version antérieure. Nous essayons de maximizer la compatibilité mais il peu y avoir quelques incohérences.", "v2_imported": "Le fichier que vous avez importé vient d'un version antérieure. Nous essayons de maximizer la compatibilité mais il peu y avoir quelques incohérences.",
"future_version_imported": "Le fichier importé viens d'une version postérieure de PleromaFE.", "future_version_imported": "Le fichier importé viens d'une version postérieure de PleromaFE.",
"older_version_imported": "Le fichier importé viens d'une version antérieure de PleromaFE." "older_version_imported": "Le fichier importé viens d'une version antérieure de PleromaFE.",
"snapshot_source_mismatch": "Conflict de version : Probablement due à un retour arrière puis remise à jour de la version de PleromaFE, si vous avez charger le thème en utilisant une version antérieure vous voulez probablement utiliser la version antérieure, autrement utiliser la version postérieure.",
"migration_napshot_gone": "Pour une raison inconnue l'instantané est manquant, des parties peuvent rendre différentes que dans vos souvenirs.",
"migration_snapshot_ok": "Pour être sûr un instantanée du thème à été chargé. Vos pouvez essayer de charger ses données.",
"fe_downgraded": "Retour en arrière de la version de PleromaFE.",
"fe_upgraded": "Le moteur de thème PleromaFE à été mis à jour après un changement de version.",
"snapshot_missing": "Aucun instantané du thème à été trouvé dans le fichier, il peut y avoir un rendu différent à la vision originelle."
}, },
"keep_as_is": "Garder tel-quel", "keep_as_is": "Garder tel-quel",
"use_source": "Nouvelle version" "use_source": "Nouvelle version"
@ -392,7 +399,10 @@
"selectedPost": "Message sélectionné", "selectedPost": "Message sélectionné",
"selectedMenu": "Objet sélectionné du menu", "selectedMenu": "Objet sélectionné du menu",
"disabled": "Désactivé", "disabled": "Désactivé",
"tabs": "Onglets" "tabs": "Onglets",
"toggled": "(Dés)activé",
"highlight": "Éléments mis en valeur",
"popover": "Infobulles, menus"
}, },
"radii": { "radii": {
"_tab_label": "Rondeur" "_tab_label": "Rondeur"
@ -482,7 +492,9 @@
"useStreamingApi": "Recevoir les messages et notifications en temps réel", "useStreamingApi": "Recevoir les messages et notifications en temps réel",
"notification_setting_filters": "Filtres", "notification_setting_filters": "Filtres",
"notification_setting_privacy_option": "Masquer l'expéditeur et le contenu des notifications push", "notification_setting_privacy_option": "Masquer l'expéditeur et le contenu des notifications push",
"notification_setting_privacy": "Intimité" "notification_setting_privacy": "Intimité",
"hide_followers_count_description": "Masquer le nombre d'abonnés",
"accent": "Accent"
}, },
"timeline": { "timeline": {
"collapse": "Fermer", "collapse": "Fermer",
@ -666,10 +678,13 @@
"unicode": "émoji unicode", "unicode": "émoji unicode",
"load_all": "Charger tout les {emojiAmount} émojis", "load_all": "Charger tout les {emojiAmount} émojis",
"load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.", "load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.",
"stickers": "Stickers" "stickers": "Stickers",
"keep_open": "Garder le sélecteur ouvert"
}, },
"remote_user_resolver": { "remote_user_resolver": {
"error": "Non trouvé." "error": "Non trouvé.",
"searching_for": "Rechercher",
"remote_user_resolver": "Résolution de compte distant"
}, },
"time": { "time": {
"minutes_short": "{0}min", "minutes_short": "{0}min",

View file

@ -12,7 +12,12 @@
"disable": "Disabilita", "disable": "Disabilita",
"enable": "Abilita", "enable": "Abilita",
"confirm": "Conferma", "confirm": "Conferma",
"verify": "Verifica" "verify": "Verifica",
"peek": "Anteprima",
"close": "Chiudi",
"retry": "Riprova",
"error_retry": "Per favore, riprova",
"loading": "Carico…"
}, },
"nav": { "nav": {
"mentions": "Menzioni", "mentions": "Menzioni",
@ -35,14 +40,14 @@
"followed_you": "ti segue", "followed_you": "ti segue",
"notifications": "Notifiche", "notifications": "Notifiche",
"read": "Letto!", "read": "Letto!",
"broken_favorite": "Stato sconosciuto, lo sto cercando...", "broken_favorite": "Stato sconosciuto, lo sto cercando",
"favorited_you": "ha gradito il tuo messaggio", "favorited_you": "ha gradito il tuo messaggio",
"load_older": "Carica notifiche precedenti", "load_older": "Carica notifiche precedenti",
"repeated_you": "ha condiviso il tuo messaggio", "repeated_you": "ha condiviso il tuo messaggio",
"follow_request": "vuole seguirti", "follow_request": "vuole seguirti",
"no_more_notifications": "Fine delle notifiche", "no_more_notifications": "Fine delle notifiche",
"migrated_to": "è migrato verso", "migrated_to": "è migrato verso",
"reacted_with": "ha reagito con" "reacted_with": "ha reagito con {0}"
}, },
"settings": { "settings": {
"attachments": "Allegati", "attachments": "Allegati",
@ -57,7 +62,7 @@
"hide_attachments_in_tl": "Nascondi gli allegati presenti nelle sequenze", "hide_attachments_in_tl": "Nascondi gli allegati presenti nelle sequenze",
"name": "Nome", "name": "Nome",
"name_bio": "Nome ed introduzione", "name_bio": "Nome ed introduzione",
"nsfw_clickthrough": "Fai click per visualizzare gli allegati nascosti", "nsfw_clickthrough": "Fai click per visualizzare gli allegati offuscati",
"profile_background": "Sfondo della tua pagina", "profile_background": "Sfondo della tua pagina",
"profile_banner": "Stendardo del tuo profilo", "profile_banner": "Stendardo del tuo profilo",
"reply_link_preview": "Visualizza le risposte al passaggio del cursore", "reply_link_preview": "Visualizza le risposte al passaggio del cursore",
@ -138,12 +143,171 @@
"streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina", "streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina",
"text": "Testo", "text": "Testo",
"theme_help": "Usa codici colore esadecimali (#rrggbb) per personalizzare il tuo schema di colori.", "theme_help": "Usa codici colore esadecimali (#rrggbb) per personalizzare il tuo schema di colori.",
"tooltipRadius": "Descrizioni/avvisi", "tooltipRadius": "Suggerimenti/avvisi",
"values": { "values": {
"false": "no", "false": "no",
"true": "sì" "true": "sì"
},
"avatar_size_instruction": "La taglia minima per l'icona personale è 150x150 pixel.",
"domain_mutes": "Domini",
"discoverable": "Permetti la scoperta di questo profilo da servizi di ricerca ed altro",
"composing": "Composizione",
"changed_email": "Email cambiata con successo!",
"change_email_error": "C'è stato un problema nel cambiare la tua email.",
"change_email": "Cambia email",
"blocks_tab": "Bloccati",
"blocks_imported": "Blocchi importati! Saranno elaborati a breve.",
"block_import_error": "Errore nell'importazione",
"block_import": "Importa blocchi",
"block_export_button": "Esporta i tuoi blocchi in un file CSV",
"block_export": "Esporta blocchi",
"allow_following_move": "Consenti",
"mfa": {
"verify": {
"desc": "Per abilitare l'autenticazione bifattoriale, inserisci il codice fornito dalla tua applicazione:"
},
"scan": {
"secret_code": "Codice",
"desc": "Con la tua applicazione bifattoriale, acquisisci questo QR o inserisci il codice manualmente:",
"title": "Acquisisci"
},
"authentication_methods": "Metodi di accesso",
"recovery_codes_warning": "Appuntati i codici o salvali in un posto sicuro, altrimenti rischi di non rivederli mai più. Se perderai l'accesso sia alla tua applicazione bifattoriale che ai codici di recupero non potrai più accedere al tuo profilo.",
"waiting_a_recovery_codes": "Ricevo codici di recupero…",
"recovery_codes": "Codici di recupero.",
"warning_of_generate_new_codes": "Alla generazione di nuovi codici di recupero, quelli vecchi saranno disattivati.",
"generate_new_recovery_codes": "Genera nuovi codici di recupero",
"title": "Accesso bifattoriale",
"confirm_and_enable": "Conferma ed abilita OTP",
"wait_pre_setup_otp": "preimposto OTP",
"setup_otp": "Imposta OTP",
"otp": "OTP"
},
"enter_current_password_to_confirm": "Inserisci la tua password per identificarti",
"security": "Sicurezza",
"app_name": "Nome applicazione",
"style": {
"switcher": {
"help": {
"older_version_imported": "Il tema importato è stato creato per una versione precedente dell'interfaccia.",
"future_version_imported": "Il tema importato è stato creato per una versione più recente dell'interfaccia.",
"v2_imported": "Il tema importato è stato creato per una vecchia interfaccia. Non tutto potrebbe essere come prima.",
"upgraded_from_v2": "L'interfaccia è stata aggiornata, il tema potrebbe essere diverso da come lo intendevi.",
"migration_snapshot_ok": "Ho caricato l'anteprima del tema. Puoi provare a caricarne i contenuti.",
"fe_downgraded": "L'interfaccia è stata portata ad una versione precedente.",
"fe_upgraded": "Lo schema dei temi è stato aggiornato insieme all'interfaccia.",
"snapshot_missing": "Il tema non è provvisto di anteprima, quindi potrebbe essere diverso da come appare.",
"snapshot_present": "Tutti i valori sono sostituiti dall'anteprima del tema. Puoi invece caricare i suoi contenuti.",
"snapshot_source_mismatch": "Conflitto di versione: probabilmente l'interfaccia è stata portata ad una versione precedente e poi aggiornata di nuovo. Se hai modificato il tema con una versione precedente dell'interfaccia, usa la vecchia versione del tema, altrimenti puoi usare la nuova.",
"migration_napshot_gone": "Anteprima del tema non trovata, non tutto potrebbe essere come ricordi."
},
"use_source": "Nuova versione",
"use_snapshot": "Versione precedente",
"keep_as_is": "Mantieni tal quale",
"load_theme": "Carica tema",
"clear_opacity": "Rimuovi opacità",
"clear_all": "Azzera tutto",
"reset": "Reimposta",
"save_load_hint": "Le opzioni \"mantieni\" conservano le impostazioni correnti quando selezioni o carichi un tema, e le salvano quando ne esporti uno. Quando nessuna casella è selezionata, tutte le impostazioni correnti saranno salvate nel tema.",
"keep_fonts": "Mantieni font",
"keep_roundness": "Mantieni vertici",
"keep_opacity": "Mantieni opacità",
"keep_shadows": "Mantieni ombre",
"keep_color": "Mantieni colori"
},
"common": {
"opacity": "Opacità",
"color": "Colore",
"contrast": {
"context": {
"text": "per il testo",
"18pt": "per il testo grande (oltre 17pt)"
},
"level": {
"bad": "non soddisfa le linee guida di alcun livello",
"aaa": "soddisfa le linee guida di livello AAA (ottimo)",
"aa": "soddisfa le linee guida di livello AA (sufficiente)"
},
"hint": "Il rapporto di contrasto è {ratio}, e {level} {context}"
} }
}, },
"advanced_colors": {
"badge": "Sfondo medaglie",
"post": "Messaggi / Biografie",
"alert_neutral": "Neutro",
"alert_warning": "Attenzione",
"alert_error": "Errore",
"alert": "Sfondo degli avvertimenti",
"_tab_label": "Avanzate"
},
"common_colors": {
"rgbo": "Icone, accenti, medaglie",
"foreground_hint": "Seleziona l'etichetta \"Avanzate\" per controlli più fini",
"main": "Colori comuni",
"_tab_label": "Comuni"
}
},
"enable_web_push_notifications": "Abilita notifiche web push",
"fun": "Divertimento",
"notification_mutes": "Per non ricevere notifiche da uno specifico utente, zittiscilo.",
"notification_setting_privacy_option": "Nascondi mittente e contenuti delle notifiche push",
"notification_setting_privacy": "Privacy",
"notification_setting_followers": "Utenti che ti seguono",
"notification_setting_non_followers": "Utenti che non ti seguono",
"notification_setting_non_follows": "Utenti che non segui",
"notification_setting_follows": "Utenti che segui",
"notification_setting": "Ricevi notifiche da:",
"notification_setting_filters": "Filtri",
"notifications": "Notifiche",
"greentext": "Frecce da meme",
"upload_a_photo": "Carica un'immagine",
"type_domains_to_mute": "Inserisci domini da zittire",
"theme_help_v2_2": "Le icone dietro alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se si usano delle trasparenze, questi indicatori mostrano il peggior caso possibile.",
"theme_help_v2_1": "Puoi anche forzare colore ed opacità di alcuni elementi selezionando la casella. Usa il pulsante \"Azzera\" per azzerare tutte le forzature.",
"useStreamingApiWarning": "(Sconsigliato, sperimentale, può saltare messaggi)",
"useStreamingApi": "Ricevi messaggi e notifiche in tempo reale",
"user_mutes": "Utenti",
"post_status_content_type": "Tipo di contenuto dei messaggi",
"subject_line_noop": "Non copiare",
"subject_line_mastodon": "Come in Mastodon: copia tal quale",
"subject_line_email": "Come nelle email: \"re: oggetto\"",
"subject_line_behavior": "Copia oggetto quando rispondi",
"subject_input_always_show": "Mostra sempre il campo Oggetto",
"minimal_scopes_mode": "Riduci opzioni di visibilità",
"scope_copy": "Risposte ereditano la visibilità (messaggi privati lo fanno sempre)",
"search_user_to_mute": "Cerca utente da zittire",
"search_user_to_block": "Cerca utente da bloccare",
"autohide_floating_post_button": "Nascondi automaticamente il pulsante di composizione (mobile)",
"show_moderator_badge": "Mostra l'insegna di moderatore sulla mia pagina",
"show_admin_badge": "Mostra l'insegna di amministratore sulla mia pagina",
"hide_followers_count_description": "Non mostrare quanti seguaci ho",
"hide_follows_count_description": "Non mostrare quanti utenti seguo",
"hide_followers_description": "Non mostrare i miei seguaci",
"hide_follows_description": "Non mostrare chi seguo",
"no_mutes": "Nessun utente zittito",
"no_blocks": "Nessun utente bloccato",
"notification_visibility_emoji_reactions": "Reazioni",
"notification_visibility_moves": "Migrazioni utenti",
"new_email": "Nuova email",
"use_contain_fit": "Non ritagliare le anteprime degli allegati",
"play_videos_in_modal": "Riproduci video in un riquadro a sbalzo",
"mutes_tab": "Zittiti",
"interface": "Interfaccia",
"instance_default_simple": "(predefinito)",
"checkboxRadius": "Caselle di selezione",
"import_blocks_from_a_csv_file": "Importa blocchi da un file CSV",
"hide_filtered_statuses": "Nascondi messaggi filtrati",
"use_one_click_nsfw": "Apri media offuscati con un solo click",
"preload_images": "Precarica immagini",
"hide_isp": "Nascondi pannello della stanza",
"max_thumbnails": "Numero massimo di anteprime per messaggio",
"hide_muted_posts": "Nascondi messaggi degli utenti zittiti",
"accent": "Accento",
"emoji_reactions_on_timeline": "Mostra emoji di reazione sulle sequenze",
"pad_emoji": "Affianca spazi agli emoji inseriti tramite selettore",
"notification_blocks": "Bloccando un utente non riceverai più le sue notifiche né lo seguirai più.",
"mutes_and_blocks": "Zittiti e bloccati"
},
"timeline": { "timeline": {
"error_fetching": "Errore nell'aggiornamento", "error_fetching": "Errore nell'aggiornamento",
"load_older": "Carica messaggi più vecchi", "load_older": "Carica messaggi più vecchi",
@ -209,7 +373,10 @@
"account_not_locked_warning_link": "protetto", "account_not_locked_warning_link": "protetto",
"attachments_sensitive": "Nascondi gli allegati", "attachments_sensitive": "Nascondi gli allegati",
"content_type": { "content_type": {
"text/plain": "Testo normale" "text/plain": "Testo normale",
"text/bbcode": "BBCode",
"text/markdown": "Markdown",
"text/html": "HTML"
}, },
"content_warning": "Oggetto (facoltativo)", "content_warning": "Oggetto (facoltativo)",
"default": "Sono appena atterrato a Fiumicino.", "default": "Sono appena atterrato a Fiumicino.",
@ -220,7 +387,15 @@
"private": "Solo per seguaci - Visibile solo dai tuoi seguaci", "private": "Solo per seguaci - Visibile solo dai tuoi seguaci",
"public": "Pubblico - Visibile sulla sequenza pubblica", "public": "Pubblico - Visibile sulla sequenza pubblica",
"unlisted": "Non elencato - Non visibile sulla sequenza pubblica" "unlisted": "Non elencato - Non visibile sulla sequenza pubblica"
} },
"scope_notice": {
"unlisted": "Questo messaggio non sarà visibile sulla sequenza locale né su quella pubblica",
"private": "Questo messaggio sarà visibile solo ai tuoi seguaci",
"public": "Questo messaggio sarà visibile a tutti"
},
"direct_warning_to_first_only": "Questo messaggio sarà visibile solo agli utenti menzionati all'inizio.",
"direct_warning_to_all": "Questo messaggio sarà visibile a tutti i menzionati.",
"new_status": "Nuovo messaggio"
}, },
"registration": { "registration": {
"bio": "Introduzione", "bio": "Introduzione",
@ -228,7 +403,20 @@
"fullname": "Nome visualizzato", "fullname": "Nome visualizzato",
"password_confirm": "Conferma password", "password_confirm": "Conferma password",
"registration": "Registrazione", "registration": "Registrazione",
"token": "Codice d'invito" "token": "Codice d'invito",
"validations": {
"password_confirmation_match": "dovrebbe essere uguale alla password",
"password_confirmation_required": "non può essere vuoto",
"password_required": "non può essere vuoto",
"email_required": "non può essere vuoto",
"fullname_required": "non può essere vuoto",
"username_required": "non può essere vuoto"
},
"bio_placeholder": "es.\nCiao, sono Lupo Lucio.\nSono un lupo fantastico che vive nel Fantabosco. Forse mi hai visto alla Melevisione.",
"fullname_placeholder": "es. Lupo Lucio",
"username_placeholder": "es. mister_wolf",
"new_captcha": "Clicca l'immagine per avere un altro captcha",
"captcha": "CAPTCHA"
}, },
"user_profile": { "user_profile": {
"timeline_title": "Sequenza dell'Utente" "timeline_title": "Sequenza dell'Utente"
@ -269,9 +457,9 @@
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Zittisci", "mute": "Zittisci",
"mute_progress": "Zittisco...", "mute_progress": "Zittisco",
"unmute": "Ascolta", "unmute": "Ascolta",
"unmute_progress": "Procedo..." "unmute_progress": "Procedo"
}, },
"exporter": { "exporter": {
"export": "Esporta", "export": "Esporta",
@ -307,7 +495,10 @@
"not_enough_options": "Aggiungi altre risposte" "not_enough_options": "Aggiungi altre risposte"
}, },
"interactions": { "interactions": {
"favs_repeats": "Condivisi e preferiti" "favs_repeats": "Condivisi e preferiti",
"load_older": "Carica vecchie interazioni",
"moves": "Utenti migrati",
"follows": "Nuovi seguìti"
}, },
"emoji": { "emoji": {
"load_all": "Carico tutti i {emojiAmount} emoji", "load_all": "Carico tutti i {emojiAmount} emoji",
@ -319,5 +510,13 @@
"keep_open": "Tieni aperto il menù", "keep_open": "Tieni aperto il menù",
"emoji": "Emoji", "emoji": "Emoji",
"stickers": "Adesivi" "stickers": "Adesivi"
},
"selectable_list": {
"select_all": "Seleziona tutto"
},
"remote_user_resolver": {
"error": "Non trovato.",
"searching_for": "Cerco",
"remote_user_resolver": "Cerca utenti remoti"
} }
} }

View file

@ -7,34 +7,47 @@
// sed -i -e "s/'//gm" -e 's/"/\\"/gm' -re 's/^( +)(.+?): ((.+?))?(,?)(\{?)$/\1"\2": "\4"/gm' -e 's/\"\{\"/{/g' -e 's/,"$/",/g' file.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. // There's only problem that apostrophe character ' gets replaced by \\ so you have to fix it manually, sorry.
const loaders = {
ar: () => import('./ar.json'),
ca: () => import('./ca.json'),
cs: () => import('./cs.json'),
de: () => import('./de.json'),
eo: () => import('./eo.json'),
es: () => import('./es.json'),
et: () => import('./et.json'),
eu: () => import('./eu.json'),
fi: () => import('./fi.json'),
fr: () => import('./fr.json'),
ga: () => import('./ga.json'),
he: () => import('./he.json'),
hu: () => import('./hu.json'),
it: () => import('./it.json'),
ja: () => import('./ja_pedantic.json'),
ja_easy: () => import('./ja_easy.json'),
ko: () => import('./ko.json'),
nb: () => import('./nb.json'),
nl: () => import('./nl.json'),
oc: () => import('./oc.json'),
pl: () => import('./pl.json'),
pt: () => import('./pt.json'),
ro: () => import('./ro.json'),
ru: () => import('./ru.json'),
te: () => import('./te.json'),
zh: () => import('./zh.json')
}
const messages = { const messages = {
ar: require('./ar.json'), languages: ['en', ...Object.keys(loaders)],
ca: require('./ca.json'), default: {
cs: require('./cs.json'), en: require('./en.json')
de: require('./de.json'), },
en: require('./en.json'), setLanguage: async (i18n, language) => {
eo: require('./eo.json'), if (loaders[language]) {
es: require('./es.json'), let messages = await loaders[language]()
et: require('./et.json'), i18n.setLocaleMessage(language, messages)
eu: require('./eu.json'), }
fi: require('./fi.json'), i18n.locale = language
fr: require('./fr.json'), }
ga: require('./ga.json'),
he: require('./he.json'),
hu: require('./hu.json'),
it: require('./it.json'),
ja: require('./ja_pedantic.json'),
ja_easy: require('./ja_easy.json'),
ko: require('./ko.json'),
nb: require('./nb.json'),
nl: require('./nl.json'),
oc: require('./oc.json'),
pl: require('./pl.json'),
pt: require('./pt.json'),
ro: require('./ro.json'),
ru: require('./ru.json'),
te: require('./te.json'),
zh: require('./zh.json')
} }
export default messages export default messages

View file

@ -66,7 +66,7 @@
"interactions": "Interacties" "interactions": "Interacties"
}, },
"notifications": { "notifications": {
"broken_favorite": "Onbekende status, aan het zoeken...", "broken_favorite": "Onbekende status, aan het zoeken",
"favorited_you": "vond je status leuk", "favorited_you": "vond je status leuk",
"followed_you": "volgt jou", "followed_you": "volgt jou",
"load_older": "Laad oudere meldingen", "load_older": "Laad oudere meldingen",
@ -402,7 +402,7 @@
"title": "Twee-factor Authenticatie", "title": "Twee-factor Authenticatie",
"generate_new_recovery_codes": "Genereer nieuwe herstelcodes", "generate_new_recovery_codes": "Genereer nieuwe herstelcodes",
"recovery_codes": "Herstelcodes.", "recovery_codes": "Herstelcodes.",
"waiting_a_recovery_codes": "Backup codes ontvangen...", "waiting_a_recovery_codes": "Backup codes ontvangen",
"authentication_methods": "Authenticatie methodes", "authentication_methods": "Authenticatie methodes",
"scan": { "scan": {
"title": "Scannen", "title": "Scannen",
@ -526,11 +526,11 @@
}, },
"show_repeats": "Herhalingen tonen", "show_repeats": "Herhalingen tonen",
"hide_repeats": "Herhalingen verbergen", "hide_repeats": "Herhalingen verbergen",
"mute_progress": "Negeren...", "mute_progress": "Negeren",
"unmute_progress": "Negering opheffen...", "unmute_progress": "Negering opheffen",
"unmute": "Negering opheffen", "unmute": "Negering opheffen",
"block_progress": "Blokkeren...", "block_progress": "Blokkeren",
"unblock_progress": "Blokkade opheffen...", "unblock_progress": "Blokkade opheffen",
"unblock": "Blokkade opheffen", "unblock": "Blokkade opheffen",
"unsubscribe": "Abonnement opzeggen", "unsubscribe": "Abonnement opzeggen",
"subscribe": "Abonneren", "subscribe": "Abonneren",
@ -604,9 +604,9 @@
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Negeren", "mute": "Negeren",
"mute_progress": "Negeren...", "mute_progress": "Negeren",
"unmute": "Negering opheffen", "unmute": "Negering opheffen",
"unmute_progress": "Negering wordt opgeheven..." "unmute_progress": "Negering wordt opgeheven"
}, },
"exporter": { "exporter": {
"export": "Exporteren", "export": "Exporteren",

View file

@ -456,9 +456,9 @@
}, },
"domain_mute_card": { "domain_mute_card": {
"mute": "Игнорировать", "mute": "Игнорировать",
"mute_progress": "В процессе...", "mute_progress": "В процессе",
"unmute": "Прекратить игнорирование", "unmute": "Прекратить игнорирование",
"unmute_progress": "В процессе..." "unmute_progress": "В процессе"
}, },
"exporter": { "exporter": {
"export": "Экспорт", "export": "Экспорт",

View file

@ -46,11 +46,13 @@ Vue.use(VBodyScrollLock)
const i18n = new VueI18n({ const i18n = new VueI18n({
// By default, use the browser locale, we will update it if neccessary // By default, use the browser locale, we will update it if neccessary
locale: currentLocale, locale: 'en',
fallbackLocale: 'en', fallbackLocale: 'en',
messages messages: messages.default
}) })
messages.setLanguage(i18n, currentLocale)
const persistedStateOptions = { const persistedStateOptions = {
paths: [ paths: [
'config', 'config',

View file

@ -1,5 +1,6 @@
import { set, delete as del } from 'vue' import { set, delete as del } from 'vue'
import { setPreset, applyTheme } from '../services/style_setter/style_setter.js' import { setPreset, applyTheme } from '../services/style_setter/style_setter.js'
import messages from '../i18n/messages'
const browserLocale = (window.navigator.language || 'en').split('-')[0] const browserLocale = (window.navigator.language || 'en').split('-')[0]
@ -116,6 +117,10 @@ const config = {
case 'customTheme': case 'customTheme':
case 'customThemeSource': case 'customThemeSource':
applyTheme(value) applyTheme(value)
break
case 'interfaceLanguage':
messages.setLanguage(this.getters.i18n, value)
break
} }
} }
} }

View file

@ -1,6 +1,7 @@
import { set } from 'vue' import { set } from 'vue'
import { getPreset, applyTheme } from '../services/style_setter/style_setter.js' import { getPreset, applyTheme } from '../services/style_setter/style_setter.js'
import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js' import { CURRENT_VERSION } from '../services/theme_data/theme_data.service.js'
import apiService from '../services/api/api.service.js'
import { instanceDefaultProperties } from './config.js' import { instanceDefaultProperties } from './config.js'
const defaultState = { const defaultState = {
@ -48,6 +49,7 @@ const defaultState = {
postFormats: [], postFormats: [],
restrictedNicknames: [], restrictedNicknames: [],
safeDM: true, safeDM: true,
knownDomains: [],
// Feature-set, apparently, not everything here is reported... // Feature-set, apparently, not everything here is reported...
chatAvailable: false, chatAvailable: false,
@ -80,6 +82,9 @@ const instance = {
if (typeof value !== 'undefined') { if (typeof value !== 'undefined') {
set(state, name, value) set(state, name, value)
} }
},
setKnownDomains (state, domains) {
state.knownDomains = domains
} }
}, },
getters: { getters: {
@ -182,6 +187,18 @@ const instance = {
state.emojiFetched = true state.emojiFetched = true
dispatch('getStaticEmoji') dispatch('getStaticEmoji')
} }
},
async getKnownDomains ({ commit, rootState }) {
try {
const result = await apiService.fetchKnownDomains({
credentials: rootState.users.currentUser.credentials
})
commit('setKnownDomains', result)
} catch (e) {
console.warn("Can't load known domains")
console.warn(e)
}
} }
} }
} }

View file

@ -75,6 +75,7 @@ const MASTODON_SEARCH_2 = `/api/v2/search`
const MASTODON_USER_SEARCH_URL = '/api/v1/accounts/search' const MASTODON_USER_SEARCH_URL = '/api/v1/accounts/search'
const MASTODON_DOMAIN_BLOCKS_URL = '/api/v1/domain_blocks' const MASTODON_DOMAIN_BLOCKS_URL = '/api/v1/domain_blocks'
const MASTODON_STREAMING = '/api/v1/streaming' const MASTODON_STREAMING = '/api/v1/streaming'
const MASTODON_KNOWN_DOMAIN_LIST_URL = '/api/v1/instance/peers'
const PLEROMA_EMOJI_REACTIONS_URL = id => `/api/v1/pleroma/statuses/${id}/reactions` const PLEROMA_EMOJI_REACTIONS_URL = id => `/api/v1/pleroma/statuses/${id}/reactions`
const PLEROMA_EMOJI_REACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}` const PLEROMA_EMOJI_REACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}`
const PLEROMA_EMOJI_UNREACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}` const PLEROMA_EMOJI_UNREACT_URL = (id, emoji) => `/api/v1/pleroma/statuses/${id}/reactions/${emoji}`
@ -995,6 +996,10 @@ const search2 = ({ credentials, q, resolve, limit, offset, following }) => {
}) })
} }
const fetchKnownDomains = ({ credentials }) => {
return promisedRequest({ url: MASTODON_KNOWN_DOMAIN_LIST_URL, credentials })
}
const fetchDomainMutes = ({ credentials }) => { const fetchDomainMutes = ({ credentials }) => {
return promisedRequest({ url: MASTODON_DOMAIN_BLOCKS_URL, credentials }) return promisedRequest({ url: MASTODON_DOMAIN_BLOCKS_URL, credentials })
} }
@ -1193,6 +1198,7 @@ const apiService = {
updateNotificationSettings, updateNotificationSettings,
search2, search2,
searchUsers, searchUsers,
fetchKnownDomains,
fetchDomainMutes, fetchDomainMutes,
muteDomain, muteDomain,
unmuteDomain unmuteDomain