Compare commits

..

3 commits

Author SHA1 Message Date
Weblate
bdd78c1719 Translated using Weblate (Vietnamese)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
Currently translated at 79.8% (835 of 1046 strings)

Translated using Weblate (Vietnamese)

Currently translated at 79.8% (835 of 1046 strings)

Co-authored-by: Nguyễn Gia Phong <cnx@loang.net>
Co-authored-by: xarvos <huyngo@disroot.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/vi/
Translation: Pleroma fe/pleroma-fe
2023-09-08 05:53:31 +00:00
Weblate
fb7f79232a Translated using Weblate (Greek)
Currently translated at 15.9% (167 of 1046 strings)

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: getimiskon <getimiskon@disroot.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/el/
Translation: Pleroma fe/pleroma-fe
2023-09-08 05:53:31 +00:00
Weblate
473a3b4b7b Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1046 of 1046 strings)

Co-authored-by: Poesty Li <poesty7450@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/zh_Hans/
Translation: Pleroma fe/pleroma-fe
2023-09-08 05:53:31 +00:00
153 changed files with 6147 additions and 8770 deletions

2
.eslintignore Normal file
View file

@ -0,0 +1,2 @@
build/*.js
config/*.js

30
.eslintrc.js Normal file
View file

@ -0,0 +1,30 @@
module.exports = {
root: true,
parserOptions: {
parser: '@babel/eslint-parser',
sourceType: 'module'
},
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
extends: [
'plugin:vue/recommended'
],
// required to lint *.vue files
plugins: [
'vue',
'import'
],
// add your custom rules here
rules: {
// allow paren-less arrow functions
'arrow-parens': 0,
// allow async-await
'generator-star-spacing': 0,
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'vue/require-prop-types': 0,
'vue/no-unused-vars': 0,
'no-tabs': 0,
'vue/multi-word-component-names': 0,
'vue/no-reserved-component-names': 0
}
}

1
.node-version Normal file
View file

@ -0,0 +1 @@
7.2.1

View file

@ -1 +0,0 @@
nodejs 20.12.2

View file

@ -1,21 +1,20 @@
labels:
platform: linux/amd64
steps:
pipeline:
lint:
when:
event:
- pull_request
image: node:20
image: node:18
commands:
- yarn
- yarn lint
#- yarn stylelint
test:
when:
event:
- pull_request
image: node:20
image: node:18
commands:
- apt update
- apt install firefox-esr -y --no-install-recommends
@ -29,7 +28,7 @@ steps:
branch:
- develop
- stable
image: node:20
image: node:18
commands:
- yarn
- yarn build
@ -41,15 +40,15 @@ steps:
branch:
- develop
- stable
image: node:20
image: node:18
secrets:
- SCW_ACCESS_KEY
- SCW_SECRET_KEY
- SCW_DEFAULT_ORGANIZATION_ID
commands:
- apt-get update && apt-get install -y rclone wget zip
- wget https://github.com/scaleway/scaleway-cli/releases/download/v2.30.0/scaleway-cli_2.30.0_linux_amd64
- mv scaleway-cli_2.30.0_linux_amd64 scaleway-cli
- wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64
- mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli
- chmod +x scaleway-cli
- ./scaleway-cli object config install type=rclone
- zip akkoma-fe.zip -r dist
@ -71,8 +70,8 @@ steps:
- SCW_DEFAULT_ORGANIZATION_ID
commands:
- apt-get update && apt-get install -y rclone wget git zip
- wget https://github.com/scaleway/scaleway-cli/releases/download/v2.30.0/scaleway-cli_2.30.0_linux_amd64
- mv scaleway-cli_2.30.0_linux_amd64 scaleway-cli
- wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64
- mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli
- chmod +x scaleway-cli
- ./scaleway-cli object config install type=rclone
- cd docs

View file

@ -20,11 +20,9 @@ To use Akkoma-FE in Akkoma, use the [frontend](https://docs.akkoma.dev/stable/ad
## Build Setup
Make sure you have [Node.js](https://nodejs.org/) installed. You can check `/.woodpecker.yml` for which node version the Akkoma CI currently uses.
``` bash
# install dependencies
corepack enable
npm install -g yarn
yarn
# serve with hot reload at localhost:8080
@ -39,7 +37,7 @@ npm run unit
# For Contributors:
You can create file `/config/local.json` (see [example](https://akkoma.dev/AkkomaGang/akkoma-fe/src/branch/develop/config/local.example.json)) to enable some convenience dev options:
You can create file `/config/local.json` (see [example](https://git.pleroma.social/pleroma/pleroma-fe/blob/develop/config/local.example.json)) to enable some convenience dev options:
* `target`: makes local dev server redirect to some existing instance's BE instead of local BE, useful for testing things in near-production environment and searching for real-life use-cases.
* `staticConfigPreference`: makes FE's `/static/config.json` take preference of BE-served `/api/statusnet/config.json`. Only works in dev mode.

View file

@ -1,36 +1,36 @@
// https://github.com/shelljs/shelljs
require("./check-versions")();
require("shelljs/global");
env.NODE_ENV = "production";
require('./check-versions')()
require('shelljs/global')
env.NODE_ENV = 'production'
var path = require("path");
var config = require("../config");
var webpack = require("webpack");
var webpackConfig = require("./webpack.prod.conf");
var path = require('path')
var config = require('../config')
var ora = require('ora')
var webpack = require('webpack')
var webpackConfig = require('./webpack.prod.conf')
console.log(
" Tip:\n" +
" Built files are meant to be served over an HTTP server.\n" +
" Opening index.html over file:// won't work.\n",
);
' Tip:\n' +
' Built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
)
var assetsPath = path.join(
config.build.assetsRoot,
config.build.assetsSubDirectory,
);
rm("-rf", assetsPath);
mkdir("-p", assetsPath);
cp("-R", "static/*", assetsPath);
var spinner = ora('building for production...')
spinner.start()
var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory)
rm('-rf', assetsPath)
mkdir('-p', assetsPath)
cp('-R', 'static/*', assetsPath)
webpack(webpackConfig, function (err, stats) {
if (err) throw err;
process.stdout.write(
stats.toString({
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false,
}) + "\n",
);
});
chunkModules: false
}) + '\n')
})

View file

@ -5,7 +5,7 @@ var path = require('path')
var express = require('express')
var webpack = require('webpack')
var opn = require('opn')
const { createProxyMiddleware } = require('http-proxy-middleware');
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = process.env.NODE_ENV === 'testing'
? require('./webpack.prod.conf')
: require('./webpack.dev.conf')
@ -36,13 +36,7 @@ Object.keys(proxyTable).forEach(function (context) {
if (typeof options === 'string') {
options = { target: options }
}
const targetUrl = new URL(options.target);
// add path
targetUrl.pathname = context;
options.target = targetUrl.toString();
console.log("Proxying", context, "to", options.target);
app.use(context, createProxyMiddleware(options))
app.use(proxyMiddleware(context, options))
})
// handle fallback for HTML5 history API

View file

@ -3,7 +3,6 @@ var config = require('../config')
var utils = require('./utils')
var projectRoot = path.resolve(__dirname, '../')
var { VueLoaderPlugin } = require('vue-loader')
const ESLintPlugin = require('eslint-webpack-plugin');
var env = process.env.NODE_ENV
// check env & config/index.js to decide weither to enable CSS Sourcemaps for the
@ -36,7 +35,6 @@ module.exports = {
],
fallback: {
"url": require.resolve("url/"),
querystring: require.resolve("querystring-es3")
},
alias: {
'static': path.resolve(__dirname, '../static'),
@ -49,6 +47,20 @@ module.exports = {
module: {
noParse: /node_modules\/localforage\/dist\/localforage.js/,
rules: [
{
enforce: 'pre',
test: /\.(js|vue)$/,
include: projectRoot,
exclude: /node_modules/,
use: {
loader: 'eslint-loader',
options: {
formatter: require('eslint-friendly-formatter'),
sourceMap: config.build.productionSourceMap,
extract: true
}
}
},
{
enforce: 'post',
test: /\.(json5?|ya?ml)$/, // target json, json5, yaml and yml files
@ -106,9 +118,6 @@ module.exports = {
]
},
plugins: [
new VueLoaderPlugin(),
new ESLintPlugin({
configType: 'flat'
})
new VueLoaderPlugin()
]
}

View file

@ -1,4 +1,4 @@
{
"target": "https://otp.akkoma.dev/",
"target": "https://pleroma.soykaf.com/",
"staticConfigPreference": false
}

View file

@ -2,4 +2,5 @@ var { merge } = require('webpack-merge')
var devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})

View file

@ -1,31 +0,0 @@
const pluginVue = require('eslint-plugin-vue')
const pluginImport = require('eslint-plugin-import')
module.exports = [
...pluginVue.configs['flat/recommended'],
{
languageOptions: {
parserOptions: {
parser: '@babel/eslint-parser',
sourceType: 'module'
}
},
rules: {
// allow paren-less arrow functions
'arrow-parens': 0,
// allow async-await
'generator-star-spacing': 0,
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'vue/require-prop-types': 0,
'vue/no-unused-vars': 0,
'no-tabs': 0,
'vue/multi-word-component-names': 0,
'vue/no-reserved-component-names': 0
},
ignores: [
'build/*.js',
'config/*.js'
]
}
]

View file

@ -12,118 +12,120 @@
"e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e",
"stylelint": "stylelint src/**/*.scss",
"lint": "eslint src test/unit/specs test/e2e/specs",
"lint-fix": "eslint --fix src test/unit/specs test/e2e/specs"
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs",
"lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs"
},
"dependencies": {
"@babel/runtime": "7.17.8",
"@chenfengyuan/vue-qrcode": "^2.0.0",
"@chenfengyuan/vue-qrcode": "2.0.0",
"@floatingghost/pinch-zoom-element": "^1.3.1",
"@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/free-solid-svg-icons": "^6.5.2",
"@fortawesome/vue-fontawesome": "^3.0.8",
"@vuelidate/core": "^2.0.3",
"@vuelidate/validators": "^2.0.4",
"blurhash": "^2.0.5",
"body-scroll-lock": "^3.1.5",
"chromatism": "^3.0.0",
"click-outside-vue3": "^4.0.1",
"cropperjs": "^1.6.2",
"diff": "^5.2.0",
"escape-html": "^1.0.3",
"@fortawesome/fontawesome-svg-core": "1.3.0",
"@fortawesome/free-regular-svg-icons": "^6.1.2",
"@fortawesome/free-solid-svg-icons": "^6.2.0",
"@fortawesome/vue-fontawesome": "3.0.1",
"@vuelidate/core": "^2.0.0",
"@vuelidate/validators": "^2.0.0",
"blurhash": "^2.0.4",
"body-scroll-lock": "2.7.1",
"chromatism": "3.0.0",
"click-outside-vue3": "4.0.1",
"cropperjs": "1.5.12",
"diff": "3.5.0",
"escape-html": "1.0.3",
"iso-639-1": "^2.1.15",
"js-cookie": "^3.0.1",
"localforage": "^1.10.0",
"localforage": "1.10.0",
"parse-link-header": "^2.0.0",
"phoenix": "^1.7.12",
"punycode.js": "^2.3.1",
"qrcode": "^1.5.3",
"querystring-es3": "^0.2.1",
"url": "^0.11.3",
"vue": "^3.4.38",
"vue-i18n": "^9.14.0",
"vue-router": "^4.4.3",
"vue-template-compiler": "^2.7.16",
"vuex": "^4.1.0"
"phoenix": "1.6.2",
"punycode.js": "2.1.0",
"qrcode": "1",
"url": "^0.11.0",
"vue": "^3.2.31",
"vue-i18n": "^9.2.2",
"vue-router": "4.0.14",
"vue-template-compiler": "2.6.11",
"vuex": "4.0.2"
},
"devDependencies": {
"@babel/core": "^7.24.6",
"@babel/core": "7.17.8",
"@babel/eslint-parser": "^7.19.1",
"@babel/plugin-transform-runtime": "^7.24.6",
"@babel/preset-env": "^7.24.6",
"@babel/register": "^7.24.6",
"@babel/plugin-transform-runtime": "7.17.0",
"@babel/preset-env": "7.16.11",
"@babel/register": "7.17.7",
"@intlify/vue-i18n-loader": "^5.0.0",
"@ungap/event-target": "^0.2.4",
"@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
"@vue/babel-plugin-jsx": "^1.2.2",
"@ungap/event-target": "0.2.3",
"@vue/babel-helper-vue-jsx-merge-props": "1.2.1",
"@vue/babel-plugin-jsx": "1.1.1",
"@vue/compiler-sfc": "^3.1.0",
"@vue/test-utils": "^2.0.2",
"autoprefixer": "^10.4.19",
"autoprefixer": "6.7.7",
"babel-loader": "^9.1.0",
"babel-plugin-lodash": "^3.3.4",
"babel-plugin-lodash": "3.3.4",
"chai": "^4.3.7",
"chalk": "^1.1.3",
"chromedriver": "^119.0.1",
"chalk": "1.1.3",
"chromedriver": "^107.0.3",
"connect-history-api-fallback": "^2.0.0",
"cross-spawn": "^7.0.3",
"css-loader": "^7.1.2",
"css-loader": "^6.7.2",
"custom-event-polyfill": "^1.0.7",
"eslint": "^9.3.0",
"eslint-config-standard": "^17.1.0",
"eslint": "^7.32.0",
"eslint-config-standard": "^17.0.0",
"eslint-friendly-formatter": "^4.0.1",
"eslint-plugin-import": "^2.29.1",
"eslint-loader": "^4.0.2",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.2.0",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-standard": "^5.0.0",
"eslint-plugin-vue": "^9.26.0",
"eslint-webpack-plugin": "^4.2.0",
"eventsource-polyfill": "^0.9.6",
"express": "^4.19.2",
"eslint-plugin-vue": "^9.7.0",
"eventsource-polyfill": "0.9.6",
"express": "4.17.3",
"file-loader": "^6.2.0",
"function-bind": "^1.1.2",
"function-bind": "1.1.1",
"html-webpack-plugin": "^5.5.0",
"http-proxy-middleware": "^3.0.0",
"json-loader": "^0.5.7",
"karma": "^6.4.3",
"karma-coverage": "^2.2.1",
"karma-firefox-launcher": "^2.1.3",
"karma-mocha": "^2.0.1",
"karma-mocha-reporter": "^2.2.5",
"karma-sinon-chai": "^2.0.2",
"karma-sourcemap-loader": "^0.4.0",
"karma-spec-reporter": "^0.0.36",
"http-proxy-middleware": "0.21.0",
"inject-loader": "2.0.1",
"isparta-loader": "2.0.0",
"json-loader": "0.5.7",
"karma": "6.3.17",
"karma-coverage": "1.1.2",
"karma-firefox-launcher": "1.3.0",
"karma-mocha": "2.0.1",
"karma-mocha-reporter": "2.2.5",
"karma-sinon-chai": "2.0.2",
"karma-sourcemap-loader": "0.3.8",
"karma-spec-reporter": "0.0.33",
"karma-webpack": "^5.0.0",
"lodash": "^4.17.21",
"lolex": "^6.0.0",
"mini-css-extract-plugin": "^2.9.0",
"mocha": "^10.4.0",
"nightwatch": "^3.6.3",
"opn": "^6.0.0",
"lodash": "4.17.21",
"lolex": "1.6.0",
"mini-css-extract-plugin": "0.12.0",
"mocha": "3.5.3",
"nightwatch": "0.9.21",
"opn": "4.0.2",
"ora": "0.4.1",
"postcss-html": "^1.5.0",
"postcss-loader": "^8.1.1",
"postcss-loader": "3.0.0",
"postcss-sass": "^0.5.0",
"raw-loader": "^4.0.2",
"sass": "^1.77.2",
"sass-loader": "^14.2.1",
"selenium-server": "^3.141.59",
"semver": "^7.6.2",
"shelljs": "^0.8.5",
"sinon": "^18.0.0",
"sinon-chai": "^3.7.0",
"raw-loader": "0.5.1",
"sass": "^1.56.0",
"sass-loader": "^13.2.0",
"selenium-server": "2.53.1",
"semver": "5.7.1",
"shelljs": "0.8.5",
"sinon": "2.4.1",
"sinon-chai": "2.14.0",
"stylelint": "^14.15.0",
"stylelint-config-recommended-vue": "^1.4.0",
"stylelint-config-standard": "^29.0.0",
"stylelint-config-standard-scss": "^6.1.0",
"stylelint-rscss": "^0.4.0",
"url-loader": "^4.1.1",
"vue-loader": "^17.4.2",
"vue-style-loader": "^4.1.3",
"webpack": "^5.91.0",
"webpack-dev-middleware": "^7.2.1",
"webpack-hot-middleware": "^2.26.1",
"webpack-merge": "^5.10.0",
"workbox-webpack-plugin": "^7.1.0"
"vue-loader": "^17.0.0",
"vue-style-loader": "^4.1.2",
"webpack": "^5.75.0",
"webpack-dev-middleware": "^5.3.3",
"webpack-hot-middleware": "^2.25.1",
"webpack-merge": "^5.8.0",
"workbox-webpack-plugin": "^6.5.4"
},
"engines": {
"node": ">= 16.0.0",

View file

@ -64,11 +64,6 @@ export default {
'-' + this.layoutType
]
},
pageBackground () {
return this.mergedConfig.displayPageBackgrounds
? this.$store.state.users.displayBackground
: null
},
currentUser () { return this.$store.state.users.currentUser },
userBackground () { return this.currentUser.background_image },
instanceBackground () {
@ -76,7 +71,7 @@ export default {
? null
: this.$store.state.instance.background
},
background () { return this.pageBackground || this.userBackground || this.instanceBackground },
background () { return this.userBackground || this.instanceBackground },
bgStyle () {
if (this.background) {
return {

View file

@ -8,7 +8,7 @@
}
html {
font-size: 0.875rem;
font-size: 14px;
// overflow-x: clip causes my browser's tab to crash with SIGILL lul
}

View file

@ -183,12 +183,6 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
copyInstanceOption('renderMisskeyMarkdown')
copyInstanceOption('sidebarRight')
if (config.backendCommitUrl)
copyInstanceOption('backendCommitUrl')
if (config.frontendCommitUrl)
copyInstanceOption('frontendCommitUrl')
return store.dispatch('setTheme', config['theme'])
}

View file

@ -6,7 +6,7 @@
:bound-to="{ x: 'container' }"
remove-padding
>
<template #content>
<template v-slot:content>
<div class="dropdown-menu">
<template v-if="relationship.following">
<button
@ -71,7 +71,7 @@
</button>
</div>
</template>
<template #trigger>
<template v-slot:trigger>
<button class="button-unstyled ellipsis-button">
<FAIcon
class="icon"
@ -93,7 +93,7 @@
keypath="user_card.block_confirm"
tag="span"
>
<template #user>
<template v-slot:user>
<span
v-text="user.screen_name_ui"
/>

View file

@ -37,7 +37,7 @@
white-space: pre-line;
word-break: break-word;
text-overflow: ellipsis;
overflow: auto;
overflow: scroll;
}
&.-static {

View file

@ -246,8 +246,8 @@
ref="flash"
class="flash"
:src="attachment.large_thumb_url || attachment.url"
@player-opened="setFlashLoaded(true)"
@player-closed="setFlashLoaded(false)"
@playerOpened="setFlashLoaded(true)"
@playerClosed="setFlashLoaded(false)"
/>
</span>
</div>

View file

@ -22,12 +22,12 @@
<script>
export default {
emits: ['update:modelValue'],
props: [
'modelValue',
'indeterminate',
'disabled'
],
emits: ['update:modelValue']
]
}
</script>

View file

@ -14,7 +14,7 @@
:model-value="present"
:disabled="disabled"
class="opt"
@update:model-value="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)"
@update:modelValue="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)"
/>
<div class="input color-input-field">
<input
@ -46,6 +46,7 @@
</div>
</div>
</template>
<style lang="scss" src="./color_input.scss"></style>
<script>
import Checkbox from '../checkbox/checkbox.vue'
import { hex2rgb } from '../../services/color_convert/color_convert.js'
@ -107,7 +108,6 @@ export default {
}
}
</script>
<style lang="scss" src="./color_input.scss"></style>
<style lang="scss">
.color-control {

View file

@ -25,8 +25,6 @@
</dialog-modal>
</template>
<script src="./confirm_modal.js"></script>
<style lang="scss" scoped>
@import '../../_variables';
@ -37,3 +35,5 @@
}
}
</style>
<script src="./confirm_modal.js"></script>

View file

@ -267,11 +267,11 @@ const conversation = {
},
replies () {
let i = 1
// eslint-disable-next-line camelcase
return reduce(this.conversation, (result, { id, in_reply_to_status_id }) => {
/* eslint-disable camelcase */
const irid = in_reply_to_status_id
/* eslint-enable camelcase */
if (irid) {
result[irid] = result[irid] || []
result[irid].push({

View file

@ -91,7 +91,7 @@
:controlled-set-media-playing="(newVal) => toggleStatusContentProperty(status.id, 'mediaPlaying', newVal)"
@goto="setHighlight"
@toggle-expanded="toggleExpanded"
@toggleExpanded="toggleExpanded"
/>
<div
v-if="showOtherRepliesButtonBelowStatus && getReplies(status.id).length > 1"
@ -184,7 +184,7 @@
:toggle-status-content-property="toggleStatusContentProperty"
@goto="setHighlight"
@toggle-expanded="toggleExpanded"
@toggleExpanded="toggleExpanded"
/>
</div>
</div>

View file

@ -44,9 +44,9 @@
/>
</router-link>
<router-link
v-if="publicTimelineVisible"
:to="{ name: 'public-timeline' }"
class="nav-icon"
v-if="publicTimelineVisible"
>
<FAIcon
fixed-width
@ -68,9 +68,9 @@
/>
</router-link>
<router-link
v-if="federatedTimelineVisible"
:to="{ name: 'public-external-timeline' }"
class="nav-icon"
v-if="federatedTimelineVisible"
>
<FAIcon
fixed-width

View file

@ -9,7 +9,7 @@
class="btn button-default"
>
{{ $t('domain_mute_card.unmute') }}
<template #progress>
<template v-slot:progress>
{{ $t('domain_mute_card.unmute_progress') }}
</template>
</ProgressButton>
@ -19,7 +19,7 @@
class="btn button-default"
>
{{ $t('domain_mute_card.mute') }}
<template #progress>
<template v-slot:progress>
{{ $t('domain_mute_card.mute_progress') }}
</template>
</ProgressButton>

View file

@ -2,7 +2,7 @@
<Modal
v-if="isFormVisible"
class="edit-form-modal-view"
@backdrop-clicked="closeModal"
@backdropClicked="closeModal"
>
<div class="edit-form-modal-panel panel">
<div class="panel-heading">
@ -11,10 +11,10 @@
<PostStatusForm
class="panel-body"
v-bind="params"
:disable-polls="true"
:disable-visibility-selector="true"
:post-handler="doEditStatus"
@posted="closeModal"
:disablePolls="true"
:disableVisibilitySelector="true"
:post-handler="doEditStatus"
/>
</div>
</Modal>

View file

@ -43,10 +43,7 @@
:class="{ highlighted: index === highlighted }"
@click.stop.prevent="onClick($event, suggestion)"
>
<span
v-if="!suggestion.mfm"
class="image"
>
<span v-if="!suggestion.mfm" class="image">
<img
v-if="suggestion.img"
:src="suggestion.img"

View file

@ -122,14 +122,14 @@ export const suggestUsers = ({ dispatch, state }) => {
const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1
return diff + nameAlphabetically + screenNameAlphabetically
/* eslint-disable camelcase */
}).map(({ screen_name, screen_name_ui, name, profile_image_url_original }) => ({
displayText: screen_name_ui,
detailText: name,
imageUrl: profile_image_url_original,
replacement: '@' + screen_name + ' '
}))
/* eslint-enable camelcase */
suggestions = newSuggestions || []
return suggestions

View file

@ -7,7 +7,7 @@
:bound-to="{ x: 'container' }"
remove-padding
>
<template #content="{close}">
<template v-slot:content="{close}">
<div class="dropdown-menu">
<button
v-if="canMute && !status.thread_muted"
@ -172,7 +172,7 @@
</button>
</div>
</template>
<template #trigger>
<template v-slot:trigger>
<button class="button-unstyled popover-trigger">
<FAIcon
class="fa-scale-110 fa-old-padding"

View file

@ -1,8 +1,5 @@
<template>
<basic-user-card
v-if="show"
:user="user"
>
<basic-user-card :user="user" v-if="show">
<div class="follow-request-card-content-container">
<button
class="btn button-default"

View file

@ -31,8 +31,8 @@
:description="descriptions && descriptions[attachment.id]"
:hide-description="size === 'small' || tooManyAttachments && hidingLong"
:style="itemStyle(attachment.id, row.items)"
@set-media="onMedia"
@natural-size-load="onNaturalSizeLoad"
@setMedia="onMedia"
@naturalSizeLoad="onNaturalSizeLoad"
/>
</div>
</div>

View file

@ -42,7 +42,6 @@ export default {
@import '../../_variables.scss';
.list {
min-height: 1em;
&-item:not(:last-child) {
border-bottom: 1px solid;
border-bottom-color: $fallback--border;

View file

@ -2,7 +2,7 @@
<Modal
v-if="showing"
class="media-modal-view"
@backdrop-clicked="hideIfNotSwiped"
@backdropClicked="hideIfNotSwiped"
>
<SwipeClick
v-if="type === 'image'"

View file

@ -42,7 +42,7 @@ const mediaUpload = {
.then((fileData) => {
self.$emit('uploaded', fileData)
self.decreaseUploadCount()
}, (error) => {
}, (error) => { // eslint-disable-line handle-callback-err
self.$emit('upload-failed', 'default')
self.decreaseUploadCount()
})

View file

@ -93,6 +93,9 @@ const MentionLink = {
this.highlightType
]
},
useAtIcon () {
return this.mergedConfig.useAtIcon
},
isRemote () {
return this.userName !== this.userNameFull
},

View file

@ -18,7 +18,6 @@
<input
id="code"
v-model="code"
autocomplete="one-time-code"
class="form-control"
>
</div>

View file

@ -4,7 +4,7 @@
class="panel-heading"
@click="toggleHidden"
>
<h4>{{ $t('moderation.reports.report') + ' ' + account.screen_name }}</h4>
<h4>{{ $t('moderation.reports.report') + ' ' + this.account.screen_name }}</h4>
<button
v-if="isOpen"
class="button-default"
@ -35,10 +35,7 @@
<div v-if="content">
{{ decode(content) }}
</div>
<i
v-else
class="faint"
>
<i v-else class="faint">
{{ $t('moderation.reports.no_content') }}
</i>
<div class="report-author">
@ -46,12 +43,12 @@
class="small-avatar"
:user="actor"
/>
{{ actor.screen_name }}
{{ this.actor.screen_name }}
</div>
</div>
<div
v-if="!hidden && statuses.length > 0"
class="dropdown"
v-if="!hidden && this.statuses.length > 0"
>
<button
class="button button-unstyled dropdown-header"
@ -77,8 +74,8 @@
</div>
</div>
<div
v-if="!hidden && notes.length > 0"
class="dropdown"
v-if="!hidden && this.notes.length > 0"
>
<button
class="button button-unstyled dropdown-header"
@ -102,9 +99,9 @@
</div>
<div class="report-add-note">
<textarea
v-model.trim="note"
rows="1"
cols="1"
v-model.trim="note"
:placeholder="$t('moderation.reports.note_placeholder')"
/>
<button
@ -137,7 +134,7 @@
:offset="{ y: 5 }"
remove-padding
>
<template #trigger>
<template v-slot:trigger>
<button
class="btn button-default"
:disabled="!tagPolicyEnabled"
@ -150,7 +147,7 @@
/>
</button>
</template>
<template #content="{close}">
<template v-slot:content="{close}">
<div
class="dropdown-menu"
:disabled="!tagPolicyEnabled"

View file

@ -6,7 +6,7 @@
class="small-avatar"
:user="user"
/>
{{ user.screen_name }}
{{ this.user.screen_name }}
</div>
<div class="header-right">
<Timeago

View file

@ -22,9 +22,6 @@ export default {
default: false
}
},
emits: [
'backdropClicked',
],
computed: {
classes () {
return {

View file

@ -8,7 +8,7 @@
@show="setToggled(true)"
@close="setToggled(false)"
>
<template #content>
<template v-slot:content>
<div class="dropdown-menu">
<span v-if="user.is_local">
<button
@ -122,7 +122,7 @@
</span>
</div>
</template>
<template #trigger>
<template v-slot:trigger>
<button
class="btn button-default btn-block moderation-tools-button"
:class="{ toggled }"
@ -137,11 +137,11 @@
v-if="showDeleteUserDialog"
:on-cancel="deleteUserDialog.bind(this, false)"
>
<template #header>
<template v-slot:header>
{{ $t('user_card.admin_menu.delete_user') }}
</template>
<p>{{ $t('user_card.admin_menu.delete_user_confirmation') }}</p>
<template #footer>
<template v-slot:footer>
<button
class="btn button-default"
@click="deleteUserDialog(false)"

View file

@ -6,7 +6,6 @@ import UserCard from '../user_card/user_card.vue'
import Timeago from '../timeago/timeago.vue'
import RichContent from 'src/components/rich_content/rich_content.jsx'
import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import StillImage from '../still-image/still-image.vue'
import { isStatusNotification } from '../../services/notification_utils/notification_utils.js'
import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
@ -51,8 +50,7 @@ const Notification = {
Timeago,
Status,
RichContent,
ConfirmModal,
StillImage
ConfirmModal
},
methods: {
toggleUserExpanded () {

View file

@ -116,13 +116,12 @@
scope="global"
keypath="notifications.reacted_with"
>
<still-image
<img
v-if="notification.emoji_url !== null"
class="notification-reaction-emoji"
:src="notification.emoji_url"
:title="notification.emoji"
:alt="notification.emoji"
/>
:name="notification.emoji"
>
<span
v-else
class="emoji-reaction-emoji"
@ -152,6 +151,7 @@
>
<Timeago
:time="notification.created_at"
:with-direction="true"
:auto-update="240"
/>
</router-link>

View file

@ -5,7 +5,7 @@
placement="bottom"
:bound-to="{ x: 'container' }"
>
<template #content>
<template v-slot:content>
<div class="dropdown-menu">
<button
class="button-default dropdown-item"
@ -72,7 +72,7 @@
</button>
</div>
</template>
<template #trigger>
<template v-slot:trigger>
<button class="filter-trigger-button button-unstyled">
<FAIcon icon="filter" />
</button>

View file

@ -105,12 +105,9 @@
flex: 1;
padding-left: 0.8em;
min-width: 0;
}
.heading-right, .notification-right {
.timeago {
display: inline-block;
min-width: 6em;
min-width: 3em;
text-align: right;
}
}

View file

@ -14,7 +14,7 @@
:model-value="present"
:disabled="disabled"
class="opt"
@update:model-value="$emit('update:modelValue', !present ? fallback : undefined)"
@update:modelValue="$emit('update:modelValue', !present ? fallback : undefined)"
/>
<input
:id="name"

View file

@ -2,6 +2,7 @@
<pinch-zoom
class="pinch-zoom-parent"
v-bind="$attrs"
v-on="$listeners"
>
<slot />
</pinch-zoom>

View file

@ -9,12 +9,11 @@ import StatusContent from '../status_content/status_content.vue'
import fileTypeService from '../../services/file_type/file_type.service.js'
import { findOffset } from '../../services/offset_finder/offset_finder.service.js'
import { reject, map, uniqBy, debounce } from 'lodash'
import { usePostLanguageOptions } from 'src/lib/post_language'
import suggestor from '../emoji_input/suggestor.js'
import { mapGetters, mapState } from 'vuex'
import Checkbox from '../checkbox/checkbox.vue'
import Select from '../select/select.vue'
import iso6391 from 'iso-639-1'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
@ -63,13 +62,6 @@ const deleteDraft = (draftKey) => {
localStorage.setItem('drafts', JSON.stringify(draftData));
}
const interfaceToISOLanguage = (ilang) => {
const sep = ilang.indexOf("_");
return sep < 0 ?
ilang :
ilang.substr(0, sep);
}
const PostStatusForm = {
props: [
'statusId',
@ -137,13 +129,6 @@ const PostStatusForm = {
this.$refs.textarea.focus()
}
},
setup() {
const {postLanguageOptions} = usePostLanguageOptions()
return {
postLanguageOptions,
}
},
data () {
const preset = this.$route.query.message
let statusText = preset || ''
@ -153,8 +138,7 @@ const PostStatusForm = {
statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)
}
const { postContentType: contentType, postLanguage: defaultPostLanguage, sensitiveByDefault, sensitiveIfSubject, interfaceLanguage, alwaysShowSubjectInput } = this.$store.getters.mergedConfig
const postLanguage = defaultPostLanguage || interfaceToISOLanguage(interfaceLanguage)
const { postContentType: contentType, sensitiveByDefault, sensitiveIfSubject, interfaceLanguage } = this.$store.getters.mergedConfig
let statusParams = {
spoilerText: this.subject || '',
@ -165,7 +149,7 @@ const PostStatusForm = {
poll: {},
mediaDescriptions: {},
visibility: this.suggestedVisibility(),
language: postLanguage,
language: interfaceLanguage,
contentType
}
@ -180,7 +164,7 @@ const PostStatusForm = {
poll: this.statusPoll || {},
mediaDescriptions: this.statusMediaDescriptions || {},
visibility: this.statusScope || this.suggestedVisibility(),
language: this.statusLanguage || postLanguage,
language: this.statusLanguage || interfaceLanguage,
contentType: statusContentType
}
}
@ -215,10 +199,6 @@ const PostStatusForm = {
}
}
// When first loading the form, hide the subject (CW) field if it's disabled or doesn't have a starting value.
// "disableSubject" seems to take priority over "alwaysShowSubjectInput".
const showSubject = !this.disableSubject && (statusParams.spoilerText || alwaysShowSubjectInput)
return {
dropFiles: [],
uploadingFiles: false,
@ -233,10 +213,7 @@ const PostStatusForm = {
preview: null,
previewLoading: false,
emojiInputShown: false,
idempotencyKey: '',
activeEmojiInput: undefined,
activeTextInput: undefined,
subjectVisible: showSubject
idempotencyKey: ''
}
},
computed: {
@ -325,11 +302,13 @@ const PostStatusForm = {
...mapState({
mobileLayout: state => state.interface.mobileLayout
}),
isoLanguages () {
return iso6391.getAllCodes();
}
},
watch: {
'newStatus': {
deep: true,
flush: 'sync',
handler () {
this.statusChanged()
}
@ -695,33 +674,8 @@ const PostStatusForm = {
this.$refs['emoji-input'].resize()
},
showEmojiPicker () {
if (!this.activeEmojiInput || !this.activeTextInput)
this.focusStatusInput()
this.$refs[this.activeTextInput].focus()
this.$refs[this.activeEmojiInput].triggerShowPicker()
},
focusStatusInput() {
this.activeEmojiInput = 'emoji-input'
this.activeTextInput = 'textarea'
},
focusSubjectInput() {
this.activeEmojiInput = 'subject-emoji-input'
this.activeTextInput = 'subject-input'
},
toggleSubjectVisible() {
// If hiding CW, then we need to clear the subject and reset focus
if (this.subjectVisible)
{
this.focusStatusInput()
// "nsfw" property is normally set by the @change listener, but this bypasses it.
// We need to clear it manually instead.
this.newStatus.spoilerText = ''
this.newStatus.nsfw = false
}
this.subjectVisible = !this.subjectVisible
this.$refs['textarea'].focus()
this.$refs['emoji-input'].triggerShowPicker()
},
clearError () {
this.error = null

View file

@ -118,16 +118,13 @@
/>
</div>
<EmojiInput
v-if="subjectVisible"
ref="subject-emoji-input"
v-if="!disableSubject && (newStatus.spoilerText || alwaysShowSubject)"
v-model="newStatus.spoilerText"
enable-emoji-picker
hide-emoji-button
:suggest="emojiSuggestor"
class="form-control"
>
<input
ref="subject-input"
v-model="newStatus.spoilerText"
type="text"
:placeholder="$t('post_status.content_warning')"
@ -135,7 +132,6 @@
size="1"
class="form-post-subject"
@input="onSubjectInput"
@focus="focusSubjectInput()"
>
</EmojiInput>
<i18n-t
@ -170,14 +166,13 @@
cols="1"
:disabled="posting && !optimisticPosting"
class="form-post-body"
:class="{ 'scrollable-form': !!maxHeight, '-has-subject': subjectVisible }"
:class="{ 'scrollable-form': !!maxHeight }"
@keydown.exact.enter="submitOnEnter && postStatus($event, newStatus)"
@keydown.meta.enter="postStatus($event, newStatus)"
@keydown.ctrl.enter="!submitOnEnter && postStatus($event, newStatus)"
@input="resize"
@compositionupdate="resize"
@paste="paste"
@focus="focusStatusInput()"
/>
<p
v-if="hasStatusLengthLimit"
@ -190,7 +185,6 @@
<div
v-if="!disableScopeSelector"
class="visibility-tray"
:class="{ 'visibility-tray-edit': isEdit }"
>
<scope-selector
v-if="!disableVisibilitySelector"
@ -201,9 +195,7 @@
/>
<div
class="format-selector-container">
<div
class="format-selector"
class="language-selector"
>
<Select
id="post-language"
@ -211,17 +203,17 @@
class="form-control"
>
<option
v-for="language in postLanguageOptions"
:key="language.key"
:value="language.value"
v-for="language in isoLanguages"
:key="language"
:value="language"
>
{{ language.label }}
{{ language }}
</option>
</Select>
</div>
<div
v-if="postFormats.length > 1"
class="text-format format-selector"
class="text-format"
>
<Select
id="post-content-type"
@ -239,7 +231,7 @@
</div>
<div
v-if="postFormats.length === 1 && postFormats[0] !== 'text/plain'"
class="text-format format-selector"
class="text-format"
>
<span class="only-format">
{{ $t(`post_status.content_type["${postFormats[0]}"]`) }}
@ -247,7 +239,6 @@
</div>
</div>
</div>
</div>
<poll-form
v-if="pollsAvailable"
ref="pollForm"
@ -285,15 +276,6 @@
>
<FAIcon icon="poll-h" />
</button>
<button
v-if="!disableSubject"
class="spoiler-icon button-unstyled"
:class="{ selected: subjectVisible }"
:title="$t('post_status.toggle_content_warning')"
@click="toggleSubjectVisible"
>
<FAIcon icon="eye-slash" />
</button>
</div>
<button
v-if="posting"
@ -464,10 +446,6 @@
align-items: baseline;
}
.visibility-tray-edit {
justify-content: right;
}
.visibility-notice.edit-warning {
> :first-child {
margin-top: 0;
@ -478,13 +456,7 @@
}
}
.format-selector-container {
.format-selector {
display: inline-block;
}
}
.media-upload-icon, .poll-icon, .emoji-icon, .spoiler-icon {
.media-upload-icon, .poll-icon, .emoji-icon {
font-size: 1.85em;
line-height: 1.1;
flex: 1;
@ -527,11 +499,6 @@
.poll-icon {
order: 3;
justify-content: center;
}
.spoiler-icon {
order: 4;
justify-content: right;
}
@ -584,11 +551,6 @@
line-height: 1.85;
}
.form-post-subject {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.form-post-body {
// TODO: make a resizable textarea component?
box-sizing: content-box; // needed for easier computation of dynamic size
@ -601,11 +563,6 @@
min-height: calc(var(--post-line-height) * 1em);
resize: none;
&.-has-subject {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
&.scrollable-form {
overflow-y: auto;
}

View file

@ -3,7 +3,7 @@
v-if="isLoggedIn && !resettingForm"
:is-open="modalActivated"
class="post-form-modal-view"
@backdrop-clicked="closeModal"
@backdropClicked="closeModal"
>
<div class="post-form-modal-panel panel">
<div class="panel-heading">

View file

@ -8,13 +8,13 @@
remove-padding
@show="focusInput"
>
<template #content="{close}">
<template v-slot:content="{close}">
<EmojiPicker
:enable-sticker-picker="false"
@emoji="addReaction($event, close)"
/>
</template>
<template #trigger>
<template v-slot:trigger>
<button
class="button-unstyled popover-trigger"
:title="$t('tool_tip.add_reaction')"

View file

@ -2,7 +2,7 @@ export default {
props: [ 'user' ],
computed: {
subscribeUrl () {
// eslint-disable-next-line no-undef
const serverUrl = new URL(this.user.statusnet_profile_url)
return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`
}

View file

@ -24,7 +24,7 @@
:items="items"
:get-key="getKey"
>
<template #item="{item}">
<template v-slot:item="{item}">
<div
class="selectable-list-item-inner"
:class="{ 'selectable-list-item-selected-inner': isSelected(item) }"
@ -41,7 +41,7 @@
/>
</div>
</template>
<template #empty>
<template v-slot:empty>
<slot name="empty" />
</template>
</List>

View file

@ -6,7 +6,7 @@
<Checkbox
:model-value="state"
:disabled="disabled"
@update:model-value="update"
@update:modelValue="update"
>
<span
v-if="!!$slots.default"

View file

@ -8,7 +8,7 @@
<Select
:model-value="state"
:disabled="disabled"
@update:model-value="update"
@update:modelValue="update"
>
<option
v-for="option in options"

View file

@ -6,14 +6,14 @@
<Popover
trigger="hover"
>
<template #trigger>
<template v-slot:trigger>
&nbsp;
<FAIcon
icon="wrench"
:aria-label="$t('settings.setting_changed')"
/>
</template>
<template #content>
<template v-slot:content>
<div class="modified-tooltip">
{{ $t('settings.setting_changed') }}
</div>

View file

@ -6,14 +6,14 @@
<Popover
trigger="hover"
>
<template #trigger>
<template v-slot:trigger>
&nbsp;
<FAIcon
icon="server"
:aria-label="$t('settings.setting_server_side')"
/>
</template>
<template #content>
<template v-slot:content>
<div class="serverside-tooltip">
{{ $t('settings.setting_server_side') }}
</div>

View file

@ -69,7 +69,7 @@ const SettingsModal = {
this.$store.dispatch('closeSettingsModal')
},
logout () {
this.$router.replace(this.$store.state.instance.redirectRootNoLogin || '/main/all')
this.$router.replace('/main/public')
this.$store.dispatch('closeSettingsModal')
this.$store.dispatch('logout')
},

View file

@ -108,7 +108,7 @@
<Checkbox
:model-value="!!expertLevel"
class="expertMode"
@update:model-value="expertLevel = Number($event)"
@update:modelValue="expertLevel = Number($event)"
>
{{ $t("settings.expert_mode") }}
</Checkbox>

View file

@ -72,7 +72,7 @@ const DataImportExportTab = {
// check is it's a local user
if (user && user.is_local) {
// append the instance address
// eslint-disable-next-line no-undef
return user.screen_name + '@' + location.hostname
}
return user.screen_name

View file

@ -4,7 +4,6 @@ import ScopeSelector from 'src/components/scope_selector/scope_selector.vue'
import IntegerSetting from '../helpers/integer_setting.vue'
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
import { usePostLanguageOptions } from 'src/lib/post_language'
import SharedComputedObject from '../helpers/shared_computed_object.js'
import ServerSideIndicator from '../helpers/server_side_indicator.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
@ -18,11 +17,6 @@ library.add(
)
const GeneralTab = {
setup() {
const {postLanguageOptions} = usePostLanguageOptions()
return {postLanguageOptions}
},
data () {
return {
subjectLineOptions: ['email', 'noop', 'masto'].map(mode => ({
@ -124,12 +118,6 @@ const GeneralTab = {
this.$store.dispatch('setOption', { name: 'translationLanguage', value: val })
}
},
postLanguage: {
get: function () { return this.$store.getters.mergedConfig.postLanguage },
set: function (val) {
this.$store.dispatch('setOption', { name: 'postLanguage', value: val })
}
},
...SharedComputedObject()
},
methods: {

View file

@ -44,6 +44,7 @@
<template
v-if="profilesExpanded"
>
<div
v-for="profile in settingsProfiles"
:key="profile.id"
@ -72,24 +73,15 @@
</button>
</template>
</div>
<button
class="btn button-default"
@click="refreshProfiles()"
>
<button class="btn button-default" @click="refreshProfiles()">
{{ $t('settings.settings_profiles_refresh') }}
<FAIcon
icon="sync"
@click="refreshProfiles()"
/>
<FAIcon icon="sync" @click="refreshProfiles()" />
</button>
<h3>{{ $t('settings.settings_profile_creation') }}</h3>
<label for="settings-profile-new-name">
{{ $t('settings.settings_profile_creation_new_name_label') }}
</label>
<input
id="settings-profile-new-name"
v-model="newProfileName"
>
<input v-model="newProfileName" id="settings-profile-new-name">
<button
class="btn button-default"
@click="createSettingsProfile"
@ -154,21 +146,6 @@
{{ $t('settings.show_wider_shortcuts') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="displayPageBackgrounds">
{{ $t('settings.show_page_backgrounds') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="centerAlignBio">
{{ $t('settings.center_align_bio') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="compactUserInfo">
{{ $t('settings.compact_user_info') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="stopGifs">
{{ $t('settings.stop_gifs') }}
@ -506,6 +483,14 @@
</BooleanSetting>
</li>
</ul>
<li>
<BooleanSetting
path="useAtIcon"
expert="1"
>
{{ $t('settings.use_at_icon') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="mentionLinkShowAvatar">
{{ $t('settings.mention_link_show_avatar') }}
@ -603,15 +588,6 @@
{{ $t('settings.post_status_content_type') }}
</ChoiceSetting>
</li>
<li>
<ChoiceSetting
id="postLanguage"
path="postLanguage"
:options="postLanguageOptions"
>
{{ $t('settings.post_language') }}
</ChoiceSetting>
</li>
<li>
<BooleanSetting
path="alwaysShowNewPostButton"

View file

@ -85,7 +85,7 @@ const MutesAndBlocks = {
// check is it's a local user
if (user && user.is_local) {
// append the instance address
// eslint-disable-next-line no-undef
return user.screen_name + '@' + location.hostname
}
return user.screen_name

View file

@ -10,7 +10,7 @@
:query="queryUserIds"
:placeholder="$t('settings.search_user_to_block')"
>
<template #default="row">
<template v-slot="row">
<BlockCard
:user-id="row.item"
/>
@ -21,7 +21,7 @@
:refresh="true"
:get-key="i => i"
>
<template #header="{selected}">
<template v-slot:header="{selected}">
<div class="bulk-actions">
<ProgressButton
v-if="selected.length > 0"
@ -29,7 +29,7 @@
:click="() => blockUsers(selected)"
>
{{ $t('user_card.block') }}
<template #progress>
<template v-slot:progress>
{{ $t('user_card.block_progress') }}
</template>
</ProgressButton>
@ -39,16 +39,16 @@
:click="() => unblockUsers(selected)"
>
{{ $t('user_card.unblock') }}
<template #progress>
<template v-slot:progress>
{{ $t('user_card.unblock_progress') }}
</template>
</ProgressButton>
</div>
</template>
<template #item="{item}">
<template v-slot:item="{item}">
<BlockCard :user-id="item" />
</template>
<template #empty>
<template v-slot:empty>
{{ $t('settings.no_blocks') }}
</template>
</BlockList>
@ -63,7 +63,7 @@
:query="queryUserIds"
:placeholder="$t('settings.search_user_to_mute')"
>
<template #default="row">
<template v-slot="row">
<MuteCard
:user-id="row.item"
/>
@ -74,7 +74,7 @@
:refresh="true"
:get-key="i => i"
>
<template #header="{selected}">
<template v-slot:header="{selected}">
<div class="bulk-actions">
<ProgressButton
v-if="selected.length > 0"
@ -82,7 +82,7 @@
:click="() => muteUsers(selected)"
>
{{ $t('user_card.mute') }}
<template #progress>
<template v-slot:progress>
{{ $t('user_card.mute_progress') }}
</template>
</ProgressButton>
@ -92,16 +92,16 @@
:click="() => unmuteUsers(selected)"
>
{{ $t('user_card.unmute') }}
<template #progress>
<template v-slot:progress>
{{ $t('user_card.unmute_progress') }}
</template>
</ProgressButton>
</div>
</template>
<template #item="{item}">
<template v-slot:item="{item}">
<MuteCard :user-id="item" />
</template>
<template #empty>
<template v-slot:empty>
{{ $t('settings.no_mutes') }}
</template>
</MuteList>
@ -114,7 +114,7 @@
:query="queryKnownDomains"
:placeholder="$t('settings.type_domains_to_mute')"
>
<template #default="row">
<template v-slot="row">
<DomainMuteCard
:domain="row.item"
/>
@ -125,7 +125,7 @@
:refresh="true"
:get-key="i => i"
>
<template #header="{selected}">
<template v-slot:header="{selected}">
<div class="bulk-actions">
<ProgressButton
v-if="selected.length > 0"
@ -133,16 +133,16 @@
:click="() => unmuteDomains(selected)"
>
{{ $t('domain_mute_card.unmute') }}
<template #progress>
<template v-slot:progress>
{{ $t('domain_mute_card.unmute_progress') }}
</template>
</ProgressButton>
</div>
</template>
<template #item="{item}">
<template v-slot:item="{item}">
<DomainMuteCard :domain="item" />
</template>
<template #empty>
<template v-slot:empty>
{{ $t('settings.no_mutes') }}
</template>
</DomainMuteList>

View file

@ -33,7 +33,6 @@ const ProfileTab = {
newName: this.$store.state.users.currentUser.name_unescaped,
newBio: unescape(this.$store.state.users.currentUser.description),
newLocked: this.$store.state.users.currentUser.locked,
newPermitFollowback: this.$store.state.users.currentUser.permit_followback,
newFields: this.$store.state.users.currentUser.fields.map(field => ({ name: field.name, value: field.value })),
showRole: this.$store.state.users.currentUser.show_role,
role: this.$store.state.users.currentUser.role,
@ -130,15 +129,14 @@ const ProfileTab = {
note: this.newBio,
locked: this.newLocked,
// Backend notation.
/* eslint-disable camelcase */
display_name: this.newName,
fields_attributes: this.newFields.filter(el => el != null),
bot: this.bot,
show_role: this.showRole,
status_ttl_days: this.expirePosts ? this.newPostTTLDays : -1,
permit_followback: this.permit_followback,
accepts_direct_messages_from: this.userAcceptsDirectMessagesFrom
/* eslint-enable camelcase */
}
if (this.emailLanguage) {
@ -187,7 +185,7 @@ const ProfileTab = {
})
return
}
// eslint-disable-next-line no-undef
const reader = new FileReader()
reader.onload = ({ target }) => {
const img = target.result

View file

@ -110,9 +110,11 @@
max="730"
class="expire-posts-days"
:placeholder="$t('settings.expire_posts_input_placeholder')"
>
/>
</p>
<p>
</p>
<p />
<p>
<interface-language-switcher
:prompt-text="$t('settings.email_language')"
@ -257,19 +259,6 @@
<BooleanSetting path="serverSide_locked">
{{ $t('settings.lock_account_description') }}
</BooleanSetting>
<ul
class="setting-list suboptions"
:class="[{disabled: !serverSide_locked}]"
>
<li>
<BooleanSetting
path="serverSide_permitFollowback"
:disabled="!serverSide_locked"
>
{{ $t('settings.permit_followback_description') }}
</BooleanSetting>
</li>
</ul>
</li>
<li>
<BooleanSetting path="serverSide_discoverable">

View file

@ -1,25 +1,22 @@
import { extractCommit } from 'src/services/version/version.service'
function joinURL(base, subpath) {
return URL.parse(subpath, base)?.href || "invalid base URL"
}
const pleromaFeCommitUrl = 'https://akkoma.dev/AkkomaGang/pleroma-fe/commit/'
const pleromaBeCommitUrl = 'https://akkoma.dev/AkkomaGang/akkoma/commit/'
const VersionTab = {
data () {
const instance = this.$store.state.instance
return {
backendCommitUrl: instance.backendCommitUrl,
backendVersion: instance.backendVersion,
frontendCommitUrl: instance.frontendCommitUrl,
frontendVersion: instance.frontendVersion
}
},
computed: {
frontendVersionLink () {
return joinURL(this.frontendCommitUrl, this.frontendVersion)
return pleromaFeCommitUrl + this.frontendVersion
},
backendVersionLink () {
return joinURL(this.backendCommitUrl, extractCommit(this.backendVersion))
return pleromaBeCommitUrl + extractCommit(this.backendVersion)
}
}
}

View file

@ -266,16 +266,6 @@
color: $fallback--cGreen;
color: var(--cGreen, $fallback--cGreen);
}
.right-side {
display: flex;
align-items: center;
gap: 0.3em;
}
.repeat-tooltip {
flex-shrink: 0;
}
}
.repeater-avatar {

View file

@ -83,7 +83,7 @@
:user="statusoid.user"
/>
<div class="right-side faint">
<div
<span
class="status-username repeater-name"
:title="retweeter"
>
@ -100,12 +100,8 @@
v-else
:to="retweeterProfileLink"
>{{ retweeter }}</router-link>
</div>
</span>
{{ ' ' }}
<div
class="repeat-tooltip"
>
<FAIcon
icon="retweet"
class="repeat-icon"
@ -114,7 +110,6 @@
{{ $t('timeline.repeated') }}
</div>
</div>
</div>
<div
v-if="!deleted"
@ -195,7 +190,7 @@
>
<Timeago
:time="status.created_at"
:with-direction="!compact"
:with-direction="true"
:auto-update="60"
/>
</router-link>
@ -373,7 +368,7 @@
:controlled-toggle-showing-long-subject="controlledToggleShowingLongSubject"
@mediaplay="addMediaPlaying($event)"
@mediapause="removeMediaPlaying($event)"
@parse-ready="setHeadTailLinks"
@parseReady="setHeadTailLinks"
/>
</div>
@ -481,8 +476,8 @@
/>
<extra-buttons
:status="status"
@on-error="showError"
@on-success="clearError"
@onError="showError"
@onSuccess="clearError"
/>
</div>
</div>

View file

@ -41,8 +41,7 @@ const StatusContent = {
postLength: this.status.text.length,
parseReadyDone: false,
renderMisskeyMarkdown,
translateFrom: null,
translating: false
translateFrom: null
}
},
computed: {
@ -136,10 +135,7 @@ const StatusContent = {
},
translateStatus () {
const translateTo = this.$store.getters.mergedConfig.translationLanguage || this.$store.state.instance.interfaceLanguage
this.translating = true
this.$store.dispatch(
'translateStatus', { id: this.status.id, language: translateTo, from: this.translateFrom }
).finally(() => { this.translating = false })
this.$store.dispatch('translateStatus', { id: this.status.id, language: translateTo, from: this.translateFrom })
}
}
}

View file

@ -54,7 +54,7 @@
:mfm="renderMisskeyMarkdown && (status.media_type === 'text/x.misskeymarkdown')"
:greentext="mergedConfig.greentext"
:attentions="status.attentions"
@parse-ready="onParseReady"
@parseReady="onParseReady"
/>
<div
v-if="status.translation"
@ -70,7 +70,7 @@
:mfm="renderMisskeyMarkdown && (status.media_type === 'text/x.misskeymarkdown')"
:greentext="mergedConfig.greentext"
:attentions="status.attentions"
@parse-ready="onParseReady"
@parseReady="onParseReady"
/>
<div>
<label class="label">{{ $t('status.override_translation_source_language') }}</label>
@ -89,11 +89,7 @@
</option>
</Select>
{{ ' ' }}
<button
class="btn button-default"
:disabled="translating"
@click="translateStatus"
>
<button @click="translateStatus" class="btn button-default">
{{ $t('status.translate') }}
</button>
</div>

View file

@ -14,7 +14,7 @@
:toggle-showing-tall="toggleShowingTall"
:toggle-expanding-subject="toggleExpandingSubject"
:toggle-showing-long-subject="toggleShowingLongSubject"
@parse-ready="$emit('parseReady', $event)"
@parseReady="$emit('parseReady', $event)"
>
<div v-if="status.poll && status.poll.options && !compact">
<Poll

View file

@ -2,7 +2,7 @@
<Modal
v-if="modalActivated"
class="status-history-modal-view"
@backdrop-clicked="closeModal"
@backdropClicked="closeModal"
>
<div class="status-history-modal-panel panel">
<div class="panel-heading">
@ -17,7 +17,7 @@
v-for="status in history"
:key="status.id"
:statusoid="status"
:is-preview="true"
:isPreview="true"
class="conversation-status status-fadein panel-body"
/>
</div>

View file

@ -5,10 +5,10 @@
:bound-to="{ x: 'container' }"
@show="enter"
>
<template #trigger>
<template v-slot:trigger>
<slot />
</template>
<template #content>
<template v-slot:content>
<Status
v-if="status"
:is-preview="true"

View file

@ -13,7 +13,6 @@ const StillImage = {
return {
stopGifs: this.$store.getters.mergedConfig.stopGifs || window.matchMedia('(prefers-reduced-motion: reduce)').matches,
isAnimated: false,
imageTypeLabel: ''
}
},
computed: {
@ -40,24 +39,27 @@ const StillImage = {
this.imageLoadError && this.imageLoadError()
},
detectAnimation (image) {
// If there are no file extensions, the mimetype isn't set, and no mediaproxy is available, we can't figure out
// the mimetype of the image.
const hasFileExtension = this.src.split('/').pop().includes('.') // TODO: Better check?
const mediaProxyAvailable = this.$store.state.instance.mediaProxyAvailable
if (!mediaProxyAvailable) {
if (!hasFileExtension && this.mimetype === undefined && !mediaProxyAvailable) {
// It's a bit aggressive to assume all images we can't find the mimetype of is animated, but necessary for
// people in need of reduced motion accessibility. As such, we'll consider those images animated if the user
// agent is set to prefer reduced motion. Otherwise, it'll just be used as an early exit.
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
// Since the canvas and images are not pixel-perfect matching (due to scaling),
// It makes the images jiggle on hover, which is not ideal for accessibility, methinks
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches)
this.isAnimated = true
return
}
this.detectWithoutMediaProxy(image)
} else {
this.detectWithMediaProxy(image)
if (this.mimetype === 'image/gif' || this.src.endsWith('.gif')) {
this.isAnimated = true
return
}
},
detectAnimationWithFetch (image) {
// harmless CORS errors without-- clean console with
if (!mediaProxyAvailable) return
// Animated JPEGs?
if (!(this.src.endsWith('.webp') || this.src.endsWith('.png'))) return
// Browser Cache should ensure image doesn't get loaded twice if cache exists
fetch(image.src, {
referrerPolicy: 'same-origin'
@ -66,20 +68,12 @@ const StillImage = {
// We don't need to read the whole file so only call it once
data.body.getReader().read()
.then(reader => {
// Ordered from least to most intensive
if (this.isGIF(reader.value)) {
if (this.src.endsWith('.webp') && this.isAnimatedWEBP(reader.value)) {
this.isAnimated = true
this.setLabel('GIF')
return
}
if (this.isAnimatedWEBP(reader.value)) {
if (this.src.endsWith('.png') && this.isAnimatedPNG(reader.value)) {
this.isAnimated = true
this.setLabel('WEBP')
return
}
if (this.isAnimatedPNG(reader.value)) {
this.isAnimated = true
this.setLabel('APNG')
}
})
})
@ -87,53 +81,6 @@ const StillImage = {
// this.imageLoadError && this.imageLoadError()
})
},
detectWithMediaProxy (image) {
this.detectAnimationWithFetch(image)
},
detectWithoutMediaProxy (image) {
// We'll just assume that gifs and webp are animated
const extension = image.src.split('.').pop().toLowerCase()
if (extension === 'gif') {
this.isAnimated = true
this.setLabel('GIF')
return
}
if (extension === 'webp') {
this.isAnimated = true
this.setLabel('WEBP')
return
}
// Beware the apng! use this if ye dare
// if (extension === 'png') {
// this.isAnimated = true
// this.setLabel('PNG')
// return
// }
// Hail mary for extensionless
if (extension.includes('/')) {
// Don't mind the CORS error barrage
this.detectAnimationWithFetch(image)
}
},
setLabel (name) {
this.imageTypeLabel = name;
},
isGIF (data) {
// I am a perfectly sane individual
//
// GIF HEADER CHUNK
// === START HEADER ===
// 47 49 46 38 ("GIF8")
const gifHeader = [0x47, 0x49, 0x46];
for (let i = 0; i < 3; i++) {
if (data[i] !== gifHeader[i]) {
return false;
}
}
return true
},
isAnimatedWEBP (data) {
/**
* WEBP HEADER CHUNK
@ -168,53 +115,14 @@ const StillImage = {
return (str.substring(0, idatPos > 0 ? idatPos : 0).indexOf('acTL') > 0)
},
drawThumbnail () {
const canvas = this.$refs.canvas;
if (!canvas) return;
const context = canvas.getContext('2d');
const image = this.$refs.src;
const parentElement = canvas.parentElement;
// Draw the quick, unscaled version first
context.drawImage(image, 0, 0, parentElement.clientWidth, parentElement.clientHeight);
// Use requestAnimationFrame to schedule the scaling to the next frame
requestAnimationFrame(() => {
// Compute scaling ratio between the natural dimensions of the image and its display dimensions
const scalingRatioWidth = parentElement.clientWidth / image.naturalWidth;
const scalingRatioHeight = parentElement.clientHeight / image.naturalHeight;
// Adjust for high-DPI displays
const ratio = window.devicePixelRatio || 1;
canvas.width = image.naturalWidth * scalingRatioWidth * ratio;
canvas.height = image.naturalHeight * scalingRatioHeight * ratio;
canvas.style.width = `${parentElement.clientWidth}px`;
canvas.style.height = `${parentElement.clientHeight}px`;
context.scale(ratio, ratio);
// Maintain the aspect ratio of the image
const imgAspectRatio = image.naturalWidth / image.naturalHeight;
const canvasAspectRatio = parentElement.clientWidth / parentElement.clientHeight;
let drawWidth, drawHeight;
if (imgAspectRatio > canvasAspectRatio) {
drawWidth = parentElement.clientWidth;
drawHeight = parentElement.clientWidth / imgAspectRatio;
} else {
drawHeight = parentElement.clientHeight;
drawWidth = parentElement.clientHeight * imgAspectRatio;
}
context.clearRect(0, 0, canvas.width, canvas.height); // Clear the previous unscaled image
context.imageSmoothingEnabled = true;
context.imageSmoothingQuality = 'high';
// Draw the good one for realsies
const dx = (parentElement.clientWidth - drawWidth) / 2;
const dy = (parentElement.clientHeight - drawHeight) / 2;
context.drawImage(image, dx, dy, drawWidth, drawHeight);
});
const canvas = this.$refs.canvas
if (!this.$refs.canvas) return
const image = this.$refs.src
const width = image.naturalWidth
const height = image.naturalHeight
canvas.width = width
canvas.height = height
canvas.getContext('2d').drawImage(image, 0, 0, width, height)
}
},
updated () {

View file

@ -1,16 +1,9 @@
<template>
<div
ref="still-image"
class="still-image"
:class="{ animated: animated }"
:style="style"
>
<div
v-if="animated && imageTypeLabel"
class="image-type-label"
>
{{ imageTypeLabel }}
</div>
<canvas
v-if="animated"
ref="canvas"
@ -64,26 +57,30 @@
}
}
.image-type-label {
&.animated {
&::before {
zoom: var(--_still_image-label-scale, 1);
content: 'gif';
position: absolute;
top: 0.25em;
left: 0.25em;
line-height: 1;
font-size: 0.6em;
font-size: 0.7em;
top: 0.5em;
left: 0.5em;
background: rgba(127, 127, 127, 0.5);
color: #fff;
display: block;
padding: 2px 4px;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
z-index: 2;
visibility: var(--_still-image-label-visibility, visible);
}
&.animated {
&:hover canvas {
display: none;
}
&:hover .image-type-label {
&:hover::before {
visibility: var(--_still-image-label-visibility, hidden);
}

View file

@ -32,7 +32,7 @@
:dive="dive ? () => dive(status.id) : undefined"
@goto="setHighlight"
@toggle-expanded="toggleExpanded"
@toggleExpanded="toggleExpanded"
/>
<div
v-if="currentReplies.length && threadShowing"

View file

@ -28,7 +28,4 @@
}
}
}
.timeline {
min-height: 1em;
}
}

View file

@ -4,7 +4,7 @@
class="TimelineQuickSettings"
:bound-to="{ x: 'container' }"
>
<template #content>
<template v-slot:content>
<div class="dropdown-menu">
<div v-if="loggedIn">
<button
@ -80,7 +80,7 @@
</button>
</div>
</template>
<template #trigger>
<template v-slot:trigger>
<button class="button-unstyled">
<FAIcon icon="filter" />
</button>

View file

@ -9,12 +9,12 @@
@show="openMenu"
@close="() => isOpen = false"
>
<template #content>
<template v-slot:content>
<div class="timeline-menu-popover popover-default">
<TimelineMenuContent />
</div>
</template>
<template #trigger>
<template v-slot:trigger>
<button class="button-unstyled title timeline-menu-title">
<span class="timeline-title">{{ timelineName() }}</span>
<span>

View file

@ -62,6 +62,7 @@
:title="$t('nav.twkn_timeline_description')"
:aria-label="$t('nav.twkn_timeline_description')"
>{{ $t("nav.twkn") }}</span>
</router-link>
</li>
<li v-if="currentUser">

View file

@ -16,9 +16,9 @@
/>
</router-link>
<router-link
v-if="publicTimelineVisible"
:to="{ name: 'public-timeline' }"
class="nav-icon"
v-if="publicTimelineVisible"
>
<FAIcon
fixed-width
@ -40,9 +40,9 @@
/>
</router-link>
<router-link
v-if="federatedTimelineVisible"
:to="{ name: 'public-external-timeline' }"
class="nav-icon"
v-if="federatedTimelineVisible"
>
<FAIcon
fixed-width

View file

@ -33,7 +33,7 @@
--_avatarShadowBox: var(--avatarStatusShadow);
--_avatarShadowFilter: var(--avatarStatusShadowFilter);
--_avatarShadowInset: var(--avatarStatusShadowInset);
// --_still-image-label-visibility: hidden;
--_still-image-label-visibility: hidden;
display: inline-block;
position: relative;

View file

@ -66,7 +66,7 @@ export default {
return this.user.id !== this.$store.state.users.currentUser.id
},
subscribeUrl () {
// eslint-disable-next-line no-undef
const serverUrl = new URL(this.user.statusnet_profile_url)
return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`
},
@ -117,11 +117,6 @@ export default {
shouldConfirmMute () {
return this.mergedConfig.modalOnMute
},
compactUserInfo () {
return this.$store.getters.mergedConfig.compactUserInfo
&& (this.$store.state.interface.layoutType !== 'mobile')
&& this.switcher
},
...mapGetters(['mergedConfig'])
},
components: {

View file

@ -21,13 +21,6 @@
position: relative;
}
.user-buttons {
grid-area: edit;
display: flex;
padding: .5em 0 .5em 0;
justify-self: end;
}
.panel-body {
word-wrap: break-word;
border-bottom-right-radius: inherit;
@ -60,6 +53,7 @@
}
&-bio {
text-align: center;
display: block;
line-height: 1.3;
padding: 1em;
@ -106,14 +100,15 @@
padding: 0 26px;
.container {
min-width: 0;
padding: 16px 0 6px;
display: grid;
grid-template-areas:
"pfp name edit"
"pfp summary summary"
"stats stats stats";
grid-template-columns: auto 1fr auto;
align-items: start;
display: flex;
align-items: flex-start;
max-height: 56px;
> * {
min-width: 0;
}
.Avatar {
--_avatarShadowBox: var(--avatarShadow);
@ -128,7 +123,6 @@
}
&-avatar-link {
grid-area: pfp;
position: relative;
cursor: pointer;
@ -159,8 +153,8 @@
.external-link-button, .edit-profile-button {
cursor: pointer;
width: 2.3em;
text-align: right;
width: 2.5em;
text-align: center;
margin: -0.5em 0;
padding: 0.5em 0;
@ -171,16 +165,12 @@
}
.user-summary {
grid-area: summary;
display: grid;
grid-template-areas:
"name name name name name"
"hand role lock avg _";
grid-template-columns:
auto auto auto auto 1fr;
justify-items: start;
display: block;
margin-left: 0.6em;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1 1 0;
// This is so that text doesn't get overlapped by avatar's shadow if it has
// big one
z-index: 1;
@ -188,81 +178,55 @@
--emoji-size: 1.7em;
.user-locked {
.top-line,
.bottom-line {
display: flex;
}
}
.user-name {
text-overflow: ellipsis;
overflow: hidden;
flex: 1 1 auto;
margin-right: 1em;
font-size: 1.1em;
}
.bottom-line {
font-weight: light;
font-size: 1.1em;
align-items: baseline;
.lock-icon {
margin-left: 0.5em;
grid-area: lock;
}
.user-screen-name {
min-width: 1px;
max-width: 100%;
flex: 0 1 auto;
text-overflow: ellipsis;
overflow: hidden;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
grid-area: hand;
}
.dailyAvg {
min-width: 1px;
flex: 0 0 auto;
margin-left: 1em;
font-size: 0.7em;
color: $fallback--text;
color: var(--text, $fallback--text);
grid-area: avg;
}
.user-roles {
display: flex;
grid-area: role;
.user-role {
flex: none;
color: $fallback--text;
color: var(--alertNeutralText, $fallback--text);
background-color: $fallback--fg;
background-color: var(--alertNeutral, $fallback--fg);
}
}
}
.user-counts {
grid-area: stats;
display: flex;
line-height:16px;
padding-top: 0.5em;
text-align: center;
justify-content: space-around;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
align-self: center;
.user-count {
padding: .5em 0 .5em 0;
margin: 0 .5em;
h5 {
font-size:1em;
font-weight: bolder;
margin: 0 0 0.25em;
}
a {
text-decoration: none;
}
}
}
.user-name {
text-align: start;
text-overflow: ellipsis;
overflow: hidden;
margin-left: 0.6em;
font-size: 1.1em;
grid-area: name;
align-self: center;
white-space: nowrap;
max-width: 100%;
z-index: 1; // so shadow from user avatar doesn't overlap it
}
.user-meta {
margin-bottom: .15em;
@ -326,21 +290,34 @@
margin: 0;
}
}
&.-compact {
.container {
grid-template-areas:
"pfp name stats edit"
"pfp summary stats edit";
grid-template-columns: auto auto 1fr auto;
}
.user-counts {
padding-top: 0;
justify-content: space-evenly;
}
}
}
.sidebar .edit-profile-button {
display: none;
}
.user-counts {
display: flex;
line-height:16px;
padding: .5em 1.5em 0em 1.5em;
text-align: center;
justify-content: space-between;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
flex-wrap: wrap;
}
.user-count {
flex: 1 0 auto;
padding: .5em 0 .5em 0;
margin: 0 .5em;
h5 {
font-size:1em;
font-weight: bolder;
margin: 0 0 0.25em;
}
a {
text-decoration: none;
}
}

View file

@ -9,10 +9,7 @@
class="background-image"
/>
<div class="panel-heading -flexible-height">
<div
class="user-info"
:class="{ '-compact': this.compactUserInfo }"
>
<div class="user-info">
<div class="container">
<a
v-if="allowZoomingAvatar"
@ -32,7 +29,6 @@
</a>
<router-link
v-else
class="user-info-avatar-link"
:to="userProfileLink(user)"
>
<UserAvatar
@ -40,79 +36,14 @@
:user="user"
/>
</router-link>
<div class="user-summary">
<div class="top-line">
<RichContent
:title="user.name"
class="user-name"
:html="user.name"
:emoji="user.emoji"
/>
<div class="user-summary">
<router-link
class="user-screen-name"
:title="user.screen_name_ui"
:to="userProfileLink(user)"
>
@{{ user.screen_name_ui }}
</router-link>
<span class="user-roles" v-if="!hideBio && (user.deactivated || !!visibleRole || user.bot)">
<span
v-if="user.deactivated"
class="alert user-role"
>
{{ $t('user_card.deactivated') }}
</span>
<span
v-if="!!visibleRole"
class="alert user-role"
>
{{ $t(`general.role.${visibleRole}`) }}
</span>
<span
v-if="user.bot"
class="alert user-role"
>
{{ $t('user_card.bot') }}
</span>
</span>
<span class="user-locked" v-if="user.locked">
<FAIcon
class="lock-icon"
icon="lock"
size="sm"
/>
</span>
<span
v-if="!mergedConfig.hideUserStats && !hideBio"
class="dailyAvg"
>{{ dailyAvg }} {{ $t('user_card.per_day') }}</span>
</div>
<div
v-if="!mergedConfig.hideUserStats && switcher"
class="user-counts"
>
<div
class="user-count"
@click.prevent="setProfileView('statuses')"
>
<h5>{{ $t('user_card.statuses') }}</h5>
<span>{{ user.statuses_count }} <br></span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('friends')"
>
<h5>{{ $t('user_card.followees') }}</h5>
<span>{{ hideFollowsCount ? $t('user_card.hidden') : user.friends_count }}</span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('followers')"
>
<h5>{{ $t('user_card.followers') }}</h5>
<span>{{ hideFollowersCount ? $t('user_card.hidden') : user.followers_count }}</span>
</div>
</div>
<div class="user-buttons">
<button
v-if="!isOtherUser && user.is_local"
class="button-unstyled edit-profile-button"
@ -153,6 +84,47 @@
:relationship="relationship"
/>
</div>
<div class="bottom-line">
<router-link
class="user-screen-name"
:title="user.screen_name_ui"
:to="userProfileLink(user)"
>
@{{ user.screen_name_ui }}
</router-link>
<template v-if="!hideBio">
<span
v-if="user.deactivated"
class="alert user-role"
>
{{ $t('user_card.deactivated') }}
</span>
<span
v-if="!!visibleRole"
class="alert user-role"
>
{{ $t(`general.role.${visibleRole}`) }}
</span>
<span
v-if="user.bot"
class="alert user-role"
>
{{ $t('user_card.bot') }}
</span>
</template>
<span v-if="user.locked">
<FAIcon
class="lock-icon"
icon="lock"
size="sm"
/>
</span>
<span
v-if="!mergedConfig.hideUserStats && !hideBio"
class="dailyAvg"
>{{ dailyAvg }} {{ $t('user_card.per_day') }}</span>
</div>
</div>
</div>
<div class="user-meta">
<div
@ -297,13 +269,38 @@
v-if="!hideBio"
class="panel-body"
>
<div
v-if="!mergedConfig.hideUserStats && switcher"
class="user-counts"
>
<div
class="user-count"
@click.prevent="setProfileView('statuses')"
>
<h5>{{ $t('user_card.statuses') }}</h5>
<span>{{ user.statuses_count }} <br></span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('friends')"
>
<h5>{{ $t('user_card.followees') }}</h5>
<span>{{ hideFollowsCount ? $t('user_card.hidden') : user.friends_count }}</span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('followers')"
>
<h5>{{ $t('user_card.followers') }}</h5>
<span>{{ hideFollowersCount ? $t('user_card.hidden') : user.followers_count }}</span>
</div>
</div>
<RichContent
v-if="!hideBio"
class="user-card-bio"
:html="user.description_html"
:emoji="user.emoji"
:handle-links="true"
:style='{"text-align": this.$store.getters.mergedConfig.centerAlignBio ? "center" : "start"}'
/>
</div>
<teleport to="#modal">

View file

@ -4,10 +4,10 @@
placement="top"
:offset="{ y: 5 }"
>
<template #trigger>
<template v-slot:trigger>
<slot />
</template>
<template #content>
<template v-slot:content>
<div class="user-list-popover">
<template v-if="users.length">
<div

View file

@ -145,12 +145,10 @@ const UserProfile = {
if (user) {
loadById(user.id)
this.note = user.relationship.note
this.$store.dispatch('setDisplayBackground', user.background_image)
} else {
this.$store.dispatch('fetchUser', userNameOrId)
.then(({ id, relationship, background_image }) => {
.then(({ id, relationship }) => {
this.note = relationship.note
this.$store.dispatch('setDisplayBackground', background_image)
return loadById(id)
})
.catch((reason) => {
@ -227,9 +225,6 @@ const UserProfile = {
Conversation,
RichContent,
FollowedTagList
},
beforeRouteLeave(to, from) {
this.$store.dispatch('setDisplayBackground', null)
}
}

View file

@ -121,8 +121,8 @@
</FriendList>
</div>
<div
v-if="isUs"
key="tags"
v-if="isUs"
:label="$t('user_card.followed_tags')"
>
<FollowedTagList

View file

@ -1,7 +1,7 @@
<template>
<Modal
v-if="isOpen"
@backdrop-clicked="closeModal"
@backdropClicked="closeModal"
>
<div class="user-reporting-panel panel">
<div class="panel-heading">
@ -45,7 +45,7 @@
</div>
<div class="user-reporting-panel-right">
<List :items="statuses">
<template #item="{item}">
<template v-slot:item="{item}">
<div class="status-fadein user-reporting-panel-sitem">
<Status
:in-conversation="false"

View file

@ -84,7 +84,6 @@
"keep_open": "Mantindre el selector obert",
"load_all": "Carregant tots els {emojiAmount} emoji",
"load_all_hint": "Carregat el primer {saneAmount} emoji, carregar tots els emoji pot causar problemes de rendiment.",
"recent": "Recents",
"search_emoji": "Buscar un emoji",
"stickers": "Adhesius",
"unicode": "Emojis unicode"
@ -255,10 +254,6 @@
"hint": "Entra per a participar en la conversa",
"login": "Inicia sessió",
"logout": "Tanca la sessió",
"logout_confirm": "Segur que vols tancar la sessió?",
"logout_confirm_accept_button": "Surt",
"logout_confirm_cancel_button": "Canceŀla",
"logout_confirm_title": "Tanca la sessió",
"password": "Contrasenya",
"placeholder": "el meu nom d'usuari",
"recovery_code": "Codi de recuperació",
@ -271,32 +266,6 @@
"next": "Següent",
"previous": "Anterior"
},
"moderation": {
"moderation": "Moderació",
"reports": {
"add_note": "Afegeix una nota",
"close": "Tanca",
"delete_note": "Esborra la nota",
"delete_note_accept": "Sí, esborra-la",
"delete_note_cancel": "No, conserva-la",
"delete_note_confirm": "Segur que vols esborrar aquesta nota?",
"delete_note_title": "Cal confirmació",
"no_content": "Sense descripció",
"no_reports": "No hi ha informes per mostrar",
"note_placeholder": "Deixa una nota",
"notes": "{ count } nota | { count } notes",
"reopen": "Reobre",
"report": "Denuncia-ho",
"reports": "Denúncies",
"resolve": "Resol",
"show_closed": "Mostra les tancades",
"statuses": "{ count } post| { count } posts",
"tag_policy_notice": "Activa la restricció de publicacions segons la TagPolicy MRF",
"tags": "Estableix restriccions a les publicacions"
},
"statuses": "Publicacions",
"users": "Usuàries"
},
"nav": {
"about": "Quant a",
"administration": "Administració",
@ -313,7 +282,6 @@
"interactions": "Interaccions",
"lists": "Llistes",
"mentions": "Mencions",
"moderation": "Moderació",
"preferences": "Preferències",
"public_timeline_description": "Apunts públics des d'aquesta instància",
"public_tl": "Línia de temps Pública",
@ -407,12 +375,9 @@
"private": "Aquest apunt serà visible només per els teus seguidors",
"public": "Aquest apunt serà visible per a tothom",
"unlisted": "Aquest apunt no es veurà ni a la Línia de temps Pública ni a Tota la Xarxa Coneguda"
},
"toggle_content_warning": "Des/activa l'avís de contingut"
}
},
"registration": {
"awaiting_email_confirmation": "S'ha registrat el teu compte i s'ha enviat un correu a la teva adreça. Consulta el correu per completar el registre.",
"awaiting_email_confirmation_title": "Pendent de confirmar l'adreça de correu",
"bio": "Bio",
"bio_placeholder": "p.e.\nHola! Benvingut a la meva bio.\nM'encanta veure anime i jugar a jocs. Espero que podrem ser amics!",
"captcha": "CAPTCHA",
@ -426,8 +391,6 @@
"reason_placeholder": "Aquesta instància aprova els registres manualment.\nExplica a l'administració per què vols registrar-te.",
"register": "Registre",
"registration": "Registre",
"request_sent": "La teva soŀlicitud de registre s'ha enviat. Rebràs un correu quan sigui aprovada.",
"request_sent_title": "Soŀlicitud de registre",
"token": "Codi d'invitació",
"username_placeholder": "p. ex. akko",
"validations": {
@ -537,8 +500,6 @@
"enable_web_push_notifications": "Habilitar notificacions del navegador",
"enter_current_password_to_confirm": "Posa la teva contrasenya actual per a confirmar la teva identitat",
"expert_mode": "Mostra avançat",
"expire_posts_enabled": "Esborra les publicacions després d'un cert nombre de dies",
"expire_posts_input_placeholder": "Nombre de dies",
"export_theme": "Desa el tema",
"file_export_import": {
"backup_restore": "Còpia de seguretat de la configuració",
@ -680,7 +641,6 @@
"pad_emoji": "Acompanya els emojis amb espais al afegir-los des del selector",
"panelRadius": "Panells",
"pause_on_unfocused": "Pausa quan la pestanya perdi el focus",
"permit_followback_description": "Aprova automàticament les soŀlicituds de seguiment que vinguin d'usuàries que ja segueixes",
"play_videos_in_modal": "Reproduir vídeos en un marc emergent",
"post_look_feel": "Aspecte i Sensació dels apunts",
"post_status_content_type": "Tipus de contingut d'apunt predeterminat",
@ -749,7 +709,6 @@
"show_admin_badge": "Mostra l'insígnia \"Administrador\" en el meu perfil",
"show_moderator_badge": "Mostra l'insígnia \"Moderador\" en el meu perfil",
"show_nav_shortcuts": "Mostra els accessos directes addicionals en el panell superior",
"show_page_backgrounds": "Mostra fons de pantalla específics de pàgines, com en les pàgines de perfil d'usuari",
"show_panel_nav_shortcuts": "Mostra els accessos directes de navegació de la línia de temps en el panell superior",
"show_scrollbars": "Mostra les barres de desplaçament de la columna lateral",
"show_wider_shortcuts": "Mostra més separats els accessos directes del panell superior",
@ -925,13 +884,9 @@
"upload_a_photo": "Pujar una foto",
"useStreamingApi": "Rebre apunts i notificacions en temps real",
"useStreamingApiWarning": "És genial emprar-lo. Si es trenca, refresca, suposo?",
"use_blurhash": "Fes borroses les miniatures d'imatges NSFW",
"use_at_icon": "Mostra el símbol {'@'} com a icona enlloc de text",
"use_contain_fit": "No retallar els adjunts en miniatures",
"use_one_click_nsfw": "Obre els adjunts NSFW amb només un clic",
"user_accepts_direct_messages_from": "Accepta missatges directes de",
"user_accepts_direct_messages_from_everybody": "Qualsevol",
"user_accepts_direct_messages_from_nobody": "Ningú",
"user_accepts_direct_messages_from_people_i_follow": "Comptes que segueixo",
"user_mutes": "Usuaris",
"user_profile_default_tab": "Pestanya per defecte en el Perfil d'Usuari",
"user_profiles": "Perfils d'usuari",
@ -1054,7 +1009,6 @@
"collapse": "Replega",
"conversation": "Conversa",
"error": "Error carregant la línia de temps: {0}",
"follow_tag": "Segueix l'etiqueta",
"load_older": "Carrega apunts anteriors",
"no_more_statuses": "No hi ha més apunts",
"no_retweet_hint": "L'apunt és només per a seguidors o és \"directe\" i no es pot repetir o citar",
@ -1064,7 +1018,6 @@
"show_new": "Mostra els nous",
"socket_broke": "Connexió a temps real perduda: codi CloseEvent {0}",
"socket_reconnected": "Connexió a temps real establerta",
"unfollow_tag": "Deixa de seguir l'etiqueta",
"up_to_date": "Actualitzat"
},
"toast": {
@ -1129,7 +1082,6 @@
"block_confirm_title": "Bloqueja l'usuari",
"block_progress": "Bloquejant…",
"blocked": "Bloquejat!",
"blocks_you": "Et té bloquejadi!",
"bot": "Bot",
"deactivated": "Desactivat",
"deny": "Denega",
@ -1144,10 +1096,7 @@
"follow_cancel": "Cancel·la la sol·licitud",
"follow_progress": "Sol·licitant…",
"follow_sent": "Petició enviada!",
"follow_tag": "Segueix l'etiqueta",
"follow_unfollow": "Deixa de seguir",
"followed_tags": "Etiquetes que segueixes",
"followed_users": "Usuaris que segueixes",
"followees": "Seguint",
"followers": "Seguidors",
"following": "Seguint!",
@ -1172,14 +1121,12 @@
"mute_domain": "Bloqueja el domini",
"mute_progress": "Silenciant…",
"muted": "Silenciat",
"not_following_any_hashtags": "No estàs seguint cap etiqueta",
"note": "Nota privada",
"per_day": "per dia",
"remote_follow": "Seguiment remot",
"remove_follower": "Esborra seguidor",
"replies": "Amb respostes",
"report": "Informa",
"requested_by": "Et vol seguir",
"show_repeats": "Mostra les repeticions",
"statuses": "Apunts",
"subscribe": "Subscriu-te",
@ -1189,13 +1136,11 @@
"unfollow_confirm_accept_button": "Sí, deixa'l de seguir",
"unfollow_confirm_cancel_button": "No, no el deixis de seguir",
"unfollow_confirm_title": "Deixa de seguir l'usuari",
"unfollow_tag": "Deixa de seguir l'etiqueta",
"unmute": "Deixa de silenciar",
"unmute_progress": "Deixant de silenciar…",
"unsubscribe": "Anul·la la subscripció"
},
"user_profile": {
"field_validated": "Enllaç verificat",
"profile_does_not_exist": "Disculpes, aquest perfil no existeix.",
"profile_loading_error": "Disculpes, hi ha hagut un error carregant aquest perfil.",
"timeline_title": "Línia de temps del usuari"

View file

@ -482,7 +482,6 @@
"blocks_tab": "Blocks",
"bot": "Dies ist ein Bot Account",
"btnRadius": "Knöpfe",
"center_align_bio": "Zentrale Textausrichtung in der Bio",
"cBlue": "Blau (Antworten, folgt dir)",
"cGreen": "Grün (Retweet)",
"cOrange": "Orange (Favorisieren)",
@ -497,7 +496,6 @@
"checkboxRadius": "Auswahlfelder",
"collapse_subject": "Beiträge mit Inhaltswarnungen einklappen",
"columns": "Spalten",
"compact_user_info": "Kompakte Benutzerinfos wenn genug Platz",
"composing": "Verfassen",
"confirm_dialogs": "Bestätigung erforderlich für:",
"confirm_dialogs_approve_follow": "Annehmen einer Followanfrage",
@ -918,6 +916,7 @@
"upload_a_photo": "Lade ein Foto hoch",
"useStreamingApi": "Empfange Posts und Benachrichtigungen in Echtzeit",
"useStreamingApiWarning": "(Nicht empfohlen, experimentell, bekannt dafür, Posts zu überspringen)",
"use_at_icon": "{'@'}-Symbol als Icon und nicht als Text anzeigen",
"use_blurhash": "Blurhash für NSFW-Vorschauen verwenden",
"use_contain_fit": "Vorschaubilder nicht zuschneiden",
"use_one_click_nsfw": "Heikle Anhänge mit nur einem Klick öffnen",

View file

@ -380,7 +380,6 @@
"text/x.misskeymarkdown": "MFM"
},
"content_warning": "Content Warning (optional)",
"toggle_content_warning": "Toggle content warning",
"default": "Just arrived at Luna Nova Academy",
"direct_warning_to_all": "This post will be visible to all the mentioned users.",
"direct_warning_to_first_only": "This post will only be visible to the mentioned users at the beginning of the message.",
@ -488,7 +487,6 @@
"blocks_tab": "Blocks",
"bot": "This is a bot account",
"btnRadius": "Buttons",
"center_align_bio": "Center text in user bio",
"cBlue": "Blue (Reply, follow)",
"cGreen": "Green (Retweet)",
"cOrange": "Orange (Favorite)",
@ -503,7 +501,6 @@
"checkboxRadius": "Checkboxes",
"collapse_subject": "Collapse posts with content warnings",
"columns": "Columns",
"compact_user_info": "Compact user info when enough space",
"composing": "Composing",
"confirm_dialogs": "Require confirmation for:",
"confirm_dialogs_approve_follow": "Accepting a follow request",
@ -603,7 +600,6 @@
"list_aliases_error": "Error fetching aliases: {error}",
"list_backups_error": "Error fetching backup list: {error}",
"lock_account_description": "Restrict your account to approved followers only",
"permit_followback_description": "Automatically approve requests from already followed users",
"loop_video": "Loop videos",
"loop_video_silent_only": "Loop only videos without sound (i.e. Mastodon's \"gifs\")",
"mascot": "Mastodon FE Mascot",
@ -686,7 +682,6 @@
"play_videos_in_modal": "Play videos in a popup frame",
"post_look_feel": "Posts Look & Feel",
"post_status_content_type": "Default post content type",
"post_language": "Default post language",
"posts": "Posts",
"preload_images": "Preload images",
"presets": "Presets",
@ -754,7 +749,6 @@
"show_nav_shortcuts": "Show extra navigation shortcuts in top panel",
"show_panel_nav_shortcuts": "Show timeline navigation shortcuts at the top of the panel",
"show_scrollbars": "Show side column's scrollbars",
"show_page_backgrounds": "Show page-specific backgrounds, e.g. for user profiles",
"show_wider_shortcuts": "Show wider gap between top panel shortcuts",
"show_yous": "Show (You)s",
"stop_gifs": "Pause animated images until you hover on them",
@ -928,6 +922,7 @@
"upload_a_photo": "Upload a photo",
"useStreamingApi": "Receive posts and notifications real-time",
"useStreamingApiWarning": "It's cool use it. If it breaks refresh I guess?",
"use_at_icon": "Display {'@'} symbol as an icon instead of text",
"use_contain_fit": "Don't crop the attachment in thumbnails",
"use_one_click_nsfw": "Open NSFW attachments with just one click",
"user_mutes": "Users",

View file

@ -84,7 +84,6 @@
"keep_open": "Mantener el selector abierto",
"load_all": "Cargando todos los {emojiAmount} emoji",
"load_all_hint": "Cargado el primer emoji {saneAmount}, cargar todos los emoji puede causar problemas de rendimiento.",
"recent": "Recientemente usado",
"search_emoji": "Buscar un emoji",
"stickers": "Pegatinas",
"unicode": "Emojis unicode"
@ -303,7 +302,7 @@
"announcements": "Anuncios",
"back": "Volver",
"bookmarks": "Marcadores",
"bubble_timeline": "Línea temporal burbuja",
"bubble_timeline": "Linea temporal burbuja",
"bubble_timeline_description": "Publicaciones de instancias cercanas a la tuya, recomendadas por los/las administradores/as",
"chats": "Chats",
"dms": "Mensajes directos",
@ -916,20 +915,13 @@
"token": "Token",
"tooltipRadius": "Información/alertas",
"translation_language": "Idioma de traducción automática",
"tree_advanced": "Mostrar botones extras para abrir y cerrar la cadena de réplicas en los hilos",
"type_domains_to_mute": "Buscar dominios para silenciar",
"upload_a_photo": "Subir una foto",
"useStreamingApi": "Recibir publicaciones y notificaciones en tiempo real",
"useStreamingApiWarning": "(no recomendado, experimental, puede omitir publicaciones)",
"use_blurhash": "Usar miniaturas borrosas para las imágenes sensibles",
"use_contain_fit": "No recortar los adjuntos en miniaturas",
"use_one_click_nsfw": "Abrir los adjuntos NSFW con un solo click",
"user_accepts_direct_messages_from": "Aceptar mensajes directos de",
"user_accepts_direct_messages_from_everybody": "Todos",
"user_accepts_direct_messages_from_nobody": "Nadie",
"user_accepts_direct_messages_from_people_i_follow": "Personas que sigo",
"user_mutes": "Usuarios",
"user_profiles": "Perfiles de usuario",
"user_settings": "Ajustes del Usuario",
"valid_until": "Válido hasta",
"values": {
@ -942,61 +934,26 @@
"title": "Versión"
},
"virtual_scrolling": "Optimizar la representación de la linea temporal",
"word_filter": "Filtro de palabras",
"wordfilter": "Filtro de palabras"
},
"settings_profile": {
"creating": "Creando un nuevo perfil de configuración \"{profile}\"...",
"synchronization_error": "No se pudo sincronizar la configuración: {err}",
"synchronized": "¡Ajustes sincronizados!",
"synchronizing": "Sincronizando los ajustes de perfil \"{profile}\"..."
"word_filter": "Filtro de palabras"
},
"status": {
"ancestor_follow": "Vea {numReplies} respuesta en esta publicación | Ver otras {numReplies} respuestas en esta publicación",
"ancestor_follow_with_icon": "{icon} {text}",
"attachment_stop_flash": "Parar el reproductor Flash",
"bookmark": "Marcar",
"collapse_attachments": "Minimizar adjuntos",
"copy_link": "Copiar el enlace al mensaje",
"delete": "Eliminar mensaje",
"delete_confirm": "¿Realmente quieres borrar el mensaje?",
"delete_confirm_accept_button": "Sí, elimínelo",
"delete_confirm_cancel_button": "No, mantenerlo",
"delete_confirm_title": "Confirmar la eliminación",
"edit": "Editar",
"edit_history": "Editar el historial",
"edit_history_modal_title": "Editado {historyCount} vez | Editado {historyCount} veces",
"edited_at": "Editado {time}",
"copy_link": "Copiar el enlace al estado",
"delete": "Eliminar publicación",
"delete_confirm": "¿Realmente quieres borrar la publicación?",
"expand": "Expandir",
"external_source": "Fuente externa",
"favorites": "Favoritos",
"hide_attachment": "Ocultar adjuntos",
"hide_content": "Ocultar el contenido",
"hide_full_subject": "Ocultar la advertencia de contenido",
"many_attachments": "El mensaje tiene {number} adjunto | El mensaje tiene {number} adjuntos",
"hide_full_subject": "Ocultar el tema completo",
"mentions": "Menciones",
"move_down": "Desplazar adjunto a la derecha",
"move_up": "Desplazar adjunto a la izquierda",
"mute_conversation": "Silenciar la conversación",
"nsfw": "NSFW (No apropiado para el trabajo)",
"open_gallery": "Abrir la galería",
"override_translation_source_language": "Anular el idioma de origen",
"pin": "Fijar en tu perfil",
"pinned": "Fijado",
"plus_more": "+{number} más",
"redraft": "Eliminar y volver a redactar",
"redraft_confirm": "¿Realmente deseas eliminar y volver a redactar esta publicación? Las interacciones con la publicación original no se conservarán.",
"redraft_confirm_accept_button": "Sí, eliminar y volver a redactar",
"redraft_confirm_cancel_button": "No, conserva el original",
"redraft_confirm_title": "Confirmar eliminación y volver a redactar",
"remove_attachment": "Quitar archivo adjunto",
"repeat_confirm": "¿De verdad quieres repetir esta entrada?",
"repeat_confirm_accept_button": "Si, repítela",
"repeat_confirm_cancel_button": "No, no repitas",
"repeat_confirm_title": "Confirmar repetir",
"repeats": "Repetidos",
"replies_list": "Respuestas:",
"replies_list_with_others": "Ver {numReplies} respuesta | Ver {numReplies} respuestas más",
"reply_to": "Respondiendo a",
"show_content": "Mostrar el contenido",
"show_full_subject": "Mostrar el tema completo",

View file

@ -920,6 +920,7 @@
"upload_a_photo": "Envoyer une photo",
"useStreamingApi": "Recevoir les messages et notifications en temps réel",
"useStreamingApiWarning": "(Non recommandé, expérimental, connu pour rater des messages)",
"use_at_icon": "Afficher le symbol {'@'} comme une image",
"use_contain_fit": "Ne pas rogner les miniatures des pièces-jointes",
"use_one_click_nsfw": "Ouvrir les pièces-jointes sensibles avec un seul clic",
"user_mutes": "Comptes",

View file

@ -1,7 +1,7 @@
{
"about": {
"bubble_instances": "Instance Bubble Lokal",
"bubble_instances_description": "Instansi yang dipilih oleh admin untuk mewakili daerah lokal instansi ini",
"bubble_instances_description": "Instansi yang dipilih oleh admin untuk mewakili instance ini",
"mrf": {
"federation": "Federasi",
"keyword": {
@ -456,10 +456,8 @@
"settings": {
"accent": "Aksen",
"account_alias": "Akun alias",
"account_alias_table_head": "Alias",
"account_backup": "Pencadangan akun",
"account_backup_description": "Ini memungkinkan kamu untuk mengunduh arsip yang berisi informasi tentang akun dan postingan kamu, namun belum bisa diimpor ke akun Pleroma.",
"account_backup_table_head": "Cadangan",
"account_privacy": "Privasi",
"add_alias_error": "Gagal menambahkan alias: {error}",
"add_backup": "Buat cadangan baru",
@ -557,8 +555,7 @@
"follow_export_button": "Export yang kamu ikuti ke dalam file csv",
"follow_import": "Import pengikut",
"follow_import_error": "Terjadi kesalahan ketika mengimpor pengikut",
"follows_imported": "Daftar mengikuti telah diimpor! Proses mungkin membutuhkan beberapa saat.",
"foreground": "Latar depan",
"follows_imported": "Pengguna yang diikuti telak diimpor! Proses mungkin membutuhkan beberapa saat.",
"fun": "Seru",
"general": "Umum",
"greentext": "Panah meme",
@ -566,30 +563,17 @@
"hide_attachments_in_convo": "Sembunyikan lampiran pada percakapan",
"hide_attachments_in_tl": "Sembunyikan lampiran di linimasa",
"hide_bot_indication": "Sembunyikan tanda bot pada postingan",
"hide_favorites_description": "Jangan tunjukkan daftar kesukaan saya (orang masih mendapatkan notifikasi)",
"hide_filtered_statuses": "Sembunyikan semua postingan yang tersaring",
"hide_followers_count_description": "Jangan tampilkan jumlah pengikut",
"hide_followers_description": "Jangan tampilkan siapa yang mengikutiku",
"hide_follows_count_description": "Jangan tampilkan jumlah mengikuti",
"hide_follows_description": "Jangan tampilkan siapa yang aku ikuti",
"hide_isp": "Sembunyikan panel spesifik instansi",
"hide_list_aliases_error_action": "Tutup",
"hide_media_previews": "Sembunyikan pratinjau media",
"hide_muted_posts": "Sembunyikan postingan-postingan dari pengguna yang dibisukan",
"hide_muted_threads": "Sembunyikan thread yang dibisukan",
"hide_post_stats": "Sembunyikan statistik postingan (seperti jumlah favorit)",
"hide_shoutbox": "Sembunyikan kotak suara instansi",
"hide_site_favicon": "Sembunyikan favicon instansi di panel atas",
"hide_site_name": "Sembunyikan nama instansi di panel atas",
"hide_threads_with_blocked_users": "Sembunyikan thread yang menyebut orang yang diblok",
"hide_user_stats": "Sembunyikan statistik pengguna (seperti jumlah pengikut)",
"hide_wallpaper": "Sembunyikan latar belakang instansi",
"hide_wordfiltered_statuses": "Sembunyikan post yang disaring dengan kata",
"import_blocks_from_a_csv_file": "Impor blokiran dari berkas csv",
"import_followers_from_a_csv_file": "Impor daftar mengikuti dari berkas csv",
"import_mutes_from_a_csv_file": "Impor daftar pembisuan dari berkas csv",
"import_theme": "Muat preset",
"inputRadius": "Bidang masukan",
"instance_default": "(bawaan: {value})",
"instance_default_simple": "(bawaan)",
"interface": "Antarmuka",
@ -597,23 +581,16 @@
"invalid_theme_imported": "Berkas yang dipilih bukan sebuah tema yang didukung Pleroma. Tidak ada perubahan yang dibuat pada tema kamu.",
"limited_availability": "Tidak tersedia di browser kamu",
"links": "Tautan",
"list_aliases_error": "Gagal mengambil alias: {error}",
"list_backups_error": "Gagal mengambil daftar cadangan: {error}",
"lock_account_description": "Batasi akunmu kepada pengikut yang sudah disetujui saja",
"loop_video": "Ulang-ulang video",
"loop_video_silent_only": "Ulang-ulang video tanpa suara (seperti \"gif\" Mastodon)",
"mascot": "Maskot Mastodon FE",
"max_depth_in_thread": "Tingat thread maksimum yang ditampilkan oleh bawaan",
"max_thumbnails": "Jumlah thumbnail maksimum per postingan (kosong = tidak terbatas)",
"mention_link_bolden_you": "Sorot sebutan kamu apabila kamu disebut",
"mention_link_display": "Tampilkan tautan sebutan",
"mention_link_display_full": "selalu sebagai nama lengkap (cth. {'@'}foo{'@'}example.org)",
"mention_link_display_full_for_remote": "sebagai nama lengkap hanya untuk pengguna di instansi lain (cth. {'@'}foo{'@'}example.org)",
"mention_link_display_short": "selalu sebagai nama pendek (cth. {'@'}foo)",
"mention_link_fade_domain": "Pudarkan domain (contoh: {'@'}example.org di {'@'}foo{'@'}example.org)",
"mention_link_show_avatar": "Tampilkan avatar pengguna di samping tautan",
"mention_link_show_tooltip": "Tunjukkan nama penuh pengguna sebagai tooltip untuk pengguna jauh",
"mention_links": "Tautan sebutan",
"mfa": {
"authentication_methods": "Metode otentikasi",
"confirm_and_enable": "Konfirmasi & aktifkan OTP",
@ -622,8 +599,6 @@
"recovery_codes": "Kode pemulihan.",
"recovery_codes_warning": "Tulis kodenya atau simpan mereka di tempat yang aman - jika tidak kamu tidak akan melihat mereka lagi. Jika kamu tidak dapat mengakses aplikasi 2FA kamu dan kode pemulihanmu hilang, kamu tidak akan bisa mengakses akun kamu.",
"scan": {
"desc": "Menggunakan aplikasi dua-faktor kamu, pindai kode QR ini atau masukkan kunci teks:",
"secret_code": "Kunci",
"title": "Pindai"
},
"setup_otp": "Siapkan OTP",
@ -631,19 +606,10 @@
"verify": {
"desc": "Untuk mengaktifkan otentikasi dua-faktor, masukkan kode dari aplikasi dua-faktor kamu:"
},
"wait_pre_setup_otp": "Pengaturan awal OTP",
"waiting_a_recovery_codes": "Menerima kode cadangan…",
"warning_of_generate_new_codes": "Ketika kamu menghasilkan kode pemulihan baru, kode lama kamu berhenti bekerja."
},
"minimal_scopes_mode": "Minimalkan pilihan seleksi lingkup posting",
"more_settings": "Lebih banyak pengaturan",
"move_account": "Pindahkan akun",
"move_account_error": "Gagal memindahkan akun: {error}",
"move_account_notes": "Jika kamu ingin memindahkan akun ini ke tempat lain, kamu harus pergi ke akun tujuan kamu dan menambahkan alias yang mengarah ke sini.",
"move_account_target": "Akun tujuan (contoh {example})",
"moved_account": "Akun telah dipindahkan.",
"mute_bot_posts": "Bisukan posting dari bot",
"mute_export": "Expor pembisuan",
"mutes_and_blocks": "Bisuan dan Blokiran",
"name": "Nama",
"name_bio": "Nama & bio",
@ -733,7 +699,7 @@
"fine_print": "Baca {0} kami untuk belajar sesuatu yang tak ada gunanya!",
"header": "Pratinjau",
"header_faint": "Ini baik-baik saja",
"input": "Baru saja mendarat di Luna Nova Academy",
"input": "Baru saja mendarat di L.A.",
"link": "sebuah tautan yang kecil nan bagus"
},
"shadows": {
@ -754,15 +720,15 @@
"use_source": "Versi baru"
}
},
"subject_line_behavior": "Salin peringatan isi ketika membalas",
"subject_line_email": "Seperti surel: \"re: peringatan\"",
"subject_line_behavior": "Salin subyek ketika membalas",
"subject_line_email": "Seperti surel: \"re: subyek\"",
"subject_line_mastodon": "Seperti mastodon: salin saja",
"subject_line_noop": "Jangan salin",
"text": "Teks",
"theme": "Tema",
"token": "Token",
"upload_a_photo": "Unggah foto",
"useStreamingApiWarning": "Ini bagus, gunakan. Kalau tidak jalan, mungkin segarkan halaman?",
"useStreamingApiWarning": "(Tidak disarankan, eksperimental, diketahui dapat melewati postingan-postingan)",
"use_one_click_nsfw": "Buka lampiran NSFW hanya dengan satu klik",
"user_settings": "Pengaturan Pengguna",
"valid_until": "Valid hingga",
@ -778,7 +744,7 @@
"word_filter": "Penyaring kata"
},
"status": {
"delete": "Hapus post",
"delete": "Hapus status",
"delete_confirm": "Apakah kamu benar-benar ingin menghapus postingan ini?",
"favorites": "Favorit",
"hide_content": "",
@ -791,7 +757,7 @@
"reply_to": "Balas ke",
"show_content": "",
"status_deleted": "Postingan ini telah dihapus",
"status_unavailable": "Post tidak tersedia",
"status_unavailable": "Status tidak tersedia",
"thread_muted_and_words": ", memiliki kata:",
"unmute_conversation": "Berhenti membisikan percakapan",
"unpin": "Berhenti menyematkan dari profil"
@ -821,9 +787,9 @@
"timeline": {
"conversation": "Percakapan",
"error": "Terjadi kesalahan memuat linimasa: {0}",
"no_more_statuses": "Tidak ada post lagi",
"no_more_statuses": "Tidak ada status lagi",
"no_retweet_hint": "Postingan ditandai sebagai hanya-pengikut atau langsung dan tidak dapat diulang atau dikutip",
"no_statuses": "Tidak ada post",
"no_statuses": "Tidak ada status",
"reload": "Muat ulang",
"repeated": "diulangi"
},
@ -887,7 +853,7 @@
"per_day": "per hari",
"report": "Laporkan",
"show_repeats": "Tampilkan ulangan",
"statuses": "Postingan",
"statuses": "Status",
"unblock": "Berhenti memblokir",
"unmute": "Berhenti membisukan"
},

View file

@ -1,7 +1,5 @@
{
"about": {
"bubble_instances": "Istanze della Bolla Locale",
"bubble_instances_description": "Istanze selezionate dagli amministratori per rappresentare l'area d'interesse dell'istanza",
"mrf": {
"federation": "Federazione",
"keyword": {
@ -18,15 +16,12 @@
"accept_desc": "Questa stanza accetta messaggi solo dalle seguenti altre:",
"ftl_removal": "Rimozione dalla sequenza federale",
"ftl_removal_desc": "Questa stanza rimuove le seguenti dalla sequenza federale:",
"instance": "Istanza",
"media_nsfw": "Allegati oscurati d'ufficio",
"media_nsfw_desc": "Questa stanza oscura gli allegati dei messaggi provenienti da queste stanze:",
"media_removal": "Rimozione multimedia",
"media_removal_desc": "Questa istanza rimuove gli allegati dalle seguenti stanze:",
"not_applicable": "N/D",
"quarantine": "Quarantena",
"quarantine_desc": "Questa istanza non invierà post alle seguenti istanze:",
"reason": "Motivazione",
"quarantine_desc": "Questa stanza inoltrerà solo messaggi pubblici alle seguenti:",
"reject": "Rifiuta",
"reject_desc": "Questa stanza rifiuterà i messaggi provenienti dalle seguenti:",
"simple_policies": "Regole specifiche alla stanza"
@ -34,27 +29,6 @@
},
"staff": "Responsabili"
},
"announcements": {
"all_day_prompt": "Evento lungo tutto il giorno",
"cancel_edit_action": "Annulla",
"close_error": "Chiudi",
"delete_action": "Elimina",
"edit_action": "Modifica",
"end_time_display": "Finisce alle {time}",
"end_time_prompt": "Ora di fine: ",
"inactive_message": "Questo annuncio è inattivo",
"mark_as_read_action": "Segna come già letto",
"page_header": "Annunci",
"post_action": "Post",
"post_error": "Errore: {error}",
"post_form_header": "Posta annuncio",
"post_placeholder": "Contenuto dell'annuncio",
"published_time_display": "Pubblicato alle {time}",
"start_time_display": "Inizia alle {time}",
"start_time_prompt": "Ora di inizio: ",
"submit_edit_action": "Invia",
"title": "Annuncio"
},
"chats": {
"chats": "Conversazioni",
"delete": "Elimina",
@ -84,7 +58,6 @@
"keep_open": "Tieni aperto il menù",
"load_all": "Carico tutti i {emojiAmount} emoji",
"load_all_hint": "Primi {saneAmount} emoji caricati, caricarli tutti potrebbe causare rallentamenti.",
"recent": "Usato di recente",
"search_emoji": "Cerca un emoji",
"stickers": "Adesivi",
"unicode": "Emoji Unicode"
@ -136,13 +109,6 @@
"admin": "Amministratore",
"moderator": "Moderatore"
},
"scope_in_timeline": {
"direct": "Diretto",
"local": "Locale - Solo la tua istanza può vedere questo post",
"private": "Solo per i seguaci",
"public": "Pubblico",
"unlisted": "Non elencato"
},
"show_less": "Ripiega",
"show_more": "Mostra tutto",
"submit": "Invia",
@ -165,84 +131,6 @@
"load_older": "Carica interazioni precedenti",
"moves": "Utenti migrati"
},
"languages": {
"ar": "Arabo",
"az": "Azero",
"bg": "Bulgaro",
"cs": "Ceco",
"da": "Danese",
"de": "Tedesco",
"el": "Greco",
"en": "Inglese",
"eo": "Esperanto",
"es": "Spagnolo",
"fa": "Persiano",
"fi": "Finlandese",
"fr": "Francese",
"ga": "Irlandese",
"he": "Ebreo",
"hi": "Hindi",
"hu": "Ungherese",
"id": "Indonesiano",
"it": "Italiano",
"ja": "Giapponese",
"ko": "Coreano",
"lt": "Lituano",
"lv": "Lettone",
"nl": "Olandese",
"pl": "Polacco",
"pt": "Portoghese",
"ru": "Russo",
"sk": "Slovacco",
"sv": "Svedese",
"tr": "Turco",
"translated_from": {
"ar": "Tradotto dall' @:languages.ar",
"az": "Tradotto dall' @:languages.az",
"bg": "Tradotto dal @:languages.bg",
"cs": "Tradotto dal @:languages.cs",
"da": "Tradotto dal @:languages.da",
"de": "Tradotto dal @:languages.de",
"el": "Tradotto dal @:languages.el",
"en": "Tradotto dall' @:languages.en",
"eo": "Tradotto dal @:languages.eo",
"es": "Tradotto dallo @:languages.es",
"fa": "Tradotto dal @:languages.fa",
"fi": "Tradotto dal @:languages.fi",
"fr": "Tradotto dal @:languages.fr",
"ga": "Tradotto dal @:languages.ga",
"he": "Tradotto dal @:languages.he",
"hi": "Tradotto dal @:languages.hi",
"hu": "Tradotto dal @:languages.hu",
"id": "Tradotto dal @:languages.id",
"it": "Tradotto dall' @:languages.it",
"ja": "Tradotto dal @:languages.ja",
"ko": "Tradotto dal @:languages.ko",
"lt": "Tradotto dal @:languages.lt",
"lv": "Tradotto dal @:languages.lv",
"nl": "Tradotto dall' @:languages.nl",
"pl": "Tradotto dal @:languages.pl",
"pt": "Tradotto dal @:languages.pt",
"ru": "Tradotto dal @:languages.ru",
"sk": "Tradotto dal @:languages.sk",
"sv": "Tradotto dal @:languages.sv",
"tr": "Tradotto dal @:languages.tr",
"uk": "Tradotto dal @:languages.uk",
"zh": "Tradotto dal @:languages.zh"
},
"uk": "Ucraino",
"zh": "Cinese"
},
"lists": {
"create": "Crea",
"delete": "Elimina lista",
"following_only": "Limita a chi segui",
"lists": "Liste",
"new": "Nuova Lista",
"save": "Salva cambiamenti",
"search": "Cerca utenti",
"title": "Titolo della lista"
},
"login": {
"authentication_code": "Codice di autenticazione",
"description": "Accedi con OAuth",
@ -255,10 +143,6 @@
"hint": "Accedi per conversare",
"login": "Accedi",
"logout": "Disconnettiti",
"logout_confirm": "Sicuro di disconnetterti?",
"logout_confirm_accept_button": "Disconnetti",
"logout_confirm_cancel_button": "Annulla",
"logout_confirm_title": "Disconnetti",
"password": "Password",
"placeholder": "es. Lupo Lucio",
"recovery_code": "Codice di recupero",
@ -266,67 +150,31 @@
"username": "Nome utente"
},
"media_modal": {
"counter": "{current} / {total}",
"hide": "Chiudi visualizzatore multimediale",
"next": "Prossimo",
"previous": "Precedente"
},
"moderation": {
"moderation": "Moderazione",
"reports": {
"add_note": "Aggiungi nota",
"close": "Chiudi",
"delete_note": "Elimina",
"delete_note_accept": "Si, eliminalo",
"delete_note_cancel": "No, lascialo stare",
"delete_note_confirm": "Sei sicurə di voler eliminare questa nota?",
"delete_note_title": "Conferma eliminazione",
"no_content": "Nessuna descrizione",
"no_reports": "Nessun report da mostrare",
"note_placeholder": "Lascia una nota",
"notes": "{ count } nota | { count } note",
"reopen": "Riapri",
"report": "Riporta su",
"reports": "Rapporti",
"resolve": "Risolvi",
"show_closed": "Mostra chiusi",
"statuses": "{ count } post| { count } post",
"tag_policy_notice": "Abilita il TagPolicy MRF per poter impostare restrizioni sui post",
"tags": "Imposta restrizioni sui post"
},
"statuses": "Post",
"users": "Utenti"
},
"nav": {
"about": "Informazioni",
"administration": "Amministrazione",
"announcements": "Annunci",
"back": "Indietro",
"bookmarks": "Segnalibri",
"bubble_timeline": "Timeline della Bolla Locale",
"bubble_timeline_description": "Post da istanze vicine alla tua e raccomandate dagli amministratori",
"chats": "Conversazioni",
"dms": "Messaggi privati",
"friend_requests": "Vogliono seguirti",
"home_timeline": "Sequenza personale",
"home_timeline_description": "Post dalle persone che segui",
"interactions": "Interazioni",
"lists": "Liste",
"mentions": "Menzioni",
"moderation": "Moderazione",
"preferences": "Preferenze",
"public_timeline_description": "Post pubblici da questa istanza",
"public_tl": "Sequenza pubblica",
"search": "Ricerca",
"timeline": "Sequenza personale",
"timelines": "Sequenze",
"twkn": "Sequenza federale",
"twkn_timeline_description": "Post da tutta la rete",
"user_search": "Ricerca utenti",
"who_to_follow": "Chi seguire"
},
"notifications": {
"broken_favorite": "Post sconosciuto, lo sto cercando…",
"broken_favorite": "Stato sconosciuto, lo sto cercando…",
"error": "Errore nel caricare le notifiche: {0}",
"favorited_you": "ha gradito",
"follow_request": "vuole seguirti",
@ -335,10 +183,9 @@
"migrated_to": "è migrato verso",
"no_more_notifications": "Fine delle notifiche",
"notifications": "Notifiche",
"poll_ended": "sondaggio terminato",
"reacted_with": "ha reagito con {0}",
"read": "Letto!",
"repeated_you": "ha condiviso il tuo post"
"repeated_you": "ha condiviso il tuo messaggio"
},
"password_reset": {
"check_email": "Controlla la tua posta elettronica.",
@ -376,20 +223,15 @@
"text/bbcode": "BBCode",
"text/html": "HTML",
"text/markdown": "Markdown",
"text/plain": "Testo normale",
"text/x.misskeymarkdown": "MFM"
"text/plain": "Testo normale"
},
"content_warning": "Contenuto Sensibile (facoltativo)",
"content_warning": "Oggetto (facoltativo)",
"default": "Sono appena atterrato a Città Laggiù.",
"direct_warning_to_all": "Questo messaggio sarà visibile a tutti i menzionati.",
"direct_warning_to_first_only": "Questo messaggio sarà visibile solo agli utenti menzionati in testa.",
"edit_remote_warning": "Le modifiche fatte al messaggio potrebbero non essere visibili su alcune istanze!",
"edit_status": "Modifica Stato",
"edit_unsupported_warning": "Sondaggi e menzioni non verranno cambiati in fase di modifica.",
"empty_status_error": "Aggiungi del testo o degli allegati",
"media_description": "Descrizione allegati",
"media_description_error": "Allegati non caricati, riprova",
"media_not_sensitive_warning": "C'è un Contenuto Sensibile, ma gli allegati non sono contrassegnati come sensibili!",
"new_status": "Nuovo messaggio",
"post": "Pubblica",
"posting": "Sto pubblicando",
@ -397,26 +239,21 @@
"preview_empty": "Vuoto",
"scope": {
"direct": "Diretto - Visibile solo agli utenti menzionati",
"local": "Locale - non federare questo messaggio",
"private": "Solo per seguaci - Visibile solo dai tuoi seguaci",
"public": "Pubblico - Visibile sulla sequenza pubblica",
"unlisted": "Nascosto - Non visibile sulla sequenza pubblica"
},
"scope_notice": {
"local": "Questo messaggio non sarà visibile sulle altre istanze",
"private": "Questo messaggio sarà visibile solo ai tuoi seguaci",
"public": "Questo messaggio sarà visibile a tutti",
"unlisted": "Questo messaggio non sarà visibile sulla sequenza locale né su quella pubblica"
}
},
"registration": {
"awaiting_email_confirmation": "Il tuo account è stato registrato e un'email è stata inviata al tuo indirizzo. Controllala per completare la registrazione.",
"awaiting_email_confirmation_title": "Attendo la conferma dell'email",
"bio": "Introduzione",
"bio_placeholder": "es.\nCiao, sono Lupo Lucio.\nSono un lupo fantastico che vive nel Fantabosco. Forse mi hai visto alla Melevisione.",
"captcha": "CAPTCHA",
"email": "Email",
"email_language": "In quale lingua vuoi ricevere email dal server?",
"fullname": "Nome visualizzato",
"fullname_placeholder": "es. Lupo Lucio",
"new_captcha": "Clicca il captcha per averne uno nuovo",
@ -425,8 +262,6 @@
"reason_placeholder": "L'amministratore esamina ciascuna richiesta.\nFornisci il motivo della tua iscrizione.",
"register": "Registrati",
"registration": "Registrazione",
"request_sent": "La richiesta di registrazione è stata inoltrata ad un amministratore. Riceverai un'email non appena il tuo account verrà approvato.",
"request_sent_title": "Richiesta di registrazione inviata",
"token": "Codice d'invito",
"username_placeholder": "es. mister_wolf",
"validations": {
@ -455,17 +290,6 @@
},
"settings": {
"accent": "Accento",
"account_alias": "Alias dell'account",
"account_alias_table_head": "Alias",
"account_backup": "Backup dell'account",
"account_backup_description": "Puoi scaricare un archivio con le tue informazioni ed i tuoi messaggi, ma non possono essere importati in un account Akkoma.",
"account_backup_table_head": "Backup",
"account_privacy": "Privacy",
"add_alias_error": "Errore durante l'aggiunta dell'alias: {error}",
"add_backup": "Crea un nuovo backup",
"add_backup_error": "Errore durante l'aggiunta di un nuovo backup: {error}",
"added_alias": "Alias aggiunto.",
"added_backup": "Nuovo backup aggiunto.",
"allow_following_move": "Consenti l'iscrizione automatica ai profili traslocati",
"always_show_post_button": "Non nascondere il pulsante di composizione",
"app_name": "Nome applicazione",
@ -477,7 +301,6 @@
"avatarRadius": "Icone utente",
"avatar_size_instruction": "La taglia minima per l'icona personale è 150x150 pixel.",
"background": "Sfondo",
"backup_not_ready": "Questo backup non è ancora pronto.",
"bio": "Introduzione",
"block_export": "Esporta blocchi",
"block_export_button": "Esporta i tuoi blocchi in un file CSV",
@ -499,17 +322,10 @@
"changed_password": "Password cambiata correttamente!",
"chatMessageRadius": "Messaggi istantanei",
"checkboxRadius": "Caselle di selezione",
"collapse_subject": "Ripiega messaggi con Contenuto Sensibile",
"columns": "Colonne",
"collapse_subject": "Ripiega messaggi con oggetto",
"composing": "Composizione",
"confirm_new_password": "Conferma la nuova password",
"conversation_display": "Stile di visualizzazione delle conversazioni",
"conversation_display_linear": "Stile lineare",
"conversation_display_tree": "Stile ad albero",
"conversation_other_replies_button": "Mostra il bottone \"altre risposte\"",
"conversation_other_replies_button_below": "Sotto i post",
"current_avatar": "La tua icona attuale",
"current_mascot": "La tua mascotte attuale",
"current_password": "La tua password attuale",
"data_import_export_tab": "Importa o esporta dati",
"default_vis": "Visibilità predefinita dei messaggi",
@ -517,15 +333,11 @@
"delete_account_description": "Elimina definitivamente i tuoi dati e disattiva il tuo profilo.",
"delete_account_error": "C'è stato un problema durante l'eliminazione del tuo profilo. Se il problema persiste contatta l'amministratore della tua stanza.",
"delete_account_instructions": "Digita la tua password nel campo sottostante per eliminare il tuo profilo.",
"disable_sticky_headers": "Non fissare i titoli delle colonne in cima allo schermo",
"discoverable": "Permetti la scoperta di questo profilo a servizi di ricerca ed altro",
"domain_mutes": "Domini",
"download_backup": "Scarica",
"email_language": "Lingua delle email ricevute dal server",
"emoji_reactions_on_timeline": "Mostra reazioni nelle sequenze",
"enable_web_push_notifications": "Abilita notifiche web push",
"enter_current_password_to_confirm": "Inserisci la tua password per identificarti",
"expert_mode": "Mostra avanzate",
"export_theme": "Salva impostazioni",
"file_export_import": {
"backup_restore": "Archiviazione impostazioni",
@ -553,23 +365,18 @@
"hide_all_muted_posts": "Nascondi messaggi silenziati",
"hide_attachments_in_convo": "Nascondi gli allegati presenti nelle conversazioni",
"hide_attachments_in_tl": "Nascondi gli allegati presenti nelle sequenze",
"hide_bot_indication": "Nascondi indicatore bot nei post",
"hide_favorites_description": "Non mostrare la lista dei miei preferiti (gli utenti verranno comunque notificati)",
"hide_filtered_statuses": "Nascondi messaggi filtrati",
"hide_followers_count_description": "Non mostrare quanti seguaci ho",
"hide_followers_description": "Non mostrare i miei seguaci",
"hide_follows_count_description": "Non mostrare quanti utenti seguo",
"hide_follows_description": "Non mostrare chi seguo",
"hide_isp": "Nascondi pannello della stanza",
"hide_list_aliases_error_action": "Chiudi",
"hide_media_previews": "Nascondi anteprime",
"hide_muted_posts": "Nascondi messaggi degli utenti silenziati",
"hide_muted_threads": "Nascondi conversazioni silenziate",
"hide_post_stats": "Nascondi statistiche dei messaggi (es. il numero di preferenze)",
"hide_shoutbox": "Nascondi muro dei graffiti",
"hide_user_stats": "Nascondi statistiche dell'utente (es. il numero di seguaci)",
"hide_wallpaper": "Nascondi sfondo della stanza",
"hide_wordfiltered_statuses": "Nascondi post filtrati per parola",
"import_blocks_from_a_csv_file": "Importa blocchi da un file CSV",
"import_followers_from_a_csv_file": "Importa una lista di chi segui da un file CSV",
"import_mutes_from_a_csv_file": "Importa silenziati da un file CSV",
@ -582,14 +389,10 @@
"invalid_theme_imported": "Il file selezionato non è un tema supportato da Pleroma. Il tuo tema non è stato modificato.",
"limited_availability": "Non disponibile nel tuo browser",
"links": "Collegamenti",
"list_aliases_error": "Errore nel recupero degli alias: {error}",
"list_backups_error": "Errore nel recupero della lista dei backup: {error}",
"lock_account_description": "Vaglia manualmente i nuovi seguaci",
"loop_video": "Riproduci video in ciclo continuo",
"loop_video_silent_only": "Riproduci solo video muti in ciclo continuo (es. le \"gif\" di Mastodon)",
"mascot": "Mascotte di MastodonFE",
"max_thumbnails": "Numero massimo di anteprime per messaggio",
"mention_links": "Collegamenti delle menzioni",
"mfa": {
"authentication_methods": "Metodi di accesso",
"confirm_and_enable": "Conferma ed abilita OTP",
@ -613,12 +416,6 @@
},
"minimal_scopes_mode": "Riduci opzioni di visibilità",
"more_settings": "Altre impostazioni",
"move_account": "Sposta account",
"move_account_error": "Errore nello spostamento dell'account: {error}",
"move_account_notes": "Se vuoi spostare questo account da qualche altra parte, devi andare all'account di destinazione e aggiungere un alias che punta qui.",
"move_account_target": "Account di destinazione (es. {example})",
"moved_account": "Account spostato.",
"mute_bot_posts": "Silenzia post dei bot",
"mute_export": "Esporta silenziati",
"mute_export_button": "Esporta i silenziati in un file CSV",
"mute_import": "Carica silenziati",
@ -628,7 +425,6 @@
"mutes_tab": "Silenziati",
"name": "Nome",
"name_bio": "Nome ed introduzione",
"new_alias_target": "Aggiungi nuovo alias (es. {example})",
"new_email": "Nuova email",
"new_password": "Nuova password",
"no_blocks": "Nessun utente bloccato",
@ -646,7 +442,6 @@
"notification_visibility_likes": "Preferiti",
"notification_visibility_mentions": "Menzioni",
"notification_visibility_moves": "Migrazioni utenti",
"notification_visibility_polls": "Termine dei poll in cui hai votato",
"notification_visibility_repeats": "Condivisioni",
"notifications": "Notifiche",
"nsfw_clickthrough": "Fai click per visualizzare gli allegati offuscati",
@ -655,9 +450,7 @@
"panelRadius": "Pannelli",
"pause_on_unfocused": "Interrompi l'aggiornamento continuo mentre la scheda è in secondo piano",
"play_videos_in_modal": "Riproduci video in un riquadro a sbalzo",
"post_look_feel": "Aspetto dei post",
"post_status_content_type": "Tipo di contenuto dei messaggi",
"posts": "Post",
"preload_images": "Precarica immagini",
"presets": "Valori predefiniti",
"profile_background": "Sfondo del tuo profilo",
@ -671,8 +464,6 @@
"profile_tab": "Profilo",
"radii_help": "Imposta il raggio degli angoli (in pixel)",
"refresh_token": "Aggiorna token",
"remove_alias": "Rimuovi questo alias",
"remove_backup": "Elimina",
"replies_in_timeline": "Risposte nelle sequenze",
"reply_visibility_all": "Mostra tutte le risposte",
"reply_visibility_following": "Mostra solo le risposte rivolte a me o agli utenti che seguo",
@ -697,15 +488,12 @@
"security_tab": "Sicurezza",
"sensitive_by_default": "Tutti i miei messaggi sono scabrosi",
"set_new_avatar": "Scegli una nuova icona",
"set_new_mascot": "Imposta nuova mascotte",
"set_new_profile_background": "Scegli un nuovo sfondo",
"set_new_profile_banner": "Scegli un nuovo gonfalone",
"setting_changed": "Valore personalizzato",
"setting_server_side": "Questa impostazione è legata al tuo profilo e ha effetto su tutte le sessioni e tutti i client",
"settings": "Impostazioni",
"show_admin_badge": "Mostra l'insegna di amministratore sul mio profilo",
"show_moderator_badge": "Mostra l'insegna di moderatore sul mio profilo",
"show_scrollbars": "Mostra le barre di scorrimento delle colonne laterali",
"stop_gifs": "Riproduci GIF al passaggio del cursore",
"streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina",
"style": {
@ -814,80 +602,66 @@
},
"filter_hint": {
"always_drop_shadow": "Attenzione: quest'ombra usa sempre {0} se il tuo browser lo supporta.",
"avatar_inset": "Tieni presente che combinare ombre (sia incavate che non) sulle icone utente potrebbe dare risultati strani con avatar trasparenti.",
"drop_shadow_syntax": "{0} non supporta il parametro {1} con la keyword {2}.",
"inset_classic": "Le ombre incavate usano {0}",
"spread_zero": "Le ombre con espansione maggiore di zero appariranno come se l'espansione fosse zero"
"avatar_inset": "Tieni presente che combinare ombre (sia incluse che non) sulle icone utente potrebbe dare risultati strani con quelle trasparenti.",
"drop_shadow_syntax": "{0} non supporta il parametro {1} né la keyword {2}.",
"inset_classic": "Le ombre incluse usano {0}",
"spread_zero": "Lo spandimento maggiore di zero si azzera sulle ombre"
},
"hintV3": "Per le ombre puoi anche usare la sintassi {0} per usare l'altro slot colore.",
"inset": "Incavatura",
"override": "Sovrascrivi",
"shadow_id": "Ombra #{value}",
"spread": "Espansione"
"hintV3": "Per le ombre puoi anche usare la sintassi {0} per sfruttare il secondo colore.",
"inset": "Includi",
"override": "Sostituisci",
"shadow_id": "Ombra numero {value}",
"spread": "Spandi"
},
"switcher": {
"clear_all": "Azzera tutto",
"clear_opacity": "Azzera opacità",
"clear_opacity": "Rimuovi opacità",
"help": {
"fe_downgraded": "La versione di PleromaFE è riportata ad una versione precedente.",
"fe_upgraded": "Il motore dei temi di PleromaFE è stato aggiornato insieme all'interfaccia.",
"future_version_imported": "Il tema importato è stato creato per una versione più nuova del frontend.",
"migration_napshot_gone": "Per qualche motivo non è stata trovata l'anteprima del tema, non tutto potrebbe essere come ricordi.",
"migration_snapshot_ok": "Per sicurezza, è stata caricata l'anteprima del tema. Puoi provare a caricarne i contenuti.",
"older_version_imported": "Il file importato è stato creato per una versione precedente del frontend.",
"snapshot_missing": "Il file non è provvisto di anteprima, quindi potrebbe essere diverso da come appare.",
"fe_downgraded": "L'interfaccia è stata portata ad una versione precedente.",
"fe_upgraded": "Lo schema dei temi è stato aggiornato insieme all'interfaccia.",
"future_version_imported": "Il tema importato è stato creato per una versione più recente dell'interfaccia.",
"migration_napshot_gone": "Anteprima del tema non trovata, non tutto potrebbe essere come ricordi.",
"migration_snapshot_ok": "Ho caricato l'anteprima del tema. Puoi provare a caricarne i contenuti.",
"older_version_imported": "Il tema importato è stato creato per una versione precedente dell'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 il frontend è stato deaggiornato e poi aggiornato di nuovo. Se hai modificato il tema con una vecchia versione usa il tema precedente, altrimenti usa quello nuovo.",
"upgraded_from_v2": "PleromaFE è stato aggiornato, il tema potrebbe essere un pochino diverso da come lo ricordi.",
"v2_imported": "Il file importato è stato creato per un vecchio frontend. Cerchiamo di massimizzare la compatibilità, ma potrebbero esserci inconsistenze."
"snapshot_source_mismatch": "Conflitto di versione: probabilmente l'interfaccia è stata portata indietro e poi aggiornata di nuovo. Se hai modificato il tema con una vecchia versione usa il tema precedente, altrimenti puoi usare il nuovo.",
"upgraded_from_v2": "L'interfaccia è stata aggiornata, il tema potrebbe essere diverso da come lo ricordi.",
"v2_imported": "Il tema importato è stato creato per una vecchia interfaccia. Non tutto potrebbe essere come inteso."
},
"keep_as_is": "Mantieni com'è",
"keep_as_is": "Mantieni tal quale",
"keep_color": "Mantieni colori",
"keep_fonts": "Mantieni font",
"keep_opacity": "Mantieni opacità",
"keep_roundness": "Mantieni vertici",
"keep_shadows": "Mantieni ombre",
"load_theme": "Carica tema",
"reset": "Azzera",
"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.",
"use_snapshot": "Versione precedente",
"use_source": "Nuova versione"
}
},
"subject_input_always_show": "Mostra sempre il campo avvertenza sul contenuto",
"subject_line_behavior": "Copia avvertenza sul contenuto quando rispondi",
"subject_line_email": "Come nelle email: \"re: avvertenza\"",
"subject_line_mastodon": "Come su Mastodon: copia com'è",
"subject_input_always_show": "Mostra sempre il campo Oggetto",
"subject_line_behavior": "Copia oggetto quando rispondi",
"subject_line_email": "Come nelle email: \"re: oggetto\"",
"subject_line_mastodon": "Come in Mastodon: copia tal quale",
"subject_line_noop": "Non copiare",
"text": "Testo",
"theme": "Tema",
"theme_help": "Usa colori esadecimali (#rrvvbb) per personalizzare il tuo tema colori.",
"theme_help_v2_1": "Puoi anche sovrascrivere colore ed opacità di alcuni elementi spuntando la casella. Usa il pulsante \"Azzera\" per azzerare tutte le sovrascritture.",
"theme_help_v2_2": "Le icone vicino alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se usano la trasparenza, questi indicatori mostrano come sarebbero nel peggior caso possibile.",
"third_column_mode": "Quando c'è abbastanza spazio, mostra una terza colonna contenente",
"third_column_mode_none": "Non mostrare proprio la terza colonna",
"third_column_mode_notifications": "Colonna notifiche",
"third_column_mode_postform": "Modulo post principale e navigazione",
"theme_help": "Usa colori esadecimali (#rrggbb) per personalizzare il tuo schema di colori.",
"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.",
"theme_help_v2_2": "Le icone vicino alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se usani trasparenze, questi indicatori mostrano il peggior caso possibile.",
"token": "Token",
"tooltipRadius": "Suggerimenti/allerte",
"translation_language": "Lingua finale di traduzione automatica",
"tree_advanced": "Mostra bottoni aggiuntivi per aprire e chiudere catene di risposte nelle conversazioni",
"tree_fade_ancestors": "Mostra antenati del post corrente in testo semitrasparente",
"tooltipRadius": "Suggerimenti/avvisi",
"type_domains_to_mute": "Cerca domini da silenziare",
"upload_a_photo": "Carica una foto",
"upload_a_photo": "Carica un'immagine",
"useStreamingApi": "Ricevi messaggi e notifiche in tempo reale",
"useStreamingApiWarning": "",
"use_blurhash": "Usa blurhash per anteprime NSFW",
"useStreamingApiWarning": "(Sconsigliato, sperimentale, può saltare messaggi)",
"use_contain_fit": "Non ritagliare le anteprime degli allegati",
"use_one_click_nsfw": "Apri allegati NSFW con un solo click",
"user_accepts_direct_messages_from": "Accetta post «diretti» da",
"user_accepts_direct_messages_from_everybody": "Tutti",
"user_accepts_direct_messages_from_nobody": "Nessuno",
"user_accepts_direct_messages_from_people_i_follow": "Persone che seguo",
"use_one_click_nsfw": "Apri media offuscati con un solo click",
"user_mutes": "Utenti",
"user_profile_default_tab": "Scheda predefinita sul profilo degli utenti",
"user_profiles": "Profili utente",
"user_settings": "Impostazioni utente",
"user_settings": "Impostazioni Utente",
"valid_until": "Valido fino a",
"values": {
"false": "no",
@ -895,141 +669,86 @@
},
"version": {
"backend_version": "Versione backend",
"frontend_version": "Versione frontend",
"frontend_version": "Versione interfaccia",
"title": "Versione"
},
"virtual_scrolling": "Velocizza rendering sequenze",
"word_filter": "Filtro per parola",
"wordfilter": "Filtro per parola"
},
"settings_profile": {
"creating": "Creazione del nuovo profilo di impostazioni \"{profile}\"…",
"synchronization_error": "Non è stato possibile sincronizzare le impostazioni: {err}",
"synchronized": "Impostazioni sincronizzate!",
"synchronizing": "Sincronizzazione del profilo di impostazioni \"{profile}\"…"
"virtual_scrolling": "Velocizza l'elaborazione delle sequenze",
"word_filter": "Parole filtrate"
},
"status": {
"ancestor_follow": "Vedi {numReplies} altra risposta sotto questo post | Vedi {numReplies} altre risposte sotto questo post",
"ancestor_follow_with_icon": "{icon} {text}",
"attachment_stop_flash": "Ferma Flash player",
"bookmark": "Aggiungi segnalibro",
"collapse_attachments": "Riduci allegati",
"copy_link": "Copia collegamento al post",
"delete": "Elimina post",
"delete_confirm": "Vuoi davvero eliminare questo post?",
"delete_confirm_accept_button": "Sì, eliminalo",
"delete_confirm_cancel_button": "No, tienilo",
"delete_confirm_title": "Conferma eliminazione",
"edit": "Modifica",
"edit_history": "Cronologia modifiche",
"edit_history_modal_title": "Modificato {historyCount} volta | Modificato {historyCount} volte",
"edited_at": "Modificato {time}",
"copy_link": "Copia collegamento",
"delete": "Elimina messaggio",
"delete_confirm": "Vuoi veramente eliminare questo messaggio?",
"expand": "Espandi",
"external_source": "Fonte originale",
"external_source": "Vai all'origine",
"favorites": "Preferiti",
"hide_attachment": "Nascondi allegato",
"hide_content": "Nascondi contenuto",
"hide_full_subject": "Nascondi avvertenza sul contenuto intera",
"many_attachments": "Il post ha {number} allegato | Il post ha {number} allegati",
"hide_content": "Nascondi contenuti",
"hide_full_subject": "Nascondi oggetto intero",
"mentions": "Menzioni",
"move_down": "Muovi allegato a destra",
"move_up": "Muovi allegato a sinistra",
"mute_conversation": "Silenzia conversazione",
"nsfw": "NSFW",
"open_gallery": "Apri galleria",
"override_translation_source_language": "Sovrascrivi lingua di origine",
"pin": "Fissa in cima al profilo",
"pinned": "Fissato",
"nsfw": "DISDICEVOLE",
"pin": "Intesta al profilo",
"pinned": "Intestato",
"plus_more": "+{number} altri",
"redraft": "Elimina e correggi",
"redraft_confirm": "Vuoi davvero eliminare e correggere questo post? Le interazioni al post originale non saranno mantenute.",
"redraft_confirm_accept_button": "Sì, elimina e correggi",
"redraft_confirm_cancel_button": "No, tieni l'originale",
"redraft_confirm_title": "Conferma elimina e correggi",
"remove_attachment": "Rimuovi allegato",
"repeat_confirm": "Vuoi davvero condividere questo post?",
"repeat_confirm_accept_button": "Sì, condividilo",
"repeat_confirm_cancel_button": "No, non condividere",
"repeat_confirm_title": "Conferma condivisione",
"repeats": "Condivisioni",
"repeats": "Condivisi",
"replies_list": "Risposte:",
"replies_list_with_others": "Mostra {numReplies} altra risposta | Mostra {numReplies} altre risposte",
"reply_to": "In risposta a",
"show_all_attachments": "Mostra tutti gli allegati",
"show_all_conversation": "Mostra conversazione intera ({numStatus} altro post) | Mostra conversazione intera ({numStatus} altri post)",
"show_all_conversation_with_icon": "{icon} {text}",
"show_attachment_description": "Anteprima descrizione (apri l'allegato per la descrizione intera)",
"show_attachment_in_modal": "Mostra allegato in una finestra",
"show_content": "Mostra contenuto",
"show_full_subject": "Mostra tutta l'avvertenza sul contenuto",
"show_only_conversation_under_this": "Mostra solo le risposte a questo post",
"status_deleted": "Questo post è stato eliminato",
"status_unavailable": "Post non disponibile",
"thread_follow": "Visualizza {numStatus} altra risposta | Visualizza {numStatus} altre risposte",
"thread_follow_with_icon": "{icon} {text}",
"thread_hide": "Nascondi questa conversazione",
"thread_muted": "Conversazione silenziata",
"show_content": "Mostra contenuti",
"show_full_subject": "Mostra oggetto intero",
"status_deleted": "Questo messagio è stato cancellato",
"status_unavailable": "Messaggio non disponibile",
"thread_muted": "Discussione silenziata",
"thread_muted_and_words": ", contiene:",
"thread_show": "Mostra questa conversazione",
"thread_show_full": "Mostra {numStatus} risposta | Mostra tutte e {numStatus} le risposte",
"thread_show_full_with_icon": "{icon} {text}",
"translate": "Traduci",
"translated_from": "Tradotto da {language}",
"unbookmark": "Rimuovi segnalibro",
"unmute_conversation": "Desilenzia conversazione",
"unpin": "Rimuovi dalla cima del profilo",
"unmute_conversation": "Riabilita conversazione",
"unpin": "De-intesta",
"you": "(Tu)"
},
"time": {
"in_future": "fra {0}",
"in_past": "{0} fa",
"now": "proprio adesso",
"now_short": "ora",
"now": "adesso",
"now_short": "adesso",
"unit": {
"days": "{0} giorno | {0} giorni",
"days": "{0} giorni",
"days_short": "{0} g",
"hours": "{0} ora | {0} ore",
"hours_short": "{0} ora | {0} ore",
"minutes": "{0} minuto | {0} minuti",
"hours": "{0} ore",
"hours_short": "{0} h",
"minutes": "{0} minuti",
"minutes_short": "{0} min",
"months": "{0} mese | {0} mesi",
"months_short": "{0} mese | {0} mesi",
"seconds": "{0} secondo | {0} secondi",
"months": "{0} mesi",
"months_short": "{0} mes",
"seconds": "{0} secondi",
"seconds_short": "{0} sec",
"weeks": "{0} settimana | {0} settimane",
"weeks_short": "{0} sett",
"years": "{0} anno | {0} anni",
"weeks": "{0} settimane",
"weeks_short": "{0} stm",
"years": "{0} anni",
"years_short": "{0} a"
}
},
"timeline": {
"collapse": "Riduci",
"collapse": "Ripiega",
"conversation": "Conversazione",
"error": "Errore nel caricare la sequenza: {0}",
"follow_tag": "Segui hashtag",
"load_older": "Carica post precedenti",
"no_more_statuses": "Non ci sono altri post",
"no_retweet_hint": "Il messaggio è «solo per follower» o «diretto», quindi non può essere condiviso",
"no_statuses": "Nessun post",
"load_older": "Carica messaggi precedenti",
"no_more_statuses": "Fine dei messaggi",
"no_retweet_hint": "Il messaggio è diretto o solo per seguaci e non può essere condiviso",
"no_statuses": "Nessun messaggio",
"reload": "Ricarica",
"repeated": "ha condiviso",
"show_new": "Mostra nuovi",
"socket_broke": "Connessione tempo reale interrotta: CloseEvent codice {0}",
"socket_broke": "Connessione tempo reale interrotta: codice {0}",
"socket_reconnected": "Connesso in tempo reale",
"unfollow_tag": "Smetti di seguire hashtag",
"up_to_date": "Aggiornato"
},
"toast": {
"no_translation_target_set": "Nessuna lingua finale di traduzione impostata: la traduzione potrebbe fallire. Imposta una lingua finale di traduzione nelle tue impostazioni."
},
"tool_tip": {
"accept_follow_request": "Accetta richiesta di follow",
"add_reaction": "Aggiungi reazione",
"accept_follow_request": "Accetta seguace",
"add_reaction": "Reagisci",
"bookmark": "Aggiungi segnalibro",
"favorite": "Rendi preferito",
"media_upload": "Carica media",
"quote": "Cita",
"reject_follow_request": "Rifiuta richiesta di follow",
"favorite": "Gradisci",
"media_upload": "Carica allegati",
"reject_follow_request": "Rifiuta seguace",
"repeat": "Condividi",
"reply": "Rispondi",
"user_settings": "Impostazioni utente"
@ -1037,7 +756,7 @@
"upload": {
"error": {
"base": "Caricamento fallito.",
"default": "Riprova più tardi",
"default": "Riprova in seguito",
"file_too_big": "File troppo pesante [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"message": "Caricamento fallito: {0}"
},
@ -1051,115 +770,79 @@
},
"user_card": {
"admin_menu": {
"activate_account": "Riattiva account",
"deactivate_account": "Disattiva account",
"delete_account": "Elimina account",
"activate_account": "Attiva profilo",
"deactivate_account": "Disattiva profilo",
"delete_account": "Elimina profilo",
"delete_user": "Elimina utente",
"delete_user_data_and_deactivate_confirmation": "Questo eliminerà permanentemente i dati dall'account e lo disattiverà. Sei sicuro al 100%?",
"disable_any_subscription": "Proibisci a tutti di seguire l'utente",
"disable_remote_subscription": "Proibisci ad istanze remote di seguire l'utente",
"force_nsfw": "Marca tutti i post come NSFW",
"force_unlisted": "Rendi tutti i post «non in elenco»",
"grant_admin": "Rendi amministratore",
"grant_moderator": "Rendi moderatore",
"disable_any_subscription": "Rendi utente non seguibile",
"disable_remote_subscription": "Blocca i tentativi di seguirlo da altre stanze",
"force_nsfw": "Oscura tutti i messaggi",
"force_unlisted": "Nascondi tutti i messaggi",
"grant_admin": "Crea Amministratore",
"grant_moderator": "Crea Moderatore",
"moderation": "Moderazione",
"quarantine": "Impedisci la federazione dei post degli utenti",
"revoke_admin": "Rimuovi da amministratore",
"revoke_moderator": "Rimuovi da moderatore",
"sandbox": "Rendi tutti i messaggi \"solo per follower\"",
"strip_media": "Rimuovi media dai messaggi"
"quarantine": "I messaggi non arriveranno alle altre stanze",
"revoke_admin": "Divesti Amministratore",
"revoke_moderator": "Divesti Moderatore",
"sandbox": "Rendi tutti i messaggi solo per seguaci",
"strip_media": "Rimuovi ogni allegato ai messaggi"
},
"approve": "Accetta",
"approve_confirm": "Sei sicuro di voler permettere a questo utente di seguirti?",
"approve_confirm_accept_button": "Sì, accetta",
"approve_confirm_cancel_button": "No, annulla",
"approve_confirm_title": "Accetta richiesta di follow",
"approve": "Approva",
"block": "Blocca",
"block_confirm": "Sei sicuro di voler bloccare {user}?",
"block_confirm_accept_button": "Sì, blocca",
"block_confirm_cancel_button": "No, non bloccare",
"block_confirm_title": "Blocca utente",
"block_progress": "Blocco…",
"blocked": "Bloccato!",
"blocks_you": "Ti blocca!",
"bot": "Bot",
"deactivated": "Disattivato",
"deny": "Rifiuta",
"deny_confirm": "Sei sicuro di voler rifiutare la richiesta di follow di questo utente?",
"deny_confirm_accept_button": "Sì, rifiuta",
"deny_confirm_cancel_button": "No, annulla",
"deny_confirm_title": "Rifiuta richiesta di follow",
"domain_muted": "Sblocca dominio",
"deny": "Nega",
"edit_profile": "Modifica profilo",
"favorites": "Preferiti",
"follow": "Segui",
"follow_cancel": "Annulla richiesta",
"follow_progress": "Richiedo…",
"follow_sent": "Richiesta inviata!",
"follow_tag": "Segui l'hashtag",
"follow_unfollow": "Smetti di seguire",
"followed_tags": "Hashtag seguiti",
"followed_users": "Utenti seguiti",
"followees": "Seguiti",
"followers": "Follower",
"following": "Seguito!",
"follow_unfollow": "Disconosci",
"followees": "Segue",
"followers": "Seguaci",
"following": "Seguìto!",
"follows_you": "Ti segue!",
"hidden": "Nascosto",
"hide_repeats": "Nascondi condivisioni",
"highlight": {
"disabled": "Nessuno sfondo",
"side": "Striscia laterale",
"solid": "Sfondo monocolore",
"striped": "Sfondo a righe"
"disabled": "Nessun risalto",
"side": "Nastro a lato",
"solid": "Un colore",
"striped": "A righe"
},
"its_you": "Sei tu!",
"media": "Media",
"mention": "Menziona",
"message": "Contatta",
"mute": "Silenzia",
"mute_confirm": "Sei sicuro di voler silenziare {user}?",
"mute_confirm_accept_button": "Sì, silenzia",
"mute_confirm_cancel_button": "No, non silenziare",
"mute_confirm_title": "Silenzia utente",
"mute_domain": "Blocca dominio",
"mute_progress": "Silenziando…",
"mute_progress": "Silenzio…",
"muted": "Silenziato",
"not_following_any_hashtags": "Non stai seguendo nessun hashtag",
"note": "Nota privata",
"per_day": "al giorno",
"remote_follow": "Segui da remoto",
"remove_follower": "Rimuovi follower",
"replies": "Con risposte",
"report": "Segnala",
"requested_by": "Ha chiesto di seguirti",
"show_repeats": "Mostra condivisioni",
"statuses": "Post",
"subscribe": "Iscriviti",
"statuses": "Messaggi",
"subscribe": "Abbònati",
"unblock": "Sblocca",
"unblock_progress": "Sblocco…",
"unfollow_confirm": "Sei sicuro di voler smettere di seguire {user}?",
"unfollow_confirm_accept_button": "Sì, smetti di seguire",
"unfollow_confirm_cancel_button": "No, non smettere di seguire",
"unfollow_confirm_title": "Smetti di seguire l'utente",
"unfollow_tag": "Smetti di seguire l'hashtag",
"unmute": "Desilenzia",
"unmute_progress": "Desilenziamento…",
"unsubscribe": "Disiscriviti"
"unmute": "Riabilita",
"unmute_progress": "Riabilito…",
"unsubscribe": "Disdici"
},
"user_profile": {
"field_validated": "Collegamento verificato",
"profile_does_not_exist": "Spiacente, questo profilo non esiste.",
"profile_loading_error": "Spiacente, c'è stato un errore nel caricamento del profilo.",
"timeline_title": "Sequenza dell'utente"
},
"user_reporting": {
"add_comment_description": "La segnalazione sarà inviata ai moderatori della tua istanza. Puoi fornire una motivazione per cui stai segnalando questo account qui sotto:",
"additional_comments": "Commenti aggiuntivi",
"forward_description": "Il profilo appartiene ad un altro server. Inviare la segnalazione anche a quello?",
"add_comment_description": "La segnalazione sarà inviata ai moderatori della tua stanza. Puoi motivarla qui sotto:",
"additional_comments": "Osservazioni accessorie",
"forward_description": "Il profilo appartiene ad un'altra stanza. Inviare la segnalazione anche a quella?",
"forward_to": "Inoltra a {0}",
"generic_error": "C'è stato un errore nell'elaborazione della tua richiesta.",
"submit": "Invia",
"title": "Segnala {0}"
"title": "Segnalo {0}"
},
"who_to_follow": {
"more": "Altro",

View file

@ -1,11 +0,0 @@
{
"about": {
"mrf": {
"keyword": {
"is_replaced_by": "→",
"replace": "置き換える"
},
"mrf_policies": "有効なMRFポリシー"
}
}
}

View file

@ -523,7 +523,7 @@
"delete_account_description": "あなたのアカウントとメッセージが、きえます。",
"delete_account_error": "アカウントをけすことが、できなかったかもしれません。インスタンスのアドミニストレーターに、おといあわせください。",
"delete_account_instructions": "ほんとうにアカウントをけしてもいいなら、パスワードをかいてください。",
"disable_sticky_headers": "カラムヘッダーをがめんのいちばんうえにくっつけない",
"disable_sticky_headers": "カラムヘッダーをがめんのいちばんうえにくっつけない",
"discoverable": "けんさくなどのサービスで、このアカウントをみつけてもよい",
"domain_mutes": "ドメイン",
"download_backup": "ダウンロード",

View file

@ -921,6 +921,7 @@
"upload_a_photo": "画像をアップロード",
"useStreamingApi": "投稿と通知を、すぐに受け取る",
"useStreamingApiWarning": "(実験中で、投稿を取りこぼすかもしれないので、おすすめしません)",
"use_at_icon": "{'@'}マークをアイコンにする",
"use_contain_fit": "画像のサムネイルを、切り抜かない",
"use_one_click_nsfw": "NSFWなファイルを1クリックで開く",
"user_mutes": "ユーザー",

Some files were not shown because too many files have changed in this diff Show more