forked from AkkomaGang/akkoma-fe
grab that sweet 2022.12 release (ty for yalls work) #4
78 changed files with 3100 additions and 5732 deletions
10
.eslintrc.js
10
.eslintrc.js
|
@ -1,17 +1,17 @@
|
||||||
module.exports = {
|
module.exports = {
|
||||||
root: true,
|
root: true,
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
parser: 'babel-eslint',
|
parser: '@babel/eslint-parser',
|
||||||
sourceType: 'module'
|
sourceType: 'module'
|
||||||
},
|
},
|
||||||
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
|
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
|
||||||
extends: [
|
extends: [
|
||||||
'standard',
|
|
||||||
'plugin:vue/recommended'
|
'plugin:vue/recommended'
|
||||||
],
|
],
|
||||||
// required to lint *.vue files
|
// required to lint *.vue files
|
||||||
plugins: [
|
plugins: [
|
||||||
'vue'
|
'vue',
|
||||||
|
'import'
|
||||||
],
|
],
|
||||||
// add your custom rules here
|
// add your custom rules here
|
||||||
rules: {
|
rules: {
|
||||||
|
@ -23,6 +23,8 @@ module.exports = {
|
||||||
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
|
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
|
||||||
'vue/require-prop-types': 0,
|
'vue/require-prop-types': 0,
|
||||||
'vue/no-unused-vars': 0,
|
'vue/no-unused-vars': 0,
|
||||||
'no-tabs': 0
|
'no-tabs': 0,
|
||||||
|
'vue/multi-word-component-names': 0,
|
||||||
|
'vue/no-reserved-component-names': 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
49
.gitea/issue_template/bug.yml
Normal file
49
.gitea/issue_template/bug.yml
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
name: "Bug report"
|
||||||
|
about: "Something isn't working as expected"
|
||||||
|
title: "[bug] "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: "Thanks for taking the time to file this bug report! Please try to be as specific and detailed as you can, so we can track down the issue and fix it as soon as possible."
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: "Version"
|
||||||
|
description: "Which version of pleroma-fe are you running? If running develop, specify the commit hash."
|
||||||
|
placeholder: "e.g. 2022.11, 40e86998e6"
|
||||||
|
- type: textarea
|
||||||
|
id: attempt
|
||||||
|
attributes:
|
||||||
|
label: "What were you trying to do?"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: expectation
|
||||||
|
attributes:
|
||||||
|
label: "What did you expect to happen?"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reality
|
||||||
|
attributes:
|
||||||
|
label: "What actually happened?"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: severity
|
||||||
|
attributes:
|
||||||
|
label: "Severity"
|
||||||
|
description: "Does this issue prevent you from using the software as normal?"
|
||||||
|
options:
|
||||||
|
- "I cannot use the software"
|
||||||
|
- "I cannot use it as easily as I'd like"
|
||||||
|
- "I can manage"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: searched
|
||||||
|
attributes:
|
||||||
|
label: "Have you searched for this issue?"
|
||||||
|
description: "Please double-check that your issue is not already being tracked on [the forums](https://meta.akkoma.dev) or [the issue tracker](https://akkoma.dev/AkkomaGang/pleroma-fe/issues)."
|
||||||
|
options:
|
||||||
|
- label: "I have double-checked and have not found this issue mentioned anywhere."
|
29
.gitea/issue_template/feat.yml
Normal file
29
.gitea/issue_template/feat.yml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
name: "Feature request"
|
||||||
|
about: "I'd like something to be added to pleroma-fe"
|
||||||
|
title: "[feat] "
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: "Thanks for taking the time to request a new feature! Please be as concise and clear as you can in your proposal, so we could understand what you're going for."
|
||||||
|
- type: textarea
|
||||||
|
id: idea
|
||||||
|
attributes:
|
||||||
|
label: "The idea"
|
||||||
|
description: "What do you think you should be able to do in pleroma-fe?"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reason
|
||||||
|
attributes:
|
||||||
|
label: "The reasoning"
|
||||||
|
description: "Why would this be a worthwhile feature? Does it solve any problems? Have people talked about wanting it?"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: searched
|
||||||
|
attributes:
|
||||||
|
label: "Have you searched for this feature request?"
|
||||||
|
description: "Please double-check that your issue is not already being tracked on [the forums](https://meta.akkoma.dev), [the issue tracker](https://akkoma.dev/AkkomaGang/pleroma-fe/issues), or the one for [the backend](https://akkoma.dev/AkkomaGang/akkoma/issues)."
|
||||||
|
options:
|
||||||
|
- label: "I have double-checked and have not found this feature request mentioned anywhere."
|
||||||
|
- label: "This feature is related to the pleroma-fe Akkoma frontend specifically, and not the backend."
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -9,3 +9,4 @@ selenium-debug.log
|
||||||
config/local.json
|
config/local.json
|
||||||
config/local.*.json
|
config/local.*.json
|
||||||
docs/site/
|
docs/site/
|
||||||
|
.vscode/
|
|
@ -1,19 +1,13 @@
|
||||||
{
|
{
|
||||||
"extends": [
|
"extends": [
|
||||||
"stylelint-rscss/config",
|
"stylelint-config-recommended-vue/scss",
|
||||||
"stylelint-config-recommended",
|
"stylelint-config-recommended",
|
||||||
"stylelint-config-standard"
|
"stylelint-config-standard"
|
||||||
],
|
],
|
||||||
|
"customSyntax": "postcss-scss",
|
||||||
"rules": {
|
"rules": {
|
||||||
"declaration-no-important": true,
|
"declaration-no-important": true,
|
||||||
"rscss/no-descendant-combinator": false,
|
"selector-class-pattern": null,
|
||||||
"rscss/class-format": [
|
"custom-property-pattern": null
|
||||||
true,
|
|
||||||
{
|
|
||||||
"component": "pascal-case",
|
|
||||||
"variant": "^-[a-z]\\w+",
|
|
||||||
"element": "^[a-z]\\w+"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,17 +3,17 @@ pipeline:
|
||||||
when:
|
when:
|
||||||
event:
|
event:
|
||||||
- pull_request
|
- pull_request
|
||||||
image: node:16
|
image: node:18
|
||||||
commands:
|
commands:
|
||||||
- yarn
|
- yarn
|
||||||
- yarn lint
|
- yarn lint
|
||||||
- yarn stylelint
|
#- yarn stylelint
|
||||||
|
|
||||||
test:
|
test:
|
||||||
when:
|
when:
|
||||||
event:
|
event:
|
||||||
- pull_request
|
- pull_request
|
||||||
image: node:16
|
image: node:18
|
||||||
commands:
|
commands:
|
||||||
- apt update
|
- apt update
|
||||||
- apt install firefox-esr -y --no-install-recommends
|
- apt install firefox-esr -y --no-install-recommends
|
||||||
|
@ -27,7 +27,7 @@ pipeline:
|
||||||
branch:
|
branch:
|
||||||
- develop
|
- develop
|
||||||
- stable
|
- stable
|
||||||
image: node:16
|
image: node:18
|
||||||
commands:
|
commands:
|
||||||
- yarn
|
- yarn
|
||||||
- yarn build
|
- yarn build
|
||||||
|
@ -39,7 +39,7 @@ pipeline:
|
||||||
branch:
|
branch:
|
||||||
- develop
|
- develop
|
||||||
- stable
|
- stable
|
||||||
image: node:16
|
image: node:18
|
||||||
secrets:
|
secrets:
|
||||||
- SCW_ACCESS_KEY
|
- SCW_ACCESS_KEY
|
||||||
- SCW_SECRET_KEY
|
- SCW_SECRET_KEY
|
||||||
|
|
24
CODE_OF_CONDUCT.md
Normal file
24
CODE_OF_CONDUCT.md
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# Akkoma Code of Conduct
|
||||||
|
|
||||||
|
The Akkoma project aims to be **enjoyable** for anyone to participate in, regardless of their identity or level of expertise. To achieve this, the community must create an environment which is **safe** and **equitable**; the following guidelines have been created with these goals in mind.
|
||||||
|
|
||||||
|
1. **Treat individuals with respect.** Differing experiences and viewpoints deserve to be respected, and bigotry and harassment are not tolerated under any circumstances.
|
||||||
|
- Individuals should at all times be treated as equals, regardless of their age, gender, sexuality, race, ethnicity, _or any other characteristic_, intrinsic or otherwise.
|
||||||
|
- Behaviour that is harmful in nature should be addressed and corrected *regardless of intent*.
|
||||||
|
- Respect personal boundaries and ask for clarification whenever they are unclear.
|
||||||
|
- (Obviously, hate does not count as merely a "differing viewpoint", because it is harmful in nature.)
|
||||||
|
|
||||||
|
2. **Be understanding of differences in communication.** Not everyone is aware of unspoken social cues, and speech that is not intended to be offensive should not be treated as such simply due to an atypical manner of communication.
|
||||||
|
- Somebody who speaks bluntly is not necessarily rude, and somebody who swears a lot is not necessarily volatile.
|
||||||
|
- Try to confirm your interpretation of their intent rather than assuming bad faith.
|
||||||
|
- Someone may not communicate as, or come across as a picture of "professionalism", but this should not be seen as a reason to dismiss them. This is a **casual** space, and communication styles can reflect that.
|
||||||
|
|
||||||
|
3. **"Uncomfortable" does not mean "unsafe".** In an ideal world, the community would be safe, equitable, enjoyable, *and* comfortable for all members at all times. Unfortunately, this is not always possible in reality.
|
||||||
|
- Safety and equity will be prioritized over comfort whenever it is necessary to do so.
|
||||||
|
- Weaponizing one's own discomfort to deflect accountability or censor an individual (e.g. "white fragility") is a form of discriminatory conduct.
|
||||||
|
|
||||||
|
4. **Let people grow from their mistakes.** Nobody is perfect; even the most well-meaning individual can do something hurtful. Everyone should be given a fair opportunity to explain themselves and correct their behaviour. Portraying someone as inherently malicious prevents improvement and shifts focus away from the *action* that was problematic.
|
||||||
|
- Avoid bringing up past events that do not accurately reflect an individual's current actions or beliefs. (This is, of course, different from providing evidence of a recurring pattern of behaviour.)
|
||||||
|
|
||||||
|
---
|
||||||
|
This document was adapted from one created by ~keith as part of punks default repository template, and is licensed under CC-BY-SA 4.0. The original template is here: <https://bytes.keithhacks.cyou/keith/default-template>
|
|
@ -1,49 +0,0 @@
|
||||||
```
|
|
||||||
o$$$$$$oo
|
|
||||||
o$" "$oo
|
|
||||||
$ o""""$o "$o
|
|
||||||
"$ o "o "o $
|
|
||||||
"$ $o $ $ o$
|
|
||||||
"$ o$"$ o$
|
|
||||||
"$ooooo$$ $ o$
|
|
||||||
o$ """ $ " $$$ " $
|
|
||||||
o$ $o $$" " "
|
|
||||||
$$ $ " $ $$$o"$ o o$"
|
|
||||||
$" o "" $ $" " o" $$
|
|
||||||
$o " " $ o$" o" o$"
|
|
||||||
"$o $$ $ o" o$$"
|
|
||||||
""o$o"$" $oo" o$"
|
|
||||||
o$$ $ $$$ o$$
|
|
||||||
o" o oo"" "" "$o
|
|
||||||
o$o" "" $
|
|
||||||
$" " o" " " " "o
|
|
||||||
$$ " " o$ o$o " $
|
|
||||||
o$ $ $ o$$ " " ""
|
|
||||||
o $ $" " "o o$
|
|
||||||
$ o $o$oo$""
|
|
||||||
$o $ o o o"$$
|
|
||||||
$o o $ $ "$o
|
|
||||||
$o $ o $ $ "o
|
|
||||||
$ $ "o $ "o"$o
|
|
||||||
$ " o $ o $$
|
|
||||||
$o$o$o$o$$o$$$o$$o$o$$o$$o$$$o$o$o$o$o$o$o$o$o$ooo
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$o
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ " $$$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ "$$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ o$$$$"
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ooooo$$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"""""
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
|
|
||||||
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
|
|
||||||
"$o$o$o$o$o$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
|
|
||||||
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
|
|
||||||
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"""
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
```
|
|
|
@ -29,18 +29,6 @@ var devMiddleware = require('webpack-dev-middleware')(compiler, {
|
||||||
})
|
})
|
||||||
|
|
||||||
var hotMiddleware = require('webpack-hot-middleware')(compiler)
|
var hotMiddleware = require('webpack-hot-middleware')(compiler)
|
||||||
// force page reload when html-webpack-plugin template changes
|
|
||||||
compiler.plugin('compilation', function (compilation) {
|
|
||||||
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
|
|
||||||
// FIXME: This supposed to reload whole page when index.html is changed,
|
|
||||||
// however now it reloads entire page on every breath, i suppose the order
|
|
||||||
// of plugins changed or something. It's a minor thing and douesn't hurt
|
|
||||||
// disabling it, constant reloads hurt much more
|
|
||||||
|
|
||||||
// hotMiddleware.publish({ action: 'reload' })
|
|
||||||
// cb()
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
// proxy api requests
|
// proxy api requests
|
||||||
Object.keys(proxyTable).forEach(function (context) {
|
Object.keys(proxyTable).forEach(function (context) {
|
||||||
|
|
|
@ -2,8 +2,6 @@ var path = require('path')
|
||||||
var config = require('../config')
|
var config = require('../config')
|
||||||
var utils = require('./utils')
|
var utils = require('./utils')
|
||||||
var projectRoot = path.resolve(__dirname, '../')
|
var projectRoot = path.resolve(__dirname, '../')
|
||||||
var ServiceWorkerWebpackPlugin = require('serviceworker-webpack-plugin')
|
|
||||||
var CopyPlugin = require('copy-webpack-plugin');
|
|
||||||
var { VueLoaderPlugin } = require('vue-loader')
|
var { VueLoaderPlugin } = require('vue-loader')
|
||||||
|
|
||||||
var env = process.env.NODE_ENV
|
var env = process.env.NODE_ENV
|
||||||
|
@ -20,6 +18,7 @@ module.exports = {
|
||||||
app: './src/main.js'
|
app: './src/main.js'
|
||||||
},
|
},
|
||||||
output: {
|
output: {
|
||||||
|
hashFunction: "sha256", // Workaround for builds with OpenSSL 3.
|
||||||
path: config.build.assetsRoot,
|
path: config.build.assetsRoot,
|
||||||
publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath,
|
publicPath: process.env.NODE_ENV === 'production' ? config.build.assetsPublicPath : config.dev.assetsPublicPath,
|
||||||
filename: '[name].js'
|
filename: '[name].js'
|
||||||
|
@ -34,6 +33,9 @@ module.exports = {
|
||||||
modules: [
|
modules: [
|
||||||
path.join(__dirname, '../node_modules')
|
path.join(__dirname, '../node_modules')
|
||||||
],
|
],
|
||||||
|
fallback: {
|
||||||
|
"url": require.resolve("url/"),
|
||||||
|
},
|
||||||
alias: {
|
alias: {
|
||||||
'static': path.resolve(__dirname, '../static'),
|
'static': path.resolve(__dirname, '../static'),
|
||||||
'src': path.resolve(__dirname, '../src'),
|
'src': path.resolve(__dirname, '../src'),
|
||||||
|
@ -116,23 +118,6 @@ module.exports = {
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
new ServiceWorkerWebpackPlugin({
|
new VueLoaderPlugin()
|
||||||
entry: path.join(__dirname, '..', 'src/sw.js'),
|
|
||||||
filename: 'sw-pleroma.js'
|
|
||||||
}),
|
|
||||||
new VueLoaderPlugin(),
|
|
||||||
// This copies Ruffle's WASM to a directory so that JS side can access it
|
|
||||||
new CopyPlugin({
|
|
||||||
patterns: [
|
|
||||||
{
|
|
||||||
from: "node_modules/ruffle-mirror/*",
|
|
||||||
to: "static/ruffle",
|
|
||||||
flatten: true
|
|
||||||
},
|
|
||||||
],
|
|
||||||
options: {
|
|
||||||
concurrency: 100,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
var config = require('../config')
|
var config = require('../config')
|
||||||
var webpack = require('webpack')
|
var webpack = require('webpack')
|
||||||
var merge = require('webpack-merge')
|
var { merge } = require('webpack-merge')
|
||||||
var utils = require('./utils')
|
var utils = require('./utils')
|
||||||
var baseWebpackConfig = require('./webpack.base.conf')
|
var baseWebpackConfig = require('./webpack.base.conf')
|
||||||
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
|
@ -16,7 +16,7 @@ module.exports = merge(baseWebpackConfig, {
|
||||||
},
|
},
|
||||||
mode: 'development',
|
mode: 'development',
|
||||||
// eval-source-map is faster for development
|
// eval-source-map is faster for development
|
||||||
devtool: '#eval-source-map',
|
devtool: 'eval-source-map',
|
||||||
plugins: [
|
plugins: [
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
'process.env': config.dev.env,
|
'process.env': config.dev.env,
|
||||||
|
|
|
@ -2,7 +2,8 @@ var path = require('path')
|
||||||
var config = require('../config')
|
var config = require('../config')
|
||||||
var utils = require('./utils')
|
var utils = require('./utils')
|
||||||
var webpack = require('webpack')
|
var webpack = require('webpack')
|
||||||
var merge = require('webpack-merge')
|
const WorkboxPlugin = require('workbox-webpack-plugin');
|
||||||
|
var { merge } = require('webpack-merge')
|
||||||
var baseWebpackConfig = require('./webpack.base.conf')
|
var baseWebpackConfig = require('./webpack.base.conf')
|
||||||
var MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
var MiniCssExtractPlugin = require('mini-css-extract-plugin')
|
||||||
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
|
@ -19,7 +20,7 @@ var webpackConfig = merge(baseWebpackConfig, {
|
||||||
module: {
|
module: {
|
||||||
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, extract: true })
|
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, extract: true })
|
||||||
},
|
},
|
||||||
devtool: config.build.productionSourceMap ? '#source-map' : false,
|
devtool: 'source-map',
|
||||||
optimization: {
|
optimization: {
|
||||||
minimize: true,
|
minimize: true,
|
||||||
splitChunks: {
|
splitChunks: {
|
||||||
|
@ -32,6 +33,11 @@ var webpackConfig = merge(baseWebpackConfig, {
|
||||||
chunkFilename: utils.assetsPath('js/[name].[chunkhash].js')
|
chunkFilename: utils.assetsPath('js/[name].[chunkhash].js')
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
|
new WorkboxPlugin.InjectManifest({
|
||||||
|
swSrc: path.join(__dirname, '..', 'src/sw.js'),
|
||||||
|
swDest: 'sw-pleroma.js',
|
||||||
|
maximumFileSizeToCacheInBytes: 15 * 1024 * 1024,
|
||||||
|
}),
|
||||||
// http://vuejs.github.io/vue-loader/workflow/production.html
|
// http://vuejs.github.io/vue-loader/workflow/production.html
|
||||||
new webpack.DefinePlugin({
|
new webpack.DefinePlugin({
|
||||||
'process.env': env,
|
'process.env': env,
|
||||||
|
@ -62,7 +68,7 @@ var webpackConfig = merge(baseWebpackConfig, {
|
||||||
// https://github.com/kangax/html-minifier#options-quick-reference
|
// https://github.com/kangax/html-minifier#options-quick-reference
|
||||||
},
|
},
|
||||||
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
|
||||||
chunksSortMode: 'dependency'
|
chunksSortMode: 'auto'
|
||||||
}),
|
}),
|
||||||
// split vendor js into its own file
|
// split vendor js into its own file
|
||||||
// extract webpack runtime and module manifest to its own file in order to
|
// extract webpack runtime and module manifest to its own file in order to
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
var merge = require('webpack-merge')
|
var { merge } = require('webpack-merge')
|
||||||
var prodEnv = require('./prod.env')
|
var prodEnv = require('./prod.env')
|
||||||
|
|
||||||
module.exports = merge(prodEnv, {
|
module.exports = merge(prodEnv, {
|
||||||
|
|
|
@ -38,6 +38,11 @@ module.exports = {
|
||||||
assetsSubDirectory: 'static',
|
assetsSubDirectory: 'static',
|
||||||
assetsPublicPath: '/',
|
assetsPublicPath: '/',
|
||||||
proxyTable: {
|
proxyTable: {
|
||||||
|
'/manifest.json': {
|
||||||
|
target,
|
||||||
|
changeOrigin: true,
|
||||||
|
cookieDomainRewrite: 'localhost'
|
||||||
|
},
|
||||||
'/api': {
|
'/api': {
|
||||||
target,
|
target,
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
var merge = require('webpack-merge')
|
var { merge } = require('webpack-merge')
|
||||||
var devEnv = require('./dev.env')
|
var devEnv = require('./dev.env')
|
||||||
|
|
||||||
module.exports = merge(devEnv, {
|
module.exports = merge(devEnv, {
|
||||||
|
|
|
@ -70,9 +70,6 @@ Default post formatting option (markdown/bbcode/plaintext/etc...)
|
||||||
### `redirectRootNoLogin`, `redirectRootLogin`
|
### `redirectRootNoLogin`, `redirectRootLogin`
|
||||||
These two settings should point to where FE should redirect visitor when they login/open up website root
|
These two settings should point to where FE should redirect visitor when they login/open up website root
|
||||||
|
|
||||||
### `scopeCopy`
|
|
||||||
Copy post scope (visibility) when replying to a post. Instance-default.
|
|
||||||
|
|
||||||
### `sidebarRight`
|
### `sidebarRight`
|
||||||
Change alignment of sidebar and panels to the right. Defaults to `false`.
|
Change alignment of sidebar and panels to the right. Defaults to `false`.
|
||||||
|
|
||||||
|
|
|
@ -3,17 +3,19 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
|
||||||
<title>Pleroma</title>
|
<title>Akkoma</title>
|
||||||
<link rel="stylesheet" href="/static/font/css/fontello.css">
|
<link rel="stylesheet" href="/static/font/css/fontello.css">
|
||||||
<link rel="stylesheet" href="/static/font/css/animation.css">
|
<link rel="stylesheet" href="/static/font/css/animation.css">
|
||||||
<link rel="stylesheet" href="/static/font/tiresias.css">
|
<link rel="stylesheet" href="/static/font/tiresias.css">
|
||||||
<link rel="stylesheet" href="/static/font/css/lato.css">
|
<link rel="stylesheet" href="/static/font/css/lato.css">
|
||||||
<link rel="stylesheet" href="/static/mfm.css">
|
<link rel="stylesheet" href="/static/mfm.css">
|
||||||
|
<link rel="stylesheet" href="/static/custom.css">
|
||||||
<!--server-generated-meta-->
|
<!--server-generated-meta-->
|
||||||
<link rel="icon" type="image/png" href="/favicon.png">
|
<link rel="icon" type="image/png" href="/favicon.png">
|
||||||
|
<link rel="manifest" href="/manifest.json">
|
||||||
</head>
|
</head>
|
||||||
<body class="hidden">
|
<body class="hidden">
|
||||||
<noscript>To use Pleroma, please enable JavaScript.</noscript>
|
<noscript>To use Akkoma, please enable JavaScript.</noscript>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<div id="modal"></div>
|
<div id="modal"></div>
|
||||||
<!-- built files will be auto injected -->
|
<!-- built files will be auto injected -->
|
||||||
|
|
87
package.json
87
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "pleroma_fe",
|
"name": "pleroma_fe",
|
||||||
"version": "3.2.0",
|
"version": "3.5.0",
|
||||||
"description": "A frontend for Akkoma instances",
|
"description": "A frontend for Akkoma instances",
|
||||||
"author": "Roger Braun <roger@rogerbraun.net>",
|
"author": "Roger Braun <roger@rogerbraun.net>",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
@ -11,7 +11,7 @@
|
||||||
"unit:watch": "karma start test/unit/karma.conf.js --single-run=false",
|
"unit:watch": "karma start test/unit/karma.conf.js --single-run=false",
|
||||||
"e2e": "node test/e2e/runner.js",
|
"e2e": "node test/e2e/runner.js",
|
||||||
"test": "npm run unit && npm run e2e",
|
"test": "npm run unit && npm run e2e",
|
||||||
"stylelint": "npx stylelint src/components/status/status.scss",
|
"stylelint": "stylelint src/**/*.scss",
|
||||||
"lint": "eslint --ext .js,.vue 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"
|
"lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs"
|
||||||
},
|
},
|
||||||
|
@ -23,8 +23,8 @@
|
||||||
"@fortawesome/free-solid-svg-icons": "^6.2.0",
|
"@fortawesome/free-solid-svg-icons": "^6.2.0",
|
||||||
"@fortawesome/vue-fontawesome": "3.0.1",
|
"@fortawesome/vue-fontawesome": "3.0.1",
|
||||||
"@kazvmoe-infra/pinch-zoom-element": "1.2.0",
|
"@kazvmoe-infra/pinch-zoom-element": "1.2.0",
|
||||||
"@vuelidate/core": "2.0.0-alpha.42",
|
"@vuelidate/core": "^2.0.0",
|
||||||
"@vuelidate/validators": "2.0.0-alpha.30",
|
"@vuelidate/validators": "^2.0.0",
|
||||||
"body-scroll-lock": "2.7.1",
|
"body-scroll-lock": "2.7.1",
|
||||||
"chromatism": "3.0.0",
|
"chromatism": "3.0.0",
|
||||||
"click-outside-vue3": "4.0.1",
|
"click-outside-vue3": "4.0.1",
|
||||||
|
@ -33,13 +33,11 @@
|
||||||
"escape-html": "1.0.3",
|
"escape-html": "1.0.3",
|
||||||
"js-cookie": "^3.0.1",
|
"js-cookie": "^3.0.1",
|
||||||
"localforage": "1.10.0",
|
"localforage": "1.10.0",
|
||||||
"marked": "^4.0.17",
|
"parse-link-header": "^2.0.0",
|
||||||
"marked-mfm": "^0.5.0",
|
|
||||||
"parse-link-header": "1.0.1",
|
|
||||||
"phoenix": "1.6.2",
|
"phoenix": "1.6.2",
|
||||||
"punycode.js": "2.1.0",
|
"punycode.js": "2.1.0",
|
||||||
"qrcode": "1",
|
"qrcode": "1",
|
||||||
"ruffle-mirror": "2021.12.31",
|
"url": "^0.11.0",
|
||||||
"vue": "^3.2.31",
|
"vue": "^3.2.31",
|
||||||
"vue-i18n": "^9.2.2",
|
"vue-i18n": "^9.2.2",
|
||||||
"vue-router": "4.0.14",
|
"vue-router": "4.0.14",
|
||||||
|
@ -48,6 +46,7 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "7.17.8",
|
"@babel/core": "7.17.8",
|
||||||
|
"@babel/eslint-parser": "^7.19.1",
|
||||||
"@babel/plugin-transform-runtime": "7.17.0",
|
"@babel/plugin-transform-runtime": "7.17.0",
|
||||||
"@babel/preset-env": "7.16.11",
|
"@babel/preset-env": "7.16.11",
|
||||||
"@babel/register": "7.17.7",
|
"@babel/register": "7.17.7",
|
||||||
|
@ -58,31 +57,29 @@
|
||||||
"@vue/compiler-sfc": "^3.1.0",
|
"@vue/compiler-sfc": "^3.1.0",
|
||||||
"@vue/test-utils": "^2.0.2",
|
"@vue/test-utils": "^2.0.2",
|
||||||
"autoprefixer": "6.7.7",
|
"autoprefixer": "6.7.7",
|
||||||
"babel-eslint": "7.2.3",
|
"babel-loader": "^9.1.0",
|
||||||
"babel-loader": "8.2.4",
|
|
||||||
"babel-plugin-lodash": "3.3.4",
|
"babel-plugin-lodash": "3.3.4",
|
||||||
"chai": "3.5.0",
|
"chai": "^4.3.7",
|
||||||
"chalk": "1.1.3",
|
"chalk": "1.1.3",
|
||||||
"chromedriver": "87.0.7",
|
"chromedriver": "^107.0.3",
|
||||||
"connect-history-api-fallback": "1.6.0",
|
"connect-history-api-fallback": "^2.0.0",
|
||||||
"copy-webpack-plugin": "6.4.1",
|
"cross-spawn": "^7.0.3",
|
||||||
"cross-spawn": "4.0.2",
|
"css-loader": "^6.7.2",
|
||||||
"css-loader": "0.28.11",
|
"custom-event-polyfill": "^1.0.7",
|
||||||
"custom-event-polyfill": "1.0.7",
|
"eslint": "^7.32.0",
|
||||||
"eslint": "5.16.0",
|
"eslint-config-standard": "^17.0.0",
|
||||||
"eslint-config-standard": "12.0.0",
|
"eslint-friendly-formatter": "^4.0.1",
|
||||||
"eslint-friendly-formatter": "2.0.7",
|
"eslint-loader": "^4.0.2",
|
||||||
"eslint-loader": "2.2.1",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"eslint-plugin-import": "2.25.4",
|
"eslint-plugin-node": "^11.1.0",
|
||||||
"eslint-plugin-node": "7.0.1",
|
"eslint-plugin-promise": "^6.1.1",
|
||||||
"eslint-plugin-promise": "4.3.1",
|
"eslint-plugin-standard": "^5.0.0",
|
||||||
"eslint-plugin-standard": "4.1.0",
|
"eslint-plugin-vue": "^9.7.0",
|
||||||
"eslint-plugin-vue": "5.2.3",
|
|
||||||
"eventsource-polyfill": "0.9.6",
|
"eventsource-polyfill": "0.9.6",
|
||||||
"express": "4.17.3",
|
"express": "4.17.3",
|
||||||
"file-loader": "3.0.1",
|
"file-loader": "^6.2.0",
|
||||||
"function-bind": "1.1.1",
|
"function-bind": "1.1.1",
|
||||||
"html-webpack-plugin": "3.2.0",
|
"html-webpack-plugin": "^5.5.0",
|
||||||
"http-proxy-middleware": "0.21.0",
|
"http-proxy-middleware": "0.21.0",
|
||||||
"inject-loader": "2.0.1",
|
"inject-loader": "2.0.1",
|
||||||
"iso-639-1": "2.1.15",
|
"iso-639-1": "2.1.15",
|
||||||
|
@ -96,7 +93,7 @@
|
||||||
"karma-sinon-chai": "2.0.2",
|
"karma-sinon-chai": "2.0.2",
|
||||||
"karma-sourcemap-loader": "0.3.8",
|
"karma-sourcemap-loader": "0.3.8",
|
||||||
"karma-spec-reporter": "0.0.33",
|
"karma-spec-reporter": "0.0.33",
|
||||||
"karma-webpack": "4.0.2",
|
"karma-webpack": "^5.0.0",
|
||||||
"lodash": "4.17.21",
|
"lodash": "4.17.21",
|
||||||
"lolex": "1.6.0",
|
"lolex": "1.6.0",
|
||||||
"mini-css-extract-plugin": "0.12.0",
|
"mini-css-extract-plugin": "0.12.0",
|
||||||
|
@ -104,29 +101,33 @@
|
||||||
"nightwatch": "0.9.21",
|
"nightwatch": "0.9.21",
|
||||||
"opn": "4.0.2",
|
"opn": "4.0.2",
|
||||||
"ora": "0.4.1",
|
"ora": "0.4.1",
|
||||||
|
"postcss-html": "^1.5.0",
|
||||||
"postcss-loader": "3.0.0",
|
"postcss-loader": "3.0.0",
|
||||||
|
"postcss-sass": "^0.5.0",
|
||||||
"raw-loader": "0.5.1",
|
"raw-loader": "0.5.1",
|
||||||
"sass": "1.53.0",
|
"sass": "^1.56.0",
|
||||||
"sass-loader": "7.3.1",
|
"sass-loader": "^13.2.0",
|
||||||
"selenium-server": "2.53.1",
|
"selenium-server": "2.53.1",
|
||||||
"semver": "5.7.1",
|
"semver": "5.7.1",
|
||||||
"serviceworker-webpack-plugin": "1.0.1",
|
|
||||||
"shelljs": "0.8.5",
|
"shelljs": "0.8.5",
|
||||||
"sinon": "2.4.1",
|
"sinon": "2.4.1",
|
||||||
"sinon-chai": "2.14.0",
|
"sinon-chai": "2.14.0",
|
||||||
"stylelint": "13.6.1",
|
"stylelint": "^14.15.0",
|
||||||
"stylelint-config-standard": "20.0.0",
|
"stylelint-config-recommended-vue": "^1.4.0",
|
||||||
"stylelint-rscss": "0.4.0",
|
"stylelint-config-standard": "^29.0.0",
|
||||||
"url-loader": "1.1.2",
|
"stylelint-config-standard-scss": "^6.1.0",
|
||||||
"vue-loader": "^16.0.0",
|
"stylelint-rscss": "^0.4.0",
|
||||||
"vue-style-loader": "4.1.2",
|
"url-loader": "^4.1.1",
|
||||||
"webpack": "4.46.0",
|
"vue-loader": "^17.0.0",
|
||||||
"webpack-dev-middleware": "3.7.3",
|
"vue-style-loader": "^4.1.2",
|
||||||
"webpack-hot-middleware": "2.25.1",
|
"webpack": "^5.75.0",
|
||||||
"webpack-merge": "0.20.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": {
|
"engines": {
|
||||||
"node": ">= 4.0.0",
|
"node": ">= 16.0.0",
|
||||||
"npm": ">= 3.0.0"
|
"npm": ">= 3.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,6 +150,7 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
|
||||||
copyInstanceOption('showPanelNavShortcuts')
|
copyInstanceOption('showPanelNavShortcuts')
|
||||||
copyInstanceOption('stopGifs')
|
copyInstanceOption('stopGifs')
|
||||||
copyInstanceOption('logo')
|
copyInstanceOption('logo')
|
||||||
|
copyInstanceOption('conversationDisplay')
|
||||||
|
|
||||||
store.dispatch('setInstanceOption', {
|
store.dispatch('setInstanceOption', {
|
||||||
name: 'logoMask',
|
name: 'logoMask',
|
||||||
|
@ -170,10 +171,8 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
|
||||||
copyInstanceOption('redirectRootNoLogin')
|
copyInstanceOption('redirectRootNoLogin')
|
||||||
copyInstanceOption('redirectRootLogin')
|
copyInstanceOption('redirectRootLogin')
|
||||||
copyInstanceOption('showInstanceSpecificPanel')
|
copyInstanceOption('showInstanceSpecificPanel')
|
||||||
copyInstanceOption('minimalScopesMode')
|
|
||||||
copyInstanceOption('hideMutedPosts')
|
copyInstanceOption('hideMutedPosts')
|
||||||
copyInstanceOption('collapseMessageWithSubject')
|
copyInstanceOption('collapseMessageWithSubject')
|
||||||
copyInstanceOption('scopeCopy')
|
|
||||||
copyInstanceOption('subjectLineBehavior')
|
copyInstanceOption('subjectLineBehavior')
|
||||||
copyInstanceOption('postContentType')
|
copyInstanceOption('postContentType')
|
||||||
copyInstanceOption('alwaysShowSubjectInput')
|
copyInstanceOption('alwaysShowSubjectInput')
|
||||||
|
|
|
@ -22,6 +22,8 @@ import Lists from 'components/lists/lists.vue'
|
||||||
import ListTimeline from 'components/list_timeline/list_timeline.vue'
|
import ListTimeline from 'components/list_timeline/list_timeline.vue'
|
||||||
import ListEdit from 'components/list_edit/list_edit.vue'
|
import ListEdit from 'components/list_edit/list_edit.vue'
|
||||||
import AnnouncementsPage from 'components/announcements_page/announcements_page.vue'
|
import AnnouncementsPage from 'components/announcements_page/announcements_page.vue'
|
||||||
|
import RegistrationRequestSent from 'components/registration_request_sent/registration_request_sent.vue'
|
||||||
|
import AwaitingEmailConfirmation from 'components/awaiting_email_confirmation/awaiting_email_confirmation.vue'
|
||||||
|
|
||||||
export default (store) => {
|
export default (store) => {
|
||||||
const validateAuthenticatedRoute = (to, from, next) => {
|
const validateAuthenticatedRoute = (to, from, next) => {
|
||||||
|
@ -62,6 +64,8 @@ export default (store) => {
|
||||||
{ name: 'interactions', path: '/users/:username/interactions', component: Interactions, beforeEnter: validateAuthenticatedRoute },
|
{ name: 'interactions', path: '/users/:username/interactions', component: Interactions, beforeEnter: validateAuthenticatedRoute },
|
||||||
{ name: 'dms', path: '/users/:username/dms', component: DMs, beforeEnter: validateAuthenticatedRoute },
|
{ name: 'dms', path: '/users/:username/dms', component: DMs, beforeEnter: validateAuthenticatedRoute },
|
||||||
{ name: 'registration', path: '/registration', component: Registration },
|
{ name: 'registration', path: '/registration', component: Registration },
|
||||||
|
{ name: 'registration-request-sent', path: '/registration-request-sent', component: RegistrationRequestSent },
|
||||||
|
{ name: 'awaiting-email-confirmation', path: '/awaiting-email-confirmation', component: AwaitingEmailConfirmation },
|
||||||
{ name: 'password-reset', path: '/password-reset', component: PasswordReset, props: true },
|
{ name: 'password-reset', path: '/password-reset', component: PasswordReset, props: true },
|
||||||
{ name: 'registration-token', path: '/registration/:token', component: Registration },
|
{ name: 'registration-token', path: '/registration/:token', component: Registration },
|
||||||
{ name: 'friend-requests', path: '/friend-requests', component: FollowRequests, beforeEnter: validateAuthenticatedRoute },
|
{ name: 'friend-requests', path: '/friend-requests', component: FollowRequests, beforeEnter: validateAuthenticatedRoute },
|
||||||
|
|
|
@ -26,6 +26,9 @@ const AccountActions = {
|
||||||
ConfirmModal
|
ConfirmModal
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
refetchRelationship () {
|
||||||
|
return this.$store.dispatch('fetchUserRelationship', this.user.id)
|
||||||
|
},
|
||||||
showConfirmBlock () {
|
showConfirmBlock () {
|
||||||
this.showingConfirmBlock = true
|
this.showingConfirmBlock = true
|
||||||
},
|
},
|
||||||
|
@ -57,6 +60,14 @@ const AccountActions = {
|
||||||
},
|
},
|
||||||
reportUser () {
|
reportUser () {
|
||||||
this.$store.dispatch('openUserReportingModal', { userId: this.user.id })
|
this.$store.dispatch('openUserReportingModal', { userId: this.user.id })
|
||||||
|
},
|
||||||
|
muteDomain () {
|
||||||
|
this.$store.dispatch('muteDomain', this.user.screen_name.split('@')[1])
|
||||||
|
.then(() => this.refetchRelationship())
|
||||||
|
},
|
||||||
|
unmuteDomain () {
|
||||||
|
this.$store.dispatch('unmuteDomain', this.user.screen_name.split('@')[1])
|
||||||
|
.then(() => this.refetchRelationship())
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
|
@ -55,6 +55,20 @@
|
||||||
>
|
>
|
||||||
{{ $t('user_card.report') }}
|
{{ $t('user_card.report') }}
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
v-if="relationship.domain_blocking"
|
||||||
|
class="btn button-default btn-block dropdown-item"
|
||||||
|
@click="unmuteDomain"
|
||||||
|
>
|
||||||
|
{{ $t('user_card.domain_muted') }}
|
||||||
|
</button>
|
||||||
|
<button
|
||||||
|
v-else-if="!user.is_local"
|
||||||
|
class="btn button-default btn-block dropdown-item"
|
||||||
|
@click="muteDomain"
|
||||||
|
>
|
||||||
|
{{ $t('user_card.mute_domain') }}
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:trigger>
|
<template v-slot:trigger>
|
||||||
|
|
|
@ -227,7 +227,7 @@ const Attachment = {
|
||||||
this.$emit('resize', newHeight)
|
this.$emit('resize', newHeight)
|
||||||
},
|
},
|
||||||
postStatus (event) {
|
postStatus (event) {
|
||||||
console.log(this.statusForm.postStatus(event, this.statusForm.newStatus))
|
this.statusForm.postStatus(event, this.statusForm.newStatus)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
export default {
|
||||||
|
computed: {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
<template>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4>{{ $t('registration.awaiting_email_confirmation_title') }}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<p>{{ $t('registration.awaiting_email_confirmation') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./awaiting_email_confirmation.js"></script>
|
|
@ -62,6 +62,10 @@ const EmojiPicker = {
|
||||||
this.scrolledGroup(target)
|
this.scrolledGroup(target)
|
||||||
this.triggerLoadMore(target)
|
this.triggerLoadMore(target)
|
||||||
},
|
},
|
||||||
|
onWheel (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.$refs['emoji-tabs'].scrollBy(e.deltaY, 0)
|
||||||
|
},
|
||||||
highlight (key) {
|
highlight (key) {
|
||||||
this.setShowStickers(false)
|
this.setShowStickers(false)
|
||||||
this.activeGroup = key
|
this.activeGroup = key
|
||||||
|
@ -138,7 +142,7 @@ const EmojiPicker = {
|
||||||
if (this.keyword === '') return list
|
if (this.keyword === '') return list
|
||||||
const regex = new RegExp(escapeRegExp(trim(this.keyword)), 'i')
|
const regex = new RegExp(escapeRegExp(trim(this.keyword)), 'i')
|
||||||
return list.filter(emoji => {
|
return list.filter(emoji => {
|
||||||
return regex.test(emoji.displayText)
|
return (regex.test(emoji.displayText) || (!emoji.imageUrl && emoji.replacement === this.keyword))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="emoji-picker panel panel-default panel-body">
|
<div class="emoji-picker panel panel-default panel-body">
|
||||||
<div class="heading">
|
<div class="heading">
|
||||||
<span class="emoji-tabs">
|
<span
|
||||||
|
class="emoji-tabs"
|
||||||
|
@wheel="onWheel"
|
||||||
|
ref="emoji-tabs"
|
||||||
|
>
|
||||||
<span
|
<span
|
||||||
v-for="group in emojis"
|
v-for="group in emojis"
|
||||||
:key="group.id"
|
:key="group.id"
|
||||||
|
|
|
@ -4,7 +4,6 @@ const FeaturesPanel = {
|
||||||
computed: {
|
computed: {
|
||||||
whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled },
|
whoToFollow: function () { return this.$store.state.instance.suggestionsEnabled },
|
||||||
mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable },
|
mediaProxy: function () { return this.$store.state.instance.mediaProxyAvailable },
|
||||||
minimalScopesMode: function () { return this.$store.state.instance.minimalScopesMode },
|
|
||||||
textlimit: function () { return this.$store.state.instance.textlimit },
|
textlimit: function () { return this.$store.state.instance.textlimit },
|
||||||
uploadlimit: function () { return fileSizeFormatService.fileSizeFormat(this.$store.state.instance.uploadlimit) }
|
uploadlimit: function () { return fileSizeFormatService.fileSizeFormat(this.$store.state.instance.uploadlimit) }
|
||||||
}
|
}
|
||||||
|
|
|
@ -181,9 +181,6 @@ const PostStatusForm = {
|
||||||
userDefaultScope () {
|
userDefaultScope () {
|
||||||
return this.$store.state.users.currentUser.default_scope
|
return this.$store.state.users.currentUser.default_scope
|
||||||
},
|
},
|
||||||
showAllScopes () {
|
|
||||||
return !this.mergedConfig.minimalScopesMode
|
|
||||||
},
|
|
||||||
emojiUserSuggestor () {
|
emojiUserSuggestor () {
|
||||||
return suggestor({
|
return suggestor({
|
||||||
emoji: [
|
emoji: [
|
||||||
|
@ -225,9 +222,6 @@ const PostStatusForm = {
|
||||||
isOverLengthLimit () {
|
isOverLengthLimit () {
|
||||||
return this.hasStatusLengthLimit && (this.charactersLeft < 0)
|
return this.hasStatusLengthLimit && (this.charactersLeft < 0)
|
||||||
},
|
},
|
||||||
minimalScopesMode () {
|
|
||||||
return this.$store.state.instance.minimalScopesMode
|
|
||||||
},
|
|
||||||
alwaysShowSubject () {
|
alwaysShowSubject () {
|
||||||
return this.mergedConfig.alwaysShowSubjectInput
|
return this.mergedConfig.alwaysShowSubjectInput
|
||||||
},
|
},
|
||||||
|
@ -647,12 +641,10 @@ const PostStatusForm = {
|
||||||
if (this.copyMessageScope === 'direct') {
|
if (this.copyMessageScope === 'direct') {
|
||||||
return this.copyMessageScope
|
return this.copyMessageScope
|
||||||
}
|
}
|
||||||
if (this.$store.getters.mergedConfig.scopeCopy) {
|
|
||||||
if (this.copyMessageScope !== 'public' && this.$store.state.users.currentUser.default_scope !== 'private') {
|
if (this.copyMessageScope !== 'public' && this.$store.state.users.currentUser.default_scope !== 'private') {
|
||||||
return this.copyMessageScope
|
return this.copyMessageScope
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return this.$store.state.users.currentUser.default_scope
|
return this.$store.state.users.currentUser.default_scope
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,7 +188,6 @@
|
||||||
>
|
>
|
||||||
<scope-selector
|
<scope-selector
|
||||||
v-if="!disableVisibilitySelector"
|
v-if="!disableVisibilitySelector"
|
||||||
:show-all="showAllScopes"
|
|
||||||
:user-default="userDefaultScope"
|
:user-default="userDefaultScope"
|
||||||
:original-scope="copyMessageScope"
|
:original-scope="copyMessageScope"
|
||||||
:initial-scope="newStatus.visibility"
|
:initial-scope="newStatus.visibility"
|
||||||
|
|
|
@ -79,8 +79,16 @@ const registration = {
|
||||||
|
|
||||||
if (!this.v$.$invalid) {
|
if (!this.v$.$invalid) {
|
||||||
try {
|
try {
|
||||||
await this.signUp(this.user)
|
const data = await this.signUp(this.user)
|
||||||
|
if (data.me) {
|
||||||
this.$router.push({ name: 'friends' })
|
this.$router.push({ name: 'friends' })
|
||||||
|
} else if (data.identifier === 'awaiting_approval') {
|
||||||
|
this.$router.push({ name: 'registration-request-sent' })
|
||||||
|
} else if (data.identifier === 'missing_confirmed_email') {
|
||||||
|
this.$router.push({ name: 'awaiting-email-confirmation' })
|
||||||
|
} else {
|
||||||
|
console.warn('Unknown response from sign up', data)
|
||||||
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn('Registration failed: ', error)
|
console.warn('Registration failed: ', error)
|
||||||
this.setCaptcha()
|
this.setCaptcha()
|
||||||
|
|
|
@ -177,6 +177,7 @@
|
||||||
<div
|
<div
|
||||||
v-if="accountApprovalRequired"
|
v-if="accountApprovalRequired"
|
||||||
class="form-group"
|
class="form-group"
|
||||||
|
:class="{ 'form-group--error': v$.user.reason.$error }"
|
||||||
>
|
>
|
||||||
<label
|
<label
|
||||||
class="form--label"
|
class="form--label"
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
export default {
|
||||||
|
computed: {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
<template>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4>{{ $t('registration.request_sent_title') }}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<p>{{ $t('registration.request_sent') }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script src="./registration_request_sent.js"></script>
|
|
@ -2,8 +2,6 @@ import { unescape, flattenDeep } from 'lodash'
|
||||||
import { getTagName, processTextForEmoji, getAttrs } from 'src/services/html_converter/utility.service.js'
|
import { getTagName, processTextForEmoji, getAttrs } from 'src/services/html_converter/utility.service.js'
|
||||||
import { convertHtmlToTree } from 'src/services/html_converter/html_tree_converter.service.js'
|
import { convertHtmlToTree } from 'src/services/html_converter/html_tree_converter.service.js'
|
||||||
import { convertHtmlToLines } from 'src/services/html_converter/html_line_converter.service.js'
|
import { convertHtmlToLines } from 'src/services/html_converter/html_line_converter.service.js'
|
||||||
import { marked } from 'marked'
|
|
||||||
import markedMfm from 'marked-mfm'
|
|
||||||
import StillImage from 'src/components/still-image/still-image.vue'
|
import StillImage from 'src/components/still-image/still-image.vue'
|
||||||
import MentionsLine, { MENTIONS_LIMIT } from 'src/components/mentions_line/mentions_line.vue'
|
import MentionsLine, { MENTIONS_LIMIT } from 'src/components/mentions_line/mentions_line.vue'
|
||||||
import HashtagLink from 'src/components/hashtag_link/hashtag_link.vue'
|
import HashtagLink from 'src/components/hashtag_link/hashtag_link.vue'
|
||||||
|
@ -123,51 +121,6 @@ export default {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const renderMisskeyMarkdown = (content) => {
|
|
||||||
// Untangle code blocks from <br> tags and other html encodings
|
|
||||||
const codeblocks = content.match(/(<br\/>)?(~~~|```)\w*<br\/>.+?<br\/>\2\1?/g)
|
|
||||||
if (codeblocks) {
|
|
||||||
codeblocks.forEach((pre) => {
|
|
||||||
content = content.replace(pre,
|
|
||||||
pre.replaceAll('<br/>', '\n')
|
|
||||||
.replaceAll('&', '&')
|
|
||||||
.replaceAll('<', '<')
|
|
||||||
.replaceAll('>', '>')
|
|
||||||
.replaceAll('"', '"')
|
|
||||||
.replaceAll(''', "'")
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
marked.use(markedMfm, {
|
|
||||||
mangle: false,
|
|
||||||
gfm: false,
|
|
||||||
breaks: true
|
|
||||||
})
|
|
||||||
const mfmHtml = document.createElement('template')
|
|
||||||
mfmHtml.innerHTML = marked.parse(content)
|
|
||||||
|
|
||||||
// Add options with set values to CSS
|
|
||||||
if (mfmHtml.content.firstChild) {
|
|
||||||
Array.from(mfmHtml.content.firstChild.getElementsByClassName('mfm')).map((el) => {
|
|
||||||
if (el.dataset.speed) {
|
|
||||||
el.style.animationDuration = el.dataset.speed
|
|
||||||
}
|
|
||||||
if (el.dataset.deg) {
|
|
||||||
el.style.transform = `rotate(${el.dataset.deg}deg)`
|
|
||||||
}
|
|
||||||
if (Array.from(el.classList).includes('_mfm_font_')) {
|
|
||||||
const font = Object.keys(el.dataset)[0]
|
|
||||||
if (['serif', 'monospace', 'cursive', 'fantasy', 'emoji', 'math'].includes(font)) {
|
|
||||||
el.style.fontFamily = font
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return mfmHtml.innerHTML
|
|
||||||
}
|
|
||||||
|
|
||||||
// Processor to use with html_tree_converter
|
// Processor to use with html_tree_converter
|
||||||
const processItem = (item, index, array, what) => {
|
const processItem = (item, index, array, what) => {
|
||||||
// Handle text nodes - just add emoji
|
// Handle text nodes - just add emoji
|
||||||
|
@ -305,7 +258,7 @@ export default {
|
||||||
return item
|
return item
|
||||||
}
|
}
|
||||||
|
|
||||||
const pass1 = convertHtmlToTree(this.mfm ? renderMisskeyMarkdown(html) : html).map(processItem)
|
const pass1 = convertHtmlToTree(html).map(processItem)
|
||||||
const pass2 = [...pass1].reverse().map(processItemReverse).reverse()
|
const pass2 = [...pass1].reverse().map(processItemReverse).reverse()
|
||||||
// DO NOT USE SLOTS they cause a re-render feedback loop here.
|
// DO NOT USE SLOTS they cause a re-render feedback loop here.
|
||||||
// slots updated -> rerender -> emit -> update up the tree -> rerender -> ...
|
// slots updated -> rerender -> emit -> update up the tree -> rerender -> ...
|
||||||
|
|
|
@ -13,6 +13,14 @@ library.add(
|
||||||
faLockOpen
|
faLockOpen
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const SCOPE_LEVELS = {
|
||||||
|
'direct': 0,
|
||||||
|
'private': 1,
|
||||||
|
'local': 2,
|
||||||
|
'unlisted': 2,
|
||||||
|
'public': 3
|
||||||
|
}
|
||||||
|
|
||||||
const ScopeSelector = {
|
const ScopeSelector = {
|
||||||
props: [
|
props: [
|
||||||
'showAll',
|
'showAll',
|
||||||
|
@ -57,11 +65,15 @@ const ScopeSelector = {
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
shouldShow (scope) {
|
shouldShow (scope) {
|
||||||
return this.showAll ||
|
if (!this.originalScope) {
|
||||||
this.currentScope === scope ||
|
return true
|
||||||
this.originalScope === scope ||
|
}
|
||||||
this.userDefault === scope ||
|
|
||||||
scope === 'direct'
|
if (this.originalScope === 'local') {
|
||||||
|
return scope === 'direct' || scope === 'local'
|
||||||
|
}
|
||||||
|
|
||||||
|
return SCOPE_LEVELS[scope] <= SCOPE_LEVELS[this.originalScope]
|
||||||
},
|
},
|
||||||
changeVis (scope) {
|
changeVis (scope) {
|
||||||
this.currentScope = scope
|
this.currentScope = scope
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
class="fa-scale-110 fa-old-padding"
|
class="fa-scale-110 fa-old-padding"
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
{{ ' ' }}
|
|
||||||
<button
|
<button
|
||||||
v-if="showPrivate"
|
v-if="showPrivate"
|
||||||
class="button-unstyled scope"
|
class="button-unstyled scope"
|
||||||
|
@ -30,7 +29,6 @@
|
||||||
class="fa-scale-110 fa-old-padding"
|
class="fa-scale-110 fa-old-padding"
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
{{ ' ' }}
|
|
||||||
<button
|
<button
|
||||||
v-if="showUnlisted"
|
v-if="showUnlisted"
|
||||||
class="button-unstyled scope"
|
class="button-unstyled scope"
|
||||||
|
@ -44,7 +42,6 @@
|
||||||
class="fa-scale-110 fa-old-padding"
|
class="fa-scale-110 fa-old-padding"
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
{{ ' ' }}
|
|
||||||
<button
|
<button
|
||||||
v-if="showPublic"
|
v-if="showPublic"
|
||||||
class="button-unstyled scope"
|
class="button-unstyled scope"
|
||||||
|
@ -87,6 +84,7 @@
|
||||||
min-width: 1.3em;
|
min-width: 1.3em;
|
||||||
min-height: 1.3em;
|
min-height: 1.3em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
margin-right: 0.4em;
|
||||||
|
|
||||||
&.selected svg {
|
&.selected svg {
|
||||||
color: $fallback--lightText;
|
color: $fallback--lightText;
|
||||||
|
|
|
@ -73,6 +73,7 @@
|
||||||
|
|
||||||
.search-bar-input {
|
.search-bar-input {
|
||||||
flex: 1 0 auto;
|
flex: 1 0 auto;
|
||||||
|
margin-left: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cancel-search {
|
.cancel-search {
|
||||||
|
|
|
@ -175,7 +175,6 @@ const SettingsModal = {
|
||||||
return this.$store.state.config.expertLevel > 0
|
return this.$store.state.config.expertLevel > 0
|
||||||
},
|
},
|
||||||
set (value) {
|
set (value) {
|
||||||
console.log(value)
|
|
||||||
this.$store.dispatch('setOption', { name: 'expertLevel', value: value ? 1 : 0 })
|
this.$store.dispatch('setOption', { name: 'expertLevel', value: value ? 1 : 0 })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,6 +76,10 @@
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 20px;
|
right: 20px;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
|
|
||||||
|
@media all and (max-width: 800px) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,10 @@
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<SettingsModalContent v-if="modalOpenedOnce" />
|
<SettingsModalContent v-if="modalOpenedOnce" />
|
||||||
</div>
|
</div>
|
||||||
|
<span
|
||||||
|
id="unscrolled-content"
|
||||||
|
class="extra-content"
|
||||||
|
/>
|
||||||
<div class="panel-footer settings-footer">
|
<div class="panel-footer settings-footer">
|
||||||
<Popover
|
<Popover
|
||||||
class="export"
|
class="export"
|
||||||
|
@ -53,7 +57,7 @@
|
||||||
:bound-to="{ x: 'container' }"
|
:bound-to="{ x: 'container' }"
|
||||||
remove-padding
|
remove-padding
|
||||||
>
|
>
|
||||||
<template v-slot:trigger>
|
<template #trigger>
|
||||||
<button
|
<button
|
||||||
class="btn button-default"
|
class="btn button-default"
|
||||||
:title="$t('general.close')"
|
:title="$t('general.close')"
|
||||||
|
@ -65,7 +69,7 @@
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
<template v-slot:content="{close}">
|
<template #content="{close}">
|
||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
<button
|
<button
|
||||||
class="button-default dropdown-item dropdown-item-icon"
|
class="button-default dropdown-item dropdown-item-icon"
|
||||||
|
@ -103,14 +107,11 @@
|
||||||
|
|
||||||
<Checkbox
|
<Checkbox
|
||||||
:model-value="!!expertLevel"
|
:model-value="!!expertLevel"
|
||||||
|
class="expertMode"
|
||||||
@update:modelValue="expertLevel = Number($event)"
|
@update:modelValue="expertLevel = Number($event)"
|
||||||
>
|
>
|
||||||
{{ $t("settings.expert_mode") }}
|
{{ $t("settings.expert_mode") }}
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
<span
|
|
||||||
id="unscrolled-content"
|
|
||||||
class="extra-content"
|
|
||||||
/>
|
|
||||||
<button
|
<button
|
||||||
v-if="currentUser"
|
v-if="currentUser"
|
||||||
class="button-default logout-button"
|
class="button-default logout-button"
|
||||||
|
|
|
@ -537,18 +537,12 @@
|
||||||
{{ $t('settings.default_vis') }} <ServerSideIndicator :server-side="true" />
|
{{ $t('settings.default_vis') }} <ServerSideIndicator :server-side="true" />
|
||||||
<ScopeSelector
|
<ScopeSelector
|
||||||
class="scope-selector"
|
class="scope-selector"
|
||||||
:show-all="true"
|
|
||||||
:user-default="serverSide_defaultScope"
|
:user-default="serverSide_defaultScope"
|
||||||
:initial-scope="serverSide_defaultScope"
|
:initial-scope="serverSide_defaultScope"
|
||||||
:on-scope-change="changeDefaultScope"
|
:on-scope-change="changeDefaultScope"
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<BooleanSetting path="minimalScopesMode">
|
|
||||||
{{ $t('settings.minimal_scopes_mode') }}
|
|
||||||
</BooleanSetting>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<BooleanSetting path="sensitiveByDefault">
|
<BooleanSetting path="sensitiveByDefault">
|
||||||
{{ $t('settings.sensitive_by_default') }}
|
{{ $t('settings.sensitive_by_default') }}
|
||||||
|
@ -559,14 +553,6 @@
|
||||||
{{ $t('settings.sensitive_if_subject') }}
|
{{ $t('settings.sensitive_if_subject') }}
|
||||||
</BooleanSetting>
|
</BooleanSetting>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<BooleanSetting
|
|
||||||
path="scopeCopy"
|
|
||||||
expert="1"
|
|
||||||
>
|
|
||||||
{{ $t('settings.scope_copy') }}
|
|
||||||
</BooleanSetting>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<BooleanSetting
|
<BooleanSetting
|
||||||
path="alwaysShowSubjectInput"
|
path="alwaysShowSubjectInput"
|
||||||
|
@ -594,14 +580,6 @@
|
||||||
{{ $t('settings.post_status_content_type') }}
|
{{ $t('settings.post_status_content_type') }}
|
||||||
</ChoiceSetting>
|
</ChoiceSetting>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<BooleanSetting
|
|
||||||
path="minimalScopesMode"
|
|
||||||
expert="1"
|
|
||||||
>
|
|
||||||
{{ $t('settings.minimal_scopes_mode') }}
|
|
||||||
</BooleanSetting>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<BooleanSetting
|
<BooleanSetting
|
||||||
path="alwaysShowNewPostButton"
|
path="alwaysShowNewPostButton"
|
||||||
|
|
|
@ -43,7 +43,9 @@ const ProfileTab = {
|
||||||
bannerPreview: null,
|
bannerPreview: null,
|
||||||
background: null,
|
background: null,
|
||||||
backgroundPreview: null,
|
backgroundPreview: null,
|
||||||
emailLanguage: this.$store.state.users.currentUser.language || ''
|
emailLanguage: this.$store.state.users.currentUser.language || '',
|
||||||
|
newPostTTLDays: this.$store.state.users.currentUser.status_ttl_days,
|
||||||
|
expirePosts: this.$store.state.users.currentUser.status_ttl_days !== null,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
|
@ -123,7 +125,8 @@ const ProfileTab = {
|
||||||
display_name: this.newName,
|
display_name: this.newName,
|
||||||
fields_attributes: this.newFields.filter(el => el != null),
|
fields_attributes: this.newFields.filter(el => el != null),
|
||||||
bot: this.bot,
|
bot: this.bot,
|
||||||
show_role: this.showRole
|
show_role: this.showRole,
|
||||||
|
status_ttl_days: this.expirePosts ? this.newPostTTLDays : -1
|
||||||
/* eslint-enable camelcase */
|
/* eslint-enable camelcase */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.expire-posts-days {
|
||||||
|
margin-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
.visibility-tray {
|
.visibility-tray {
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,20 @@
|
||||||
{{ $t('settings.bot') }}
|
{{ $t('settings.bot') }}
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
</p>
|
</p>
|
||||||
|
<p>
|
||||||
|
<Checkbox v-model="expirePosts">
|
||||||
|
{{ $t('settings.expire_posts_enabled') }}
|
||||||
|
</Checkbox>
|
||||||
|
<input
|
||||||
|
v-model="newPostTTLDays"
|
||||||
|
:disabled="!expirePosts"
|
||||||
|
type="number"
|
||||||
|
min="1"
|
||||||
|
max="730"
|
||||||
|
class="expire-posts-days"
|
||||||
|
:placeholder="$t('settings.expire_posts_input_placeholder')"
|
||||||
|
/>
|
||||||
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<interface-language-switcher
|
<interface-language-switcher
|
||||||
:prompt-text="$t('settings.email_language')"
|
:prompt-text="$t('settings.email_language')"
|
||||||
|
|
|
@ -753,7 +753,6 @@ export default {
|
||||||
selected () {
|
selected () {
|
||||||
this.selectedTheme = Object.entries(this.availableStyles).find(([k, s]) => {
|
this.selectedTheme = Object.entries(this.availableStyles).find(([k, s]) => {
|
||||||
if (Array.isArray(s)) {
|
if (Array.isArray(s)) {
|
||||||
console.log(s[0] === this.selected, this.selected)
|
|
||||||
return s[0] === this.selected
|
return s[0] === this.selected
|
||||||
} else {
|
} else {
|
||||||
return s.name === this.selected
|
return s.name === this.selected
|
||||||
|
|
|
@ -284,7 +284,6 @@
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
color: var(--faint, $fallback--faint);
|
color: var(--faint, $fallback--faint);
|
||||||
align-self: stretch;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.theme-color-cl,
|
.theme-color-cl,
|
||||||
|
@ -318,11 +317,11 @@
|
||||||
|
|
||||||
.extra-content {
|
.extra-content {
|
||||||
.apply-container {
|
.apply-container {
|
||||||
|
padding-left: 15vw;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: space-around;
|
justify-content: space-evenly;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
min-height: 2em;
|
min-height: 2em;
|
||||||
|
|
|
@ -958,6 +958,7 @@
|
||||||
v-if="isActive"
|
v-if="isActive"
|
||||||
to="#unscrolled-content"
|
to="#unscrolled-content"
|
||||||
>
|
>
|
||||||
|
<div class="panel-body settings-footer">
|
||||||
<div class="apply-container">
|
<div class="apply-container">
|
||||||
<button
|
<button
|
||||||
class="btn button-default submit"
|
class="btn button-default submit"
|
||||||
|
@ -973,6 +974,7 @@
|
||||||
{{ $t('settings.style.switcher.reset') }}
|
{{ $t('settings.style.switcher.reset') }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</teleport>
|
</teleport>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
@import '../../_variables.scss';
|
@import "../../_variables.scss";
|
||||||
|
|
||||||
.Status {
|
.Status {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
@ -42,6 +42,10 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: var(--status-margin, $status-margin);
|
padding: var(--status-margin, $status-margin);
|
||||||
|
|
||||||
|
.content {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
@ -130,6 +134,15 @@
|
||||||
.heading-left {
|
.heading-left {
|
||||||
display: flex;
|
display: flex;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
img {
|
||||||
|
aspect-ratio: 1 / 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nowrap {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.heading-right {
|
.heading-right {
|
||||||
|
@ -139,6 +152,7 @@
|
||||||
.button-unstyled {
|
.button-unstyled {
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
margin: -5px;
|
margin: -5px;
|
||||||
|
height: min-content;
|
||||||
|
|
||||||
&:hover svg {
|
&:hover svg {
|
||||||
color: $fallback--lightText;
|
color: $fallback--lightText;
|
||||||
|
@ -185,7 +199,7 @@
|
||||||
|
|
||||||
.reply-to-popover {
|
.reply-to-popover {
|
||||||
.reply-to:hover::before {
|
.reply-to:hover::before {
|
||||||
content: '';
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
@ -195,13 +209,12 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.faint-link:hover {
|
.faint-link:hover {
|
||||||
// override default
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.-strikethrough {
|
&.-strikethrough {
|
||||||
.reply-to::after {
|
.reply-to::after {
|
||||||
content: '';
|
content: "";
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 50%;
|
top: 50%;
|
||||||
|
@ -293,10 +306,12 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
justify-content: left;
|
||||||
margin-top: var(--status-margin, $status-margin);
|
margin-top: var(--status-margin, $status-margin);
|
||||||
|
|
||||||
> * {
|
> * {
|
||||||
max-width: 4em;
|
min-width: fit-content;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -340,7 +355,7 @@
|
||||||
margin-left: 0.2em;
|
margin-left: 0.2em;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: ' ';
|
content: " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -387,7 +402,7 @@
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
content: '';
|
content: "";
|
||||||
position: absolute;
|
position: absolute;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 1px;
|
width: 1px;
|
||||||
|
|
|
@ -166,12 +166,13 @@
|
||||||
>
|
>
|
||||||
{{ status.user.name }}
|
{{ status.user.name }}
|
||||||
</h4>
|
</h4>
|
||||||
|
<span class="nowrap">
|
||||||
<router-link
|
<router-link
|
||||||
class="account-name"
|
class="account-name"
|
||||||
:title="status.user.screen_name_ui"
|
:title="status.user.screen_name_ui"
|
||||||
:to="userProfileLink"
|
:to="userProfileLink"
|
||||||
>
|
>
|
||||||
{{ status.user.screen_name_ui }}
|
@{{ status.user.screen_name_ui }}
|
||||||
</router-link>
|
</router-link>
|
||||||
<img
|
<img
|
||||||
v-if="!!(status.user && status.user.favicon)"
|
v-if="!!(status.user && status.user.favicon)"
|
||||||
|
@ -179,6 +180,7 @@
|
||||||
:src="status.user.favicon"
|
:src="status.user.favicon"
|
||||||
:title="faviconAlt(status)"
|
:title="faviconAlt(status)"
|
||||||
>
|
>
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span class="heading-right">
|
<span class="heading-right">
|
||||||
|
@ -350,8 +352,10 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="content">
|
||||||
<StatusContent
|
<StatusContent
|
||||||
ref="content"
|
ref="content"
|
||||||
|
class="status-content"
|
||||||
:status="status"
|
:status="status"
|
||||||
:no-heading="noHeading"
|
:no-heading="noHeading"
|
||||||
:highlight="highlight"
|
:highlight="highlight"
|
||||||
|
@ -366,6 +370,7 @@
|
||||||
@mediapause="removeMediaPlaying($event)"
|
@mediapause="removeMediaPlaying($event)"
|
||||||
@parseReady="setHeadTailLinks"
|
@parseReady="setHeadTailLinks"
|
||||||
/>
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="inConversation && !isPreview && replies && replies.length"
|
v-if="inConversation && !isPreview && replies && replies.length"
|
||||||
|
@ -532,6 +537,6 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script src="./status.js" ></script>
|
<script src="./status.js"></script>
|
||||||
|
|
||||||
<style src="./status.scss" lang="scss"></style>
|
<style src="./status.scss" lang="scss"></style>
|
||||||
|
|
|
@ -6,11 +6,13 @@ import TimelineMenuTabs from '../timeline_menu_tabs/timeline_menu_tabs.vue'
|
||||||
import TimelineQuickSettings from './timeline_quick_settings.vue'
|
import TimelineQuickSettings from './timeline_quick_settings.vue'
|
||||||
import { debounce, throttle, keyBy } from 'lodash'
|
import { debounce, throttle, keyBy } from 'lodash'
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import { faCircleNotch, faCog } from '@fortawesome/free-solid-svg-icons'
|
import { faCircleNotch, faCog, faPlus, faMinus } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
library.add(
|
library.add(
|
||||||
faCircleNotch,
|
faCircleNotch,
|
||||||
faCog
|
faCog,
|
||||||
|
faPlus,
|
||||||
|
faMinus
|
||||||
)
|
)
|
||||||
|
|
||||||
const Timeline = {
|
const Timeline = {
|
||||||
|
@ -90,6 +92,15 @@ const Timeline = {
|
||||||
},
|
},
|
||||||
showPanelNavShortcuts () {
|
showPanelNavShortcuts () {
|
||||||
return this.$store.getters.mergedConfig.showPanelNavShortcuts
|
return this.$store.getters.mergedConfig.showPanelNavShortcuts
|
||||||
|
},
|
||||||
|
currentUser () {
|
||||||
|
return this.$store.state.users.currentUser
|
||||||
|
},
|
||||||
|
tagData () {
|
||||||
|
return this.$store.state.tags.tags[this.tag]
|
||||||
|
},
|
||||||
|
tagFollowed () {
|
||||||
|
return this.$store.state.tags.tags[this.tag]?.following
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
|
@ -118,6 +129,10 @@ const Timeline = {
|
||||||
}
|
}
|
||||||
window.addEventListener('keydown', this.handleShortKey)
|
window.addEventListener('keydown', this.handleShortKey)
|
||||||
setTimeout(this.determineVisibleStatuses, 250)
|
setTimeout(this.determineVisibleStatuses, 250)
|
||||||
|
|
||||||
|
if (this.tag) {
|
||||||
|
this.$store.dispatch('getTag', this.tag)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
unmounted () {
|
unmounted () {
|
||||||
window.removeEventListener('scroll', this.handleScroll)
|
window.removeEventListener('scroll', this.handleScroll)
|
||||||
|
@ -126,7 +141,7 @@ const Timeline = {
|
||||||
this.$store.commit('setLoading', { timeline: this.timelineName, value: false })
|
this.$store.commit('setLoading', { timeline: this.timelineName, value: false })
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
stopBlockingClicks: debounce(function () {
|
stopBlockingClicks: debounce( function() {
|
||||||
this.blockingClicks = false
|
this.blockingClicks = false
|
||||||
}, 1000),
|
}, 1000),
|
||||||
blockClicksTemporarily () {
|
blockClicksTemporarily () {
|
||||||
|
@ -154,7 +169,7 @@ const Timeline = {
|
||||||
window.scrollTo({ top: 0 })
|
window.scrollTo({ top: 0 })
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
fetchOlderStatuses: throttle(function () {
|
fetchOlderStatuses: throttle( function () {
|
||||||
const store = this.$store
|
const store = this.$store
|
||||||
const credentials = store.state.users.currentUser.credentials
|
const credentials = store.state.users.currentUser.credentials
|
||||||
store.commit('setLoading', { timeline: this.timelineName, value: true })
|
store.commit('setLoading', { timeline: this.timelineName, value: true })
|
||||||
|
@ -188,7 +203,7 @@ const Timeline = {
|
||||||
|
|
||||||
const centerOfScreen = window.pageYOffset + (window.innerHeight * 0.5)
|
const centerOfScreen = window.pageYOffset + (window.innerHeight * 0.5)
|
||||||
|
|
||||||
// Start from approximating the index of some visible status by using the
|
// Start from approximating the index of some visible status by using
|
||||||
// the center of the screen on the timeline.
|
// the center of the screen on the timeline.
|
||||||
let approxIndex = Math.floor(statuses.length * (centerOfScreen / height))
|
let approxIndex = Math.floor(statuses.length * (centerOfScreen / height))
|
||||||
let err = statuses[approxIndex].getBoundingClientRect().y
|
let err = statuses[approxIndex].getBoundingClientRect().y
|
||||||
|
@ -226,12 +241,18 @@ const Timeline = {
|
||||||
this.fetchOlderStatuses()
|
this.fetchOlderStatuses()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
handleScroll: throttle(function (e) {
|
handleScroll: throttle( function (e) {
|
||||||
this.determineVisibleStatuses()
|
this.determineVisibleStatuses()
|
||||||
this.scrollLoad(e)
|
this.scrollLoad(e)
|
||||||
}, 200),
|
}, 200),
|
||||||
handleVisibilityChange () {
|
handleVisibilityChange () {
|
||||||
this.unfocused = document.hidden
|
this.unfocused = document.hidden
|
||||||
|
},
|
||||||
|
followTag (tag) {
|
||||||
|
return this.$store.dispatch('followTag', tag)
|
||||||
|
},
|
||||||
|
unfollowTag (tag) {
|
||||||
|
return this.$store.dispatch('unfollowTag', tag)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
|
|
|
@ -21,6 +21,36 @@
|
||||||
{{ $t('timeline.up_to_date') }}
|
{{ $t('timeline.up_to_date') }}
|
||||||
</div>
|
</div>
|
||||||
<TimelineQuickSettings v-if="!embedded" />
|
<TimelineQuickSettings v-if="!embedded" />
|
||||||
|
<div
|
||||||
|
v-if="currentUser && tag !== undefined && tagData && !tagFollowed"
|
||||||
|
class="followTag"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="button-default"
|
||||||
|
:title="$t('timeline.follow_tag')"
|
||||||
|
@click="followTag(tag)"
|
||||||
|
>
|
||||||
|
<FAIcon
|
||||||
|
size="sm"
|
||||||
|
icon="plus"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="currentUser && tag !== undefined && tagData && tagFollowed"
|
||||||
|
class="followTag"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="button-default"
|
||||||
|
:title="$t('timeline.unfollow_tag')"
|
||||||
|
@click="unfollowTag(tag)"
|
||||||
|
>
|
||||||
|
<FAIcon
|
||||||
|
size="sm"
|
||||||
|
icon="minus"
|
||||||
|
/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div :class="classes.body">
|
<div :class="classes.body">
|
||||||
<div
|
<div
|
||||||
|
|
|
@ -71,7 +71,6 @@ export default {
|
||||||
return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`
|
return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`
|
||||||
},
|
},
|
||||||
loggedIn () {
|
loggedIn () {
|
||||||
console.log({ ...this.$store.state.users.currentUser })
|
|
||||||
return this.$store.state.users.currentUser
|
return this.$store.state.users.currentUser
|
||||||
},
|
},
|
||||||
dailyAvg () {
|
dailyAvg () {
|
||||||
|
@ -155,14 +154,6 @@ export default {
|
||||||
unmuteUser () {
|
unmuteUser () {
|
||||||
this.$store.dispatch('unmuteUser', this.user.id)
|
this.$store.dispatch('unmuteUser', this.user.id)
|
||||||
},
|
},
|
||||||
muteDomain () {
|
|
||||||
this.$store.dispatch('muteDomain', this.user.screen_name.split('@')[1])
|
|
||||||
.then(() => this.refetchRelationship())
|
|
||||||
},
|
|
||||||
unmuteDomain () {
|
|
||||||
this.$store.dispatch('unmuteDomain', this.user.screen_name.split('@')[1])
|
|
||||||
.then(() => this.refetchRelationship())
|
|
||||||
},
|
|
||||||
subscribeUser () {
|
subscribeUser () {
|
||||||
return this.$store.dispatch('subscribeUser', this.user.id)
|
return this.$store.dispatch('subscribeUser', this.user.id)
|
||||||
},
|
},
|
||||||
|
|
|
@ -67,6 +67,17 @@
|
||||||
icon="external-link-alt"
|
icon="external-link-alt"
|
||||||
/>
|
/>
|
||||||
</a>
|
</a>
|
||||||
|
<a
|
||||||
|
v-if="isOtherUser"
|
||||||
|
:href="user.statusnet_profile_url + '.rss'"
|
||||||
|
target="_blank"
|
||||||
|
class="button-unstyled external-link-button"
|
||||||
|
>
|
||||||
|
<FAIcon
|
||||||
|
class="icon"
|
||||||
|
icon="rss"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
<AccountActions
|
<AccountActions
|
||||||
v-if="isOtherUser && loggedIn"
|
v-if="isOtherUser && loggedIn"
|
||||||
:user="user"
|
:user="user"
|
||||||
|
@ -225,22 +236,6 @@
|
||||||
{{ $t('user_card.mute') }}
|
{{ $t('user_card.mute') }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<button
|
|
||||||
v-if="relationship.domain_blocking"
|
|
||||||
class="btn button-default btn-block toggled"
|
|
||||||
@click="unmuteDomain"
|
|
||||||
>
|
|
||||||
{{ $t('user_card.domain_muted') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
v-else
|
|
||||||
class="btn button-default btn-block"
|
|
||||||
@click="muteDomain"
|
|
||||||
>
|
|
||||||
{{ $t('user_card.mute_domain') }}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
class="btn button-default btn-block"
|
class="btn button-default btn-block"
|
||||||
|
|
|
@ -33,6 +33,8 @@ const FriendList = withLoadMore({
|
||||||
additionalPropNames: ['userId']
|
additionalPropNames: ['userId']
|
||||||
})(List)
|
})(List)
|
||||||
|
|
||||||
|
const isUserPage = ({ name }) => name === 'user-profile' || name === 'external-user-profile'
|
||||||
|
|
||||||
const UserProfile = {
|
const UserProfile = {
|
||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
|
@ -182,12 +184,12 @@ const UserProfile = {
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'$route.params.id': function (newVal) {
|
'$route.params.id': function (newVal) {
|
||||||
if (newVal) {
|
if (isUserPage(this.$route) && newVal) {
|
||||||
this.switchUser(newVal)
|
this.switchUser(newVal)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'$route.params.name': function (newVal) {
|
'$route.params.name': function (newVal) {
|
||||||
if (newVal) {
|
if (isUserPage(this.$route) && newVal) {
|
||||||
this.switchUser(newVal)
|
this.switchUser(newVal)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -135,7 +135,7 @@
|
||||||
},
|
},
|
||||||
"scope_in_timeline": {
|
"scope_in_timeline": {
|
||||||
"direct": "Direkt",
|
"direct": "Direkt",
|
||||||
"local": "Lokal - nur deine eigene Instanz kann diesen Beitrag sehen",
|
"local": "Lokal - nur deine eigene Instanz kann diese Nachricht sehen",
|
||||||
"private": "Nur an Folgende",
|
"private": "Nur an Folgende",
|
||||||
"public": "Öffentlich",
|
"public": "Öffentlich",
|
||||||
"unlisted": "Nicht gelistet"
|
"unlisted": "Nicht gelistet"
|
||||||
|
@ -345,10 +345,10 @@
|
||||||
},
|
},
|
||||||
"content_warning": "Inhaltswarnung (optional)",
|
"content_warning": "Inhaltswarnung (optional)",
|
||||||
"default": "Sitze gerade im Hofbräuhaus",
|
"default": "Sitze gerade im Hofbräuhaus",
|
||||||
"direct_warning_to_all": "Dieser Beitrag wird für alle erwähnten Benutzer sichtbar sein.",
|
"direct_warning_to_all": "Diese Nachricht wird für alle erwähnten Benutzer sichtbar sein.",
|
||||||
"direct_warning_to_first_only": "Dieser Beitrag wird für alle Benutzer, die am Anfang der Nachricht erwähnt wurden, sichtbar sein.",
|
"direct_warning_to_first_only": "Diese Nachricht wird für alle Benutzer, die am Anfang der Nachricht erwähnt wurden, sichtbar sein.",
|
||||||
"edit_remote_warning": "Änderungen könnten auf manchen Instanzen nicht sichtbar sein!",
|
"edit_remote_warning": "Änderungen könnten auf manchen Instanzen nicht sichtbar sein!",
|
||||||
"edit_status": "Beitrag ändern",
|
"edit_status": "Nachricht bearbeiten",
|
||||||
"edit_unsupported_warning": "Umfragen und Erwähnungen werden durch die Bearbeitung nicht geändert.",
|
"edit_unsupported_warning": "Umfragen und Erwähnungen werden durch die Bearbeitung nicht geändert.",
|
||||||
"empty_status_error": "Eine Nachricht ohne Text und ohne Anhänge kann nicht gesendet werden",
|
"empty_status_error": "Eine Nachricht ohne Text und ohne Anhänge kann nicht gesendet werden",
|
||||||
"media_description": "Medienbeschreibung",
|
"media_description": "Medienbeschreibung",
|
||||||
|
@ -360,17 +360,17 @@
|
||||||
"preview": "Vorschau",
|
"preview": "Vorschau",
|
||||||
"preview_empty": "Leer",
|
"preview_empty": "Leer",
|
||||||
"scope": {
|
"scope": {
|
||||||
"direct": "Direkt - Beitrag nur an erwähnte Profile",
|
"direct": "Direkt - Nachricht nur an erwähnte Profile",
|
||||||
"local": "Lokal - diesen Beitrag nicht föderieren",
|
"local": "Lokal - diese Nachricht nicht föderieren",
|
||||||
"private": "Nur Follower - Beitrag nur für Follower sichtbar",
|
"private": "Nur Follower - Nachricht nur für Follower sichtbar",
|
||||||
"public": "Öffentlich - Beitrag an öffentliche Zeitleisten",
|
"public": "Öffentlich - Nachricht an öffentliche Zeitleisten",
|
||||||
"unlisted": "Nicht gelistet - Nicht in öffentlichen Zeitleisten anzeigen"
|
"unlisted": "Nicht gelistet - Nicht in öffentlichen Zeitleisten anzeigen"
|
||||||
},
|
},
|
||||||
"scope_notice": {
|
"scope_notice": {
|
||||||
"local": "Dieser Bericht ist auf anderen Instanzen nicht sichbar",
|
"local": "Dieser Bericht ist auf anderen Instanzen nicht sichbar",
|
||||||
"private": "Dieser Beitrag wird nur für deine Follower sichtbar sein",
|
"private": "Diese Nachricht wird nur für deine Follower sichtbar sein",
|
||||||
"public": "Dieser Beitrag wird für alle sichtbar sein",
|
"public": "Diese Nachricht wird für alle sichtbar sein",
|
||||||
"unlisted": "Dieser Beitrag wird weder in der öffentlichen Zeitleiste noch im gesamten bekannten Netzwerk sichtbar sein"
|
"unlisted": "Diese Nachricht wird weder in der öffentlichen Zeitleiste noch im gesamten bekannten Netzwerk sichtbar sein"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
|
@ -465,10 +465,10 @@
|
||||||
"confirm_dialogs": "Bestätigung erforderlich für:",
|
"confirm_dialogs": "Bestätigung erforderlich für:",
|
||||||
"confirm_dialogs_approve_follow": "Annehmen einer Followanfrage",
|
"confirm_dialogs_approve_follow": "Annehmen einer Followanfrage",
|
||||||
"confirm_dialogs_block": "Jemanden blockieren",
|
"confirm_dialogs_block": "Jemanden blockieren",
|
||||||
"confirm_dialogs_delete": "Löschen eines Beitrages",
|
"confirm_dialogs_delete": "Löschen einer Nachricht",
|
||||||
"confirm_dialogs_deny_follow": "Ablehnen einer Followanfrage",
|
"confirm_dialogs_deny_follow": "Ablehnen einer Followanfrage",
|
||||||
"confirm_dialogs_mute": "Jemanden stummschalten",
|
"confirm_dialogs_mute": "Jemanden stummschalten",
|
||||||
"confirm_dialogs_repeat": "Wiederholen eines Beitrages",
|
"confirm_dialogs_repeat": "Wiederholen einer Nachricht",
|
||||||
"confirm_dialogs_unfollow": "Folgen beenden",
|
"confirm_dialogs_unfollow": "Folgen beenden",
|
||||||
"confirm_new_password": "Neues Passwort bestätigen",
|
"confirm_new_password": "Neues Passwort bestätigen",
|
||||||
"confirmation_dialogs": "Bestätigungs-Einstellungen",
|
"confirmation_dialogs": "Bestätigungs-Einstellungen",
|
||||||
|
@ -535,7 +535,7 @@
|
||||||
"hide_media_previews": "Verstecke Vorschau von Medien",
|
"hide_media_previews": "Verstecke Vorschau von Medien",
|
||||||
"hide_muted_posts": "Verberge Beiträge stummgeschalteter Nutzer",
|
"hide_muted_posts": "Verberge Beiträge stummgeschalteter Nutzer",
|
||||||
"hide_muted_threads": "Stummgeschaltete Unterhaltungen ausblenden",
|
"hide_muted_threads": "Stummgeschaltete Unterhaltungen ausblenden",
|
||||||
"hide_post_stats": "Beitragsstatistiken verbergen (z.B. die Anzahl der Favoriten)",
|
"hide_post_stats": "Nachrichtenstatistiken verbergen (z.B. die Anzahl der Favoriten)",
|
||||||
"hide_shoutbox": "Shoutbox der Instanz verbergen",
|
"hide_shoutbox": "Shoutbox der Instanz verbergen",
|
||||||
"hide_site_favicon": "Favicon der Instanz im Top-Panel nicht anzeigen",
|
"hide_site_favicon": "Favicon der Instanz im Top-Panel nicht anzeigen",
|
||||||
"hide_site_name": "Instanznamen im Top-Panel nicht anzeigen",
|
"hide_site_name": "Instanznamen im Top-Panel nicht anzeigen",
|
||||||
|
@ -562,7 +562,7 @@
|
||||||
"loop_video_silent_only": "Nur Videos ohne Ton wiederholen (z.B. Mastodons \"gifs\")",
|
"loop_video_silent_only": "Nur Videos ohne Ton wiederholen (z.B. Mastodons \"gifs\")",
|
||||||
"mascot": "Mastodon-FE-Maskottchen",
|
"mascot": "Mastodon-FE-Maskottchen",
|
||||||
"max_depth_in_thread": "Maximale Tiefe, bis zu der Unterhaltungen standardmäßig angezeigt werden",
|
"max_depth_in_thread": "Maximale Tiefe, bis zu der Unterhaltungen standardmäßig angezeigt werden",
|
||||||
"max_thumbnails": "Maximale Anzahl von Vorschaubildern pro Beitrag",
|
"max_thumbnails": "Maximale Anzahl von Vorschaubildern pro Nachricht (leer = keine Beschränkung)",
|
||||||
"mention_link_bolden_you": "eigene Erwähnungen hervorheben",
|
"mention_link_bolden_you": "eigene Erwähnungen hervorheben",
|
||||||
"mention_link_display": "Erwähungs-Links anzeigen",
|
"mention_link_display": "Erwähungs-Links anzeigen",
|
||||||
"mention_link_display_full": "immer als vollständige Namen (z. B. {'@'}foo{'@'}example.org)",
|
"mention_link_display_full": "immer als vollständige Namen (z. B. {'@'}foo{'@'}example.org)",
|
||||||
|
@ -638,7 +638,7 @@
|
||||||
"panelRadius": "Panel",
|
"panelRadius": "Panel",
|
||||||
"pause_on_unfocused": "Streaming pausieren, wenn das Tab nicht fokussiert ist",
|
"pause_on_unfocused": "Streaming pausieren, wenn das Tab nicht fokussiert ist",
|
||||||
"play_videos_in_modal": "Videos in größerem Medienfenster abspielen",
|
"play_videos_in_modal": "Videos in größerem Medienfenster abspielen",
|
||||||
"post_status_content_type": "Standard-Beitragsart",
|
"post_status_content_type": "Standard-Format für Nachrichten",
|
||||||
"posts": "Beiträge",
|
"posts": "Beiträge",
|
||||||
"preload_images": "Bilder vorausladen",
|
"preload_images": "Bilder vorausladen",
|
||||||
"presets": "Voreinstellungen",
|
"presets": "Voreinstellungen",
|
||||||
|
@ -656,7 +656,7 @@
|
||||||
"remove_alias": "Dieses Pseudonym entfernen",
|
"remove_alias": "Dieses Pseudonym entfernen",
|
||||||
"remove_backup": "Entfernen",
|
"remove_backup": "Entfernen",
|
||||||
"render_mfm": "Misskey-Markdown darstellen",
|
"render_mfm": "Misskey-Markdown darstellen",
|
||||||
"render_mfm_on_hover": "MFM-Animationen pausieren, solange sich der Mauszeiger nicht über dem Beitrag befindet",
|
"render_mfm_on_hover": "MFM-Animationen pausieren, solange sich der Mauszeiger nicht über der Nachricht befindet",
|
||||||
"replies_in_timeline": "Antworten in der Zeitleiste",
|
"replies_in_timeline": "Antworten in der Zeitleiste",
|
||||||
"reply_visibility_all": "Alle Antworten zeigen",
|
"reply_visibility_all": "Alle Antworten zeigen",
|
||||||
"reply_visibility_following": "Zeige nur Antworten an mich oder an Benutzer, denen ich folge",
|
"reply_visibility_following": "Zeige nur Antworten an mich oder an Benutzer, denen ich folge",
|
||||||
|
@ -680,7 +680,7 @@
|
||||||
"security": "Sicherheit",
|
"security": "Sicherheit",
|
||||||
"security_tab": "Sicherheit",
|
"security_tab": "Sicherheit",
|
||||||
"sensitive_by_default": "Alle Beiträge standardmäßig als heikel markieren",
|
"sensitive_by_default": "Alle Beiträge standardmäßig als heikel markieren",
|
||||||
"sensitive_if_subject": "Bilder automatisch als heikel markieren, wenn der Beitrag eine Inhaltswarnung hat",
|
"sensitive_if_subject": "Bilder automatisch als heikel markieren, wenn die Nachricht eine Inhaltswarnung hat",
|
||||||
"set_new_avatar": "Setze einen neuen Avatar",
|
"set_new_avatar": "Setze einen neuen Avatar",
|
||||||
"set_new_mascot": "Neues Maskottchen einstellen",
|
"set_new_mascot": "Neues Maskottchen einstellen",
|
||||||
"set_new_profile_background": "Setze einen neuen Hintergrund für dein Profil",
|
"set_new_profile_background": "Setze einen neuen Hintergrund für dein Profil",
|
||||||
|
@ -758,8 +758,8 @@
|
||||||
"components": {
|
"components": {
|
||||||
"input": "Eingabefelder",
|
"input": "Eingabefelder",
|
||||||
"interface": "Oberfläche",
|
"interface": "Oberfläche",
|
||||||
"post": "Beitragstext",
|
"post": "Nachrichtentext",
|
||||||
"postCode": "Dicktengleicher Text in einem Beitrag (Rich-Text)"
|
"postCode": "nichtproportionaler Text in einer Nachricht (Rich-Text)"
|
||||||
},
|
},
|
||||||
"custom": "Benutzerdefiniert",
|
"custom": "Benutzerdefiniert",
|
||||||
"family": "Schriftname",
|
"family": "Schriftname",
|
||||||
|
@ -790,7 +790,7 @@
|
||||||
"component": "Komponente",
|
"component": "Komponente",
|
||||||
"components": {
|
"components": {
|
||||||
"avatar": "Benutzer-Avatar (in der Profilansicht)",
|
"avatar": "Benutzer-Avatar (in der Profilansicht)",
|
||||||
"avatarStatus": "Benutzer-Avatar (in der Beitragsanzeige)",
|
"avatarStatus": "Benutzer-Avatar (in der Nachrichtenanzeige)",
|
||||||
"button": "Schaltfläche",
|
"button": "Schaltfläche",
|
||||||
"buttonHover": "Schaltfläche (hover)",
|
"buttonHover": "Schaltfläche (hover)",
|
||||||
"buttonPressed": "Schaltfläche (gedrückt)",
|
"buttonPressed": "Schaltfläche (gedrückt)",
|
||||||
|
@ -861,7 +861,7 @@
|
||||||
"tooltipRadius": "Tooltips/Warnungen",
|
"tooltipRadius": "Tooltips/Warnungen",
|
||||||
"translation_language": "Sprache für automatische Übersetzungen",
|
"translation_language": "Sprache für automatische Übersetzungen",
|
||||||
"tree_advanced": "Weitere Knöpfe zum Öffnen und Schließen von Antworten anzeigen",
|
"tree_advanced": "Weitere Knöpfe zum Öffnen und Schließen von Antworten anzeigen",
|
||||||
"tree_fade_ancestors": "Vorgänger des aktuellen Beitrags schwach darstellen",
|
"tree_fade_ancestors": "Vorgänger der aktuellen Nachricht schwach darstellen",
|
||||||
"type_domains_to_mute": "Tippe die Domains ein, die du stummschalten willst",
|
"type_domains_to_mute": "Tippe die Domains ein, die du stummschalten willst",
|
||||||
"upload_a_photo": "Lade ein Foto hoch",
|
"upload_a_photo": "Lade ein Foto hoch",
|
||||||
"useStreamingApi": "Empfange Posts und Benachrichtigungen in Echtzeit",
|
"useStreamingApi": "Empfange Posts und Benachrichtigungen in Echtzeit",
|
||||||
|
@ -888,14 +888,14 @@
|
||||||
"wordfilter": "Wortfilter"
|
"wordfilter": "Wortfilter"
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"ancestor_follow": "Zeige {numReplies} andere Antwort unter diesem Beitrag | Zeige {numReplies} andere Antworten unter diesem Beitrag",
|
"ancestor_follow": "Zeige {numReplies} andere Antwort unter dieser Nachricht | Zeige {numReplies} andere Antworten unter dieser Nachricht",
|
||||||
"ancestor_follow_with_icon": "{icon} {text}",
|
"ancestor_follow_with_icon": "{icon} {text}",
|
||||||
"attachment_stop_flash": "Flash-Player stoppen",
|
"attachment_stop_flash": "Flash-Player stoppen",
|
||||||
"bookmark": "Lesezeichen setzen",
|
"bookmark": "Lesezeichen setzen",
|
||||||
"collapse_attachments": "Anhänge einklappen",
|
"collapse_attachments": "Anhänge einklappen",
|
||||||
"copy_link": "Beitragslink kopieren",
|
"copy_link": "Link zur Nachricht kopieren",
|
||||||
"delete": "Lösche Beitrag",
|
"delete": "Lösche Nachricht",
|
||||||
"delete_confirm": "Möchtest du diese Beitrag wirklich löschen?",
|
"delete_confirm": "Möchtest du diese Nachricht wirklich löschen?",
|
||||||
"delete_confirm_accept_button": "Ja, löschen",
|
"delete_confirm_accept_button": "Ja, löschen",
|
||||||
"delete_confirm_cancel_button": "Nein, behalten",
|
"delete_confirm_cancel_button": "Nein, behalten",
|
||||||
"delete_confirm_title": "Löschen bestätigen",
|
"delete_confirm_title": "Löschen bestätigen",
|
||||||
|
@ -909,7 +909,7 @@
|
||||||
"hide_attachment": "Anhänge verbergen",
|
"hide_attachment": "Anhänge verbergen",
|
||||||
"hide_content": "Inhalt verbergen",
|
"hide_content": "Inhalt verbergen",
|
||||||
"hide_full_subject": "Vollständige Inhaltswarnung verbergen",
|
"hide_full_subject": "Vollständige Inhaltswarnung verbergen",
|
||||||
"many_attachments": "Beitrag hat {number} Anhang | Beitrag hat {number} Anhänge",
|
"many_attachments": "Nachricht hat {number} Anhang | Nachricht hat {number} Anhänge",
|
||||||
"mentions": "Erwähnungen",
|
"mentions": "Erwähnungen",
|
||||||
"move_down": "Anhang nach rechts verschieben",
|
"move_down": "Anhang nach rechts verschieben",
|
||||||
"move_up": "Anhang nach links verschieben",
|
"move_up": "Anhang nach links verschieben",
|
||||||
|
@ -921,7 +921,7 @@
|
||||||
"pinned": "Angeheftet",
|
"pinned": "Angeheftet",
|
||||||
"plus_more": "+{number} mehr",
|
"plus_more": "+{number} mehr",
|
||||||
"remove_attachment": "Anhang entfernen",
|
"remove_attachment": "Anhang entfernen",
|
||||||
"repeat_confirm": "Beitrag wirklich wiederholen?",
|
"repeat_confirm": "Nachricht wirklich wiederholen?",
|
||||||
"repeat_confirm_accept_button": "Ja, wiederholen",
|
"repeat_confirm_accept_button": "Ja, wiederholen",
|
||||||
"repeat_confirm_cancel_button": "Nein, nicht wiederholen",
|
"repeat_confirm_cancel_button": "Nein, nicht wiederholen",
|
||||||
"repeat_confirm_title": "Wiederholen bestätigen",
|
"repeat_confirm_title": "Wiederholen bestätigen",
|
||||||
|
@ -930,15 +930,15 @@
|
||||||
"replies_list_with_others": "Zeige noch {numReplies} Antwort | Zeige noch {numReplies} Antworten",
|
"replies_list_with_others": "Zeige noch {numReplies} Antwort | Zeige noch {numReplies} Antworten",
|
||||||
"reply_to": "Antworten auf",
|
"reply_to": "Antworten auf",
|
||||||
"show_all_attachments": "Alle Anhänge anzeigen",
|
"show_all_attachments": "Alle Anhänge anzeigen",
|
||||||
"show_all_conversation": "Ganzes Gespräch anzeigen (noch {numStatus} Beitrag) | Ganzes Gespräch anzeigen (noch {numStatus} Beiträge)",
|
"show_all_conversation": "Ganzes Gespräch anzeigen (noch {numStatus} Nachricht) | Ganzes Gespräch anzeigen (noch {numStatus} Nachrichten)",
|
||||||
"show_all_conversation_with_icon": "{icon} {text}",
|
"show_all_conversation_with_icon": "{icon} {text}",
|
||||||
"show_attachment_description": "Vorschau-Beschreibung (Anhang öffnen für vollständige Beschreibung)",
|
"show_attachment_description": "Vorschau-Beschreibung (Anhang öffnen für vollständige Beschreibung)",
|
||||||
"show_attachment_in_modal": "Anhang in einem Fenster anzeigen",
|
"show_attachment_in_modal": "Anhang in einem Fenster anzeigen",
|
||||||
"show_content": "Inhalt anzeigen",
|
"show_content": "Inhalt anzeigen",
|
||||||
"show_full_subject": "Vollständige Inhaltswarnung anzeigen",
|
"show_full_subject": "Vollständige Inhaltswarnung anzeigen",
|
||||||
"show_only_conversation_under_this": "Nur Antworten auf diesen Bericht anzeigen",
|
"show_only_conversation_under_this": "Nur Antworten auf diesen Bericht anzeigen",
|
||||||
"status_deleted": "Dieser Beitrag wurde gelöscht",
|
"status_deleted": "Diese Nachricht wurde gelöscht",
|
||||||
"status_unavailable": "Beitrag nicht verfügbar",
|
"status_unavailable": "Nachricht nicht verfügbar",
|
||||||
"thread_follow": "Zeige noch {numStatus} Antwort | Zeige noch {numStatus} Antworten",
|
"thread_follow": "Zeige noch {numStatus} Antwort | Zeige noch {numStatus} Antworten",
|
||||||
"thread_follow_with_icon": "{icon} {text}",
|
"thread_follow_with_icon": "{icon} {text}",
|
||||||
"thread_hide": "Diese Unterhaltung stummschalten",
|
"thread_hide": "Diese Unterhaltung stummschalten",
|
||||||
|
@ -979,10 +979,10 @@
|
||||||
"collapse": "Einklappen",
|
"collapse": "Einklappen",
|
||||||
"conversation": "Unterhaltung",
|
"conversation": "Unterhaltung",
|
||||||
"error": "Fehler beim Lesen der Timeline: {0}",
|
"error": "Fehler beim Lesen der Timeline: {0}",
|
||||||
"load_older": "Lade ältere Beiträge",
|
"load_older": "Lade ältere Nachrichten",
|
||||||
"no_more_statuses": "Keine weiteren Beiträge",
|
"no_more_statuses": "Keine weiteren Nachrichten",
|
||||||
"no_retweet_hint": "Der Beitrag ist als nur-für-Follower oder Direktnachricht markiert und kann nicht wiederholt oder zitiert werden",
|
"no_retweet_hint": "Die Nachricht ist als nur-für-Follower oder Direktnachricht markiert und kann nicht wiederholt oder zitiert werden",
|
||||||
"no_statuses": "Keine Beiträge",
|
"no_statuses": "Keine Nachrichten",
|
||||||
"reload": "Neu laden",
|
"reload": "Neu laden",
|
||||||
"repeated": "wiederholte",
|
"repeated": "wiederholte",
|
||||||
"show_new": "Zeige Neuere",
|
"show_new": "Zeige Neuere",
|
||||||
|
@ -1094,7 +1094,7 @@
|
||||||
"replies": "Mit Antworten",
|
"replies": "Mit Antworten",
|
||||||
"report": "Melden",
|
"report": "Melden",
|
||||||
"show_repeats": "Geteilte Beiträge anzeigen",
|
"show_repeats": "Geteilte Beiträge anzeigen",
|
||||||
"statuses": "Beiträge",
|
"statuses": "Nachrichten",
|
||||||
"subscribe": "Folgen",
|
"subscribe": "Folgen",
|
||||||
"unblock": "Entblocken",
|
"unblock": "Entblocken",
|
||||||
"unblock_progress": "Entblocken…",
|
"unblock_progress": "Entblocken…",
|
||||||
|
|
|
@ -165,72 +165,72 @@
|
||||||
"moves": "User migrates"
|
"moves": "User migrates"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
"bg": "Bulgarian",
|
|
||||||
"en": "English",
|
|
||||||
"ar": "Arabic",
|
"ar": "Arabic",
|
||||||
"az": "Azerbaijani",
|
"az": "Azerbaijani",
|
||||||
"zh": "Chinese",
|
"bg": "Bulgarian",
|
||||||
"cs": "Czech",
|
"cs": "Czech",
|
||||||
"da": "Danish",
|
"da": "Danish",
|
||||||
"nl": "Dutch",
|
|
||||||
"eo": "Esperanto",
|
|
||||||
"fi": "Finnish",
|
|
||||||
"fr": "French",
|
|
||||||
"de": "German",
|
"de": "German",
|
||||||
"el": "Greek",
|
"el": "Greek",
|
||||||
|
"en": "English",
|
||||||
|
"eo": "Esperanto",
|
||||||
|
"es": "Spanish",
|
||||||
|
"fa": "Persian",
|
||||||
|
"fi": "Finnish",
|
||||||
|
"fr": "French",
|
||||||
|
"ga": "Irish",
|
||||||
"he": "Hebrew",
|
"he": "Hebrew",
|
||||||
"hi": "Hindi",
|
"hi": "Hindi",
|
||||||
"hu": "Hungarian",
|
"hu": "Hungarian",
|
||||||
"id": "Indonesian",
|
"id": "Indonesian",
|
||||||
"ga": "Irish",
|
|
||||||
"it": "Italian",
|
"it": "Italian",
|
||||||
"ja": "Japanese",
|
"ja": "Japanese",
|
||||||
"ko": "Korean",
|
"ko": "Korean",
|
||||||
"fa": "Persian",
|
"lt": "Lithuanian",
|
||||||
|
"lv": "Latvian",
|
||||||
|
"nl": "Dutch",
|
||||||
"pl": "Polish",
|
"pl": "Polish",
|
||||||
"pt": "Portuguese",
|
"pt": "Portuguese",
|
||||||
"ru": "Russian",
|
"ru": "Russian",
|
||||||
"sk": "Slovak",
|
"sk": "Slovak",
|
||||||
"es": "Spanish",
|
|
||||||
"sv": "Swedish",
|
"sv": "Swedish",
|
||||||
"tr": "Turkish",
|
"tr": "Turkish",
|
||||||
"uk": "Ukrainian",
|
|
||||||
"lt": "Lithuanian",
|
|
||||||
"lv": "Latvian",
|
|
||||||
"translated_from": {
|
"translated_from": {
|
||||||
"bg": "Translated from @:languages.bg",
|
|
||||||
"en": "Translated from @:languages.en",
|
|
||||||
"ar": "Translated from @:languages.ar",
|
"ar": "Translated from @:languages.ar",
|
||||||
"az": "Translated from @:languages.az",
|
"az": "Translated from @:languages.az",
|
||||||
"zh": "Translated from @:languages.zh",
|
"bg": "Translated from @:languages.bg",
|
||||||
"cs": "Translated from @:languages.cs",
|
"cs": "Translated from @:languages.cs",
|
||||||
"da": "Translated from @:languages.da",
|
"da": "Translated from @:languages.da",
|
||||||
"nl": "Translated from @:languages.nl",
|
|
||||||
"eo": "Translated from @:languages.eo",
|
|
||||||
"fi": "Translated from @:languages.fi",
|
|
||||||
"fr": "Translated from @:languages.fr",
|
|
||||||
"de": "Translated from @:languages.de",
|
"de": "Translated from @:languages.de",
|
||||||
"el": "Translated from @:languages.el",
|
"el": "Translated from @:languages.el",
|
||||||
|
"en": "Translated from @:languages.en",
|
||||||
|
"eo": "Translated from @:languages.eo",
|
||||||
|
"es": "Translated from @:languages.es",
|
||||||
|
"fa": "Translated from @:languages.fa",
|
||||||
|
"fi": "Translated from @:languages.fi",
|
||||||
|
"fr": "Translated from @:languages.fr",
|
||||||
|
"ga": "Translated from @:languages.ga",
|
||||||
"he": "Translated from @:languages.he",
|
"he": "Translated from @:languages.he",
|
||||||
"hi": "Translated from @:languages.hi",
|
"hi": "Translated from @:languages.hi",
|
||||||
"hu": "Translated from @:languages.hu",
|
"hu": "Translated from @:languages.hu",
|
||||||
"id": "Translated from @:languages.id",
|
"id": "Translated from @:languages.id",
|
||||||
"ga": "Translated from @:languages.ga",
|
|
||||||
"it": "Translated from @:languages.it",
|
"it": "Translated from @:languages.it",
|
||||||
"ja": "Translated from @:languages.ja",
|
"ja": "Translated from @:languages.ja",
|
||||||
"ko": "Translated from @:languages.ko",
|
"ko": "Translated from @:languages.ko",
|
||||||
"fa": "Translated from @:languages.fa",
|
"lt": "Translated from @:languages.lt",
|
||||||
|
"lv": "Translated from @:languages.lv",
|
||||||
|
"nl": "Translated from @:languages.nl",
|
||||||
"pl": "Translated from @:languages.pl",
|
"pl": "Translated from @:languages.pl",
|
||||||
"pt": "Translated from @:languages.pt",
|
"pt": "Translated from @:languages.pt",
|
||||||
"ru": "Translated from @:languages.ru",
|
"ru": "Translated from @:languages.ru",
|
||||||
"sk": "Translated from @:languages.sk",
|
"sk": "Translated from @:languages.sk",
|
||||||
"es": "Translated from @:languages.es",
|
|
||||||
"sv": "Translated from @:languages.sv",
|
"sv": "Translated from @:languages.sv",
|
||||||
"tr": "Translated from @:languages.tr",
|
"tr": "Translated from @:languages.tr",
|
||||||
"uk": "Translated from @:languages.uk",
|
"uk": "Translated from @:languages.uk",
|
||||||
"lt": "Translated from @:languages.lt",
|
"zh": "Translated from @:languages.zh"
|
||||||
"lv": "Translated from @:languages.lv"
|
},
|
||||||
}
|
"uk": "Ukrainian",
|
||||||
|
"zh": "Chinese"
|
||||||
},
|
},
|
||||||
"lists": {
|
"lists": {
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
|
@ -254,15 +254,15 @@
|
||||||
"hint": "Log in to join the discussion",
|
"hint": "Log in to join the discussion",
|
||||||
"login": "Log in",
|
"login": "Log in",
|
||||||
"logout": "Log out",
|
"logout": "Log out",
|
||||||
|
"logout_confirm": "Are you sure you want to log out?",
|
||||||
|
"logout_confirm_accept_button": "Log out",
|
||||||
|
"logout_confirm_cancel_button": "Cancel",
|
||||||
|
"logout_confirm_title": "Log out",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"placeholder": "myusername",
|
"placeholder": "myusername",
|
||||||
"recovery_code": "Recovery code",
|
"recovery_code": "Recovery code",
|
||||||
"register": "Register",
|
"register": "Register",
|
||||||
"username": "Username",
|
"username": "Username"
|
||||||
"logout_confirm_cancel_button": "Cancel",
|
|
||||||
"logout_confirm_accept_button": "Log out",
|
|
||||||
"logout_confirm": "Are you sure you want to log out?",
|
|
||||||
"logout_confirm_title": "Log out"
|
|
||||||
},
|
},
|
||||||
"media_modal": {
|
"media_modal": {
|
||||||
"counter": "{current} / {total}",
|
"counter": "{current} / {total}",
|
||||||
|
@ -273,7 +273,6 @@
|
||||||
"moderation": {
|
"moderation": {
|
||||||
"moderation": "Moderation",
|
"moderation": "Moderation",
|
||||||
"reports": {
|
"reports": {
|
||||||
"no_reports": "No reports to show",
|
|
||||||
"add_note": "Add note",
|
"add_note": "Add note",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
"delete_note": "Delete",
|
"delete_note": "Delete",
|
||||||
|
@ -282,18 +281,19 @@
|
||||||
"delete_note_confirm": "Are you sure you want to delete this note?",
|
"delete_note_confirm": "Are you sure you want to delete this note?",
|
||||||
"delete_note_title": "Confirm deletion",
|
"delete_note_title": "Confirm deletion",
|
||||||
"no_content": "No description given",
|
"no_content": "No description given",
|
||||||
"note_placeholder": "Leave a note...",
|
"no_reports": "No reports to show",
|
||||||
|
"note_placeholder": "Leave a note",
|
||||||
"notes": "{ count } note | { count } notes",
|
"notes": "{ count } note | { count } notes",
|
||||||
"reopen": "Reopen",
|
"reopen": "Reopen",
|
||||||
"report": "Report on",
|
"report": "Report on",
|
||||||
"reports": "Reports",
|
"reports": "Reports",
|
||||||
"resolve": "Resolve",
|
"resolve": "Resolve",
|
||||||
"show_closed": "Show closed",
|
"show_closed": "Show closed",
|
||||||
"statuses": "{ count } status | { count } statuses",
|
"statuses": "{ count } post| { count } posts",
|
||||||
"tag_policy_notice": "Enable the TagPolicy MRF to set post restrictions",
|
"tag_policy_notice": "Enable the TagPolicy MRF to set post restrictions",
|
||||||
"tags": "Set post restrictions"
|
"tags": "Set post restrictions"
|
||||||
},
|
},
|
||||||
"statuses": "Statuses",
|
"statuses": "Posts",
|
||||||
"users": "Users"
|
"users": "Users"
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
|
@ -409,6 +409,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
|
"awaiting_email_confirmation": "Your account has been registered and an email has been sent to your address. Please check the email to complete registration.",
|
||||||
|
"awaiting_email_confirmation_title": "Awaiting email confirmation",
|
||||||
"bio": "Bio",
|
"bio": "Bio",
|
||||||
"bio_placeholder": "e.g.\nHi! Welcome to my bio.\nI love watching anime and playing games. I hope we can be friends!",
|
"bio_placeholder": "e.g.\nHi! Welcome to my bio.\nI love watching anime and playing games. I hope we can be friends!",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
|
@ -422,6 +424,8 @@
|
||||||
"reason_placeholder": "This instance approves registrations manually.\nLet the administration know why you want to register.",
|
"reason_placeholder": "This instance approves registrations manually.\nLet the administration know why you want to register.",
|
||||||
"register": "Register",
|
"register": "Register",
|
||||||
"registration": "Registration",
|
"registration": "Registration",
|
||||||
|
"request_sent": "Your registration request has been sent for approval. You will receive an email when your account is approved.",
|
||||||
|
"request_sent_title": "Registration request sent",
|
||||||
"token": "Invite token",
|
"token": "Invite token",
|
||||||
"username_placeholder": "e.g. akko",
|
"username_placeholder": "e.g. akko",
|
||||||
"validations": {
|
"validations": {
|
||||||
|
@ -531,6 +535,8 @@
|
||||||
"enable_web_push_notifications": "Enable web push notifications",
|
"enable_web_push_notifications": "Enable web push notifications",
|
||||||
"enter_current_password_to_confirm": "Enter your current password to confirm your identity",
|
"enter_current_password_to_confirm": "Enter your current password to confirm your identity",
|
||||||
"expert_mode": "Show advanced",
|
"expert_mode": "Show advanced",
|
||||||
|
"expire_posts_enabled": "Delete posts after a set amount of days",
|
||||||
|
"expire_posts_input_placeholder": "Number of days",
|
||||||
"export_theme": "Save preset",
|
"export_theme": "Save preset",
|
||||||
"file_export_import": {
|
"file_export_import": {
|
||||||
"backup_restore": "Settings backup",
|
"backup_restore": "Settings backup",
|
||||||
|
@ -725,18 +731,18 @@
|
||||||
"setting_server_side": "This setting is tied to your profile and affects all sessions and clients",
|
"setting_server_side": "This setting is tied to your profile and affects all sessions and clients",
|
||||||
"settings": "Settings",
|
"settings": "Settings",
|
||||||
"settings_profile": "Settings Profiles",
|
"settings_profile": "Settings Profiles",
|
||||||
"settings_profile_currently": "Currently using {name} (version: {version})",
|
|
||||||
"settings_profiles_show": "Show all settings profiles",
|
|
||||||
"settings_profiles_unshow": "Hide all settings profiles",
|
|
||||||
"settings_profile_in_use": "In use",
|
|
||||||
"settings_profile_creation": "Create new profile",
|
"settings_profile_creation": "Create new profile",
|
||||||
"settings_profile_creation_submit": "Create",
|
|
||||||
"settings_profile_creation_new_name_label": "Name",
|
"settings_profile_creation_new_name_label": "Name",
|
||||||
"settings_profile_use": "Use",
|
"settings_profile_creation_submit": "Create",
|
||||||
|
"settings_profile_currently": "Currently using {name} (version: {version})",
|
||||||
"settings_profile_delete": "Delete",
|
"settings_profile_delete": "Delete",
|
||||||
"settings_profile_delete_confirm": "Do you really want to delete this profile?",
|
"settings_profile_delete_confirm": "Do you really want to delete this profile?",
|
||||||
"settings_profile_force_sync": "Synchronize",
|
"settings_profile_force_sync": "Synchronize",
|
||||||
|
"settings_profile_in_use": "In use",
|
||||||
|
"settings_profile_use": "Use",
|
||||||
"settings_profiles_refresh": "Reload settings profiles",
|
"settings_profiles_refresh": "Reload settings profiles",
|
||||||
|
"settings_profiles_show": "Show all settings profiles",
|
||||||
|
"settings_profiles_unshow": "Hide all settings profiles",
|
||||||
"show_admin_badge": "Show \"Admin\" badge in my profile",
|
"show_admin_badge": "Show \"Admin\" badge in my profile",
|
||||||
"show_moderator_badge": "Show \"Moderator\" badge in my profile",
|
"show_moderator_badge": "Show \"Moderator\" badge in my profile",
|
||||||
"show_nav_shortcuts": "Show extra navigation shortcuts in top panel",
|
"show_nav_shortcuts": "Show extra navigation shortcuts in top panel",
|
||||||
|
@ -937,10 +943,10 @@
|
||||||
"wordfilter": "Wordfilter"
|
"wordfilter": "Wordfilter"
|
||||||
},
|
},
|
||||||
"settings_profile": {
|
"settings_profile": {
|
||||||
"synchronizing": "Synchronizing setting profile \"{profile}\"...",
|
"creating": "Creating new setting profile \"{profile}\"...",
|
||||||
"synchronized": "Synchronized settings!",
|
|
||||||
"synchronization_error": "Could not synchronize settings: {err}",
|
"synchronization_error": "Could not synchronize settings: {err}",
|
||||||
"creating": "Creating new setting profile \"{profile}\"..."
|
"synchronized": "Synchronized settings!",
|
||||||
|
"synchronizing": "Synchronizing setting profile \"{profile}\"..."
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"ancestor_follow": "See {numReplies} other reply under this post | See {numReplies} other replies under this post",
|
"ancestor_follow": "See {numReplies} other reply under this post | See {numReplies} other replies under this post",
|
||||||
|
@ -1040,6 +1046,7 @@
|
||||||
"collapse": "Collapse",
|
"collapse": "Collapse",
|
||||||
"conversation": "Conversation",
|
"conversation": "Conversation",
|
||||||
"error": "Error fetching timeline: {0}",
|
"error": "Error fetching timeline: {0}",
|
||||||
|
"follow_tag": "Follow hashtag",
|
||||||
"load_older": "Load older posts",
|
"load_older": "Load older posts",
|
||||||
"no_more_statuses": "No more posts",
|
"no_more_statuses": "No more posts",
|
||||||
"no_retweet_hint": "Post is marked as followers-only or direct and cannot be repeated or quoted",
|
"no_retweet_hint": "Post is marked as followers-only or direct and cannot be repeated or quoted",
|
||||||
|
@ -1049,6 +1056,7 @@
|
||||||
"show_new": "Show new",
|
"show_new": "Show new",
|
||||||
"socket_broke": "Realtime connection lost: CloseEvent code {0}",
|
"socket_broke": "Realtime connection lost: CloseEvent code {0}",
|
||||||
"socket_reconnected": "Realtime connection established",
|
"socket_reconnected": "Realtime connection established",
|
||||||
|
"unfollow_tag": "Unfollow hashtag",
|
||||||
"up_to_date": "Up-to-date"
|
"up_to_date": "Up-to-date"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
|
@ -1132,7 +1140,6 @@
|
||||||
"followers": "Followers",
|
"followers": "Followers",
|
||||||
"following": "Following!",
|
"following": "Following!",
|
||||||
"follows_you": "Follows you!",
|
"follows_you": "Follows you!",
|
||||||
"requested_by": "Has requested to follow you",
|
|
||||||
"hidden": "Hidden",
|
"hidden": "Hidden",
|
||||||
"hide_repeats": "Hide repeats",
|
"hide_repeats": "Hide repeats",
|
||||||
"highlight": {
|
"highlight": {
|
||||||
|
@ -1159,6 +1166,7 @@
|
||||||
"remove_follower": "Remove follower",
|
"remove_follower": "Remove follower",
|
||||||
"replies": "With Replies",
|
"replies": "With Replies",
|
||||||
"report": "Report",
|
"report": "Report",
|
||||||
|
"requested_by": "Has requested to follow you",
|
||||||
"show_repeats": "Show repeats",
|
"show_repeats": "Show repeats",
|
||||||
"statuses": "Posts",
|
"statuses": "Posts",
|
||||||
"subscribe": "Subscribe",
|
"subscribe": "Subscribe",
|
||||||
|
|
|
@ -254,6 +254,10 @@
|
||||||
"hint": "Inicia sesión para unirte a la discusión",
|
"hint": "Inicia sesión para unirte a la discusión",
|
||||||
"login": "Identificarse",
|
"login": "Identificarse",
|
||||||
"logout": "Cerrar sesión",
|
"logout": "Cerrar sesión",
|
||||||
|
"logout_confirm": "¿Estás seguro que quieres cerrar la sesión?",
|
||||||
|
"logout_confirm_accept_button": "Cerrar sesión",
|
||||||
|
"logout_confirm_cancel_button": "Cancelar",
|
||||||
|
"logout_confirm_title": "Cerrar sesión",
|
||||||
"password": "Contraseña",
|
"password": "Contraseña",
|
||||||
"placeholder": "miusuario",
|
"placeholder": "miusuario",
|
||||||
"recovery_code": "Código de recuperación",
|
"recovery_code": "Código de recuperación",
|
||||||
|
@ -277,14 +281,15 @@
|
||||||
"delete_note_confirm": "¿Estás seguro que quieres eliminar esta nota?",
|
"delete_note_confirm": "¿Estás seguro que quieres eliminar esta nota?",
|
||||||
"delete_note_title": "Confirma la eliminación",
|
"delete_note_title": "Confirma la eliminación",
|
||||||
"no_content": "Sin descripción dada",
|
"no_content": "Sin descripción dada",
|
||||||
|
"no_reports": "No hay informes que mostrar",
|
||||||
"note_placeholder": "Dejar una nota...",
|
"note_placeholder": "Dejar una nota...",
|
||||||
"notes": "notas",
|
"notes": "{ count } nota | { count } notas",
|
||||||
"reopen": "Reabrir",
|
"reopen": "Reabrir",
|
||||||
"report": "Reportar",
|
"report": "Reportar",
|
||||||
"reports": "Reportes",
|
"reports": "Reportes",
|
||||||
"resolve": "Resolver",
|
"resolve": "Resolver",
|
||||||
"show_closed": "Mostrar cerrados",
|
"show_closed": "Mostrar cerrados",
|
||||||
"statuses": "estados",
|
"statuses": "{ count } estado | { count } estados",
|
||||||
"tag_policy_notice": "Habilitar TagPolicy MRF para establecer restricciones de publicación",
|
"tag_policy_notice": "Habilitar TagPolicy MRF para establecer restricciones de publicación",
|
||||||
"tags": "Establecer restricciones de publicación"
|
"tags": "Establecer restricciones de publicación"
|
||||||
},
|
},
|
||||||
|
@ -404,6 +409,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
|
"awaiting_email_confirmation": "Su cuenta ha sido registrada y se ha enviado un correo electrónico a su dirección. Por favor revise el correo electrónico para completar el registro.",
|
||||||
|
"awaiting_email_confirmation_title": "En espera de confirmación por correo electrónico",
|
||||||
"bio": "Biografía",
|
"bio": "Biografía",
|
||||||
"bio_placeholder": "p. ej.\nHola, soy un ejemplo.\nAquí puedes poner algo representativo tuyo... o no.",
|
"bio_placeholder": "p. ej.\nHola, soy un ejemplo.\nAquí puedes poner algo representativo tuyo... o no.",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
|
@ -417,6 +424,8 @@
|
||||||
"reason_placeholder": "Los registros de esta instancia son aprobados manualmente.\nComéntanos por qué quieres registrarte aquí.",
|
"reason_placeholder": "Los registros de esta instancia son aprobados manualmente.\nComéntanos por qué quieres registrarte aquí.",
|
||||||
"register": "Registrarse",
|
"register": "Registrarse",
|
||||||
"registration": "Registro",
|
"registration": "Registro",
|
||||||
|
"request_sent": "Su solicitud de registro ha sido enviada para su aprobación. Recibirá un correo electrónico cuando se apruebe su cuenta.",
|
||||||
|
"request_sent_title": "Solicitud de registro enviada",
|
||||||
"token": "Token de invitación",
|
"token": "Token de invitación",
|
||||||
"username_placeholder": "p. ej. akko",
|
"username_placeholder": "p. ej. akko",
|
||||||
"validations": {
|
"validations": {
|
||||||
|
@ -445,6 +454,7 @@
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"accent": "Acento",
|
"accent": "Acento",
|
||||||
|
"account_alias": "Alias de cuenta",
|
||||||
"account_alias_table_head": "Alias",
|
"account_alias_table_head": "Alias",
|
||||||
"account_backup": "Copia de seguridad de la cuenta",
|
"account_backup": "Copia de seguridad de la cuenta",
|
||||||
"account_backup_description": "Esto le permite descargar un archivo con la información de su cuenta y sus publicaciones, pero aún no se pueden importar a una cuenta de Pleroma.",
|
"account_backup_description": "Esto le permite descargar un archivo con la información de su cuenta y sus publicaciones, pero aún no se pueden importar a una cuenta de Pleroma.",
|
||||||
|
@ -492,7 +502,16 @@
|
||||||
"columns": "Columnas",
|
"columns": "Columnas",
|
||||||
"composing": "Redactando",
|
"composing": "Redactando",
|
||||||
"confirm_dialogs": "Requiere confirmación de:",
|
"confirm_dialogs": "Requiere confirmación de:",
|
||||||
|
"confirm_dialogs_approve_follow": "Aceptar una solicitud de seguimiento",
|
||||||
|
"confirm_dialogs_block": "Bloqueando a alguien",
|
||||||
|
"confirm_dialogs_delete": "Eliminar una publicación",
|
||||||
|
"confirm_dialogs_deny_follow": "Rechazar una solicitud de seguimiento",
|
||||||
|
"confirm_dialogs_mute": "Silenciar a alguien",
|
||||||
|
"confirm_dialogs_repeat": "Repitiendo una publicación",
|
||||||
|
"confirm_dialogs_unfollow": "Dejar de seguir a alguien",
|
||||||
"confirm_new_password": "Confirmar la nueva contraseña",
|
"confirm_new_password": "Confirmar la nueva contraseña",
|
||||||
|
"confirmation_dialogs": "Opciones de confirmación",
|
||||||
|
"conversation_display": "Estilo de visualización de la conversación",
|
||||||
"conversation_display_linear": "Lineal",
|
"conversation_display_linear": "Lineal",
|
||||||
"conversation_display_tree": "Ramificado",
|
"conversation_display_tree": "Ramificado",
|
||||||
"conversation_other_replies_button": "Mostrar el botón \"otras respuestas\"",
|
"conversation_other_replies_button": "Mostrar el botón \"otras respuestas\"",
|
||||||
|
@ -543,6 +562,7 @@
|
||||||
"hide_all_muted_posts": "Ocultar las publicaciones silenciadas",
|
"hide_all_muted_posts": "Ocultar las publicaciones silenciadas",
|
||||||
"hide_attachments_in_convo": "Ocultar adjuntos en las conversaciones",
|
"hide_attachments_in_convo": "Ocultar adjuntos en las conversaciones",
|
||||||
"hide_attachments_in_tl": "Ocultar adjuntos en la línea temporal",
|
"hide_attachments_in_tl": "Ocultar adjuntos en la línea temporal",
|
||||||
|
"hide_bot_indication": "Ocultar indicación de bot en publicaciones",
|
||||||
"hide_favorites_description": "No mostrar la lista de mis favoritos (las personas aún serán notificadas)",
|
"hide_favorites_description": "No mostrar la lista de mis favoritos (las personas aún serán notificadas)",
|
||||||
"hide_filtered_statuses": "Ocultar estados filtrados",
|
"hide_filtered_statuses": "Ocultar estados filtrados",
|
||||||
"hide_followers_count_description": "No mostrar el número de cuentas que me siguen",
|
"hide_followers_count_description": "No mostrar el número de cuentas que me siguen",
|
||||||
|
@ -587,8 +607,10 @@
|
||||||
"mention_link_display_full": "siempre como nombre completo (p. ej. {'@'}foo{'@'}example.org)",
|
"mention_link_display_full": "siempre como nombre completo (p. ej. {'@'}foo{'@'}example.org)",
|
||||||
"mention_link_display_full_for_remote": "como nombre completo solo para usuarios remotos (p. ej. {'@'}foo{'@'}example.org)",
|
"mention_link_display_full_for_remote": "como nombre completo solo para usuarios remotos (p. ej. {'@'}foo{'@'}example.org)",
|
||||||
"mention_link_display_short": "siempre como nombres cortos (p. ej. {'@'}foo)",
|
"mention_link_display_short": "siempre como nombres cortos (p. ej. {'@'}foo)",
|
||||||
|
"mention_link_fade_domain": "Renombrar dominios (p. ej. {'@'}ejemplo.org en {'@'}algo{'@'}ejemplo.org)",
|
||||||
"mention_link_show_avatar": "Mostrar el avatar del usuario detrás del enlace",
|
"mention_link_show_avatar": "Mostrar el avatar del usuario detrás del enlace",
|
||||||
"mention_link_show_tooltip": "Mostrar el nombre completo de los usuarios remotos como información emergente",
|
"mention_link_show_tooltip": "Mostrar el nombre completo de los usuarios remotos como información emergente",
|
||||||
|
"mention_links": "Mencionar enlaces",
|
||||||
"mfa": {
|
"mfa": {
|
||||||
"authentication_methods": "Métodos de autentificación",
|
"authentication_methods": "Métodos de autentificación",
|
||||||
"confirm_and_enable": "Confirmar y habilitar OTP",
|
"confirm_and_enable": "Confirmar y habilitar OTP",
|
||||||
|
@ -637,6 +659,7 @@
|
||||||
"notification_mutes": "Para dejar de recibir notificaciones de un usuario específico, siléncialo.",
|
"notification_mutes": "Para dejar de recibir notificaciones de un usuario específico, siléncialo.",
|
||||||
"notification_setting_block_from_strangers": "Bloquea las notificaciones de los usuarios que no sigues",
|
"notification_setting_block_from_strangers": "Bloquea las notificaciones de los usuarios que no sigues",
|
||||||
"notification_setting_filters": "Filtros",
|
"notification_setting_filters": "Filtros",
|
||||||
|
"notification_setting_hide_if_cw": "Ocultar las notificaciones \"push\", si la publicación está marcada como \"contenido sensible\"",
|
||||||
"notification_setting_hide_notification_contents": "Ocultar el remitente y el contenido de las notificaciones push",
|
"notification_setting_hide_notification_contents": "Ocultar el remitente y el contenido de las notificaciones push",
|
||||||
"notification_setting_privacy": "Privacidad",
|
"notification_setting_privacy": "Privacidad",
|
||||||
"notification_visibility": "Tipos de notificaciones a mostrar",
|
"notification_visibility": "Tipos de notificaciones a mostrar",
|
||||||
|
@ -645,6 +668,7 @@
|
||||||
"notification_visibility_likes": "Favoritos",
|
"notification_visibility_likes": "Favoritos",
|
||||||
"notification_visibility_mentions": "Menciones",
|
"notification_visibility_mentions": "Menciones",
|
||||||
"notification_visibility_moves": "Usuario Migrado",
|
"notification_visibility_moves": "Usuario Migrado",
|
||||||
|
"notification_visibility_polls": "Encuestas finalizadas en las que has participado",
|
||||||
"notification_visibility_repeats": "Repeticiones (Repeats)",
|
"notification_visibility_repeats": "Repeticiones (Repeats)",
|
||||||
"notifications": "Notificaciones",
|
"notifications": "Notificaciones",
|
||||||
"nsfw_clickthrough": "Habilitar la ocultación de la imagen de vista previa del enlace y el adjunto para los estados NSFW por defecto",
|
"nsfw_clickthrough": "Habilitar la ocultación de la imagen de vista previa del enlace y el adjunto para los estados NSFW por defecto",
|
||||||
|
@ -653,7 +677,9 @@
|
||||||
"panelRadius": "Paneles",
|
"panelRadius": "Paneles",
|
||||||
"pause_on_unfocused": "Parar la transmisión cuando no estés en foco",
|
"pause_on_unfocused": "Parar la transmisión cuando no estés en foco",
|
||||||
"play_videos_in_modal": "Reproducir los vídeos en un marco emergente",
|
"play_videos_in_modal": "Reproducir los vídeos en un marco emergente",
|
||||||
"post_status_content_type": "Formato de publicación",
|
"post_look_feel": "Aspecto de las publicaciones",
|
||||||
|
"post_status_content_type": "Formato predeterminado de publicación",
|
||||||
|
"posts": "Publicaciones",
|
||||||
"preload_images": "Precargar las imágenes",
|
"preload_images": "Precargar las imágenes",
|
||||||
"presets": "Por defecto",
|
"presets": "Por defecto",
|
||||||
"profile_background": "Imagen de fondo del perfil",
|
"profile_background": "Imagen de fondo del perfil",
|
||||||
|
@ -667,6 +693,9 @@
|
||||||
"profile_tab": "Perfil",
|
"profile_tab": "Perfil",
|
||||||
"radii_help": "Establezca el redondeo de las esquinas de la interfaz (en píxeles)",
|
"radii_help": "Establezca el redondeo de las esquinas de la interfaz (en píxeles)",
|
||||||
"refresh_token": "Actualizar el token",
|
"refresh_token": "Actualizar el token",
|
||||||
|
"remove_alias": "Eliminar este alias",
|
||||||
|
"remove_backup": "Eliminar",
|
||||||
|
"render_mfm": "Renderizar Markdown de Misskey",
|
||||||
"replies_in_timeline": "Réplicas en la línea temporal",
|
"replies_in_timeline": "Réplicas en la línea temporal",
|
||||||
"reply_visibility_all": "Mostrar todas las réplicas",
|
"reply_visibility_all": "Mostrar todas las réplicas",
|
||||||
"reply_visibility_following": "Solo mostrar réplicas para mí o usuarios a los que sigo",
|
"reply_visibility_following": "Solo mostrar réplicas para mí o usuarios a los que sigo",
|
||||||
|
@ -691,10 +720,24 @@
|
||||||
"security_tab": "Seguridad",
|
"security_tab": "Seguridad",
|
||||||
"sensitive_by_default": "Identificar las publicaciones como sensibles de forma predeterminada",
|
"sensitive_by_default": "Identificar las publicaciones como sensibles de forma predeterminada",
|
||||||
"set_new_avatar": "Cambiar avatar",
|
"set_new_avatar": "Cambiar avatar",
|
||||||
|
"set_new_mascot": "Fijar nueva mascota",
|
||||||
"set_new_profile_background": "Cambiar el fondo del perfil",
|
"set_new_profile_background": "Cambiar el fondo del perfil",
|
||||||
"set_new_profile_banner": "Cambiar la cabecera del perfil",
|
"set_new_profile_banner": "Cambiar la cabecera del perfil",
|
||||||
"setting_changed": "La configuración es diferente a la predeterminada",
|
"setting_changed": "La configuración es diferente a la predeterminada",
|
||||||
|
"setting_server_side": "Esta configuración está vinculada a su perfil y afecta a todas las sesiones y clientes",
|
||||||
"settings": "Ajustes",
|
"settings": "Ajustes",
|
||||||
|
"settings_profile": "Ajustes de Perfiles",
|
||||||
|
"settings_profile_creation": "Crear nuevo perfil",
|
||||||
|
"settings_profile_creation_new_name_label": "Nombre",
|
||||||
|
"settings_profile_creation_submit": "Crear",
|
||||||
|
"settings_profile_currently": "Actualmente usando {nombre} (versión: {version})",
|
||||||
|
"settings_profile_delete": "Eliminar",
|
||||||
|
"settings_profile_delete_confirm": "¿Realmente quieres eliminar este perfil?",
|
||||||
|
"settings_profile_force_sync": "Sincronizar",
|
||||||
|
"settings_profile_in_use": "En uso",
|
||||||
|
"settings_profile_use": "Usar",
|
||||||
|
"settings_profiles_show": "Mostrar todos los perfiles de configuración",
|
||||||
|
"settings_profiles_unshow": "Ocultar todos los perfiles de configuración",
|
||||||
"show_admin_badge": "Mostrar la insignia de \"Administrador/a\" en mi perfil",
|
"show_admin_badge": "Mostrar la insignia de \"Administrador/a\" en mi perfil",
|
||||||
"show_moderator_badge": "Mostrar la insignia de \"Moderador/a\" en mi perfil",
|
"show_moderator_badge": "Mostrar la insignia de \"Moderador/a\" en mi perfil",
|
||||||
"stop_gifs": "Iniciar GIFs al pasar el ratón",
|
"stop_gifs": "Iniciar GIFs al pasar el ratón",
|
||||||
|
|
297
src/i18n/id.json
297
src/i18n/id.json
|
@ -3,6 +3,7 @@
|
||||||
"mrf": {
|
"mrf": {
|
||||||
"federation": "Federasi",
|
"federation": "Federasi",
|
||||||
"keyword": {
|
"keyword": {
|
||||||
|
"ftl_removal": "Penghapusan dari Linimasa \"Jaringan Yang Dikenal\"",
|
||||||
"is_replaced_by": "→",
|
"is_replaced_by": "→",
|
||||||
"reject": "Tolak"
|
"reject": "Tolak"
|
||||||
},
|
},
|
||||||
|
@ -10,28 +11,57 @@
|
||||||
"simple": {
|
"simple": {
|
||||||
"accept": "Terima",
|
"accept": "Terima",
|
||||||
"accept_desc": "Instansi ini hanya menerima pesan dari instansi-instansi berikut:",
|
"accept_desc": "Instansi ini hanya menerima pesan dari instansi-instansi berikut:",
|
||||||
|
"ftl_removal": "Penghapusan dari Linimasa \"Jaringan Yang Dikenal\"",
|
||||||
|
"ftl_removal_desc": "Instansi ini menghapus instansi berikut dari linimasa \"Jaringan Yang Dikenal\":",
|
||||||
|
"instance": "Instansi",
|
||||||
|
"media_nsfw": "Media diatur sebagai sensitif secara paksa",
|
||||||
|
"media_nsfw_desc": "Instansi ini secara paksa menandai media pada postingan dari instansi berikut sebagai sensitif:",
|
||||||
"media_removal": "Penghapusan Media",
|
"media_removal": "Penghapusan Media",
|
||||||
"media_removal_desc": "Instansi ini menghapus media dari postingan yang berasal dari instansi-instansi berikut:",
|
"media_removal_desc": "Instansi ini menghapus media dari postingan yang berasal dari instansi-instansi berikut:",
|
||||||
|
"not_applicable": "Tidak berlaku",
|
||||||
"quarantine": "Karantina",
|
"quarantine": "Karantina",
|
||||||
"quarantine_desc": "Instansi ini hanya akan mengirim postingan publik ke instansi-instansi berikut:",
|
"quarantine_desc": "Instansi ini tidak akan mengirim postingan publik ke instansi berikut:",
|
||||||
|
"reason": "Alasan",
|
||||||
"reject": "Tolak",
|
"reject": "Tolak",
|
||||||
"reject_desc": "Instansi ini tidak akan menerima pesan dari instansi-instansi berikut:"
|
"reject_desc": "Instansi ini tidak akan menerima pesan dari instansi-instansi berikut:",
|
||||||
|
"simple_policies": "Kebijakan khusus instansi"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"staff": "Staf"
|
"staff": "Staf"
|
||||||
},
|
},
|
||||||
|
"announcements": {
|
||||||
|
"all_day_prompt": "Ini adalah acara sepanjang hari",
|
||||||
|
"cancel_edit_action": "Batal",
|
||||||
|
"close_error": "Tutup",
|
||||||
|
"delete_action": "Hapus",
|
||||||
|
"edit_action": "Sunting",
|
||||||
|
"end_time_display": "Berakhir pada {time}",
|
||||||
|
"end_time_prompt": "Waktu berakhir: ",
|
||||||
|
"inactive_message": "Pengumuman ini nonaktif",
|
||||||
|
"mark_as_read_action": "Tandai sebagai dibaca",
|
||||||
|
"page_header": "Pengumuman",
|
||||||
|
"post_action": "Posting",
|
||||||
|
"post_error": "Kesalahan: {error}",
|
||||||
|
"post_form_header": "Posting pengumuman",
|
||||||
|
"post_placeholder": "Isi pengumuman",
|
||||||
|
"published_time_display": "Diterbitkan pada {time}",
|
||||||
|
"start_time_display": "Dimulai pada {time}",
|
||||||
|
"start_time_prompt": "Waktu mulai: ",
|
||||||
|
"submit_edit_action": "Kirim",
|
||||||
|
"title": "Pengumuman"
|
||||||
|
},
|
||||||
"chats": {
|
"chats": {
|
||||||
"chats": "Obrolan",
|
"chats": "Obrolan",
|
||||||
"delete": "Hapus",
|
"delete": "Hapus",
|
||||||
"delete_confirm": "Apakah Anda benar-benar ingin menghapus pesan ini?",
|
"delete_confirm": "Apakah kamu benar-benar ingin menghapus pesan ini?",
|
||||||
"empty_chat_list_placeholder": "Anda belum memiliki obrolan. Buat sbeuah obrolan baru!",
|
"empty_chat_list_placeholder": "Kamu belum memiliki obrolan. Mulai obrolan baru!",
|
||||||
"empty_message_error": "Tidak dapat memposting pesan yang kosong",
|
"empty_message_error": "Tidak dapat memposting pesan yang kosong",
|
||||||
"error_loading_chat": "Sesuatu yang salah terjadi ketika memuat obrolan.",
|
"error_loading_chat": "Sesuatu yang salah terjadi ketika memuat obrolan.",
|
||||||
"error_sending_message": "Sesuatu yang salah terjadi ketika mengirim pesan.",
|
"error_sending_message": "Sesuatu yang salah terjadi ketika mengirim pesan.",
|
||||||
"message_user": "Kirim Pesan ke {nickname}",
|
"message_user": "Kirim Pesan ke {nickname}",
|
||||||
"more": "Lebih banyak",
|
"more": "Lebih banyak",
|
||||||
"new": "Obrolan Baru",
|
"new": "Obrolan Baru",
|
||||||
"you": "Anda:"
|
"you": "Kamu:"
|
||||||
},
|
},
|
||||||
"display_date": {
|
"display_date": {
|
||||||
"today": "Hari Ini"
|
"today": "Hari Ini"
|
||||||
|
@ -40,7 +70,7 @@
|
||||||
"mute": "Bisukan",
|
"mute": "Bisukan",
|
||||||
"mute_progress": "Membisukan…",
|
"mute_progress": "Membisukan…",
|
||||||
"unmute": "Berhenti membisukan",
|
"unmute": "Berhenti membisukan",
|
||||||
"unmute_progress": "Memberhentikan pembisuan…"
|
"unmute_progress": "Menghentikan pembisuan…"
|
||||||
},
|
},
|
||||||
"emoji": {
|
"emoji": {
|
||||||
"add_emoji": "Sisipkan emoji",
|
"add_emoji": "Sisipkan emoji",
|
||||||
|
@ -51,16 +81,17 @@
|
||||||
"load_all_hint": "Memuat {saneAmount} emoji pertama, memuat semua emoji dapat menyebabkan masalah performa.",
|
"load_all_hint": "Memuat {saneAmount} emoji pertama, memuat semua emoji dapat menyebabkan masalah performa.",
|
||||||
"search_emoji": "Cari emoji",
|
"search_emoji": "Cari emoji",
|
||||||
"stickers": "Stiker",
|
"stickers": "Stiker",
|
||||||
"unicode": "Emoji unicode"
|
"unicode": "Emoji Unicode"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"storage_unavailable": "Pleroma tidak dapat mengakses penyimpanan browser. Login Anda atau pengaturan lokal Anda tidak akan tersimpan dan masalah yang tidak terduga dapat terjadi. Coba mengaktifkan kuki."
|
"storage_unavailable": "Pleroma tidak dapat mengakses penyimpanan browser. Login kamu atau pengaturan lokal kamu tidak akan tersimpan dan masalah yang tidak terduga dapat terjadi. Coba aktifkan kuki."
|
||||||
},
|
},
|
||||||
"exporter": {
|
"exporter": {
|
||||||
"export": "Ekspor",
|
"export": "Ekspor",
|
||||||
"processing": "Memproses, Anda akan segera diminta untuk mengunduh berkas Anda"
|
"processing": "Memproses, kamu akan segera diminta untuk mengunduh berkas kamu"
|
||||||
},
|
},
|
||||||
"features_panel": {
|
"features_panel": {
|
||||||
|
"media_proxy": "Proxy media",
|
||||||
"text_limit": "Batas teks",
|
"text_limit": "Batas teks",
|
||||||
"title": "Fitur-fitur",
|
"title": "Fitur-fitur",
|
||||||
"upload_limit": "Batas unggahan"
|
"upload_limit": "Batas unggahan"
|
||||||
|
@ -96,6 +127,12 @@
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
"moderator": "Moderator"
|
"moderator": "Moderator"
|
||||||
},
|
},
|
||||||
|
"scope_in_timeline": {
|
||||||
|
"direct": "Langsung",
|
||||||
|
"local": "Lokal - hanya instansi kamu yang dapat melihat postingan ini",
|
||||||
|
"private": "Hanya pengikut",
|
||||||
|
"public": "Publik"
|
||||||
|
},
|
||||||
"show_less": "Tampilkan lebih sedikit",
|
"show_less": "Tampilkan lebih sedikit",
|
||||||
"show_more": "Tampilkan lebih banyak",
|
"show_more": "Tampilkan lebih banyak",
|
||||||
"submit": "Kirim",
|
"submit": "Kirim",
|
||||||
|
@ -118,68 +155,154 @@
|
||||||
"load_older": "Muat interaksi yang lebih tua",
|
"load_older": "Muat interaksi yang lebih tua",
|
||||||
"moves": "Pengguna yang bermigrasi"
|
"moves": "Pengguna yang bermigrasi"
|
||||||
},
|
},
|
||||||
|
"languages": {
|
||||||
|
"ar": "Arab",
|
||||||
|
"az": "Azerbaijan",
|
||||||
|
"bg": "Bulgaria",
|
||||||
|
"cs": "Ceko",
|
||||||
|
"da": "Denmark",
|
||||||
|
"de": "Jerman",
|
||||||
|
"el": "Yunani",
|
||||||
|
"en": "Inggris",
|
||||||
|
"eo": "Esperanto",
|
||||||
|
"es": "Spanyol",
|
||||||
|
"fa": "Persia",
|
||||||
|
"fi": "Finlandia",
|
||||||
|
"fr": "Prancis",
|
||||||
|
"ga": "Irlandia",
|
||||||
|
"he": "Ibrani",
|
||||||
|
"hi": "Hindi",
|
||||||
|
"hu": "Hongaria",
|
||||||
|
"id": "Indonesia",
|
||||||
|
"it": "Italia",
|
||||||
|
"ja": "Jepang",
|
||||||
|
"ko": "Korea",
|
||||||
|
"lt": "Lithuania",
|
||||||
|
"lv": "Latvia",
|
||||||
|
"nl": "Belanda",
|
||||||
|
"pl": "Polandia",
|
||||||
|
"pt": "Portugal",
|
||||||
|
"ru": "Rusia",
|
||||||
|
"sk": "Slovakia",
|
||||||
|
"sv": "Swedia",
|
||||||
|
"tr": "Turki",
|
||||||
|
"translated_from": {
|
||||||
|
"ar": "Diterjemahkan dari @:languages.ar",
|
||||||
|
"bg": "Diterjemahkan dari @:languages.bg",
|
||||||
|
"en": "Diterjemahkan dari @:languages.en"
|
||||||
|
},
|
||||||
|
"uk": "Ukraina",
|
||||||
|
"zh": "Tionghoa"
|
||||||
|
},
|
||||||
|
"lists": {
|
||||||
|
"create": "Buat",
|
||||||
|
"delete": "Hapus daftar",
|
||||||
|
"lists": "Daftar",
|
||||||
|
"new": "Buat Daftar",
|
||||||
|
"save": "Simpan perubahan",
|
||||||
|
"search": "Telusuri pengguna",
|
||||||
|
"title": "Judul daftar"
|
||||||
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"authentication_code": "Kode otentikasi",
|
"authentication_code": "Kode otentikasi",
|
||||||
"description": "Masuk dengan OAuth",
|
"description": "Masuk dengan OAuth",
|
||||||
"enter_recovery_code": "Masukkan kode pemulihan",
|
"enter_recovery_code": "Masukkan kode pemulihan",
|
||||||
"enter_two_factor_code": "Masukkan kode dua-faktor",
|
"enter_two_factor_code": "Masukkan kode dua-faktor",
|
||||||
"heading": {
|
"heading": {
|
||||||
|
"recovery": "Pemulihan dua-faktor",
|
||||||
"totp": "Otentikasi dua-faktor"
|
"totp": "Otentikasi dua-faktor"
|
||||||
},
|
},
|
||||||
"hint": "Masuk untuk ikut berdiskusi",
|
"hint": "Masuk untuk ikut berdiskusi",
|
||||||
"login": "Masuk",
|
"login": "Masuk",
|
||||||
"logout": "Keluar",
|
"logout": "Keluar",
|
||||||
|
"logout_confirm": "Apa kamu yakin ingin keluar?",
|
||||||
|
"logout_confirm_accept_button": "Keluar",
|
||||||
|
"logout_confirm_cancel_button": "Batal",
|
||||||
|
"logout_confirm_title": "Keluar",
|
||||||
"password": "Kata sandi",
|
"password": "Kata sandi",
|
||||||
"placeholder": "contoh: lain",
|
"placeholder": "namapenggunaku",
|
||||||
"recovery_code": "Kode pemulihan",
|
"recovery_code": "Kode pemulihan",
|
||||||
"register": "Daftar",
|
"register": "Daftar",
|
||||||
"username": "Nama pengguna"
|
"username": "Nama pengguna"
|
||||||
},
|
},
|
||||||
"media_modal": {
|
"media_modal": {
|
||||||
"next": "Selanjutnya",
|
"counter": "{current} / {total}",
|
||||||
"previous": "Sebelum"
|
"hide": "Tutup penampil media",
|
||||||
|
"next": "Berikutnya",
|
||||||
|
"previous": "Sebelumnya"
|
||||||
|
},
|
||||||
|
"moderation": {
|
||||||
|
"moderation": "Moderasi",
|
||||||
|
"reports": {
|
||||||
|
"add_note": "Tambahkan catatan",
|
||||||
|
"close": "Tutup",
|
||||||
|
"delete_note": "Hapus",
|
||||||
|
"delete_note_accept": "Ya, hapus",
|
||||||
|
"delete_note_cancel": "Tidak, kembalikan",
|
||||||
|
"delete_note_confirm": "Apa kamu yakin ingin menghapus catatan ini?",
|
||||||
|
"delete_note_title": "Konfirmasi penghapusan",
|
||||||
|
"no_content": "Tak diberikan keterangan",
|
||||||
|
"no_reports": "Tak ada laporan",
|
||||||
|
"note_placeholder": "Tinggalkan catatan...",
|
||||||
|
"reopen": "Buka kembali",
|
||||||
|
"reports": "Laporan",
|
||||||
|
"resolve": "Selesaikan",
|
||||||
|
"show_closed": "Tampilkan yang telah ditutup"
|
||||||
|
},
|
||||||
|
"statuses": "Status",
|
||||||
|
"users": "Pengguna"
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
"about": "Tentang",
|
"about": "Tentang",
|
||||||
"administration": "Administrasi",
|
"administration": "Administrasi",
|
||||||
|
"announcements": "Pengumuman",
|
||||||
"back": "Kembali",
|
"back": "Kembali",
|
||||||
|
"bubble_timeline_description": "Postingan dari instansi yang dekat dengan instansimu, yang direkomendasikan oleh admin kamu",
|
||||||
"chats": "Obrolan",
|
"chats": "Obrolan",
|
||||||
"dms": "Pesan langsung",
|
"dms": "Pesan langsung",
|
||||||
"friend_requests": "Ingin mengikuti",
|
"friend_requests": "Ingin mengikuti",
|
||||||
"home_timeline": "Linimasa beranda",
|
"home_timeline": "Linimasa beranda",
|
||||||
|
"home_timeline_description": "Postingan dari orang yang kamu ikuti",
|
||||||
"interactions": "Interaksi",
|
"interactions": "Interaksi",
|
||||||
|
"lists": "Daftar",
|
||||||
"mentions": "Sebutan",
|
"mentions": "Sebutan",
|
||||||
|
"moderation": "Moderasi",
|
||||||
"preferences": "Preferensi",
|
"preferences": "Preferensi",
|
||||||
|
"public_timeline_description": "Postingan publik dari instansi ini",
|
||||||
"public_tl": "Linimasa publik",
|
"public_tl": "Linimasa publik",
|
||||||
"search": "Cari",
|
"search": "Penelusuran",
|
||||||
"timeline": "Linimasa",
|
"timeline": "Linimasa",
|
||||||
"timelines": "Linimasa",
|
"timelines": "Linimasa",
|
||||||
"user_search": "Pencarian Pengguna"
|
"twkn": "Jaringan Yang Dikenal",
|
||||||
|
"twkn_timeline_description": "Postingan dari seluruh jaringan",
|
||||||
|
"user_search": "Penelusuran Pengguna"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"broken_favorite": "Status tak diketahui, mencarinya…",
|
"broken_favorite": "Postingan tak dikenal, mencarinya…",
|
||||||
"error": "Terjadi kesalahan ketika memuat notifikasi: {0}",
|
"error": "Terjadi kesalahan ketika memuat notifikasi: {0}",
|
||||||
"favorited_you": "memfavoritkan status Anda",
|
"favorited_you": "memfavoritkan postinganmu",
|
||||||
"follow_request": "ingin mengikuti Anda",
|
"follow_request": "ingin mengikuti kamu",
|
||||||
"followed_you": "mengikuti Anda",
|
"followed_you": "mengikuti kamu",
|
||||||
"load_older": "Muat notifikasi yang lebih lama",
|
"load_older": "Muat notifikasi yang lebih lama",
|
||||||
"migrated_to": "bermigrasi ke",
|
"migrated_to": "bermigrasi ke",
|
||||||
"no_more_notifications": "Tidak ada notifikasi lagi",
|
"no_more_notifications": "Tidak ada notifikasi lagi",
|
||||||
"notifications": "Notifikasi",
|
"notifications": "Notifikasi",
|
||||||
|
"poll_ended": "japat telah berakhir",
|
||||||
"reacted_with": "bereaksi dengan {0}",
|
"reacted_with": "bereaksi dengan {0}",
|
||||||
"read": "Dibaca!",
|
"read": "Dibaca!",
|
||||||
"repeated_you": "mengulangi status Anda"
|
"repeated_you": "mengulangi postinganmu"
|
||||||
},
|
},
|
||||||
"password_reset": {
|
"password_reset": {
|
||||||
|
"check_email": "Periksa surelmu untuk mendapatkan tautan yang digunakan untuk mengatur ulang kata sandimu.",
|
||||||
"forgot_password": "Lupa kata sandi?",
|
"forgot_password": "Lupa kata sandi?",
|
||||||
"instruction": "Masukkan surel atau nama pengguna Anda. Kami akan mengirimkan Anda tautan untuk mengatur ulang kata sandi.",
|
"instruction": "Masukkan surel atau nama pengguna kamu. Kami akan mengirimkan kamu tautan untuk mengatur ulang kata sandi.",
|
||||||
"password_reset": "Pengatur-ulangan kata sandi",
|
"password_reset": "Pengatur ulangan kata sandi",
|
||||||
"password_reset_disabled": "Pengatur-ulangan kata sandi dinonaktifkan. Hubungi administrator instansi Anda.",
|
"password_reset_disabled": "Pengatur-ulangan kata sandi dinonaktifkan. Silakan hubungi administrator instansi kamu.",
|
||||||
"password_reset_required": "Anda harus mengatur ulang kata sandi Anda untuk masuk.",
|
"password_reset_required": "Kamu harus mengatur ulang kata sandi kamu untuk masuk.",
|
||||||
"password_reset_required_but_mailer_is_disabled": "Anda harus mengatur ulang kata sandi, tetapi pengatur-ulangan kata sandi dinonaktifkan. Silakan hubungi administrator instansi Anda.",
|
"password_reset_required_but_mailer_is_disabled": "Kamu harus mengatur ulang kata sandi, tetapi pengatur-ulangan kata sandi dinonaktifkan. Silakan hubungi administrator instansimu.",
|
||||||
"placeholder": "Surel atau nama pengguna Anda",
|
"placeholder": "Surel atau nama pengguna kamu",
|
||||||
"return_home": "Kembali ke halaman beranda",
|
"return_home": "Kembali ke halaman beranda",
|
||||||
"too_many_requests": "Anda telah mencapai batas percobaan, coba lagi nanti."
|
"too_many_requests": "Kamu telah mencapai batas percobaan, coba lagi nanti."
|
||||||
},
|
},
|
||||||
"polls": {
|
"polls": {
|
||||||
"add_option": "Tambahkan opsi",
|
"add_option": "Tambahkan opsi",
|
||||||
|
@ -190,67 +313,83 @@
|
||||||
"not_enough_options": "Terlalu sedikit opsi yang unik pada japat",
|
"not_enough_options": "Terlalu sedikit opsi yang unik pada japat",
|
||||||
"option": "Opsi",
|
"option": "Opsi",
|
||||||
"people_voted_count": "{count} orang memilih | {count} orang memilih",
|
"people_voted_count": "{count} orang memilih | {count} orang memilih",
|
||||||
|
"single_choice": "",
|
||||||
"type": "Jenis japat",
|
"type": "Jenis japat",
|
||||||
"vote": "Pilih",
|
"vote": "Pilih",
|
||||||
"votes": "suara",
|
"votes": "suara",
|
||||||
"votes_count": "{count} suara | {count} suara"
|
"votes_count": "{count} suara | {count} suara"
|
||||||
},
|
},
|
||||||
"post_status": {
|
"post_status": {
|
||||||
"account_not_locked_warning": "Akun Anda tidak {0}. Siapapun dapat mengikuti Anda untuk melihat postingan hanya-pengikut Anda.",
|
"account_not_locked_warning": "Akun kamu tidak {0}. Siapapun dapat mengikuti kamu untuk melihat postingan hanya-pengikut kamu.",
|
||||||
"account_not_locked_warning_link": "terkunci",
|
"account_not_locked_warning_link": "terkunci",
|
||||||
"attachments_sensitive": "Tandai lampiran sebagai sensitif",
|
"attachments_sensitive": "Tandai lampiran sebagai sensitif",
|
||||||
"content_type": {
|
"content_type": {
|
||||||
"text/bbcode": "BBCode",
|
"text/bbcode": "BBCode",
|
||||||
"text/html": "HTML",
|
"text/html": "HTML",
|
||||||
"text/markdown": "Markdown",
|
"text/markdown": "Markdown",
|
||||||
"text/plain": "Teks biasa"
|
"text/plain": "Teks biasa",
|
||||||
|
"text/x.misskeymarkdown": "MFM"
|
||||||
},
|
},
|
||||||
"content_warning": "Subyek (opsional)",
|
"content_warning": "Peringatan Konten (opsional)",
|
||||||
"default": "Baru saja mendarat di L.A.",
|
"default": "Baru saja tiba di Luna Nova Academy",
|
||||||
"direct_warning_to_all": "Postingan ini akan terlihat oleh pengguna yang disebutkan.",
|
"direct_warning_to_all": "Postingan ini akan terlihat oleh pengguna yang disebutkan.",
|
||||||
"direct_warning_to_first_only": "Postingan ini akan terlihat oleh pengguna yang disebutkan di awal pesan.",
|
"direct_warning_to_first_only": "Postingan ini akan terlihat oleh pengguna yang disebutkan di awal pesan.",
|
||||||
"empty_status_error": "Tidak dapat memposting status kosong tanpa berkas",
|
"edit_remote_warning": "Perubahan yang dibuat pada postingan ini mungkin tidak terlihat pada beberapa instansi!",
|
||||||
|
"edit_status": "Sunting Status",
|
||||||
|
"edit_unsupported_warning": "Japat dan sebutan tidak bisa diubah dengan menyunting.",
|
||||||
|
"empty_status_error": "Tidak dapat memposting tanpa isi atau berkas",
|
||||||
"media_description": "Keterangan media",
|
"media_description": "Keterangan media",
|
||||||
"media_description_error": "Gagal memperbarui media, coba lagi",
|
"media_description_error": "Gagal memperbarui media, coba lagi",
|
||||||
"new_status": "Posting status baru",
|
"media_not_sensitive_warning": "Kamu memasang Peringatan Konten, namun lampirannya tidak ditandai sebagai sensitif!",
|
||||||
|
"new_status": "Posting",
|
||||||
"post": "Posting",
|
"post": "Posting",
|
||||||
"posting": "Memposting",
|
"posting": "Memposting",
|
||||||
"preview": "Pratinjau",
|
"preview": "Pratinjau",
|
||||||
"preview_empty": "Kosong",
|
"preview_empty": "Kosong",
|
||||||
"scope": {
|
"scope": {
|
||||||
"direct": "Langsung - posting hanya kepada pengguna yang disebut",
|
"direct": "Langsung - posting hanya kepada pengguna yang disebut",
|
||||||
|
"local": "Lokal - postingan tidak akan difederasi",
|
||||||
"private": "Hanya-pengikut - posting hanya kepada pengikut",
|
"private": "Hanya-pengikut - posting hanya kepada pengikut",
|
||||||
"public": "Publik - posting ke linimasa publik"
|
"public": "Publik - posting ke linimasa publik"
|
||||||
},
|
},
|
||||||
"scope_notice": {
|
"scope_notice": {
|
||||||
"private": "Postingan ini akan terlihat hanya oleh pengikut Anda",
|
"local": "Postingan ini tidak akan terlihat di instansi lain",
|
||||||
"public": "Postingan ini akan terlihat oleh siapa saja"
|
"private": "Postingan ini akan terlihat hanya oleh pengikut kamu",
|
||||||
|
"public": "Postingan ini akan terlihat oleh siapa saja",
|
||||||
|
"unlisted": "Postingan ini tidak akan terlihat di Linimasa Publik dan Jaringan Yang Dikenal"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
|
"awaiting_email_confirmation": "Akunmu telah terdaftar dan sebuah surel telah dikirimkan ke alamat kamu. Harap periksa surel untuk menyelesaikan pendaftaran.",
|
||||||
|
"awaiting_email_confirmation_title": "Menunggu konfirmasi surel",
|
||||||
"bio": "Bio",
|
"bio": "Bio",
|
||||||
"bio_placeholder": "contoh.\nHai, aku Lain.\nAku seorang putri anime yang tinggal di pinggiran kota Jepang. Kamu mungkin mengenal aku dari Wired.",
|
"bio_placeholder": "cth.\nHai! Selamat datang di bioku.\nAku suka menonton anime dan bermain game. Semoga kita bisa berteman!",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
"email": "Surel",
|
"email": "Surel",
|
||||||
"fullname_placeholder": "contoh. Lain Iwakura",
|
"email_language": "Dalam bahasa apa kamu ingin menerima surel dari server ini?",
|
||||||
|
"fullname_placeholder": "cth. Atsuko Kagari",
|
||||||
"new_captcha": "Klik gambarnya untuk mendapatkan captcha baru",
|
"new_captcha": "Klik gambarnya untuk mendapatkan captcha baru",
|
||||||
"password_confirm": "Konfirmasi kata sandi",
|
"password_confirm": "Konfirmasi kata sandi",
|
||||||
"reason": "Alasan mendaftar",
|
"reason": "Alasan mendaftar",
|
||||||
"reason_placeholder": "Instansi ini menerima pendaftaran secara manual.\nBeritahu administrasinya mengapa Anda ingin mendaftar.",
|
"reason_placeholder": "Instansi ini menerima pendaftaran secara manual.\nBeritahu administrasinya mengapa kamu ingin mendaftar.",
|
||||||
"register": "Daftar",
|
"register": "Daftar",
|
||||||
"registration": "Pendaftaran",
|
"registration": "Pendaftaran",
|
||||||
|
"request_sent": "Permintaan pendaftaran kamu telah dikirim untuk diperiksa. Kamu akan menerima surel saat akunmu diterima.",
|
||||||
|
"request_sent_title": "Permintaan pendaftaran dikirim",
|
||||||
"token": "Token undangan",
|
"token": "Token undangan",
|
||||||
"username_placeholder": "contoh. lain",
|
"username_placeholder": "cth. akko",
|
||||||
"validations": {
|
"validations": {
|
||||||
"email_required": "tidak boleh kosong",
|
"email_required": "tidak boleh kosong",
|
||||||
"fullname_required": "tidak boleh kosong",
|
"fullname_required": "tidak boleh kosong",
|
||||||
|
"password_confirmation_match": "harus sama dengan kata sandi",
|
||||||
"password_confirmation_required": "tidak boleh kosong",
|
"password_confirmation_required": "tidak boleh kosong",
|
||||||
"password_required": "tidak boleh kosong",
|
"password_required": "tidak boleh kosong",
|
||||||
"username_required": "tidak boleh kosong"
|
"username_required": "tidak boleh kosong"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"remote_user_resolver": {
|
"remote_user_resolver": {
|
||||||
"error": "Tidak ditemukan."
|
"error": "Tidak ditemukan.",
|
||||||
|
"searching_for": "Mencari"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"hashtags": "Tagar",
|
"hashtags": "Tagar",
|
||||||
|
@ -263,6 +402,12 @@
|
||||||
"select_all": "Pilih semua"
|
"select_all": "Pilih semua"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
"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_privacy": "Privasi",
|
||||||
|
"add_backup": "Buat cadangan baru",
|
||||||
|
"added_backup": "Cadangan baru ditambahkan.",
|
||||||
|
"allow_following_move": "Ikuti otomatis apabila akun yang diikuti pindah",
|
||||||
"app_name": "Nama aplikasi",
|
"app_name": "Nama aplikasi",
|
||||||
"attachmentRadius": "Lampiran",
|
"attachmentRadius": "Lampiran",
|
||||||
"attachments": "Lampiran",
|
"attachments": "Lampiran",
|
||||||
|
@ -271,9 +416,10 @@
|
||||||
"avatarRadius": "Avatar",
|
"avatarRadius": "Avatar",
|
||||||
"avatar_size_instruction": "Ukuran minimum gambar avatar yang disarankan adalah 150x150 piksel.",
|
"avatar_size_instruction": "Ukuran minimum gambar avatar yang disarankan adalah 150x150 piksel.",
|
||||||
"background": "Latar belakang",
|
"background": "Latar belakang",
|
||||||
|
"backup_not_ready": "Cadangan ini belum siap.",
|
||||||
"bio": "Bio",
|
"bio": "Bio",
|
||||||
"block_export": "Ekspor blokiran",
|
"block_export": "Ekspor blokiran",
|
||||||
"block_export_button": "Ekspor blokiran Anda menjadi berkas csv",
|
"block_export_button": "Ekspor blokiranmu menjadi berkas csv",
|
||||||
"block_import": "Impor blokiran",
|
"block_import": "Impor blokiran",
|
||||||
"block_import_error": "Terjadi kesalahan ketika mengimpor blokiran",
|
"block_import_error": "Terjadi kesalahan ketika mengimpor blokiran",
|
||||||
"blocks_imported": "Blokiran diimpor! Pemrosesannya mungkin memakan sedikit waktu.",
|
"blocks_imported": "Blokiran diimpor! Pemrosesannya mungkin memakan sedikit waktu.",
|
||||||
|
@ -285,24 +431,47 @@
|
||||||
"cOrange": "Jingga (Favorit)",
|
"cOrange": "Jingga (Favorit)",
|
||||||
"cRed": "Merah (Batal)",
|
"cRed": "Merah (Batal)",
|
||||||
"change_email": "Ubah surel",
|
"change_email": "Ubah surel",
|
||||||
"change_email_error": "Ada masalah ketika mengubah surel Anda.",
|
"change_email_error": "Ada masalah ketika mengubah surel kamu.",
|
||||||
"change_password": "Ubah kata sandi",
|
"change_password": "Ubah kata sandi",
|
||||||
"change_password_error": "Ada masalah ketika mengubah kata sandi Anda.",
|
"change_password_error": "Ada masalah ketika mengubah kata sandi kamu.",
|
||||||
"changed_email": "Surel berhasil diubah!",
|
"changed_email": "Surel berhasil diubah!",
|
||||||
"changed_password": "Kata sandi berhasil diubah!",
|
"changed_password": "Kata sandi berhasil diubah!",
|
||||||
"chatMessageRadius": "Pesan obrolan",
|
"chatMessageRadius": "Pesan obrolan",
|
||||||
|
"checkboxRadius": "Kotak centang",
|
||||||
"composing": "Menulis",
|
"composing": "Menulis",
|
||||||
|
"confirm_dialogs": "Perlukan konfirmasi sebelum:",
|
||||||
|
"confirm_dialogs_approve_follow": "Menerima permintaan mengikuti",
|
||||||
|
"confirm_dialogs_block": "Memblokir seseorang",
|
||||||
|
"confirm_dialogs_delete": "Menghapus postingan",
|
||||||
|
"confirm_dialogs_deny_follow": "Menolak permintaan mengikuti",
|
||||||
|
"confirm_dialogs_mute": "Membisukan seseorang",
|
||||||
|
"confirm_dialogs_repeat": "Mengulangi postingan",
|
||||||
|
"confirm_dialogs_unfollow": "Berhenti mengikuti seseorang",
|
||||||
"confirm_new_password": "Konfirmasi kata sandi baru",
|
"confirm_new_password": "Konfirmasi kata sandi baru",
|
||||||
|
"conversation_display": "Gaya tampilan obrolan",
|
||||||
"current_password": "Kata sandi saat ini",
|
"current_password": "Kata sandi saat ini",
|
||||||
"data_import_export_tab": "Impor / ekspor data",
|
"data_import_export_tab": "Impor / ekspor data",
|
||||||
"delete_account": "Hapus akun",
|
"delete_account": "Hapus akun",
|
||||||
"delete_account_description": "Hapus data Anda secara permanen dan menonaktifkan akun Anda.",
|
"delete_account_description": "Hapus data kamu secara permanen dan nonaktifkan akunmu.",
|
||||||
"delete_account_error": "Ada masalah ketika menghapus akun Anda. Jika ini terus terjadi harap hubungi adminstrator instansi Anda.",
|
"delete_account_error": "Ada masalah ketika menghapus akun kamu. Jika ini terus terjadi harap hubungi adminstrator instansi kamu.",
|
||||||
"delete_account_instructions": "Ketik kata sandi Anda pada input di bawah untuk mengkonfirmasi penghapusan akun.",
|
"delete_account_instructions": "Ketik kata sandi kamu pada input di bawah untuk mengonfirmasi penghapusan akun.",
|
||||||
|
"discoverable": "Izinkan penelusuran akun ini pada hasil pencarian dan layanan lainnya",
|
||||||
"domain_mutes": "Domain",
|
"domain_mutes": "Domain",
|
||||||
|
"download_backup": "Unduh",
|
||||||
|
"email_language": "Bahasa yang digunakan untuk menerima surel dari server ini",
|
||||||
"emoji_reactions_on_timeline": "Tampilkan reaksi emoji pada linimasa",
|
"emoji_reactions_on_timeline": "Tampilkan reaksi emoji pada linimasa",
|
||||||
"enable_web_push_notifications": "Aktifkan notifikasi push web",
|
"enable_web_push_notifications": "Aktifkan notifikasi push web",
|
||||||
"enter_current_password_to_confirm": "Masukkan kata sandi Anda saat ini untuk mengkonfirmasi identitas Anda",
|
"enter_current_password_to_confirm": "Masukkan kata sandi kamu saat ini untuk mengonfirmasi identitas kamu",
|
||||||
|
"expire_posts_enabled": "Hapus postingan setelah jumlah hari yang ditentukan",
|
||||||
|
"expire_posts_input_placeholder": "Jumlah hari",
|
||||||
|
"file_export_import": {
|
||||||
|
"backup_restore": "Pencadangan pengaturan",
|
||||||
|
"backup_settings": "Cadangkan pengaturan ke berkas",
|
||||||
|
"backup_settings_theme": "Cadangkan pengaturan dan tema ke berkas",
|
||||||
|
"errors": {
|
||||||
|
"file_slightly_new": "Versi minor berkas berbeda, beberapa pengaturan mungkin tidak termuat"
|
||||||
|
}
|
||||||
|
},
|
||||||
"filtering": "Penyaringan",
|
"filtering": "Penyaringan",
|
||||||
"follow_import_error": "Terjadi kesalahan ketika mengimpor pengikut",
|
"follow_import_error": "Terjadi kesalahan ketika mengimpor pengikut",
|
||||||
"fun": "Seru",
|
"fun": "Seru",
|
||||||
|
@ -312,17 +481,17 @@
|
||||||
"hide_follows_count_description": "Jangan tampilkan jumlah mengikuti",
|
"hide_follows_count_description": "Jangan tampilkan jumlah mengikuti",
|
||||||
"hide_follows_description": "Jangan tampilkan siapa yang saya ikuti",
|
"hide_follows_description": "Jangan tampilkan siapa yang saya ikuti",
|
||||||
"hide_muted_posts": "Sembunyikan postingan-postingan dari pengguna yang dibisukan",
|
"hide_muted_posts": "Sembunyikan postingan-postingan dari pengguna yang dibisukan",
|
||||||
"hide_post_stats": "Sembunyikan statistik postingan (contoh. jumlah favorit)",
|
"hide_post_stats": "Sembunyikan statistik postingan (seperti jumlah favorit)",
|
||||||
"hide_shoutbox": "Sembunyikan kotak suara instansi",
|
"hide_shoutbox": "Sembunyikan kotak suara instansi",
|
||||||
"hide_user_stats": "Sembunyikan statistik pengguna (contoh. jumlah pengikut)",
|
"hide_user_stats": "Sembunyikan statistik pengguna (seperti jumlah pengikut)",
|
||||||
"hide_wallpaper": "Sembunyikan latar belakang instansi",
|
"hide_wallpaper": "Sembunyikan latar belakang instansi",
|
||||||
"import_blocks_from_a_csv_file": "Impor blokiran dari berkas csv",
|
"import_blocks_from_a_csv_file": "Impor blokiran dari berkas csv",
|
||||||
"instance_default": "(bawaan: {value})",
|
"instance_default": "(bawaan: {value})",
|
||||||
"instance_default_simple": "(bawaan)",
|
"instance_default_simple": "(bawaan)",
|
||||||
"interface": "Antarmuka",
|
"interface": "Antarmuka",
|
||||||
"interfaceLanguage": "Bahasa antarmuka",
|
"interfaceLanguage": "Bahasa antarmuka",
|
||||||
"invalid_theme_imported": "Berkas yang dipilih bukan sebuah tema yang didukung Pleroma. Tidak ada perbuahan yang dibuat pada tema Anda.",
|
"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 Anda",
|
"limited_availability": "Tidak tersedia di browser kamu",
|
||||||
"links": "Tautan",
|
"links": "Tautan",
|
||||||
"loop_video": "Ulang-ulang video",
|
"loop_video": "Ulang-ulang video",
|
||||||
"loop_video_silent_only": "Ulang-ulang video tanpa suara (seperti \"gif\" Mastodon)",
|
"loop_video_silent_only": "Ulang-ulang video tanpa suara (seperti \"gif\" Mastodon)",
|
||||||
|
@ -333,17 +502,17 @@
|
||||||
"generate_new_recovery_codes": "Hasilkan kode pemulihan baru",
|
"generate_new_recovery_codes": "Hasilkan kode pemulihan baru",
|
||||||
"otp": "OTP",
|
"otp": "OTP",
|
||||||
"recovery_codes": "Kode pemulihan.",
|
"recovery_codes": "Kode pemulihan.",
|
||||||
"recovery_codes_warning": "Tulis kode-kode nya atau simpan mereka di tempat yang aman - jika tidak Anda tidak akan melihat mereka lagi. Jika Anda tidak dapat mengakses aplikasi 2FA Anda dan kode pemulihan Anda hilang Anda tidak akan bisa mengakses akun Anda.",
|
"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": {
|
"scan": {
|
||||||
"title": "Pindai"
|
"title": "Pindai"
|
||||||
},
|
},
|
||||||
"setup_otp": "Siapkan OTP",
|
"setup_otp": "Siapkan OTP",
|
||||||
"title": "Otentikasi Dua-faktor",
|
"title": "Otentikasi Dua-faktor",
|
||||||
"verify": {
|
"verify": {
|
||||||
"desc": "Untuk mengaktifkan otentikasi dua-faktor, masukkan kode dari aplikasi dua-faktor Anda:"
|
"desc": "Untuk mengaktifkan otentikasi dua-faktor, masukkan kode dari aplikasi dua-faktor kamu:"
|
||||||
},
|
},
|
||||||
"waiting_a_recovery_codes": "Menerima kode cadangan…",
|
"waiting_a_recovery_codes": "Menerima kode cadangan…",
|
||||||
"warning_of_generate_new_codes": "Ketika Anda menghasilkan kode pemulihan baru, kode lama Anda berhenti bekerja."
|
"warning_of_generate_new_codes": "Ketika kamu menghasilkan kode pemulihan baru, kode lama kamu berhenti bekerja."
|
||||||
},
|
},
|
||||||
"more_settings": "Lebih banyak pengaturan",
|
"more_settings": "Lebih banyak pengaturan",
|
||||||
"mutes_and_blocks": "Bisuan dan Blokiran",
|
"mutes_and_blocks": "Bisuan dan Blokiran",
|
||||||
|
@ -378,8 +547,8 @@
|
||||||
"save": "Simpan perubahan",
|
"save": "Simpan perubahan",
|
||||||
"saving_err": "Terjadi kesalahan ketika menyimpan pengaturan",
|
"saving_err": "Terjadi kesalahan ketika menyimpan pengaturan",
|
||||||
"saving_ok": "Pengaturan disimpan",
|
"saving_ok": "Pengaturan disimpan",
|
||||||
"search_user_to_block": "Cari siapa yang Anda ingin blokir",
|
"search_user_to_block": "Cari siapa yang ingin kamu blokir",
|
||||||
"search_user_to_mute": "Cari siapa yang ingin Anda bisukan",
|
"search_user_to_mute": "Cari siapa yang ingin kamu bisukan",
|
||||||
"security": "Keamanan",
|
"security": "Keamanan",
|
||||||
"security_tab": "Keamanan",
|
"security_tab": "Keamanan",
|
||||||
"set_new_avatar": "Tetapkan avatar baru",
|
"set_new_avatar": "Tetapkan avatar baru",
|
||||||
|
@ -447,9 +616,9 @@
|
||||||
"switcher": {
|
"switcher": {
|
||||||
"help": {
|
"help": {
|
||||||
"fe_upgraded": "Mesin tema PleromaFE diperbarui setelah pembaruan versi.",
|
"fe_upgraded": "Mesin tema PleromaFE diperbarui setelah pembaruan versi.",
|
||||||
"future_version_imported": "Berkas yang Anda impor dibuat pada versi FE yang lebih baru.",
|
"future_version_imported": "Berkas yang kamu impor dibuat pada versi FE yang lebih baru.",
|
||||||
"older_version_imported": "Berkas yang Anda impor dibuat pada versi FE yang lebih lama.",
|
"older_version_imported": "Berkas yang kamu impor dibuat pada versi FE yang lebih lama.",
|
||||||
"upgraded_from_v2": "PleromaFE telah diperbarui, tema dapat terlihat sedikit berbeda dari apa yang Anda ingat."
|
"upgraded_from_v2": "PleromaFE telah diperbarui, tema dapat terlihat sedikit berbeda dari apa yang kamu ingat."
|
||||||
},
|
},
|
||||||
"load_theme": "Muat tema",
|
"load_theme": "Muat tema",
|
||||||
"use_snapshot": "Versi lama",
|
"use_snapshot": "Versi lama",
|
||||||
|
@ -481,7 +650,7 @@
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"delete": "Hapus status",
|
"delete": "Hapus status",
|
||||||
"delete_confirm": "Apakah Anda benar-benar ingin menghapus status ini?",
|
"delete_confirm": "Apakah kamu benar-benar ingin menghapus postingan ini?",
|
||||||
"favorites": "Favorit",
|
"favorites": "Favorit",
|
||||||
"hide_content": "",
|
"hide_content": "",
|
||||||
"mute_conversation": "Bisukan percakapan",
|
"mute_conversation": "Bisukan percakapan",
|
||||||
|
@ -524,7 +693,7 @@
|
||||||
"conversation": "Percakapan",
|
"conversation": "Percakapan",
|
||||||
"error": "Terjadi kesalahan memuat linimasa: {0}",
|
"error": "Terjadi kesalahan memuat linimasa: {0}",
|
||||||
"no_more_statuses": "Tidak ada status lagi",
|
"no_more_statuses": "Tidak ada status lagi",
|
||||||
"no_retweet_hint": "Postingan ditandai sebagai hanya-pengikut atau langsung dan tidak dapat diulang",
|
"no_retweet_hint": "Postingan ditandai sebagai hanya-pengikut atau langsung dan tidak dapat diulang atau dikutip",
|
||||||
"no_statuses": "Tidak ada status",
|
"no_statuses": "Tidak ada status",
|
||||||
"reload": "Muat ulang",
|
"reload": "Muat ulang",
|
||||||
"repeated": "diulangi"
|
"repeated": "diulangi"
|
||||||
|
@ -576,10 +745,10 @@
|
||||||
"followees": "Mengikuti",
|
"followees": "Mengikuti",
|
||||||
"followers": "Pengikut",
|
"followers": "Pengikut",
|
||||||
"following": "Diikuti!",
|
"following": "Diikuti!",
|
||||||
"follows_you": "Mengikuti Anda!",
|
"follows_you": "Mengikuti kamu!",
|
||||||
"hidden": "Disembunyikan",
|
"hidden": "Disembunyikan",
|
||||||
"hide_repeats": "Sembunyikan ulangan",
|
"hide_repeats": "Sembunyikan ulangan",
|
||||||
"its_you": "Ini Anda!",
|
"its_you": "Ini kamu!",
|
||||||
"media": "Media",
|
"media": "Media",
|
||||||
"mention": "Sebut",
|
"mention": "Sebut",
|
||||||
"message": "Kirimkan pesan",
|
"message": "Kirimkan pesan",
|
||||||
|
@ -599,10 +768,10 @@
|
||||||
"timeline_title": "Linimasa pengguna"
|
"timeline_title": "Linimasa pengguna"
|
||||||
},
|
},
|
||||||
"user_reporting": {
|
"user_reporting": {
|
||||||
"add_comment_description": "Laporan ini akan dikirim ke moderator instansi Anda. Anda dapat menyediakan penjelasan mengapa Anda melaporkan akun ini di bawah:",
|
"add_comment_description": "Laporan ini akan dikirim ke moderator instansi kamu. Kamu dapat menyediakan penjelasan mengapa kamu melaporkan akun ini di bawah:",
|
||||||
"additional_comments": "Komentar tambahan",
|
"additional_comments": "Komentar tambahan",
|
||||||
"forward_description": "Akun ini berada di server lain. Kirim salinan dari laporannya juga?",
|
"forward_description": "Akun ini berada di server lain. Kirim salinan dari laporannya juga?",
|
||||||
"generic_error": "Sebuah kesalahan terjadi ketika memproses permintaan Anda.",
|
"generic_error": "Sebuah kesalahan terjadi ketika memproses permintaan kamu.",
|
||||||
"submit": "Kirim",
|
"submit": "Kirim",
|
||||||
"title": "Melaporkan {0}"
|
"title": "Melaporkan {0}"
|
||||||
},
|
},
|
||||||
|
|
|
@ -283,13 +283,18 @@
|
||||||
"no_content": "説明なし",
|
"no_content": "説明なし",
|
||||||
"no_reports": "通報なし",
|
"no_reports": "通報なし",
|
||||||
"note_placeholder": "メモ",
|
"note_placeholder": "メモ",
|
||||||
"notes": "メモ",
|
"notes": "{count}件",
|
||||||
"reopen": "再開",
|
"reopen": "再開",
|
||||||
"report": "通報:",
|
"report": "通報:",
|
||||||
"reports": "通報",
|
"reports": "通報",
|
||||||
"resolve": "完了",
|
"resolve": "完了",
|
||||||
"show_closed": "完了した通報を表示"
|
"show_closed": "完了した通報を表示",
|
||||||
}
|
"statuses": "{count}件",
|
||||||
|
"tag_policy_notice": "TagPolicyのMRFをONにしてください",
|
||||||
|
"tags": "ポスト制限を付ける"
|
||||||
|
},
|
||||||
|
"statuses": "ポスト",
|
||||||
|
"users": "ユーザー"
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
"about": "このインスタンスについて",
|
"about": "このインスタンスについて",
|
||||||
|
@ -404,6 +409,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
|
"awaiting_email_confirmation": "あなたにメールが送られました。メールをご覧くださって、リンクをクリックしてください",
|
||||||
|
"awaiting_email_confirmation_title": "メール確認中",
|
||||||
"bio": "プロフィール",
|
"bio": "プロフィール",
|
||||||
"bio_placeholder": "例:\nこんにちは。私は玲音。\n私はアニメのキャラクターで、日本の郊外に住んでいます。私をWiredで見たことがあるかもしれません。",
|
"bio_placeholder": "例:\nこんにちは。私は玲音。\n私はアニメのキャラクターで、日本の郊外に住んでいます。私をWiredで見たことがあるかもしれません。",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
|
@ -417,6 +424,8 @@
|
||||||
"reason_placeholder": "このインスタンスは、新規登録を手動で受け付けています。\n登録したい理由を、インスタンスの管理者に教えてください。",
|
"reason_placeholder": "このインスタンスは、新規登録を手動で受け付けています。\n登録したい理由を、インスタンスの管理者に教えてください。",
|
||||||
"register": "登録",
|
"register": "登録",
|
||||||
"registration": "登録",
|
"registration": "登録",
|
||||||
|
"request_sent": "登録リクエストを送りました。登録受け入れたらメールが届きます。",
|
||||||
|
"request_sent_title": "登録リクエストを送りました",
|
||||||
"token": "招待トークン",
|
"token": "招待トークン",
|
||||||
"username_placeholder": "例: lain",
|
"username_placeholder": "例: lain",
|
||||||
"validations": {
|
"validations": {
|
||||||
|
@ -526,6 +535,8 @@
|
||||||
"enable_web_push_notifications": "ウェブプッシュ通知を許可する",
|
"enable_web_push_notifications": "ウェブプッシュ通知を許可する",
|
||||||
"enter_current_password_to_confirm": "あなたのアイデンティティを証明するため、現在のパスワードを入力してください",
|
"enter_current_password_to_confirm": "あなたのアイデンティティを証明するため、現在のパスワードを入力してください",
|
||||||
"expert_mode": "詳細設定を表示",
|
"expert_mode": "詳細設定を表示",
|
||||||
|
"expire_posts_enabled": "自動削除",
|
||||||
|
"expire_posts_input_placeholder": "日数",
|
||||||
"export_theme": "保存",
|
"export_theme": "保存",
|
||||||
"file_export_import": {
|
"file_export_import": {
|
||||||
"backup_restore": "設定をバックアップ",
|
"backup_restore": "設定をバックアップ",
|
||||||
|
@ -1035,6 +1046,7 @@
|
||||||
"collapse": "たたむ",
|
"collapse": "たたむ",
|
||||||
"conversation": "スレッド",
|
"conversation": "スレッド",
|
||||||
"error": "タイムラインの読み込みに失敗しました: {0}",
|
"error": "タイムラインの読み込みに失敗しました: {0}",
|
||||||
|
"follow_tag": "タグをフォロー",
|
||||||
"load_older": "古い投稿",
|
"load_older": "古い投稿",
|
||||||
"no_more_statuses": "これで終わりです",
|
"no_more_statuses": "これで終わりです",
|
||||||
"no_retweet_hint": "投稿を「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります",
|
"no_retweet_hint": "投稿を「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります",
|
||||||
|
@ -1044,6 +1056,7 @@
|
||||||
"show_new": "読み込み",
|
"show_new": "読み込み",
|
||||||
"socket_broke": "コード{0}によりリアルタイム接続が切断されました",
|
"socket_broke": "コード{0}によりリアルタイム接続が切断されました",
|
||||||
"socket_reconnected": "リアルタイム接続が確立されました",
|
"socket_reconnected": "リアルタイム接続が確立されました",
|
||||||
|
"unfollow_tag": "タグのフォローを解除",
|
||||||
"up_to_date": "最新"
|
"up_to_date": "最新"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
|
|
|
@ -62,7 +62,7 @@ export default function createPersistedState ({
|
||||||
}
|
}
|
||||||
loaded = true
|
loaded = true
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("Couldn't load state")
|
console.error("Couldn't load state")
|
||||||
console.error(e)
|
console.error(e)
|
||||||
loaded = true
|
loaded = true
|
||||||
}
|
}
|
||||||
|
@ -83,8 +83,8 @@ export default function createPersistedState ({
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log("Couldn't persist state:")
|
console.error("Couldn't persist state:")
|
||||||
console.log(e)
|
console.error(e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
15
src/main.js
15
src/main.js
|
@ -21,6 +21,7 @@ import postStatusModule from './modules/postStatus.js'
|
||||||
import announcementsModule from './modules/announcements.js'
|
import announcementsModule from './modules/announcements.js'
|
||||||
import editStatusModule from './modules/editStatus.js'
|
import editStatusModule from './modules/editStatus.js'
|
||||||
import statusHistoryModule from './modules/statusHistory.js'
|
import statusHistoryModule from './modules/statusHistory.js'
|
||||||
|
import tagModule from './modules/tags.js'
|
||||||
|
|
||||||
import { createI18n } from 'vue-i18n'
|
import { createI18n } from 'vue-i18n'
|
||||||
|
|
||||||
|
@ -51,6 +52,17 @@ const persistedStateOptions = {
|
||||||
};
|
};
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
|
if ('serviceWorker' in navigator) {
|
||||||
|
// declaring scope manually
|
||||||
|
navigator.serviceWorker.register('/sw-pleroma.js', {scope: '/'}).then((registration) => {
|
||||||
|
console.log('Service worker registration succeeded:', registration);
|
||||||
|
}, /*catch*/ (error) => {
|
||||||
|
console.error(`Service worker registration failed: ${error}`);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error('Service workers are not supported.');
|
||||||
|
}
|
||||||
|
|
||||||
let storageError = false
|
let storageError = false
|
||||||
const plugins = [pushNotifications]
|
const plugins = [pushNotifications]
|
||||||
try {
|
try {
|
||||||
|
@ -85,7 +97,8 @@ const persistedStateOptions = {
|
||||||
postStatus: postStatusModule,
|
postStatus: postStatusModule,
|
||||||
announcements: announcementsModule,
|
announcements: announcementsModule,
|
||||||
editStatus: editStatusModule,
|
editStatus: editStatusModule,
|
||||||
statusHistory: statusHistoryModule
|
statusHistory: statusHistoryModule,
|
||||||
|
tags: tagModule
|
||||||
},
|
},
|
||||||
plugins,
|
plugins,
|
||||||
strict: false // Socket modifies itself, let's ignore this for now.
|
strict: false // Socket modifies itself, let's ignore this for now.
|
||||||
|
|
|
@ -76,11 +76,9 @@ export const defaultState = {
|
||||||
hideScopeNotice: false,
|
hideScopeNotice: false,
|
||||||
useStreamingApi: false,
|
useStreamingApi: false,
|
||||||
sidebarRight: undefined, // instance default
|
sidebarRight: undefined, // instance default
|
||||||
scopeCopy: undefined, // instance default
|
|
||||||
subjectLineBehavior: undefined, // instance default
|
subjectLineBehavior: undefined, // instance default
|
||||||
alwaysShowSubjectInput: undefined, // instance default
|
alwaysShowSubjectInput: undefined, // instance default
|
||||||
postContentType: undefined, // instance default
|
postContentType: undefined, // instance default
|
||||||
minimalScopesMode: undefined, // instance default
|
|
||||||
// This hides statuses filtered via a word filter
|
// This hides statuses filtered via a word filter
|
||||||
hideFilteredStatuses: undefined, // instance default
|
hideFilteredStatuses: undefined, // instance default
|
||||||
modalOnRepeat: undefined, // instance default
|
modalOnRepeat: undefined, // instance default
|
||||||
|
|
|
@ -53,12 +53,10 @@ const defaultState = {
|
||||||
logoMargin: '.2em',
|
logoMargin: '.2em',
|
||||||
logoMask: true,
|
logoMask: true,
|
||||||
logoLeft: false,
|
logoLeft: false,
|
||||||
minimalScopesMode: false,
|
|
||||||
nsfwCensorImage: undefined,
|
nsfwCensorImage: undefined,
|
||||||
postContentType: 'text/plain',
|
postContentType: 'text/plain',
|
||||||
redirectRootLogin: '/main/friends',
|
redirectRootLogin: '/main/friends',
|
||||||
redirectRootNoLogin: '/main/all',
|
redirectRootNoLogin: '/main/all',
|
||||||
scopeCopy: true,
|
|
||||||
showFeaturesPanel: true,
|
showFeaturesPanel: true,
|
||||||
showInstanceSpecificPanel: false,
|
showInstanceSpecificPanel: false,
|
||||||
showNavShortcuts: true,
|
showNavShortcuts: true,
|
||||||
|
|
37
src/modules/tags.js
Normal file
37
src/modules/tags.js
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
import { merge } from 'lodash'
|
||||||
|
|
||||||
|
const tags = {
|
||||||
|
state: {
|
||||||
|
// Contains key = id, value = number of trackers for this poll
|
||||||
|
tags: {}
|
||||||
|
},
|
||||||
|
mutations: {
|
||||||
|
setTag (state, { name, data }) {
|
||||||
|
state.tags[name] = data
|
||||||
|
}
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
getTag ({ rootState, commit }, tagName) {
|
||||||
|
return rootState.api.backendInteractor.getHashtag({ tag: tagName }).then(tag => {
|
||||||
|
commit('setTag', { name: tagName, data: tag })
|
||||||
|
return tag
|
||||||
|
})
|
||||||
|
},
|
||||||
|
followTag (store, tagName) {
|
||||||
|
return store.rootState.api.backendInteractor.followHashtag({ tag: tagName })
|
||||||
|
.then((resp) => {
|
||||||
|
store.commit('setTag', { name: tagName, data: resp })
|
||||||
|
return resp
|
||||||
|
})
|
||||||
|
},
|
||||||
|
unfollowTag ({ rootState, commit }, tag) {
|
||||||
|
return rootState.api.backendInteractor.unfollowHashtag({ tag })
|
||||||
|
.then((resp) => {
|
||||||
|
commit('setTag', { name: tag, data: resp })
|
||||||
|
return resp
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default tags
|
|
@ -489,9 +489,17 @@ const users = {
|
||||||
let data = await rootState.api.backendInteractor.register(
|
let data = await rootState.api.backendInteractor.register(
|
||||||
{ params: { ...userInfo } }
|
{ params: { ...userInfo } }
|
||||||
)
|
)
|
||||||
|
if (data.identifier === 'awaiting_approval' || data.identifier === 'missing_confirmed_email') {
|
||||||
|
store.commit('signUpSuccess')
|
||||||
|
return data
|
||||||
|
} else if (data.me !== undefined) {
|
||||||
store.commit('signUpSuccess')
|
store.commit('signUpSuccess')
|
||||||
store.commit('setToken', data.access_token)
|
store.commit('setToken', data.access_token)
|
||||||
store.dispatch('loginUser', data.access_token)
|
store.dispatch('loginUser', data.access_token)
|
||||||
|
return data
|
||||||
|
} else {
|
||||||
|
store.commit('signUpFailure', data)
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
let errors = e.message
|
let errors = e.message
|
||||||
store.commit('signUpFailure', errors)
|
store.commit('signUpFailure', errors)
|
||||||
|
|
|
@ -108,6 +108,9 @@ const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements
|
||||||
const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
|
const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
|
||||||
const AKKOMA_SETTING_PROFILE_URL = (name) => `/api/v1/akkoma/frontend_settings/pleroma-fe/${name}`
|
const AKKOMA_SETTING_PROFILE_URL = (name) => `/api/v1/akkoma/frontend_settings/pleroma-fe/${name}`
|
||||||
const AKKOMA_SETTING_PROFILE_LIST = `/api/v1/akkoma/frontend_settings/pleroma-fe`
|
const AKKOMA_SETTING_PROFILE_LIST = `/api/v1/akkoma/frontend_settings/pleroma-fe`
|
||||||
|
const MASTODON_TAG_URL = (name) => `/api/v1/tags/${name}`
|
||||||
|
const MASTODON_FOLLOW_TAG_URL = (name) => `/api/v1/tags/${name}/follow`
|
||||||
|
const MASTODON_UNFOLLOW_TAG_URL = (name) => `/api/v1/tags/${name}/unfollow`
|
||||||
|
|
||||||
const oldfetch = window.fetch
|
const oldfetch = window.fetch
|
||||||
|
|
||||||
|
@ -650,7 +653,7 @@ const getReports = ({ state, limit, page, pageSize, credentials }) => {
|
||||||
url = url + (args ? '?' + args : '')
|
url = url + (args ? '?' + args : '')
|
||||||
return fetch(url, { headers: authHeaders(credentials) })
|
return fetch(url, { headers: authHeaders(credentials) })
|
||||||
.then((data) => data.json())
|
.then((data) => data.json())
|
||||||
.then((data) => data.reports.map(parseReport))
|
.then((data) => data?.reports?.map(parseReport) ?? [])
|
||||||
}
|
}
|
||||||
|
|
||||||
const updateReportStates = ({ credentials, reports }) => {
|
const updateReportStates = ({ credentials, reports }) => {
|
||||||
|
@ -1549,6 +1552,29 @@ const listSettingsProfiles = ({ credentials }) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const getHashtag = ({ tag, credentials }) => {
|
||||||
|
return promisedRequest({
|
||||||
|
url: MASTODON_TAG_URL(tag),
|
||||||
|
credentials
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const followHashtag = ({ tag, credentials }) => {
|
||||||
|
return promisedRequest({
|
||||||
|
url: MASTODON_FOLLOW_TAG_URL(tag),
|
||||||
|
method: 'POST',
|
||||||
|
credentials
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const unfollowHashtag = ({ tag, credentials }) => {
|
||||||
|
return promisedRequest({
|
||||||
|
url: MASTODON_UNFOLLOW_TAG_URL(tag),
|
||||||
|
method: 'POST',
|
||||||
|
credentials
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => {
|
export const getMastodonSocketURI = ({ credentials, stream, args = {} }) => {
|
||||||
return Object.entries({
|
return Object.entries({
|
||||||
...(credentials
|
...(credentials
|
||||||
|
@ -1784,7 +1810,10 @@ const apiService = {
|
||||||
getReports,
|
getReports,
|
||||||
updateReportStates,
|
updateReportStates,
|
||||||
addNoteToReport,
|
addNoteToReport,
|
||||||
deleteNoteFromReport
|
deleteNoteFromReport,
|
||||||
|
getHashtag,
|
||||||
|
followHashtag,
|
||||||
|
unfollowHashtag
|
||||||
}
|
}
|
||||||
|
|
||||||
export default apiService
|
export default apiService
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
import { promiseInterval } from '../promise_interval/promise_interval.js'
|
import { promiseInterval } from '../promise_interval/promise_interval.js'
|
||||||
|
|
||||||
const startFetching = ({ credentials, store }) => {
|
const startFetching = ({ credentials, store }) => {
|
||||||
console.log('startFetching: Config')
|
|
||||||
const boundFetchAndUpdate = () => store.dispatch('getSettingsProfile')
|
const boundFetchAndUpdate = () => store.dispatch('getSettingsProfile')
|
||||||
boundFetchAndUpdate()
|
boundFetchAndUpdate()
|
||||||
return promiseInterval(boundFetchAndUpdate, 10 * 60000)
|
return promiseInterval(boundFetchAndUpdate, 10 * 60000)
|
||||||
|
|
|
@ -90,6 +90,7 @@ export const parseUser = (data) => {
|
||||||
output.bot = data.bot
|
output.bot = data.bot
|
||||||
if (data.akkoma) {
|
if (data.akkoma) {
|
||||||
output.instance = data.akkoma.instance
|
output.instance = data.akkoma.instance
|
||||||
|
output.status_ttl_days = data.akkoma.status_ttl_days
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.pleroma) {
|
if (data.pleroma) {
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import runtime from 'serviceworker-webpack-plugin/lib/runtime'
|
|
||||||
|
|
||||||
function urlBase64ToUint8Array (base64String) {
|
function urlBase64ToUint8Array (base64String) {
|
||||||
const padding = '='.repeat((4 - base64String.length % 4) % 4)
|
const padding = '='.repeat((4 - base64String.length % 4) % 4)
|
||||||
const base64 = (base64String + padding)
|
const base64 = (base64String + padding)
|
||||||
|
@ -15,7 +13,7 @@ function isPushSupported () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getOrCreateServiceWorker () {
|
function getOrCreateServiceWorker () {
|
||||||
return runtime.register()
|
return navigator.serviceWorker.register('/sw-pleroma.js')
|
||||||
.catch((err) => console.error('Unable to get or create a service worker.', err))
|
.catch((err) => console.error('Unable to get or create a service worker.', err))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,9 @@ import { parseNotification } from './services/entity_normalizer/entity_normalize
|
||||||
import { prepareNotificationObject } from './services/notification_utils/notification_utils.js'
|
import { prepareNotificationObject } from './services/notification_utils/notification_utils.js'
|
||||||
import { createI18n } from 'vue-i18n'
|
import { createI18n } from 'vue-i18n'
|
||||||
import messages from './i18n/service_worker_messages.js'
|
import messages from './i18n/service_worker_messages.js'
|
||||||
|
import { precacheAndRoute } from 'workbox-precaching/precacheAndRoute';
|
||||||
|
|
||||||
|
precacheAndRoute(self.__WB_MANIFEST);
|
||||||
const i18n = createI18n({
|
const i18n = createI18n({
|
||||||
// By default, use the browser locale, we will update it if neccessary
|
// By default, use the browser locale, we will update it if neccessary
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
|
|
|
@ -13,12 +13,10 @@
|
||||||
"logoMargin": ".1em",
|
"logoMargin": ".1em",
|
||||||
"logoMask": true,
|
"logoMask": true,
|
||||||
"logoLeft": false,
|
"logoLeft": false,
|
||||||
"minimalScopesMode": false,
|
|
||||||
"nsfwCensorImage": "",
|
"nsfwCensorImage": "",
|
||||||
"postContentType": "text/plain",
|
"postContentType": "text/plain",
|
||||||
"redirectRootLogin": "/main/friends",
|
"redirectRootLogin": "/main/friends",
|
||||||
"redirectRootNoLogin": "/main/all",
|
"redirectRootNoLogin": "/main/all",
|
||||||
"scopeCopy": true,
|
|
||||||
"showFeaturesPanel": true,
|
"showFeaturesPanel": true,
|
||||||
"showInstanceSpecificPanel": false,
|
"showInstanceSpecificPanel": false,
|
||||||
"sidebarRight": false,
|
"sidebarRight": false,
|
||||||
|
|
4
static/custom.css
Normal file
4
static/custom.css
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
/* THIS IS A PLACEHOLDER FILE
|
||||||
|
place a css file at $static_dir/static/custom.css
|
||||||
|
to apply custom styles to your frontend
|
||||||
|
*/
|
BIN
static/logo-512.png
Executable file
BIN
static/logo-512.png
Executable file
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
99
static/logo.svg
Normal file → Executable file
99
static/logo.svg
Normal file → Executable file
|
@ -1,71 +1,34 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<svg
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 362.83 362.83">
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
<defs>
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
<style>
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
.cls-1 {
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
fill: #462d7a;
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
}
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
.cls-2 {
|
||||||
version="1.1"
|
stroke: #2c1e50;
|
||||||
id="svg4485"
|
}
|
||||||
width="512"
|
|
||||||
height="512"
|
.cls-2, .cls-3 {
|
||||||
viewBox="0 0 512 512"
|
stroke-miterlimit: 10;
|
||||||
sodipodi:docname="logo.svg"
|
}
|
||||||
inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
|
|
||||||
<metadata
|
.cls-3 {
|
||||||
id="metadata4491">
|
stroke: #fff;
|
||||||
<rdf:RDF>
|
}
|
||||||
<cc:Work
|
</style>
|
||||||
rdf:about="">
|
</defs>
|
||||||
<dc:format>image/svg+xml</dc:format>
|
<g id="Layer_9" data-name="Layer 9">
|
||||||
<dc:type
|
<path class="cls-2" d="M269.3,197.19c-5.77-11.54-85.59,16.83-154.76,27.39-21.09,3.22-38.13,4.31-47.3,4.75-.74,2.91-1.76,7.02-2.87,11.97-1.93,8.6-2.89,12.89-2.6,13.78,3.3,9.95,59.73-.88,99.18-7.64,32.67-5.6,115.14-18.96,114.61-30.77-.03-.69-1.11-4.01-3.27-10.65-1.78-5.47-2.67-8.2-2.98-8.83Z"/>
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs4489" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1274"
|
|
||||||
inkscape:window-height="1410"
|
|
||||||
id="namedview4487"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="1.2636719"
|
|
||||||
inkscape:cx="305.99333"
|
|
||||||
inkscape:cy="304.30809"
|
|
||||||
inkscape:window-x="1280"
|
|
||||||
inkscape:window-y="22"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="g4612"
|
|
||||||
inkscape:document-rotation="0" />
|
|
||||||
<g
|
|
||||||
id="g4612">
|
|
||||||
<g
|
|
||||||
id="g850"
|
|
||||||
transform="matrix(0.99659595,0,0,0.99659595,0.37313949,0.87143746)">
|
|
||||||
<path
|
|
||||||
style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#009bff;stroke-width:0;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.175879"
|
|
||||||
d="m 194.75841,124.65165 a 20.449443,20.449443 0 0 0 -20.44944,20.44945 v 242.24725 h 65.28091 v -262.6967 z"
|
|
||||||
id="path4497" />
|
|
||||||
<path
|
|
||||||
style="fill:#fba457;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="M 272.6236,124.65165 V 256 h 45.61799 a 20.449443,20.449443 0 0 0 20.44944,-20.44945 v -110.8989 z"
|
|
||||||
id="path4516" />
|
|
||||||
<path
|
|
||||||
style="opacity:1;fill:#fba457;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
d="m 272.6236,322.06744 v 65.28091 h 45.61799 a 20.449443,20.449443 0 0 0 20.44944,-20.44945 v -44.83146 z"
|
|
||||||
id="path4516-5" />
|
|
||||||
</g>
|
</g>
|
||||||
|
<g id="Layer_6" data-name="Layer 6">
|
||||||
|
<path class="cls-1" d="M115.2,131.89c6.26-6.54,20.19-20.63,42.39-26.14,15.79-3.92,28.51-1.28,33.51,0,83.72,21.41,116.03,201.78,77.79,226.32-10.28,6.6-26.86,2.7-36.77-3.3-32.63-19.78-29.3-72.87-44.44-73.73-5.11-.29-7.15,5.8-20.91,24.94-19.63,27.3-31.49,43.44-49.21,50.87-2.53,1.06-26.91,12.07-41.84,1.23-38.55-28-2.96-155.84,39.49-200.18Zm56.31,10.45c-27.39-.52-46.38,38.21-37.98,54.55,10.09,19.62,65.5,18.26,74.77-3.3,7.21-16.78-11.38-50.77-36.79-51.24Z"/>
|
||||||
|
</g>
|
||||||
|
<g id="Layer_4" data-name="Layer 4">
|
||||||
|
<path d="M68.93,86.51c-6.55,27.74,252.45,113.97,267.56,89.66,9.24-14.87-64.9-83.62-163.53-97.57-39.06-5.52-100.95-5.14-104.03,7.91Z"/>
|
||||||
|
</g>
|
||||||
|
<g id="Layer_5" data-name="Layer 5">
|
||||||
|
<path class="cls-3" d="M138.96,93.76c.41-5.25,6.51-5.74,28.85-19.42,26.97-16.51,28.85-22.38,56.86-40.83,30.07-19.81,48.46-31.94,54.82-26.61,9.72,8.15-25.18,43.33-21.31,99.35,.87,12.61,3.12,17.79-.86,23.01-18.25,23.95-120.07-13.68-118.35-35.5Z"/>
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 1.7 KiB |
|
@ -4,7 +4,7 @@
|
||||||
// https://github.com/webpack/karma-webpack
|
// https://github.com/webpack/karma-webpack
|
||||||
|
|
||||||
// var path = require('path')
|
// var path = require('path')
|
||||||
var merge = require('webpack-merge')
|
var { merge } = require('webpack-merge')
|
||||||
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
var HtmlWebpackPlugin = require('html-webpack-plugin')
|
||||||
var baseConfig = require('../../build/webpack.base.conf')
|
var baseConfig = require('../../build/webpack.base.conf')
|
||||||
var utils = require('../../build/utils')
|
var utils = require('../../build/utils')
|
||||||
|
@ -16,7 +16,7 @@ var webpackConfig = merge(baseConfig, {
|
||||||
module: {
|
module: {
|
||||||
rules: utils.styleLoaders()
|
rules: utils.styleLoaders()
|
||||||
},
|
},
|
||||||
devtool: '#inline-source-map',
|
devtool: 'inline-source-map',
|
||||||
// vue: {
|
// vue: {
|
||||||
// loaders: {
|
// loaders: {
|
||||||
// js: 'isparta'
|
// js: 'isparta'
|
||||||
|
|
|
@ -194,8 +194,9 @@ describe('API Entities normalizer', () => {
|
||||||
|
|
||||||
expect(parsedPost).to.have.property('type', 'status')
|
expect(parsedPost).to.have.property('type', 'status')
|
||||||
expect(parsedRepeat).to.have.property('type', 'retweet')
|
expect(parsedRepeat).to.have.property('type', 'retweet')
|
||||||
|
console.log(parsedRepeat)
|
||||||
expect(parsedRepeat).to.have.property('retweeted_status')
|
expect(parsedRepeat).to.have.property('retweeted_status')
|
||||||
expect(parsedRepeat).to.have.deep.property('retweeted_status.id', 'deadbeef')
|
expect(parsedRepeat).to.have.nested.property('retweeted_status.id', 'deadbeef')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('sets nsfw for statuses with the #nsfw tag', () => {
|
it('sets nsfw for statuses with the #nsfw tag', () => {
|
||||||
|
@ -229,7 +230,7 @@ describe('API Entities normalizer', () => {
|
||||||
expect(parsedPost).to.have.property('type', 'status')
|
expect(parsedPost).to.have.property('type', 'status')
|
||||||
expect(parsedRepeat).to.have.property('type', 'retweet')
|
expect(parsedRepeat).to.have.property('type', 'retweet')
|
||||||
expect(parsedRepeat).to.have.property('retweeted_status')
|
expect(parsedRepeat).to.have.property('retweeted_status')
|
||||||
expect(parsedRepeat).to.have.deep.property('retweeted_status.id', 'deadbeef')
|
expect(parsedRepeat).to.have.nested.property('retweeted_status.id', 'deadbeef')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -284,9 +285,9 @@ describe('API Entities normalizer', () => {
|
||||||
})
|
})
|
||||||
expect(parseNotification(notif)).to.have.property('id', 123)
|
expect(parseNotification(notif)).to.have.property('id', 123)
|
||||||
expect(parseNotification(notif)).to.have.property('seen', false)
|
expect(parseNotification(notif)).to.have.property('seen', false)
|
||||||
expect(parseNotification(notif)).to.have.deep.property('status.id', '444')
|
expect(parseNotification(notif)).to.have.nested.property('status.id', '444')
|
||||||
expect(parseNotification(notif)).to.have.deep.property('action.id', '444')
|
expect(parseNotification(notif)).to.have.nested.property('action.id', '444')
|
||||||
expect(parseNotification(notif)).to.have.deep.property('from_profile.id', 'spurdo')
|
expect(parseNotification(notif)).to.have.nested.property('from_profile.id', 'spurdo')
|
||||||
})
|
})
|
||||||
|
|
||||||
it('correctly normalizes favorite notifications', () => {
|
it('correctly normalizes favorite notifications', () => {
|
||||||
|
@ -303,9 +304,9 @@ describe('API Entities normalizer', () => {
|
||||||
expect(parseNotification(notif)).to.have.property('id', 123)
|
expect(parseNotification(notif)).to.have.property('id', 123)
|
||||||
expect(parseNotification(notif)).to.have.property('type', 'like')
|
expect(parseNotification(notif)).to.have.property('type', 'like')
|
||||||
expect(parseNotification(notif)).to.have.property('seen', true)
|
expect(parseNotification(notif)).to.have.property('seen', true)
|
||||||
expect(parseNotification(notif)).to.have.deep.property('status.id', '4412')
|
expect(parseNotification(notif)).to.have.nested.property('status.id', '4412')
|
||||||
expect(parseNotification(notif)).to.have.deep.property('action.id', '444')
|
expect(parseNotification(notif)).to.have.nested.property('action.id', '444')
|
||||||
expect(parseNotification(notif)).to.have.deep.property('from_profile.id', 'spurdo')
|
expect(parseNotification(notif)).to.have.nested.property('from_profile.id', 'spurdo')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue