forked from AkkomaGang/akkoma-fe
Compare commits
2 commits
Author | SHA1 | Date | |
---|---|---|---|
ef64d693da | |||
669b3a41ca |
120 changed files with 2582 additions and 3478 deletions
|
@ -1,49 +0,0 @@
|
||||||
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."
|
|
|
@ -1,29 +0,0 @@
|
||||||
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."
|
|
12
README.md
12
README.md
|
@ -1,22 +1,22 @@
|
||||||
# Akkoma-FE
|
# Pleroma-FE
|
||||||
|
|
||||||
![English OK](https://img.shields.io/badge/English-OK-blueviolet) ![日本語OK](https://img.shields.io/badge/%E6%97%A5%E6%9C%AC%E8%AA%9E-OK-blueviolet)
|
![English OK](https://img.shields.io/badge/English-OK-blueviolet) ![日本語OK](https://img.shields.io/badge/%E6%97%A5%E6%9C%AC%E8%AA%9E-OK-blueviolet)
|
||||||
|
|
||||||
This is a fork of Akkoma-FE from the Pleroma project, with support for new Akkoma features such as:
|
This is a fork of Pleroma-FE from the Pleroma project, with support for new Akkoma features such as:
|
||||||
- MFM support via [marked-mfm](https://akkoma.dev/sfr/marked-mfm)
|
- MFM support via [marked-mfm](https://akkoma.dev/sfr/marked-mfm)
|
||||||
- Custom emoji reactions
|
- Custom emoji reactions
|
||||||
|
|
||||||
# For Translators
|
# For Translators
|
||||||
|
|
||||||
The [Weblate UI](https://translate.akkoma.dev/projects/akkoma/pleroma-fe/) is recommended for adding or modifying translations for Akkoma-FE.
|
The [Weblate UI](https://translate.akkoma.dev/projects/akkoma/pleroma-fe/) is recommended for adding or modifying translations for Pleroma-FE.
|
||||||
|
|
||||||
Alternatively, edit/create `src/i18n/$LANGUAGE_CODE.json` (where `$LANGUAGE_CODE` is the [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language), then add your language to [src/i18n/messages.js](https://akkoma.dev/AkkomaGang/pleroma-fe/src/branch/develop/src/i18n/messages.js) if it doesn't already exist there.
|
Alternatively, edit/create `src/i18n/$LANGUAGE_CODE.json` (where `$LANGUAGE_CODE` is the [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language), then add your language to [src/i18n/messages.js](https://akkoma.dev/AkkomaGang/pleroma-fe/src/branch/develop/src/i18n/messages.js) if it doesn't already exist there.
|
||||||
|
|
||||||
Akkoma-FE will set your language by your browser locale, but you can temporarily force it in the code by changing the locale in main.js.
|
Pleroma-FE will set your language by your browser locale, but you can temporarily force it in the code by changing the locale in main.js.
|
||||||
|
|
||||||
# FOR ADMINS
|
# FOR ADMINS
|
||||||
|
|
||||||
To use Akkoma-FE in Akkoma, use the [frontend](https://docs.akkoma.dev/stable/administration/CLI_tasks/frontend/) CLI task to install Akkoma-FE, then modify your configuration as described in the [Frontend Management](https://docs.akkoma.dev/stable/configuration/frontend_management/) doc.
|
To use Pleroma-FE in Akkoma, use the [frontend](https://docs.akkoma.dev/stable/administration/CLI_tasks/frontend/) CLI task to install Pleroma-FE, then modify your configuration as described in the [Frontend Management](https://docs.akkoma.dev/stable/configuration/frontend_management/) doc.
|
||||||
|
|
||||||
## Build Setup
|
## Build Setup
|
||||||
|
|
||||||
|
@ -52,4 +52,4 @@ Edit config.json for configuration.
|
||||||
|
|
||||||
### Login methods
|
### Login methods
|
||||||
|
|
||||||
```loginMethod``` can be set to either ```password``` (the default) or ```token```, which will use the full oauth redirection flow, which is useful for SSO situations.
|
```loginMethod``` can be set to either ```password``` (the default) or ```token```, which will use the full oauth redirection flow, which is useful for SSO situations.
|
||||||
|
|
|
@ -31,13 +31,15 @@ var devMiddleware = require('webpack-dev-middleware')(compiler, {
|
||||||
var hotMiddleware = require('webpack-hot-middleware')(compiler)
|
var hotMiddleware = require('webpack-hot-middleware')(compiler)
|
||||||
|
|
||||||
// proxy api requests
|
// proxy api requests
|
||||||
Object.keys(proxyTable).forEach(function (context) {
|
if (!process.env.NO_DEV_PROXY) {
|
||||||
var options = proxyTable[context]
|
Object.keys(proxyTable).forEach(function (context) {
|
||||||
if (typeof options === 'string') {
|
var options = proxyTable[context]
|
||||||
options = { target: options }
|
if (typeof options === 'string') {
|
||||||
}
|
options = { target: options }
|
||||||
app.use(proxyMiddleware(context, options))
|
}
|
||||||
})
|
app.use(proxyMiddleware(context, options))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// handle fallback for HTML5 history API
|
// handle fallback for HTML5 history API
|
||||||
app.use(require('connect-history-api-fallback')())
|
app.use(require('connect-history-api-fallback')())
|
||||||
|
|
4
config/cypress.json
Normal file
4
config/cypress.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"target": "http://cypress.example.com",
|
||||||
|
"staticConfigPreference": false
|
||||||
|
}
|
|
@ -1,14 +1,16 @@
|
||||||
// see http://vuejs-templates.github.io/webpack for documentation.
|
// see http://vuejs-templates.github.io/webpack for documentation.
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
let settings = {}
|
let settings = {}
|
||||||
|
const localSettings = process.env.CONFIG || './local.json'
|
||||||
|
console.log('Using settings', localSettings)
|
||||||
try {
|
try {
|
||||||
settings = require('./local.json')
|
settings = require(localSettings)
|
||||||
if (settings.target && settings.target.endsWith('/')) {
|
if (settings.target && settings.target.endsWith('/')) {
|
||||||
// replacing trailing slash since it can conflict with some apis
|
// replacing trailing slash since it can conflict with some apis
|
||||||
// and that's how actual BE reports its url
|
// and that's how actual BE reports its url
|
||||||
settings.target = settings.target.replace(/\/$/, '')
|
settings.target = settings.target.replace(/\/$/, '')
|
||||||
}
|
}
|
||||||
console.log('Using local dev server settings (/config/local.json):')
|
console.log('Using local dev server settings:')
|
||||||
console.log(JSON.stringify(settings, null, 2))
|
console.log(JSON.stringify(settings, null, 2))
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log('Local dev server settings not found (/config/local.json)')
|
console.log('Local dev server settings not found (/config/local.json)')
|
||||||
|
@ -38,11 +40,6 @@ 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,
|
||||||
|
|
20
cypress.config.js
Normal file
20
cypress.config.js
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
const { defineConfig } = require("cypress");
|
||||||
|
const config = require('./build/webpack.dev.conf');
|
||||||
|
module.exports = defineConfig({
|
||||||
|
e2e: {
|
||||||
|
baseUrl: "http://localhost:8080",
|
||||||
|
setupNodeEvents(on, config) {
|
||||||
|
// implement node event listeners here
|
||||||
|
},
|
||||||
|
viewportHeight: 1080,
|
||||||
|
viewportWidth: 1920,
|
||||||
|
},
|
||||||
|
|
||||||
|
component: {
|
||||||
|
devServer: {
|
||||||
|
framework: "vue",
|
||||||
|
bundler: "webpack",
|
||||||
|
webpackConfig: config
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
34
cypress/e2e/auth/auth.cy.js
Normal file
34
cypress/e2e/auth/auth.cy.js
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/// <reference types="cypress" />
|
||||||
|
|
||||||
|
describe('signing in', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
cy.clearLocalStorage()
|
||||||
|
await indexedDB.deleteDatabase('localforage')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('registers an oauth application', async () => {
|
||||||
|
cy.defaultIntercepts();
|
||||||
|
cy.intercept('POST', '/oauth/token', { fixture: 'oauth_token.json'}).as('createToken')
|
||||||
|
cy.intercept('/api/v1/accounts/verify_credentials', { fixture: 'user.json' }).as('verifyCredentials')
|
||||||
|
cy.visit('/')
|
||||||
|
cy.wait('@getInstance')
|
||||||
|
cy.get('input#username').type('testuser');
|
||||||
|
cy.get('input#password').type('testpassword');
|
||||||
|
cy.get('button[type="submit"]').click();
|
||||||
|
|
||||||
|
cy.wait('@createApp')
|
||||||
|
cy.wait('@createToken').then((interception) => {
|
||||||
|
console.log(interception.request)
|
||||||
|
const form = interception.request.body.split('\r\n---')
|
||||||
|
cy.expectHtmlFormEntryToBe(form, 'grant_type', 'client_credentials')
|
||||||
|
});
|
||||||
|
cy.wait('@createToken').then((interception) => {
|
||||||
|
console.log(interception.request)
|
||||||
|
const form = interception.request.body.split('\r\n---')
|
||||||
|
cy.expectHtmlFormEntryToBe(form, 'grant_type', 'password')
|
||||||
|
cy.expectHtmlFormEntryToBe(form, 'username', 'testuser')
|
||||||
|
cy.expectHtmlFormEntryToBe(form, 'password', 'testpassword')
|
||||||
|
});
|
||||||
|
cy.wait('@verifyCredentials')
|
||||||
|
});
|
||||||
|
})
|
5
cypress/fixtures/example.json
Normal file
5
cypress/fixtures/example.json
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"name": "Using fixtures to represent data",
|
||||||
|
"email": "hello@cypress.io",
|
||||||
|
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||||
|
}
|
26
cypress/fixtures/frontend_configurations.json
Normal file
26
cypress/fixtures/frontend_configurations.json
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{
|
||||||
|
"masto_fe": {
|
||||||
|
"showInstanceSpecificPanel": true
|
||||||
|
},
|
||||||
|
"pleroma_fe": {
|
||||||
|
"alwaysShowSubjectInput": true,
|
||||||
|
"background": "/images/5cm.jpg",
|
||||||
|
"collapseMessageWithSubject": true,
|
||||||
|
"formattingOptionsEnabled": true,
|
||||||
|
"hidePostStats": false,
|
||||||
|
"hideSiteFavicon": true,
|
||||||
|
"hideUserStats": true,
|
||||||
|
"logo": "/static/logo.png",
|
||||||
|
"logoMask": false,
|
||||||
|
"redirectRootLogin": "/main/friends",
|
||||||
|
"redirectRootNoLogin": "/main/public",
|
||||||
|
"renderMisskeyMarkdown": true,
|
||||||
|
"scopeCopy": true,
|
||||||
|
"scopeOptionsEnabled": true,
|
||||||
|
"showInstanceSpecificPanel": true,
|
||||||
|
"showNavShortcuts": false,
|
||||||
|
"showPanelNavShortcuts": true,
|
||||||
|
"subjectLineBehavior": "email",
|
||||||
|
"theme": "ihatebeingalive"
|
||||||
|
}
|
||||||
|
}
|
133
cypress/fixtures/instance.json
Normal file
133
cypress/fixtures/instance.json
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
{
|
||||||
|
"approval_required": false,
|
||||||
|
"avatar_upload_limit": 2000000,
|
||||||
|
"background_image": "/images/city.jpg",
|
||||||
|
"background_upload_limit": 4000000,
|
||||||
|
"banner_upload_limit": 4000000,
|
||||||
|
"description": "A Test Instace",
|
||||||
|
"description_limit": 5000,
|
||||||
|
"email": "somewhere@example.com",
|
||||||
|
"languages": [
|
||||||
|
"en",
|
||||||
|
"ja"
|
||||||
|
],
|
||||||
|
"max_toot_chars": 5000,
|
||||||
|
"pleroma": {
|
||||||
|
"metadata": {
|
||||||
|
"account_activation_required": false,
|
||||||
|
"features": [
|
||||||
|
"pleroma_api",
|
||||||
|
"akkoma_api",
|
||||||
|
"mastodon_api",
|
||||||
|
"mastodon_api_streaming",
|
||||||
|
"polls",
|
||||||
|
"v2_suggestions",
|
||||||
|
"pleroma_explicit_addressing",
|
||||||
|
"shareable_emoji_packs",
|
||||||
|
"multifetch",
|
||||||
|
"pleroma:api/v1/notifications:include_types_filter",
|
||||||
|
"editing",
|
||||||
|
"media_proxy",
|
||||||
|
"pleroma_emoji_reactions",
|
||||||
|
"exposable_reactions",
|
||||||
|
"profile_directory",
|
||||||
|
"akkoma:machine_translation",
|
||||||
|
"custom_emoji_reactions",
|
||||||
|
"pleroma:get:main/ostatus"
|
||||||
|
],
|
||||||
|
"federation": {
|
||||||
|
"enabled": true,
|
||||||
|
"exclusions": true,
|
||||||
|
"mrf_hashtag": {
|
||||||
|
"federated_timeline_removal": [],
|
||||||
|
"reject": [],
|
||||||
|
"sensitive": [
|
||||||
|
"nsfw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mrf_hellthread": {
|
||||||
|
"delist_threshold": 5,
|
||||||
|
"reject_threshold": 10
|
||||||
|
},
|
||||||
|
"mrf_keyword": {
|
||||||
|
"federated_timeline_removal": [],
|
||||||
|
"reject": [
|
||||||
|
"rejectme"
|
||||||
|
],
|
||||||
|
"replace": []
|
||||||
|
},
|
||||||
|
"mrf_policies": [
|
||||||
|
"SimplePolicy",
|
||||||
|
"HellthreadPolicy",
|
||||||
|
"KeywordPolicy",
|
||||||
|
"TagPolicy",
|
||||||
|
"InlineQuotePolicy",
|
||||||
|
"HashtagPolicy"
|
||||||
|
],
|
||||||
|
"mrf_simple": {
|
||||||
|
"accept": [],
|
||||||
|
"avatar_removal": [],
|
||||||
|
"banner_removal": [],
|
||||||
|
"federated_timeline_removal": [],
|
||||||
|
"followers_only": [],
|
||||||
|
"media_nsfw": [],
|
||||||
|
"media_removal": [],
|
||||||
|
"reject": [
|
||||||
|
"badinstance.com"
|
||||||
|
],
|
||||||
|
"reject_deletes": [],
|
||||||
|
"report_removal": []
|
||||||
|
},
|
||||||
|
"mrf_simple_info": {
|
||||||
|
"reject": {
|
||||||
|
"badinstance.com": {
|
||||||
|
"reason": "This instance is bad"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"quarantined_instances": [],
|
||||||
|
"quarantined_instances_info": {
|
||||||
|
"quarantined_instances": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fields_limits": {
|
||||||
|
"max_fields": 10,
|
||||||
|
"max_remote_fields": 20,
|
||||||
|
"name_length": 512,
|
||||||
|
"value_length": 2048
|
||||||
|
},
|
||||||
|
"post_formats": [
|
||||||
|
"text/plain",
|
||||||
|
"text/html",
|
||||||
|
"text/markdown",
|
||||||
|
"text/bbcode",
|
||||||
|
"text/x.misskeymarkdown"
|
||||||
|
],
|
||||||
|
"privileged_staff": false
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"mau": 27
|
||||||
|
},
|
||||||
|
"vapid_public_key": "BDgd8xcYuskwMLnr-3Gi-xOU_Jz9IOxhHIW0VWgBMM47wB8qfC_Hw26eNd3sGDSEoXk06ZY-L5qKHqLLNzZSdnw"
|
||||||
|
},
|
||||||
|
"poll_limits": {
|
||||||
|
"max_expiration": 31536000,
|
||||||
|
"max_option_chars": 200,
|
||||||
|
"max_options": 20,
|
||||||
|
"min_expiration": 0
|
||||||
|
},
|
||||||
|
"registrations": false,
|
||||||
|
"stats": {
|
||||||
|
"domain_count": 14557,
|
||||||
|
"status_count": 284658,
|
||||||
|
"user_count": 72
|
||||||
|
},
|
||||||
|
"thumbnail": "thumb.png",
|
||||||
|
"title": "Test Instance",
|
||||||
|
"upload_limit": 100000000,
|
||||||
|
"uri": "http://localhost:8080/",
|
||||||
|
"urls": {
|
||||||
|
"streaming_api": "ws://localhost:8080"
|
||||||
|
},
|
||||||
|
"version": "2.7.2 (compatible; Akkoma 3.4.0-118-g41241bbb-develop)"
|
||||||
|
}
|
1
cypress/fixtures/instance_panel.html
Normal file
1
cypress/fixtures/instance_panel.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<h4>Testing Panel</h4>
|
141
cypress/fixtures/nodeinfo.json
Normal file
141
cypress/fixtures/nodeinfo.json
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"accountActivationRequired": false,
|
||||||
|
"features": [
|
||||||
|
"pleroma_api",
|
||||||
|
"akkoma_api",
|
||||||
|
"mastodon_api",
|
||||||
|
"mastodon_api_streaming",
|
||||||
|
"polls",
|
||||||
|
"v2_suggestions",
|
||||||
|
"pleroma_explicit_addressing",
|
||||||
|
"shareable_emoji_packs",
|
||||||
|
"multifetch",
|
||||||
|
"pleroma:api/v1/notifications:include_types_filter",
|
||||||
|
"editing",
|
||||||
|
"media_proxy",
|
||||||
|
"pleroma_emoji_reactions",
|
||||||
|
"exposable_reactions",
|
||||||
|
"profile_directory",
|
||||||
|
"akkoma:machine_translation",
|
||||||
|
"custom_emoji_reactions",
|
||||||
|
"pleroma:get:main/ostatus"
|
||||||
|
],
|
||||||
|
"federation": {
|
||||||
|
"enabled": true,
|
||||||
|
"exclusions": true,
|
||||||
|
"mrf_hashtag": {
|
||||||
|
"federated_timeline_removal": [],
|
||||||
|
"reject": [],
|
||||||
|
"sensitive": [
|
||||||
|
"nsfw"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mrf_hellthread": {
|
||||||
|
"delist_threshold": 5,
|
||||||
|
"reject_threshold": 10
|
||||||
|
},
|
||||||
|
"quarantined_instances": [],
|
||||||
|
"quarantined_instances_info": {
|
||||||
|
"quarantined_instances": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fieldsLimits": {
|
||||||
|
"maxFields": 10,
|
||||||
|
"maxRemoteFields": 20,
|
||||||
|
"nameLength": 512,
|
||||||
|
"valueLength": 2048
|
||||||
|
},
|
||||||
|
"invitesEnabled": true,
|
||||||
|
"localBubbleInstances": [
|
||||||
|
"bubble.example.com"
|
||||||
|
],
|
||||||
|
"mailerEnabled": true,
|
||||||
|
"nodeDescription": "A Test Instance",
|
||||||
|
"nodeName": "Test",
|
||||||
|
"pollLimits": {
|
||||||
|
"max_expiration": 31536000,
|
||||||
|
"max_option_chars": 200,
|
||||||
|
"max_options": 20,
|
||||||
|
"min_expiration": 0
|
||||||
|
},
|
||||||
|
"postFormats": [
|
||||||
|
"text/plain",
|
||||||
|
"text/html",
|
||||||
|
"text/markdown",
|
||||||
|
"text/bbcode",
|
||||||
|
"text/x.misskeymarkdown"
|
||||||
|
],
|
||||||
|
"private": false,
|
||||||
|
"restrictedNicknames": [
|
||||||
|
".well-known",
|
||||||
|
"~",
|
||||||
|
"about",
|
||||||
|
"activities",
|
||||||
|
"api",
|
||||||
|
"auth",
|
||||||
|
"check_password",
|
||||||
|
"dev",
|
||||||
|
"friend-requests",
|
||||||
|
"inbox",
|
||||||
|
"internal",
|
||||||
|
"main",
|
||||||
|
"media",
|
||||||
|
"nodeinfo",
|
||||||
|
"notice",
|
||||||
|
"oauth",
|
||||||
|
"objects",
|
||||||
|
"ostatus_subscribe",
|
||||||
|
"pleroma",
|
||||||
|
"proxy",
|
||||||
|
"push",
|
||||||
|
"registration",
|
||||||
|
"relay",
|
||||||
|
"settings",
|
||||||
|
"status",
|
||||||
|
"tag",
|
||||||
|
"user-search",
|
||||||
|
"user_exists",
|
||||||
|
"users",
|
||||||
|
"web",
|
||||||
|
"verify_credentials",
|
||||||
|
"update_credentials",
|
||||||
|
"relationships",
|
||||||
|
"search",
|
||||||
|
"confirmation_resend",
|
||||||
|
"mfa"
|
||||||
|
],
|
||||||
|
"skipThreadContainment": true,
|
||||||
|
"staffAccounts": [
|
||||||
|
"http://localhost:8080/users/admin"
|
||||||
|
],
|
||||||
|
"suggestions": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uploadLimits": {
|
||||||
|
"avatar": 2000000,
|
||||||
|
"background": 4000000,
|
||||||
|
"banner": 4000000,
|
||||||
|
"general": 100000000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"openRegistrations": false,
|
||||||
|
"protocols": [
|
||||||
|
"activitypub"
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"inbound": [],
|
||||||
|
"outbound": []
|
||||||
|
},
|
||||||
|
"software": {
|
||||||
|
"name": "akkoma",
|
||||||
|
"version": "3.4.0-118-g41241bbb-develop"
|
||||||
|
},
|
||||||
|
"usage": {
|
||||||
|
"localPosts": 284658,
|
||||||
|
"users": {
|
||||||
|
"total": 72
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": "2.0"
|
||||||
|
}
|
9
cypress/fixtures/oauth_app.json
Normal file
9
cypress/fixtures/oauth_app.json
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"id": "563419",
|
||||||
|
"name": "test app",
|
||||||
|
"website": null,
|
||||||
|
"redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
|
||||||
|
"client_id": "TWhM-tNSuncnqN7DBJmoyeLnk6K3iJJ71KKXxgL1hPM",
|
||||||
|
"client_secret": "ZEaFUFmF0umgBX1qKJDjaU99Q31lDkOU8NutzTOoliw",
|
||||||
|
"vapid_key": "BCk-QqERU0q-CfYZjcuB6lnyyOYfJ2AifKqfeGIm7Z-HiTU5T9eTG5GxVA0_OH5mMlI4UkkDTpaZwozy0TzdZ2M="
|
||||||
|
}
|
6
cypress/fixtures/oauth_token.json
Normal file
6
cypress/fixtures/oauth_token.json
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"access_token": "ZA-Yj3aBD8U8Cm7lKUp-lm9O9BmDgdhHzDeqsY8tlL0",
|
||||||
|
"token_type": "Bearer",
|
||||||
|
"scope": "read write follow push",
|
||||||
|
"created_at": 1573979017
|
||||||
|
}
|
1
cypress/fixtures/public_timeline.json
Normal file
1
cypress/fixtures/public_timeline.json
Normal file
|
@ -0,0 +1 @@
|
||||||
|
[]
|
198
cypress/fixtures/user.json
Normal file
198
cypress/fixtures/user.json
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
{
|
||||||
|
"acct": "test",
|
||||||
|
"akkoma": {
|
||||||
|
"instance": {
|
||||||
|
"favicon": "favicon.png",
|
||||||
|
"name": "cypress.example.com",
|
||||||
|
"nodeinfo": {
|
||||||
|
"metadata": {
|
||||||
|
"accountActivationRequired": false,
|
||||||
|
"features": [
|
||||||
|
"pleroma_api",
|
||||||
|
"akkoma_api",
|
||||||
|
"mastodon_api",
|
||||||
|
"mastodon_api_streaming",
|
||||||
|
"polls",
|
||||||
|
"v2_suggestions",
|
||||||
|
"pleroma_explicit_addressing",
|
||||||
|
"shareable_emoji_packs",
|
||||||
|
"multifetch",
|
||||||
|
"pleroma:api/v1/notifications:include_types_filter",
|
||||||
|
"editing",
|
||||||
|
"media_proxy",
|
||||||
|
"pleroma_emoji_reactions",
|
||||||
|
"exposable_reactions",
|
||||||
|
"profile_directory",
|
||||||
|
"akkoma:machine_translation",
|
||||||
|
"custom_emoji_reactions",
|
||||||
|
"pleroma:get:main/ostatus"
|
||||||
|
],
|
||||||
|
"federation": {
|
||||||
|
"enabled": true,
|
||||||
|
"exclusions": true
|
||||||
|
},
|
||||||
|
"fieldsLimits": {
|
||||||
|
"maxFields": 10,
|
||||||
|
"maxRemoteFields": 20,
|
||||||
|
"nameLength": 512,
|
||||||
|
"valueLength": 2048
|
||||||
|
},
|
||||||
|
"invitesEnabled": true,
|
||||||
|
"localBubbleInstances": [
|
||||||
|
"bubble.exaple.com"
|
||||||
|
],
|
||||||
|
"mailerEnabled": true,
|
||||||
|
"nodeDescription": "An Akkoma Instance",
|
||||||
|
"nodeName": "Test Instance",
|
||||||
|
"pollLimits": {
|
||||||
|
"max_expiration": 31536000,
|
||||||
|
"max_option_chars": 200,
|
||||||
|
"max_options": 20,
|
||||||
|
"min_expiration": 0
|
||||||
|
},
|
||||||
|
"postFormats": [
|
||||||
|
"text/plain",
|
||||||
|
"text/html",
|
||||||
|
"text/markdown",
|
||||||
|
"text/bbcode",
|
||||||
|
"text/x.misskeymarkdown"
|
||||||
|
],
|
||||||
|
"private": false,
|
||||||
|
"restrictedNicknames": [
|
||||||
|
".well-known",
|
||||||
|
"~",
|
||||||
|
"about",
|
||||||
|
"activities",
|
||||||
|
"api",
|
||||||
|
"auth",
|
||||||
|
"check_password",
|
||||||
|
"dev",
|
||||||
|
"friend-requests",
|
||||||
|
"inbox",
|
||||||
|
"internal",
|
||||||
|
"main",
|
||||||
|
"media",
|
||||||
|
"nodeinfo",
|
||||||
|
"notice",
|
||||||
|
"oauth",
|
||||||
|
"objects",
|
||||||
|
"ostatus_subscribe",
|
||||||
|
"pleroma",
|
||||||
|
"proxy",
|
||||||
|
"push",
|
||||||
|
"registration",
|
||||||
|
"relay",
|
||||||
|
"settings",
|
||||||
|
"status",
|
||||||
|
"tag",
|
||||||
|
"user-search",
|
||||||
|
"user_exists",
|
||||||
|
"users",
|
||||||
|
"web",
|
||||||
|
"verify_credentials",
|
||||||
|
"update_credentials",
|
||||||
|
"relationships",
|
||||||
|
"search",
|
||||||
|
"confirmation_resend",
|
||||||
|
"mfa"
|
||||||
|
],
|
||||||
|
"skipThreadContainment": true,
|
||||||
|
"staffAccounts": [
|
||||||
|
"http://cypress.example.com/users/test"
|
||||||
|
],
|
||||||
|
"suggestions": {
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uploadLimits": {
|
||||||
|
"avatar": 2000000,
|
||||||
|
"background": 4000000,
|
||||||
|
"banner": 4000000,
|
||||||
|
"general": 100000000
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"openRegistrations": false,
|
||||||
|
"protocols": [
|
||||||
|
"activitypub"
|
||||||
|
],
|
||||||
|
"services": {
|
||||||
|
"inbound": [],
|
||||||
|
"outbound": []
|
||||||
|
},
|
||||||
|
"software": {
|
||||||
|
"name": "akkoma",
|
||||||
|
"version": "3.4.0-136-g98d4d691-develop"
|
||||||
|
},
|
||||||
|
"usage": {
|
||||||
|
"localPosts": 284709,
|
||||||
|
"users": {
|
||||||
|
"total": 72
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version": "2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"avatar": "3ba406a0f1ce44b2379029f322cacb77b78951f515495739bd65bbfcee297931.jpg",
|
||||||
|
"avatar_static": "3ba406a0f1ce44b2379029f322cacb77b78951f515495739bd65bbfcee297931.jpg",
|
||||||
|
"bot": false,
|
||||||
|
"created_at": "2018-11-27T18:04:50.000Z",
|
||||||
|
"display_name": "Test User",
|
||||||
|
"emojis": [
|
||||||
|
],
|
||||||
|
"fields": [
|
||||||
|
],
|
||||||
|
"follow_requests_count": 1,
|
||||||
|
"followers_count": 1,
|
||||||
|
"following_count": 1,
|
||||||
|
"fqn": "test@cypress.example.com",
|
||||||
|
"header": "header.gif",
|
||||||
|
"header_static": "header.gif",
|
||||||
|
"id": "1",
|
||||||
|
"last_status_at": "2022-11-27T15:17:03",
|
||||||
|
"locked": true,
|
||||||
|
"note": "A test user",
|
||||||
|
"pleroma": {
|
||||||
|
"allow_following_move": true,
|
||||||
|
"also_known_as": [],
|
||||||
|
"ap_id": "http://cypress.example.com/users/example",
|
||||||
|
"background_image": "something.jpg",
|
||||||
|
"deactivated": false,
|
||||||
|
"email": "somewhere@example.com",
|
||||||
|
"favicon": "/favicon.png",
|
||||||
|
"hide_favorites": true,
|
||||||
|
"hide_followers": true,
|
||||||
|
"hide_followers_count": false,
|
||||||
|
"hide_follows": true,
|
||||||
|
"hide_follows_count": false,
|
||||||
|
"is_admin": true,
|
||||||
|
"is_confirmed": true,
|
||||||
|
"is_moderator": true,
|
||||||
|
"is_suggested": false,
|
||||||
|
"notification_settings": {
|
||||||
|
"block_from_strangers": false,
|
||||||
|
"hide_notification_contents": false
|
||||||
|
},
|
||||||
|
"relationship": {},
|
||||||
|
"settings_store": {},
|
||||||
|
"skip_thread_containment": false,
|
||||||
|
"tags": [],
|
||||||
|
"unread_conversation_count": 2108,
|
||||||
|
"unread_notifications_count": 18
|
||||||
|
},
|
||||||
|
"source": {
|
||||||
|
"fields": [
|
||||||
|
],
|
||||||
|
"note": "Test user",
|
||||||
|
"pleroma": {
|
||||||
|
"actor_type": "Person",
|
||||||
|
"discoverable": true,
|
||||||
|
"no_rich_text": false,
|
||||||
|
"show_role": true
|
||||||
|
},
|
||||||
|
"privacy": "private",
|
||||||
|
"sensitive": false
|
||||||
|
},
|
||||||
|
"statuses_count": 10166,
|
||||||
|
"url": "http://cypress.example.com/users/test",
|
||||||
|
"username": "test"
|
||||||
|
}
|
25
cypress/support/commands.js
Normal file
25
cypress/support/commands.js
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// ***********************************************
|
||||||
|
// This example commands.js shows you how to
|
||||||
|
// create various custom commands and overwrite
|
||||||
|
// existing commands.
|
||||||
|
//
|
||||||
|
// For more comprehensive examples of custom
|
||||||
|
// commands please read more here:
|
||||||
|
// https://on.cypress.io/custom-commands
|
||||||
|
// ***********************************************
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a parent command --
|
||||||
|
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a child command --
|
||||||
|
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This is a dual command --
|
||||||
|
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// -- This will overwrite an existing command --
|
||||||
|
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
12
cypress/support/component-index.html
Normal file
12
cypress/support/component-index.html
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||||
|
<title>Components App</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div data-cy-root></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
19
cypress/support/component.js
Normal file
19
cypress/support/component.js
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import './commands'
|
||||||
|
import Vuex from 'vuex'
|
||||||
|
import getStore from '../../src/store'
|
||||||
|
|
||||||
|
|
||||||
|
import { mount } from 'cypress/vue'
|
||||||
|
|
||||||
|
Cypress.Commands.add('mount', (component, options = {}) => {
|
||||||
|
// Setup options object
|
||||||
|
options.extensions = options.extensions || {}
|
||||||
|
options.extensions.plugins = options.extensions.plugins || []
|
||||||
|
// Use store passed in from options, or initialize a new one
|
||||||
|
options.store = options.store || getStore()
|
||||||
|
|
||||||
|
// Add Vuex plugin
|
||||||
|
options.extensions.plugins.push(Vuex)
|
||||||
|
|
||||||
|
return mount(component, options)
|
||||||
|
})
|
48
cypress/support/e2e.js
Normal file
48
cypress/support/e2e.js
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
// ***********************************************************
|
||||||
|
// This example support/e2e.js is processed and
|
||||||
|
// loaded automatically before your test files.
|
||||||
|
//
|
||||||
|
// This is a great place to put global configuration and
|
||||||
|
// behavior that modifies Cypress.
|
||||||
|
//
|
||||||
|
// You can change the location of this file or turn off
|
||||||
|
// automatically serving support files with the
|
||||||
|
// 'supportFile' configuration option.
|
||||||
|
//
|
||||||
|
// You can read more here:
|
||||||
|
// https://on.cypress.io/configuration
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Import commands.js using ES2015 syntax:
|
||||||
|
import './commands'
|
||||||
|
|
||||||
|
// Alternatively you can use CommonJS syntax:
|
||||||
|
// require('./commands')
|
||||||
|
Cypress.Commands.add('defaultIntercepts', () => {
|
||||||
|
const notAuthorized = {
|
||||||
|
body: { error: "not_authorized" },
|
||||||
|
statusCode: 403
|
||||||
|
}
|
||||||
|
cy.intercept('/api/pleroma/frontend_configurations', { fixture: 'frontend_configurations.json' });
|
||||||
|
cy.intercept('/instance/panel.html', { fixture: 'instance_panel.html' })
|
||||||
|
cy.intercept('/api/v1/instance', { fixture: 'instance.json' }).as('getInstance')
|
||||||
|
cy.intercept('/nodeinfo/2.0.json', { fixture: 'nodeinfo.json' })
|
||||||
|
cy.intercept('/api/v1/timelines/public*', { fixture: 'public_timeline.json' })
|
||||||
|
cy.intercept('/static/stickers.json', { body: {} })
|
||||||
|
|
||||||
|
cy.intercept('POST', 'http://cypress.example.com/oauth/token', notAuthorized);
|
||||||
|
cy.intercept('/api/v1/mutes', notAuthorized);
|
||||||
|
cy.intercept('/api/v1/announcements', notAuthorized);
|
||||||
|
cy.intercept('POST', 'http://cypress.example.com/api/v1/apps', { fixture: 'oauth_app.json' }).as('createApp');
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add('authenticatedIntercepts', () => {
|
||||||
|
cy.intercept('POST', '/oauth/token', { fixture: 'oauth_token.json'})
|
||||||
|
cy.intercept('/api/v1/announcements', { body: [] })
|
||||||
|
cy.intercept('/api/v1/mutes', { body: [] })
|
||||||
|
});
|
||||||
|
|
||||||
|
Cypress.Commands.add('expectHtmlFormEntryToBe', (form, key, value) => {
|
||||||
|
expect(form.find((line) => line.includes(`name="${key}"`))).to.include(value)
|
||||||
|
});
|
BIN
cypress/videos/auth.cy.js.mp4
Normal file
BIN
cypress/videos/auth.cy.js.mp4
Normal file
Binary file not shown.
|
@ -4,14 +4,13 @@
|
||||||
<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>Akkoma</title>
|
<title>Akkoma</title>
|
||||||
|
<link rel="stylesheet" href="/static/font/css/fontello.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">
|
|
||||||
<link rel="stylesheet" href="/static/theme-holder.css" id="theme-holder">
|
|
||||||
<!--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 Akkoma, please enable JavaScript.</noscript>
|
<noscript>To use Akkoma, please enable JavaScript.</noscript>
|
||||||
|
|
11
package.json
11
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "pleroma_fe",
|
"name": "pleroma_fe",
|
||||||
"version": "3.5.0",
|
"version": "3.2.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,
|
||||||
|
@ -13,26 +13,25 @@
|
||||||
"test": "npm run unit && npm run e2e",
|
"test": "npm run unit && npm run e2e",
|
||||||
"stylelint": "stylelint src/**/*.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",
|
||||||
|
"run:cypress": "CONFIG='./cypress.json' NO_DEV_SERVER=true yarn dev"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/runtime": "7.17.8",
|
"@babel/runtime": "7.17.8",
|
||||||
"@chenfengyuan/vue-qrcode": "2.0.0",
|
"@chenfengyuan/vue-qrcode": "2.0.0",
|
||||||
"@floatingghost/pinch-zoom-element": "^1.3.1",
|
|
||||||
"@fortawesome/fontawesome-svg-core": "1.3.0",
|
"@fortawesome/fontawesome-svg-core": "1.3.0",
|
||||||
"@fortawesome/free-regular-svg-icons": "^6.1.2",
|
"@fortawesome/free-regular-svg-icons": "^6.1.2",
|
||||||
"@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",
|
||||||
"@vuelidate/core": "^2.0.0",
|
"@vuelidate/core": "^2.0.0",
|
||||||
"@vuelidate/validators": "^2.0.0",
|
"@vuelidate/validators": "^2.0.0",
|
||||||
"blurhash": "^2.0.4",
|
|
||||||
"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",
|
||||||
"cropperjs": "1.5.12",
|
"cropperjs": "1.5.12",
|
||||||
"diff": "3.5.0",
|
"diff": "3.5.0",
|
||||||
"escape-html": "1.0.3",
|
"escape-html": "1.0.3",
|
||||||
"iso-639-1": "^2.1.15",
|
|
||||||
"js-cookie": "^3.0.1",
|
"js-cookie": "^3.0.1",
|
||||||
"localforage": "1.10.0",
|
"localforage": "1.10.0",
|
||||||
"parse-link-header": "^2.0.0",
|
"parse-link-header": "^2.0.0",
|
||||||
|
@ -68,6 +67,7 @@
|
||||||
"cross-spawn": "^7.0.3",
|
"cross-spawn": "^7.0.3",
|
||||||
"css-loader": "^6.7.2",
|
"css-loader": "^6.7.2",
|
||||||
"custom-event-polyfill": "^1.0.7",
|
"custom-event-polyfill": "^1.0.7",
|
||||||
|
"cypress": "^11.2.0",
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-standard": "^17.0.0",
|
"eslint-config-standard": "^17.0.0",
|
||||||
"eslint-friendly-formatter": "^4.0.1",
|
"eslint-friendly-formatter": "^4.0.1",
|
||||||
|
@ -84,6 +84,7 @@
|
||||||
"html-webpack-plugin": "^5.5.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",
|
||||||
"isparta-loader": "2.0.0",
|
"isparta-loader": "2.0.0",
|
||||||
"json-loader": "0.5.7",
|
"json-loader": "0.5.7",
|
||||||
"karma": "6.3.17",
|
"karma": "6.3.17",
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
// stylelint-disable rscss/class-format
|
// stylelint-disable rscss/class-format
|
||||||
@import './_variables.scss';
|
@import './_variables.scss';
|
||||||
@import '@fortawesome/fontawesome-svg-core/styles.css';
|
|
||||||
@import '@floatingghost/pinch-zoom-element/dist/pinch-zoom.css';
|
|
||||||
:root {
|
:root {
|
||||||
--navbar-height: 3.5rem;
|
--navbar-height: 3.5rem;
|
||||||
--post-line-height: 1.4;
|
--post-line-height: 1.4;
|
||||||
|
|
|
@ -4,8 +4,6 @@ import { createRouter, createWebHistory } from 'vue-router'
|
||||||
import vClickOutside from 'click-outside-vue3'
|
import vClickOutside from 'click-outside-vue3'
|
||||||
|
|
||||||
import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome'
|
import { FontAwesomeIcon, FontAwesomeLayers } from '@fortawesome/vue-fontawesome'
|
||||||
import { config } from '@fortawesome/fontawesome-svg-core';
|
|
||||||
config.autoAddCss = false
|
|
||||||
|
|
||||||
import App from '../App.vue'
|
import App from '../App.vue'
|
||||||
import routes from './routes'
|
import routes from './routes'
|
||||||
|
@ -322,9 +320,6 @@ const getNodeInfo = async ({ store }) => {
|
||||||
: federation.enabled
|
: federation.enabled
|
||||||
})
|
})
|
||||||
|
|
||||||
store.dispatch('setInstanceOption', { name: 'publicTimelineVisibility', value: metadata.publicTimelineVisibility })
|
|
||||||
store.dispatch('setInstanceOption', { name: 'federatedTimelineAvailable', value: metadata.federatedTimelineAvailable })
|
|
||||||
|
|
||||||
const accountActivationRequired = metadata.accountActivationRequired
|
const accountActivationRequired = metadata.accountActivationRequired
|
||||||
store.dispatch('setInstanceOption', { name: 'accountActivationRequired', value: accountActivationRequired })
|
store.dispatch('setInstanceOption', { name: 'accountActivationRequired', value: accountActivationRequired })
|
||||||
|
|
||||||
|
@ -398,7 +393,7 @@ const afterStoreSetup = async ({ store, i18n }) => {
|
||||||
getInstanceConfig({ store })
|
getInstanceConfig({ store })
|
||||||
])
|
])
|
||||||
|
|
||||||
// Start fetching things that don't need to block the UI
|
|
||||||
getTOS({ store })
|
getTOS({ store })
|
||||||
getStickers({ store })
|
getStickers({ store })
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,6 @@ import {
|
||||||
faPencilAlt,
|
faPencilAlt,
|
||||||
faAlignRight
|
faAlignRight
|
||||||
} from '@fortawesome/free-solid-svg-icons'
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
import Blurhash from '../blurhash/Blurhash.vue'
|
|
||||||
|
|
||||||
library.add(
|
library.add(
|
||||||
faFile,
|
faFile,
|
||||||
|
@ -64,8 +63,7 @@ const Attachment = {
|
||||||
components: {
|
components: {
|
||||||
Flash,
|
Flash,
|
||||||
StillImage,
|
StillImage,
|
||||||
VideoAttachment,
|
VideoAttachment
|
||||||
Blurhash
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
classNames () {
|
classNames () {
|
||||||
|
@ -86,9 +84,6 @@ const Attachment = {
|
||||||
useContainFit () {
|
useContainFit () {
|
||||||
return this.$store.getters.mergedConfig.useContainFit
|
return this.$store.getters.mergedConfig.useContainFit
|
||||||
},
|
},
|
||||||
useBlurhash () {
|
|
||||||
return this.$store.getters.mergedConfig.useBlurhash
|
|
||||||
},
|
|
||||||
placeholderName () {
|
placeholderName () {
|
||||||
if (this.attachment.description === '' || !this.attachment.description) {
|
if (this.attachment.description === '' || !this.attachment.description) {
|
||||||
return this.type.toUpperCase()
|
return this.type.toUpperCase()
|
||||||
|
|
|
@ -64,15 +64,7 @@
|
||||||
:title="attachment.description"
|
:title="attachment.description"
|
||||||
@click.prevent.stop="toggleHidden"
|
@click.prevent.stop="toggleHidden"
|
||||||
>
|
>
|
||||||
<Blurhash
|
|
||||||
v-if="useBlurhash && attachment.blurhash"
|
|
||||||
:height="512"
|
|
||||||
:width="1024"
|
|
||||||
:hash="attachment.blurhash"
|
|
||||||
:punch="1"
|
|
||||||
/>
|
|
||||||
<img
|
<img
|
||||||
v-else
|
|
||||||
:key="nsfwImage"
|
:key="nsfwImage"
|
||||||
class="nsfw"
|
class="nsfw"
|
||||||
:src="nsfwImage"
|
:src="nsfwImage"
|
||||||
|
|
|
@ -21,7 +21,7 @@ const BasicUserCard = {
|
||||||
toggleUserExpanded () {
|
toggleUserExpanded () {
|
||||||
this.userExpanded = !this.userExpanded
|
this.userExpanded = !this.userExpanded
|
||||||
},
|
},
|
||||||
userProfileLink (user) {
|
userProfileLink(user) {
|
||||||
return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)
|
return generateProfileLink(user.id, user.screen_name, this.$store.state.instance.restrictedNicknames)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,66 +0,0 @@
|
||||||
<template>
|
|
||||||
<canvas
|
|
||||||
ref="canvas"
|
|
||||||
class="blurhash"
|
|
||||||
/>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { decode } from "blurhash";
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'Blurhash',
|
|
||||||
props: {
|
|
||||||
hash: {
|
|
||||||
type: String,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
width: {
|
|
||||||
type: Number,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
height: {
|
|
||||||
type: Number,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
punch: {
|
|
||||||
type: Number,
|
|
||||||
default: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
canvas: null,
|
|
||||||
ctx: null,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
mounted() {
|
|
||||||
this.canvas = this.$refs.canvas;
|
|
||||||
this.ctx = this.canvas.getContext('2d');
|
|
||||||
this.canvas.width = 1024;
|
|
||||||
this.canvas.height = 512;
|
|
||||||
this.draw();
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
draw() {
|
|
||||||
const pixels = decode(this.hash, this.width, this.height, this.punch);
|
|
||||||
const imageData = this.ctx.createImageData(this.width, this.height);
|
|
||||||
imageData.data.set(pixels);
|
|
||||||
this.ctx.putImageData(imageData, 0, 0);
|
|
||||||
fetch("/static/blurhash-overlay.png")
|
|
||||||
.then((response) => response.blob())
|
|
||||||
.then((blob) => {
|
|
||||||
const img = new Image();
|
|
||||||
img.src = URL.createObjectURL(blob);
|
|
||||||
img.onload = () => {
|
|
||||||
this.ctx.drawImage(img, 0, 0, this.width, this.height);
|
|
||||||
};
|
|
||||||
});
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
|
@ -1,11 +1,6 @@
|
||||||
import SearchBar from 'components/search_bar/search_bar.vue'
|
import SearchBar from 'components/search_bar/search_bar.vue'
|
||||||
import ConfirmModal from '../confirm_modal/confirm_modal.vue'
|
import ConfirmModal from '../confirm_modal/confirm_modal.vue'
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
|
||||||
publicTimelineVisible,
|
|
||||||
federatedTimelineVisible,
|
|
||||||
bubbleTimelineVisible,
|
|
||||||
} from '../../lib/timeline_visibility'
|
|
||||||
import {
|
import {
|
||||||
faSignInAlt,
|
faSignInAlt,
|
||||||
faSignOutAlt,
|
faSignOutAlt,
|
||||||
|
@ -24,7 +19,6 @@ import {
|
||||||
faInfoCircle,
|
faInfoCircle,
|
||||||
faUserTie
|
faUserTie
|
||||||
} from '@fortawesome/free-solid-svg-icons'
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
import { mapState } from 'vuex'
|
|
||||||
|
|
||||||
library.add(
|
library.add(
|
||||||
faSignInAlt,
|
faSignInAlt,
|
||||||
|
@ -109,12 +103,7 @@ export default {
|
||||||
},
|
},
|
||||||
showBubbleTimeline () {
|
showBubbleTimeline () {
|
||||||
return this.$store.state.instance.localBubbleInstances.length > 0
|
return this.$store.state.instance.localBubbleInstances.length > 0
|
||||||
},
|
}
|
||||||
...mapState({
|
|
||||||
publicTimelineVisible,
|
|
||||||
federatedTimelineVisible,
|
|
||||||
bubbleTimelineVisible,
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
scrollToTop () {
|
scrollToTop () {
|
||||||
|
|
|
@ -46,7 +46,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'public-timeline' }"
|
:to="{ name: 'public-timeline' }"
|
||||||
class="nav-icon"
|
class="nav-icon"
|
||||||
v-if="publicTimelineVisible"
|
|
||||||
>
|
>
|
||||||
<FAIcon
|
<FAIcon
|
||||||
fixed-width
|
fixed-width
|
||||||
|
@ -56,7 +55,7 @@
|
||||||
/>
|
/>
|
||||||
</router-link>
|
</router-link>
|
||||||
<router-link
|
<router-link
|
||||||
v-if="bubbleTimelineVisible"
|
v-if="currentUser && showBubbleTimeline"
|
||||||
:to="{ name: 'bubble-timeline' }"
|
:to="{ name: 'bubble-timeline' }"
|
||||||
class="nav-icon"
|
class="nav-icon"
|
||||||
>
|
>
|
||||||
|
@ -70,7 +69,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'public-external-timeline' }"
|
:to="{ name: 'public-external-timeline' }"
|
||||||
class="nav-icon"
|
class="nav-icon"
|
||||||
v-if="federatedTimelineVisible"
|
|
||||||
>
|
>
|
||||||
<FAIcon
|
<FAIcon
|
||||||
fixed-width
|
fixed-width
|
||||||
|
|
|
@ -1,133 +0,0 @@
|
||||||
const EMOJI_SIZE = 32 + 8
|
|
||||||
const GROUP_TITLE_HEIGHT = 24
|
|
||||||
const BUFFER_SIZE = 3 * EMOJI_SIZE
|
|
||||||
|
|
||||||
const EmojiGrid = {
|
|
||||||
props: {
|
|
||||||
groups: {
|
|
||||||
required: true,
|
|
||||||
type: Array
|
|
||||||
}
|
|
||||||
},
|
|
||||||
data () {
|
|
||||||
return {
|
|
||||||
containerWidth: 0,
|
|
||||||
containerHeight: 0,
|
|
||||||
scrollPos: 0,
|
|
||||||
resizeObserver: null
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mounted () {
|
|
||||||
const rect = this.$refs.container.getBoundingClientRect()
|
|
||||||
this.containerWidth = rect.width
|
|
||||||
this.containerHeight = rect.height
|
|
||||||
this.resizeObserver = new ResizeObserver((entries) => {
|
|
||||||
for (const entry of entries) {
|
|
||||||
this.containerWidth = entry.contentRect.width
|
|
||||||
this.containerHeight = entry.contentRect.height
|
|
||||||
}
|
|
||||||
})
|
|
||||||
this.resizeObserver.observe(this.$refs.container)
|
|
||||||
},
|
|
||||||
beforeUnmount () {
|
|
||||||
this.resizeObserver.disconnect()
|
|
||||||
this.resizeObserver = null
|
|
||||||
},
|
|
||||||
watch: {
|
|
||||||
groups () {
|
|
||||||
// Scroll to top when grid content changes
|
|
||||||
if (this.$refs.container) {
|
|
||||||
this.$refs.container.scrollTo(0, 0)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
activeGroup (group) {
|
|
||||||
this.$emit('activeGroup', group)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
onScroll () {
|
|
||||||
this.scrollPos = this.$refs.container.scrollTop
|
|
||||||
},
|
|
||||||
onEmoji (emoji) {
|
|
||||||
this.$emit('emoji', emoji)
|
|
||||||
},
|
|
||||||
scrollToItem (itemId) {
|
|
||||||
const container = this.$refs.container
|
|
||||||
if (!container) return
|
|
||||||
|
|
||||||
for (const item of this.itemList) {
|
|
||||||
if (item.id === itemId) {
|
|
||||||
container.scrollTo(0, item.position.y)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
// Total height of scroller content
|
|
||||||
gridHeight () {
|
|
||||||
if (this.itemList.length === 0) return 0
|
|
||||||
const lastItem = this.itemList[this.itemList.length - 1]
|
|
||||||
return (
|
|
||||||
lastItem.position.y +
|
|
||||||
('title' in lastItem ? GROUP_TITLE_HEIGHT : EMOJI_SIZE)
|
|
||||||
)
|
|
||||||
},
|
|
||||||
activeGroup () {
|
|
||||||
const items = this.itemList
|
|
||||||
for (let i = items.length - 1; i >= 0; i--) {
|
|
||||||
const item = items[i]
|
|
||||||
if ('title' in item && item.position.y <= this.scrollPos) {
|
|
||||||
return item.id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
|
||||||
},
|
|
||||||
itemList () {
|
|
||||||
const items = []
|
|
||||||
let x = 0
|
|
||||||
let y = 0
|
|
||||||
for (const group of this.groups) {
|
|
||||||
items.push({ position: { x, y }, id: group.id, title: group.text })
|
|
||||||
if (group.text.length) {
|
|
||||||
y += GROUP_TITLE_HEIGHT
|
|
||||||
}
|
|
||||||
for (const emoji of group.emojis) {
|
|
||||||
items.push({
|
|
||||||
position: { x, y },
|
|
||||||
id: `${group.id}-${emoji.displayText}`,
|
|
||||||
emoji
|
|
||||||
})
|
|
||||||
x += EMOJI_SIZE
|
|
||||||
if (x + EMOJI_SIZE > this.containerWidth) {
|
|
||||||
y += EMOJI_SIZE
|
|
||||||
x = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (x > 0) {
|
|
||||||
y += EMOJI_SIZE
|
|
||||||
x = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return items
|
|
||||||
},
|
|
||||||
visibleItems () {
|
|
||||||
const startPos = this.scrollPos - BUFFER_SIZE
|
|
||||||
const endPos = this.scrollPos + this.containerHeight + BUFFER_SIZE
|
|
||||||
return this.itemList.filter((i) => {
|
|
||||||
return i.position.y >= startPos && i.position.y < endPos
|
|
||||||
})
|
|
||||||
},
|
|
||||||
scrolledClass () {
|
|
||||||
if (this.scrollPos <= 5) {
|
|
||||||
return 'scrolled-top'
|
|
||||||
} else if (this.scrollPos >= this.gridHeight - this.containerHeight - 5) {
|
|
||||||
return 'scrolled-bottom'
|
|
||||||
} else {
|
|
||||||
return 'scrolled-middle'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default EmojiGrid
|
|
|
@ -1,60 +0,0 @@
|
||||||
.emoji {
|
|
||||||
&-grid {
|
|
||||||
flex: 1 1 1px;
|
|
||||||
position: relative;
|
|
||||||
overflow: auto;
|
|
||||||
user-select: none;
|
|
||||||
mask: linear-gradient(to top, white 0, transparent 100%) bottom no-repeat,
|
|
||||||
linear-gradient(to bottom, white 0, transparent 100%) top no-repeat,
|
|
||||||
linear-gradient(to top, white, white);
|
|
||||||
transition: mask-size 150ms;
|
|
||||||
mask-size: 100% 20px, 100% 20px, auto;
|
|
||||||
// Autoprefixed seem to ignore this one, and also syntax is different
|
|
||||||
-webkit-mask-composite: xor;
|
|
||||||
mask-composite: exclude;
|
|
||||||
&.scrolled {
|
|
||||||
&-top {
|
|
||||||
mask-size: 100% 20px, 100% 0, auto;
|
|
||||||
}
|
|
||||||
&-bottom {
|
|
||||||
mask-size: 100% 0, 100% 20px, auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
margin-left: 5px;
|
|
||||||
min-height: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
&-group-title {
|
|
||||||
position: absolute;
|
|
||||||
font-size: 0.85em;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
height: 24px;
|
|
||||||
display: flex;
|
|
||||||
align-items: end;
|
|
||||||
|
|
||||||
&.disabled {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&-item {
|
|
||||||
position: absolute;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: flex;
|
|
||||||
font-size: 32px;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
margin: 4px;
|
|
||||||
|
|
||||||
cursor: pointer;
|
|
||||||
|
|
||||||
img {
|
|
||||||
object-fit: contain;
|
|
||||||
max-width: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,48 +0,0 @@
|
||||||
<template>
|
|
||||||
<div
|
|
||||||
ref="container"
|
|
||||||
class="emoji-grid"
|
|
||||||
:class="scrolledClass"
|
|
||||||
@scroll.passive="onScroll"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
:style="{
|
|
||||||
height: `${gridHeight}px`,
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<template v-for="item in visibleItems">
|
|
||||||
<h6
|
|
||||||
v-if="'title' in item && item.title.length"
|
|
||||||
:key="'title-' + item.id"
|
|
||||||
class="emoji-group-title"
|
|
||||||
:style="{
|
|
||||||
top: item.position.y + 'px',
|
|
||||||
left: item.position.x + 'px'
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
{{ item.title }}
|
|
||||||
</h6>
|
|
||||||
<span
|
|
||||||
v-else-if="'emoji' in item"
|
|
||||||
:key="'emoji-' + item.id"
|
|
||||||
class="emoji-item"
|
|
||||||
:title="item.emoji.displayText"
|
|
||||||
:style="{
|
|
||||||
top: item.position.y + 'px',
|
|
||||||
left: item.position.x + 'px'
|
|
||||||
}"
|
|
||||||
@click.stop.prevent="onEmoji(item.emoji)"
|
|
||||||
>
|
|
||||||
<span v-if="!item.emoji.imageUrl">{{ item.emoji.replacement }}</span>
|
|
||||||
<img
|
|
||||||
v-else
|
|
||||||
:src="item.emoji.imageUrl"
|
|
||||||
>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script src="./emoji_grid.js"></script>
|
|
||||||
<style lang="scss" src="./emoji_grid.scss"></style>
|
|
|
@ -205,6 +205,7 @@ const EmojiInput = {
|
||||||
},
|
},
|
||||||
triggerShowPicker () {
|
triggerShowPicker () {
|
||||||
this.showPicker = true
|
this.showPicker = true
|
||||||
|
this.$refs.picker.startEmojiLoad()
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
this.scrollIntoView()
|
this.scrollIntoView()
|
||||||
this.focusPickerInput()
|
this.focusPickerInput()
|
||||||
|
@ -222,6 +223,7 @@ const EmojiInput = {
|
||||||
this.showPicker = !this.showPicker
|
this.showPicker = !this.showPicker
|
||||||
if (this.showPicker) {
|
if (this.showPicker) {
|
||||||
this.scrollIntoView()
|
this.scrollIntoView()
|
||||||
|
this.$refs.picker.startEmojiLoad()
|
||||||
this.$nextTick(this.focusPickerInput)
|
this.$nextTick(this.focusPickerInput)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
<EmojiPicker
|
<EmojiPicker
|
||||||
v-if="enableEmojiPicker"
|
v-if="enableEmojiPicker"
|
||||||
ref="picker"
|
ref="picker"
|
||||||
show-keep-open
|
|
||||||
:class="{ hide: !showPicker }"
|
:class="{ hide: !showPicker }"
|
||||||
:enable-sticker-picker="enableStickerPicker"
|
:enable-sticker-picker="enableStickerPicker"
|
||||||
class="emoji-picker-panel"
|
class="emoji-picker-panel"
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { defineAsyncComponent } from 'vue'
|
import { defineAsyncComponent } from 'vue'
|
||||||
import Checkbox from '../checkbox/checkbox.vue'
|
import Checkbox from '../checkbox/checkbox.vue'
|
||||||
import EmojiGrid from '../emoji_grid/emoji_grid.vue'
|
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
import {
|
||||||
faBoxOpen,
|
faBoxOpen,
|
||||||
|
@ -15,17 +14,19 @@ library.add(
|
||||||
faSmileBeam
|
faSmileBeam
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// At widest, approximately 20 emoji are visible in a row,
|
||||||
|
// loading 3 rows, could be overkill for narrow picker
|
||||||
|
const LOAD_EMOJI_BY = 60
|
||||||
|
|
||||||
|
// When to start loading new batch emoji, in pixels
|
||||||
|
const LOAD_EMOJI_MARGIN = 64
|
||||||
|
|
||||||
const EmojiPicker = {
|
const EmojiPicker = {
|
||||||
props: {
|
props: {
|
||||||
enableStickerPicker: {
|
enableStickerPicker: {
|
||||||
required: false,
|
required: false,
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
},
|
|
||||||
showKeepOpen: {
|
|
||||||
required: false,
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data () {
|
data () {
|
||||||
|
@ -33,13 +34,16 @@ const EmojiPicker = {
|
||||||
keyword: '',
|
keyword: '',
|
||||||
activeGroup: 'standard',
|
activeGroup: 'standard',
|
||||||
showingStickers: false,
|
showingStickers: false,
|
||||||
keepOpen: false
|
groupsScrolledClass: 'scrolled-top',
|
||||||
|
keepOpen: false,
|
||||||
|
customEmojiBufferSlice: LOAD_EMOJI_BY,
|
||||||
|
customEmojiTimeout: null,
|
||||||
|
customEmojiLoadAllConfirmed: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
StickerPicker: defineAsyncComponent(() => import('../sticker_picker/sticker_picker.vue')),
|
StickerPicker: defineAsyncComponent(() => import('../sticker_picker/sticker_picker.vue')),
|
||||||
Checkbox,
|
Checkbox
|
||||||
EmojiGrid
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onStickerUploaded (e) {
|
onStickerUploaded (e) {
|
||||||
|
@ -51,7 +55,12 @@ const EmojiPicker = {
|
||||||
onEmoji (emoji) {
|
onEmoji (emoji) {
|
||||||
const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement
|
const value = emoji.imageUrl ? `:${emoji.displayText}:` : emoji.replacement
|
||||||
this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen })
|
this.$emit('emoji', { insertion: value, keepOpen: this.keepOpen })
|
||||||
this.$store.commit('emojiUsed', emoji)
|
},
|
||||||
|
onScroll (e) {
|
||||||
|
const target = (e && e.target) || this.$refs['emoji-groups']
|
||||||
|
this.updateScrolledClass(target)
|
||||||
|
this.scrolledGroup(target)
|
||||||
|
this.triggerLoadMore(target)
|
||||||
},
|
},
|
||||||
onWheel (e) {
|
onWheel (e) {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
@ -60,12 +69,68 @@ const EmojiPicker = {
|
||||||
highlight (key) {
|
highlight (key) {
|
||||||
this.setShowStickers(false)
|
this.setShowStickers(false)
|
||||||
this.activeGroup = key
|
this.activeGroup = key
|
||||||
if (this.keyword.length) {
|
},
|
||||||
this.$refs.emojiGrid.scrollToItem(key)
|
updateScrolledClass (target) {
|
||||||
|
if (target.scrollTop <= 5) {
|
||||||
|
this.groupsScrolledClass = 'scrolled-top'
|
||||||
|
} else if (target.scrollTop >= target.scrollTopMax - 5) {
|
||||||
|
this.groupsScrolledClass = 'scrolled-bottom'
|
||||||
|
} else {
|
||||||
|
this.groupsScrolledClass = 'scrolled-middle'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onActiveGroup (group) {
|
triggerLoadMore (target) {
|
||||||
this.activeGroup = group
|
const ref = this.$refs['group-end-custom']
|
||||||
|
if (!ref) return
|
||||||
|
const bottom = ref.offsetTop + ref.offsetHeight
|
||||||
|
|
||||||
|
const scrollerBottom = target.scrollTop + target.clientHeight
|
||||||
|
const scrollerTop = target.scrollTop
|
||||||
|
const scrollerMax = target.scrollHeight
|
||||||
|
|
||||||
|
// Loads more emoji when they come into view
|
||||||
|
const approachingBottom = bottom - scrollerBottom < LOAD_EMOJI_MARGIN
|
||||||
|
// Always load when at the very top in case there's no scroll space yet
|
||||||
|
const atTop = scrollerTop < 5
|
||||||
|
// Don't load when looking at unicode category or at the very bottom
|
||||||
|
const bottomAboveViewport = bottom < scrollerTop || scrollerBottom === scrollerMax
|
||||||
|
if (!bottomAboveViewport && (approachingBottom || atTop)) {
|
||||||
|
this.loadEmoji()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
scrolledGroup (target) {
|
||||||
|
const top = target.scrollTop + 5
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.emojisView.forEach(group => {
|
||||||
|
const ref = this.$refs['group-' + group.id]
|
||||||
|
if (ref.offsetTop <= top) {
|
||||||
|
this.activeGroup = group.id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
loadEmoji () {
|
||||||
|
const allLoaded = this.customEmojiBuffer.length === this.filteredEmoji.length
|
||||||
|
|
||||||
|
if (allLoaded) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
this.customEmojiBufferSlice += LOAD_EMOJI_BY
|
||||||
|
},
|
||||||
|
startEmojiLoad (forceUpdate = false) {
|
||||||
|
if (!forceUpdate) {
|
||||||
|
this.keyword = ''
|
||||||
|
}
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.$refs['emoji-groups'].scrollTop = 0
|
||||||
|
})
|
||||||
|
const bufferSize = this.customEmojiBuffer.length
|
||||||
|
const bufferPrefilledAll = bufferSize === this.filteredEmoji.length
|
||||||
|
if (bufferPrefilledAll && !forceUpdate) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.customEmojiBufferSlice = LOAD_EMOJI_BY
|
||||||
},
|
},
|
||||||
toggleStickers () {
|
toggleStickers () {
|
||||||
this.showingStickers = !this.showingStickers
|
this.showingStickers = !this.showingStickers
|
||||||
|
@ -81,6 +146,13 @@ const EmojiPicker = {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
keyword () {
|
||||||
|
this.customEmojiLoadAllConfirmed = false
|
||||||
|
this.onScroll()
|
||||||
|
this.startEmojiLoad(true)
|
||||||
|
}
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
activeGroupView () {
|
activeGroupView () {
|
||||||
return this.showingStickers ? '' : this.activeGroup
|
return this.showingStickers ? '' : this.activeGroup
|
||||||
|
@ -96,8 +168,10 @@ const EmojiPicker = {
|
||||||
this.$store.state.instance.customEmoji || []
|
this.$store.state.instance.customEmoji || []
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
customEmojiBuffer () {
|
||||||
|
return this.filteredEmoji.slice(0, this.customEmojiBufferSlice)
|
||||||
|
},
|
||||||
emojis () {
|
emojis () {
|
||||||
const recentEmojis = this.$store.getters.recentEmojis
|
|
||||||
const standardEmojis = this.$store.state.instance.emoji || []
|
const standardEmojis = this.$store.state.instance.emoji || []
|
||||||
const customEmojis = this.sortedEmoji
|
const customEmojis = this.sortedEmoji
|
||||||
const emojiPacks = []
|
const emojiPacks = []
|
||||||
|
@ -110,15 +184,6 @@ const EmojiPicker = {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
return [
|
return [
|
||||||
{
|
|
||||||
id: 'recent',
|
|
||||||
text: this.$t('emoji.recent'),
|
|
||||||
first: {
|
|
||||||
imageUrl: '',
|
|
||||||
replacement: '🕒',
|
|
||||||
},
|
|
||||||
emojis: this.filterByKeyword(recentEmojis)
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: 'standard',
|
id: 'standard',
|
||||||
text: this.$t('emoji.unicode'),
|
text: this.$t('emoji.unicode'),
|
||||||
|
|
|
@ -1,16 +1,5 @@
|
||||||
@import '../../_variables.scss';
|
@import '../../_variables.scss';
|
||||||
|
|
||||||
// The worst query selector ever
|
|
||||||
// selects ONLY emojis pickers in replies in notifications
|
|
||||||
// who thought this was a good idea?
|
|
||||||
.notification > .Status > .status-container > .post-status-form > form > .form-group > .emoji-input > .emoji-picker {
|
|
||||||
max-width: 100%;
|
|
||||||
left: 0;
|
|
||||||
@media (min-width: 1300px) {
|
|
||||||
left: -30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.Notification {
|
.Notification {
|
||||||
.emoji-picker {
|
.emoji-picker {
|
||||||
min-width: 160%;
|
min-width: 160%;
|
||||||
|
@ -18,7 +7,7 @@
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
left: -70%;
|
left: -70%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
@media (min-width: 800px) and (max-width: 1280px) {
|
@media (min-width: 800px) and (max-width: 1300px) {
|
||||||
left: -50%;
|
left: -50%;
|
||||||
min-width: 50%;
|
min-width: 50%;
|
||||||
max-width: 130%;
|
max-width: 130%;
|
||||||
|
@ -29,10 +18,6 @@
|
||||||
min-width: 50%;
|
min-width: 50%;
|
||||||
max-width: 130%;
|
max-width: 130%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.Status > .emoji-picker {
|
|
||||||
z-index: 1000;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.emoji-picker {
|
.emoji-picker {
|
||||||
|
@ -85,6 +70,10 @@
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.emoji-groups {
|
||||||
|
min-height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
.additional-tabs {
|
.additional-tabs {
|
||||||
border-left: 1px solid;
|
border-left: 1px solid;
|
||||||
border-left-color: $fallback--icon;
|
border-left-color: $fallback--icon;
|
||||||
|
@ -163,12 +152,76 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.emoji-search {
|
.emoji {
|
||||||
padding: 5px;
|
&-search {
|
||||||
flex: 0 0 auto;
|
padding: 5px;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
|
||||||
input {
|
input {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&-groups {
|
||||||
|
flex: 1 1 1px;
|
||||||
|
position: relative;
|
||||||
|
overflow: auto;
|
||||||
|
user-select: none;
|
||||||
|
mask: linear-gradient(to top, white 0, transparent 100%) bottom no-repeat,
|
||||||
|
linear-gradient(to bottom, white 0, transparent 100%) top no-repeat,
|
||||||
|
linear-gradient(to top, white, white);
|
||||||
|
transition: mask-size 150ms;
|
||||||
|
mask-size: 100% 20px, 100% 20px, auto;
|
||||||
|
// Autoprefixed seem to ignore this one, and also syntax is different
|
||||||
|
-webkit-mask-composite: xor;
|
||||||
|
mask-composite: exclude;
|
||||||
|
&.scrolled {
|
||||||
|
&-top {
|
||||||
|
mask-size: 100% 20px, 100% 0, auto;
|
||||||
|
}
|
||||||
|
&-bottom {
|
||||||
|
mask-size: 100% 0, 100% 20px, auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-group {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding-left: 5px;
|
||||||
|
justify-content: left;
|
||||||
|
|
||||||
|
&-title {
|
||||||
|
font-size: 0.85em;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
&.disabled {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-item {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
display: flex;
|
||||||
|
font-size: 32px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin: 4px;
|
||||||
|
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
img {
|
||||||
|
object-fit: contain;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
<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
|
<span
|
||||||
ref="emoji-tabs"
|
|
||||||
class="emoji-tabs"
|
class="emoji-tabs"
|
||||||
@wheel="onWheel"
|
@wheel="onWheel"
|
||||||
|
ref="emoji-tabs"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
v-for="group in emojis"
|
v-for="group in emojis"
|
||||||
|
@ -51,16 +51,40 @@
|
||||||
@input="$event.target.composing = false"
|
@input="$event.target.composing = false"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
<EmojiGrid
|
|
||||||
ref="emojiGrid"
|
|
||||||
:groups="emojisView"
|
|
||||||
@emoji="onEmoji"
|
|
||||||
@active-group="onActiveGroup"
|
|
||||||
/>
|
|
||||||
<div
|
<div
|
||||||
v-if="showKeepOpen"
|
ref="emoji-groups"
|
||||||
class="keep-open"
|
class="emoji-groups"
|
||||||
|
:class="groupsScrolledClass"
|
||||||
|
@scroll="onScroll"
|
||||||
>
|
>
|
||||||
|
<div
|
||||||
|
v-for="group in emojisView"
|
||||||
|
:key="group.id"
|
||||||
|
class="emoji-group"
|
||||||
|
>
|
||||||
|
<h6
|
||||||
|
:ref="'group-' + group.id"
|
||||||
|
class="emoji-group-title"
|
||||||
|
>
|
||||||
|
{{ group.text }}
|
||||||
|
</h6>
|
||||||
|
<span
|
||||||
|
v-for="emoji in group.emojis"
|
||||||
|
:key="group.id + emoji.displayText"
|
||||||
|
:title="emoji.displayText"
|
||||||
|
class="emoji-item"
|
||||||
|
@click.stop.prevent="onEmoji(emoji)"
|
||||||
|
>
|
||||||
|
<span v-if="!emoji.imageUrl">{{ emoji.replacement }}</span>
|
||||||
|
<img
|
||||||
|
v-else
|
||||||
|
:src="emoji.imageUrl"
|
||||||
|
>
|
||||||
|
</span>
|
||||||
|
<span :ref="'group-end-' + group.id" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="keep-open">
|
||||||
<Checkbox v-model="keepOpen">
|
<Checkbox v-model="keepOpen">
|
||||||
{{ $t('emoji.keep_open') }}
|
{{ $t('emoji.keep_open') }}
|
||||||
</Checkbox>
|
</Checkbox>
|
||||||
|
|
|
@ -3,11 +3,6 @@ import UserListPopover from '../user_list_popover/user_list_popover.vue'
|
||||||
|
|
||||||
const EMOJI_REACTION_COUNT_CUTOFF = 12
|
const EMOJI_REACTION_COUNT_CUTOFF = 12
|
||||||
|
|
||||||
const findEmojiByReplacement = (state, replacement) => {
|
|
||||||
const allEmojis = state.instance.emoji.concat(state.instance.customEmoji)
|
|
||||||
return allEmojis.find(emoji => emoji.replacement === replacement)
|
|
||||||
}
|
|
||||||
|
|
||||||
const EmojiReactions = {
|
const EmojiReactions = {
|
||||||
name: 'EmojiReactions',
|
name: 'EmojiReactions',
|
||||||
components: {
|
components: {
|
||||||
|
@ -59,8 +54,6 @@ const EmojiReactions = {
|
||||||
},
|
},
|
||||||
reactWith (emoji) {
|
reactWith (emoji) {
|
||||||
this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })
|
this.$store.dispatch('reactWithEmoji', { id: this.status.id, emoji })
|
||||||
const emojiObject = findEmojiByReplacement(this.$store.state, emoji)
|
|
||||||
this.$store.commit('emojiUsed', emojiObject)
|
|
||||||
},
|
},
|
||||||
unreact (emoji) {
|
unreact (emoji) {
|
||||||
this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })
|
this.$store.dispatch('unreactWithEmoji', { id: this.status.id, emoji })
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
:src="reaction.url"
|
:src="reaction.url"
|
||||||
:title="reaction.name"
|
:title="reaction.name"
|
||||||
class="reaction-emoji"
|
class="reaction-emoji"
|
||||||
height="2.55em"
|
width="2.55em"
|
||||||
>
|
>
|
||||||
{{ reaction.count }}
|
{{ reaction.count }}
|
||||||
</span>
|
</span>
|
||||||
|
@ -49,7 +49,6 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
margin-top: 0.25em;
|
margin-top: 0.25em;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
container-type: inline-size;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.unicode-emoji {
|
.unicode-emoji {
|
||||||
|
@ -65,9 +64,7 @@
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
.reaction-emoji {
|
.reaction-emoji {
|
||||||
width: auto;
|
width: 2.55em !important;
|
||||||
max-width: 96cqw;
|
|
||||||
height: 2.55em !important;
|
|
||||||
margin-right: 0.25em;
|
margin-right: 0.25em;
|
||||||
}
|
}
|
||||||
&:focus {
|
&:focus {
|
||||||
|
|
|
@ -15,7 +15,6 @@ import {
|
||||||
faBookmark as faBookmarkReg,
|
faBookmark as faBookmarkReg,
|
||||||
faFlag
|
faFlag
|
||||||
} from '@fortawesome/free-regular-svg-icons'
|
} from '@fortawesome/free-regular-svg-icons'
|
||||||
import { mapState } from 'vuex'
|
|
||||||
|
|
||||||
library.add(
|
library.add(
|
||||||
faEllipsisH,
|
faEllipsisH,
|
||||||
|
@ -145,7 +144,6 @@ const ExtraButtons = {
|
||||||
statusPoll: this.status.poll,
|
statusPoll: this.status.poll,
|
||||||
statusFiles: [...this.status.attachments],
|
statusFiles: [...this.status.attachments],
|
||||||
statusScope: this.status.visibility,
|
statusScope: this.status.visibility,
|
||||||
statusLanguage: this.status.language,
|
|
||||||
statusContentType: data.content_type
|
statusContentType: data.content_type
|
||||||
}))
|
}))
|
||||||
this.doDeleteStatus()
|
this.doDeleteStatus()
|
||||||
|
@ -192,7 +190,7 @@ const ExtraButtons = {
|
||||||
isEdited () {
|
isEdited () {
|
||||||
return this.status.edited_at !== null
|
return this.status.edited_at !== null
|
||||||
},
|
},
|
||||||
editingAvailable () { return this.$store.state.instance.editingAvailable },
|
editingAvailable () { return this.$store.state.instance.editingAvailable }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,6 @@ const FollowRequestCard = {
|
||||||
doApprove () {
|
doApprove () {
|
||||||
this.$store.state.api.backendInteractor.approveUser({ id: this.user.id })
|
this.$store.state.api.backendInteractor.approveUser({ id: this.user.id })
|
||||||
this.$store.dispatch('removeFollowRequest', this.user)
|
this.$store.dispatch('removeFollowRequest', this.user)
|
||||||
this.$store.dispatch('decrementFollowRequestsCount')
|
|
||||||
|
|
||||||
const notifId = this.findFollowRequestNotificationId()
|
const notifId = this.findFollowRequestNotificationId()
|
||||||
this.$store.dispatch('markSingleNotificationAsSeen', { id: notifId })
|
this.$store.dispatch('markSingleNotificationAsSeen', { id: notifId })
|
||||||
|
@ -67,7 +66,6 @@ const FollowRequestCard = {
|
||||||
this.$store.state.api.backendInteractor.denyUser({ id: this.user.id })
|
this.$store.state.api.backendInteractor.denyUser({ id: this.user.id })
|
||||||
.then(() => {
|
.then(() => {
|
||||||
this.$store.dispatch('dismissNotificationLocal', { id: notifId })
|
this.$store.dispatch('dismissNotificationLocal', { id: notifId })
|
||||||
this.$store.dispatch('decrementFollowRequestsCount')
|
|
||||||
this.$store.dispatch('removeFollowRequest', this.user)
|
this.$store.dispatch('removeFollowRequest', this.user)
|
||||||
})
|
})
|
||||||
this.hideDenyConfirmDialog()
|
this.hideDenyConfirmDialog()
|
||||||
|
@ -82,11 +80,6 @@ const FollowRequestCard = {
|
||||||
},
|
},
|
||||||
shouldConfirmDeny () {
|
shouldConfirmDeny () {
|
||||||
return this.mergedConfig.modalOnDenyFollow
|
return this.mergedConfig.modalOnDenyFollow
|
||||||
},
|
|
||||||
show () {
|
|
||||||
const notifId = this.$store.state.api.followRequests.find(req => req.id === this.user.id)
|
|
||||||
|
|
||||||
return notifId !== undefined
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<basic-user-card :user="user" v-if="show">
|
<basic-user-card :user="user">
|
||||||
<div class="follow-request-card-content-container">
|
<div class="follow-request-card-content-container">
|
||||||
<button
|
<button
|
||||||
class="btn button-default"
|
class="btn button-default"
|
||||||
|
|
|
@ -1,26 +1,10 @@
|
||||||
import FollowRequestCard from '../follow_request_card/follow_request_card.vue'
|
import FollowRequestCard from '../follow_request_card/follow_request_card.vue'
|
||||||
import withLoadMore from '../../hocs/with_load_more/with_load_more'
|
|
||||||
import List from '../list/list.vue'
|
|
||||||
import get from 'lodash/get'
|
|
||||||
|
|
||||||
const FollowRequestList = withLoadMore({
|
|
||||||
fetch: (props, $store) => $store.dispatch('fetchFollowRequests'),
|
|
||||||
select: (props, $store) => get($store.state.api, 'followRequests', []).map(req => $store.getters.findUser(req.id)),
|
|
||||||
destroy: (props, $store) => $store.dispatch('clearFollowRequests'),
|
|
||||||
childPropName: 'items',
|
|
||||||
additionalPropNames: ['userId']
|
|
||||||
})(List);
|
|
||||||
|
|
||||||
|
|
||||||
const FollowRequests = {
|
const FollowRequests = {
|
||||||
components: {
|
components: {
|
||||||
FollowRequestCard,
|
FollowRequestCard
|
||||||
FollowRequestList
|
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
userId () {
|
|
||||||
return this.$store.state.users.currentUser.id
|
|
||||||
},
|
|
||||||
requests () {
|
requests () {
|
||||||
return this.$store.state.api.followRequests
|
return this.$store.state.api.followRequests
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,11 +6,12 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<FollowRequestList :user-id="userId">
|
<FollowRequestCard
|
||||||
<template #item="{item}">
|
v-for="request in requests"
|
||||||
<FollowRequestCard :user="item" />
|
:key="request.id"
|
||||||
</template>
|
:user="request"
|
||||||
</FollowRequestList>
|
class="list-item"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,77 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="followed-tag-card">
|
|
||||||
<span>
|
|
||||||
<router-link :to="{ name: 'tag-timeline', params: {tag: tag.name}}">
|
|
||||||
<span class="tag-link">#{{ tag.name }}</span>
|
|
||||||
</router-link>
|
|
||||||
<span class="unfollow-tag">
|
|
||||||
<button
|
|
||||||
v-if="isFollowing"
|
|
||||||
class="button-default unfollow-tag-button"
|
|
||||||
:title="$t('user_card.unfollow_tag')"
|
|
||||||
@click="unfollowTag(tag.name)"
|
|
||||||
>
|
|
||||||
{{ $t('user_card.unfollow_tag') }}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
v-else
|
|
||||||
class="button-default follow-tag-button"
|
|
||||||
:title="$t('user_card.follow_tag')"
|
|
||||||
@click="followTag(tag.name)"
|
|
||||||
>
|
|
||||||
{{ $t('user_card.follow_tag') }}
|
|
||||||
</button>
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'FollowedTagCard',
|
|
||||||
props: {
|
|
||||||
tag: {
|
|
||||||
type: Object,
|
|
||||||
required: true
|
|
||||||
},
|
|
||||||
},
|
|
||||||
// this is a hack to update the state of the button
|
|
||||||
// for some reason, List does not update on changes to the tag object
|
|
||||||
data: () => ({
|
|
||||||
isFollowing: true
|
|
||||||
}),
|
|
||||||
mounted () {
|
|
||||||
this.isFollowing = this.tag.following
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
unfollowTag (tag) {
|
|
||||||
this.$store.dispatch('unfollowTag', tag)
|
|
||||||
this.isFollowing = false
|
|
||||||
},
|
|
||||||
followTag (tag) {
|
|
||||||
this.$store.dispatch('followTag', tag)
|
|
||||||
this.isFollowing = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.followed-tag-card {
|
|
||||||
margin-left: 1rem;
|
|
||||||
margin-top: 1rem;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
.unfollow-tag {
|
|
||||||
position: absolute;
|
|
||||||
right: 1rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag-link {
|
|
||||||
font-size: large;
|
|
||||||
}
|
|
||||||
|
|
||||||
.unfollow-tag-button, .follow-tag-button {
|
|
||||||
font-size: medium;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -33,6 +33,11 @@ library.add(
|
||||||
)
|
)
|
||||||
|
|
||||||
const NavPanel = {
|
const NavPanel = {
|
||||||
|
created () {
|
||||||
|
if (this.currentUser && this.currentUser.locked) {
|
||||||
|
this.$store.dispatch('startFetchingFollowRequests')
|
||||||
|
}
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
TimelineMenuContent
|
TimelineMenuContent
|
||||||
},
|
},
|
||||||
|
@ -49,13 +54,11 @@ const NavPanel = {
|
||||||
computed: {
|
computed: {
|
||||||
...mapState({
|
...mapState({
|
||||||
currentUser: state => state.users.currentUser,
|
currentUser: state => state.users.currentUser,
|
||||||
|
followRequestCount: state => state.api.followRequests.length,
|
||||||
privateMode: state => state.instance.private,
|
privateMode: state => state.instance.private,
|
||||||
federating: state => state.instance.federating,
|
federating: state => state.instance.federating
|
||||||
}),
|
}),
|
||||||
...mapGetters(['unreadAnnouncementCount']),
|
...mapGetters(['unreadAnnouncementCount'])
|
||||||
followRequestCount () {
|
|
||||||
return this.$store.state.users.currentUser.follow_requests_count
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import PinchZoom from '@floatingghost/pinch-zoom-element'
|
import PinchZoom from '@kazvmoe-infra/pinch-zoom-element'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
methods: {
|
methods: {
|
||||||
|
|
|
@ -103,9 +103,9 @@ export default {
|
||||||
convertExpiryFromUnit (unit, amount) {
|
convertExpiryFromUnit (unit, amount) {
|
||||||
// Note: we want seconds and not milliseconds
|
// Note: we want seconds and not milliseconds
|
||||||
switch (unit) {
|
switch (unit) {
|
||||||
case 'minutes': return amount * DateUtils.MINUTE / 1000
|
case 'minutes': return 0.001 * amount * DateUtils.MINUTE
|
||||||
case 'hours': return amount * DateUtils.HOUR / 1000
|
case 'hours': return 0.001 * amount * DateUtils.HOUR
|
||||||
case 'days': return amount * DateUtils.DAY / 1000
|
case 'days': return 0.001 * amount * DateUtils.DAY
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
expiryAmountChange () {
|
expiryAmountChange () {
|
||||||
|
|
|
@ -13,7 +13,6 @@ import suggestor from '../emoji_input/suggestor.js'
|
||||||
import { mapGetters, mapState } from 'vuex'
|
import { mapGetters, mapState } from 'vuex'
|
||||||
import Checkbox from '../checkbox/checkbox.vue'
|
import Checkbox from '../checkbox/checkbox.vue'
|
||||||
import Select from '../select/select.vue'
|
import Select from '../select/select.vue'
|
||||||
import iso6391 from 'iso-639-1'
|
|
||||||
|
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
import {
|
||||||
|
@ -54,14 +53,6 @@ const pxStringToNumber = (str) => {
|
||||||
return Number(str.substring(0, str.length - 2))
|
return Number(str.substring(0, str.length - 2))
|
||||||
}
|
}
|
||||||
|
|
||||||
const deleteDraft = (draftKey) => {
|
|
||||||
const draftData = JSON.parse(localStorage.getItem('drafts') || '{}');
|
|
||||||
|
|
||||||
delete draftData[draftKey];
|
|
||||||
|
|
||||||
localStorage.setItem('drafts', JSON.stringify(draftData));
|
|
||||||
}
|
|
||||||
|
|
||||||
const PostStatusForm = {
|
const PostStatusForm = {
|
||||||
props: [
|
props: [
|
||||||
'statusId',
|
'statusId',
|
||||||
|
@ -72,7 +63,6 @@ const PostStatusForm = {
|
||||||
'statusMediaDescriptions',
|
'statusMediaDescriptions',
|
||||||
'statusScope',
|
'statusScope',
|
||||||
'statusContentType',
|
'statusContentType',
|
||||||
'statusLanguage',
|
|
||||||
'replyTo',
|
'replyTo',
|
||||||
'quoteId',
|
'quoteId',
|
||||||
'repliedUser',
|
'repliedUser',
|
||||||
|
@ -138,7 +128,7 @@ const PostStatusForm = {
|
||||||
statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)
|
statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { postContentType: contentType, sensitiveByDefault, sensitiveIfSubject, interfaceLanguage } = this.$store.getters.mergedConfig
|
const { postContentType: contentType, sensitiveByDefault, sensitiveIfSubject } = this.$store.getters.mergedConfig
|
||||||
|
|
||||||
let statusParams = {
|
let statusParams = {
|
||||||
spoilerText: this.subject || '',
|
spoilerText: this.subject || '',
|
||||||
|
@ -149,7 +139,6 @@ const PostStatusForm = {
|
||||||
poll: {},
|
poll: {},
|
||||||
mediaDescriptions: {},
|
mediaDescriptions: {},
|
||||||
visibility: this.suggestedVisibility(),
|
visibility: this.suggestedVisibility(),
|
||||||
language: interfaceLanguage,
|
|
||||||
contentType
|
contentType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -164,41 +153,10 @@ const PostStatusForm = {
|
||||||
poll: this.statusPoll || {},
|
poll: this.statusPoll || {},
|
||||||
mediaDescriptions: this.statusMediaDescriptions || {},
|
mediaDescriptions: this.statusMediaDescriptions || {},
|
||||||
visibility: this.statusScope || this.suggestedVisibility(),
|
visibility: this.statusScope || this.suggestedVisibility(),
|
||||||
language: this.statusLanguage || interfaceLanguage,
|
|
||||||
contentType: statusContentType
|
contentType: statusContentType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.statusId) {
|
|
||||||
let draftKey = 'status';
|
|
||||||
if (this.replyTo) {
|
|
||||||
draftKey = 'reply:' + this.replyTo;
|
|
||||||
} else if (this.quoteId) {
|
|
||||||
draftKey = 'quote:' + this.quoteId;
|
|
||||||
}
|
|
||||||
|
|
||||||
const draft = JSON.parse(localStorage.getItem('drafts') || '{}')[draftKey];
|
|
||||||
|
|
||||||
if (draft) {
|
|
||||||
statusParams = {
|
|
||||||
spoilerText: draft.data.spoilerText,
|
|
||||||
status: draft.data.status,
|
|
||||||
sensitiveIfSubject,
|
|
||||||
nsfw: draft.data.nsfw,
|
|
||||||
files: draft.data.files,
|
|
||||||
poll: draft.data.poll,
|
|
||||||
mediaDescriptions: draft.data.mediaDescriptions,
|
|
||||||
visibility: draft.data.visibility,
|
|
||||||
language: draft.data.language,
|
|
||||||
contentType: draft.data.contentType
|
|
||||||
}
|
|
||||||
|
|
||||||
if (draft.data.poll) {
|
|
||||||
this.togglePollForm();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
dropFiles: [],
|
dropFiles: [],
|
||||||
uploadingFiles: false,
|
uploadingFiles: false,
|
||||||
|
@ -301,10 +259,7 @@ const PostStatusForm = {
|
||||||
...mapGetters(['mergedConfig']),
|
...mapGetters(['mergedConfig']),
|
||||||
...mapState({
|
...mapState({
|
||||||
mobileLayout: state => state.interface.mobileLayout
|
mobileLayout: state => state.interface.mobileLayout
|
||||||
}),
|
})
|
||||||
isoLanguages () {
|
|
||||||
return iso6391.getAllCodes();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'newStatus': {
|
'newStatus': {
|
||||||
|
@ -318,7 +273,6 @@ const PostStatusForm = {
|
||||||
statusChanged () {
|
statusChanged () {
|
||||||
this.autoPreview()
|
this.autoPreview()
|
||||||
this.updateIdempotencyKey()
|
this.updateIdempotencyKey()
|
||||||
this.saveDraft()
|
|
||||||
},
|
},
|
||||||
clearStatus () {
|
clearStatus () {
|
||||||
const newStatus = this.newStatus
|
const newStatus = this.newStatus
|
||||||
|
@ -328,7 +282,6 @@ const PostStatusForm = {
|
||||||
files: [],
|
files: [],
|
||||||
visibility: newStatus.visibility,
|
visibility: newStatus.visibility,
|
||||||
contentType: newStatus.contentType,
|
contentType: newStatus.contentType,
|
||||||
language: newStatus.language,
|
|
||||||
poll: {},
|
poll: {},
|
||||||
mediaDescriptions: {}
|
mediaDescriptions: {}
|
||||||
}
|
}
|
||||||
|
@ -388,7 +341,6 @@ const PostStatusForm = {
|
||||||
inReplyToStatusId: this.replyTo,
|
inReplyToStatusId: this.replyTo,
|
||||||
quoteId: this.quoteId,
|
quoteId: this.quoteId,
|
||||||
contentType: newStatus.contentType,
|
contentType: newStatus.contentType,
|
||||||
language: newStatus.language,
|
|
||||||
poll,
|
poll,
|
||||||
idempotencyKey: this.idempotencyKey
|
idempotencyKey: this.idempotencyKey
|
||||||
}
|
}
|
||||||
|
@ -423,7 +375,6 @@ const PostStatusForm = {
|
||||||
inReplyToStatusId: this.replyTo,
|
inReplyToStatusId: this.replyTo,
|
||||||
quoteId: this.quoteId,
|
quoteId: this.quoteId,
|
||||||
contentType: newStatus.contentType,
|
contentType: newStatus.contentType,
|
||||||
language: newStatus.language,
|
|
||||||
poll: {},
|
poll: {},
|
||||||
preview: true
|
preview: true
|
||||||
}).then((data) => {
|
}).then((data) => {
|
||||||
|
@ -440,38 +391,8 @@ const PostStatusForm = {
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
this.previewLoading = false
|
this.previewLoading = false
|
||||||
})
|
})
|
||||||
|
|
||||||
let draftKey = 'status';
|
|
||||||
if (this.replyTo) {
|
|
||||||
draftKey = 'reply:' + this.replyTo;
|
|
||||||
} else if (this.quoteId) {
|
|
||||||
draftKey = 'quote:' + this.quoteId;
|
|
||||||
}
|
|
||||||
deleteDraft(draftKey)
|
|
||||||
},
|
},
|
||||||
debouncePreviewStatus: debounce(function () { this.previewStatus() }, 500),
|
debouncePreviewStatus: debounce(function () { this.previewStatus() }, 500),
|
||||||
saveDraft() {
|
|
||||||
const draftData = JSON.parse(localStorage.getItem('drafts') || '{}');
|
|
||||||
|
|
||||||
let draftKey = 'status';
|
|
||||||
if (this.replyTo) {
|
|
||||||
draftKey = 'reply:' + this.replyTo;
|
|
||||||
} else if (this.quoteId) {
|
|
||||||
draftKey = 'quote:' + this.quoteId;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.newStatus.status || this.newStatus.spoilerText || this.newStatus.files.length > 0 || this.newStatus.poll.length > 0) {
|
|
||||||
draftData[draftKey] = {
|
|
||||||
updatedAt: new Date(),
|
|
||||||
data: this.newStatus,
|
|
||||||
};
|
|
||||||
|
|
||||||
localStorage.setItem('drafts', JSON.stringify(draftData));
|
|
||||||
|
|
||||||
} else {
|
|
||||||
deleteDraft(draftKey);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
autoPreview () {
|
autoPreview () {
|
||||||
if (!this.preview) return
|
if (!this.preview) return
|
||||||
this.previewLoading = true
|
this.previewLoading = true
|
||||||
|
|
|
@ -194,23 +194,6 @@
|
||||||
:on-scope-change="changeVis"
|
:on-scope-change="changeVis"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div
|
|
||||||
class="language-selector"
|
|
||||||
>
|
|
||||||
<Select
|
|
||||||
id="post-language"
|
|
||||||
v-model="newStatus.language"
|
|
||||||
class="form-control"
|
|
||||||
>
|
|
||||||
<option
|
|
||||||
v-for="language in isoLanguages"
|
|
||||||
:key="language"
|
|
||||||
:value="language"
|
|
||||||
>
|
|
||||||
{{ language }}
|
|
||||||
</option>
|
|
||||||
</Select>
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
v-if="postFormats.length > 1"
|
v-if="postFormats.length > 1"
|
||||||
class="text-format"
|
class="text-format"
|
||||||
|
|
|
@ -188,7 +188,7 @@ export default {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
case 'span':
|
case 'span':
|
||||||
if (this.handleLinks && attrs?.['class']?.includes?.('h-card')) {
|
if (this.handleLinks && attrs['class'] && attrs['class'].includes('h-card')) {
|
||||||
return ['', children.map(processItem), '']
|
return ['', children.map(processItem), '']
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
|
|
||||||
.emoji {
|
.emoji {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
width: var(--emoji-size, 32px);
|
||||||
height: var(--emoji-size, 32px);
|
height: var(--emoji-size, 32px);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
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"
|
||||||
|
@ -29,6 +30,7 @@
|
||||||
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"
|
||||||
|
@ -42,6 +44,7 @@
|
||||||
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"
|
||||||
|
@ -84,7 +87,6 @@
|
||||||
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,7 +73,6 @@
|
||||||
|
|
||||||
.search-bar-input {
|
.search-bar-input {
|
||||||
flex: 1 0 auto;
|
flex: 1 0 auto;
|
||||||
margin-left: 0.5em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.cancel-search {
|
.cancel-search {
|
||||||
|
|
|
@ -76,10 +76,6 @@
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 20px;
|
right: 20px;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
|
|
||||||
@media all and (max-width: 800px) {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,10 +44,6 @@
|
||||||
<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"
|
||||||
|
@ -57,7 +53,7 @@
|
||||||
:bound-to="{ x: 'container' }"
|
:bound-to="{ x: 'container' }"
|
||||||
remove-padding
|
remove-padding
|
||||||
>
|
>
|
||||||
<template #trigger>
|
<template v-slot:trigger>
|
||||||
<button
|
<button
|
||||||
class="btn button-default"
|
class="btn button-default"
|
||||||
:title="$t('general.close')"
|
:title="$t('general.close')"
|
||||||
|
@ -69,7 +65,7 @@
|
||||||
/>
|
/>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
<template #content="{close}">
|
<template v-slot: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"
|
||||||
|
@ -107,11 +103,14 @@
|
||||||
|
|
||||||
<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"
|
||||||
|
|
|
@ -407,15 +407,6 @@
|
||||||
{{ $t('settings.preload_images') }}
|
{{ $t('settings.preload_images') }}
|
||||||
</BooleanSetting>
|
</BooleanSetting>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<BooleanSetting
|
|
||||||
path="useBlurhash"
|
|
||||||
expert="1"
|
|
||||||
:disabled="!hideNsfw"
|
|
||||||
>
|
|
||||||
{{ $t('settings.use_blurhash') }}
|
|
||||||
</BooleanSetting>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<BooleanSetting
|
<BooleanSetting
|
||||||
path="useOneClickNsfw"
|
path="useOneClickNsfw"
|
||||||
|
|
|
@ -43,9 +43,7 @@ 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: {
|
||||||
|
@ -125,8 +123,7 @@ 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,10 +4,6 @@
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.expire-posts-days {
|
|
||||||
margin-left: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.visibility-tray {
|
.visibility-tray {
|
||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,20 +89,6 @@
|
||||||
{{ $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')"
|
||||||
|
|
|
@ -284,6 +284,7 @@
|
||||||
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,
|
||||||
|
@ -317,11 +318,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-evenly;
|
justify-content: space-around;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
min-height: 2em;
|
min-height: 2em;
|
||||||
|
|
|
@ -958,22 +958,20 @@
|
||||||
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"
|
:disabled="!themeValid"
|
||||||
:disabled="!themeValid"
|
@click="setCustomTheme"
|
||||||
@click="setCustomTheme"
|
>
|
||||||
>
|
{{ $t('general.apply') }}
|
||||||
{{ $t('general.apply') }}
|
</button>
|
||||||
</button>
|
<button
|
||||||
<button
|
class="btn button-default"
|
||||||
class="btn button-default"
|
@click="clearAll"
|
||||||
@click="clearAll"
|
>
|
||||||
>
|
{{ $t('settings.style.switcher.reset') }}
|
||||||
{{ $t('settings.style.switcher.reset') }}
|
</button>
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</teleport>
|
</teleport>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -42,10 +42,6 @@
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -352,25 +352,22 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="content">
|
<StatusContent
|
||||||
<StatusContent
|
ref="content"
|
||||||
ref="content"
|
:status="status"
|
||||||
class="status-content"
|
:no-heading="noHeading"
|
||||||
:status="status"
|
:highlight="highlight"
|
||||||
:no-heading="noHeading"
|
:focused="isFocused"
|
||||||
:highlight="highlight"
|
:controlled-showing-tall="controlledShowingTall"
|
||||||
:focused="isFocused"
|
:controlled-expanding-subject="controlledExpandingSubject"
|
||||||
:controlled-showing-tall="controlledShowingTall"
|
:controlled-showing-long-subject="controlledShowingLongSubject"
|
||||||
:controlled-expanding-subject="controlledExpandingSubject"
|
:controlled-toggle-showing-tall="controlledToggleShowingTall"
|
||||||
:controlled-showing-long-subject="controlledShowingLongSubject"
|
:controlled-toggle-expanding-subject="controlledToggleExpandingSubject"
|
||||||
:controlled-toggle-showing-tall="controlledToggleShowingTall"
|
:controlled-toggle-showing-long-subject="controlledToggleShowingLongSubject"
|
||||||
:controlled-toggle-expanding-subject="controlledToggleExpandingSubject"
|
@mediaplay="addMediaPlaying($event)"
|
||||||
:controlled-toggle-showing-long-subject="controlledToggleShowingLongSubject"
|
@mediapause="removeMediaPlaying($event)"
|
||||||
@mediaplay="addMediaPlaying($event)"
|
@parseReady="setHeadTailLinks"
|
||||||
@mediapause="removeMediaPlaying($event)"
|
/>
|
||||||
@parseReady="setHeadTailLinks"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="inConversation && !isPreview && replies && replies.length"
|
v-if="inConversation && !isPreview && replies && replies.length"
|
||||||
|
@ -537,6 +534,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>
|
||||||
|
|
|
@ -22,18 +22,21 @@
|
||||||
|
|
||||||
._mfm_x2_ {
|
._mfm_x2_ {
|
||||||
.emoji {
|
.emoji {
|
||||||
|
width: 100px;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
._mfm_x3_ {
|
._mfm_x3_ {
|
||||||
.emoji {
|
.emoji {
|
||||||
|
width: 150px;
|
||||||
height: 150px;
|
height: 150px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
._mfm_x4_ {
|
._mfm_x4_ {
|
||||||
.emoji {
|
.emoji {
|
||||||
|
width: 200px;
|
||||||
height: 200px;
|
height: 200px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,10 +68,11 @@
|
||||||
.StatusContent {
|
.StatusContent {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
img, video {
|
img, video {
|
||||||
&.emoji {
|
&.emoji {
|
||||||
max-width: 100%;
|
width: 50px;
|
||||||
height: 50px;
|
height: 50px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,6 +90,7 @@
|
||||||
animation: none !important;
|
animation: none !important;
|
||||||
}
|
}
|
||||||
.emoji {
|
.emoji {
|
||||||
|
width: 32px !important;
|
||||||
height: 32px !important;
|
height: 32px !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,13 +6,11 @@ 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, faPlus, faMinus } from '@fortawesome/free-solid-svg-icons'
|
import { faCircleNotch, faCog } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
library.add(
|
library.add(
|
||||||
faCircleNotch,
|
faCircleNotch,
|
||||||
faCog,
|
faCog
|
||||||
faPlus,
|
|
||||||
faMinus
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const Timeline = {
|
const Timeline = {
|
||||||
|
@ -92,15 +90,6 @@ 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 () {
|
||||||
|
@ -129,10 +118,6 @@ 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)
|
||||||
|
@ -247,12 +232,6 @@ const Timeline = {
|
||||||
}, 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,36 +21,6 @@
|
||||||
{{ $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
|
||||||
|
|
|
@ -8,7 +8,6 @@ import {
|
||||||
faHome,
|
faHome,
|
||||||
faCircle
|
faCircle
|
||||||
} from '@fortawesome/free-solid-svg-icons'
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
import { federatedTimelineVisible, publicTimelineVisible, bubbleTimelineVisible } from '../../lib/timeline_visibility'
|
|
||||||
|
|
||||||
library.add(
|
library.add(
|
||||||
faUsers,
|
faUsers,
|
||||||
|
@ -25,9 +24,7 @@ const TimelineMenuContent = {
|
||||||
currentUser: state => state.users.currentUser,
|
currentUser: state => state.users.currentUser,
|
||||||
privateMode: state => state.instance.private,
|
privateMode: state => state.instance.private,
|
||||||
federating: state => state.instance.federating,
|
federating: state => state.instance.federating,
|
||||||
publicTimelineVisible,
|
showBubbleTimeline: state => (state.instance.localBubbleInstances.length > 0)
|
||||||
federatedTimelineVisible,
|
|
||||||
bubbleTimelineVisible,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
>{{ $t("nav.home_timeline") }}</span>
|
>{{ $t("nav.home_timeline") }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="bubbleTimelineVisible">
|
<li v-if="currentUser && showBubbleTimeline">
|
||||||
<router-link
|
<router-link
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
:to="{ name: 'bubble-timeline' }"
|
:to="{ name: 'bubble-timeline' }"
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
>{{ $t("nav.bubble_timeline") }}</span>
|
>{{ $t("nav.bubble_timeline") }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="publicTimelineVisible">
|
<li v-if="currentUser || !privateMode">
|
||||||
<router-link
|
<router-link
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
:to="{ name: 'public-timeline' }"
|
:to="{ name: 'public-timeline' }"
|
||||||
|
@ -48,7 +48,7 @@
|
||||||
>{{ $t("nav.public_tl") }}</span>
|
>{{ $t("nav.public_tl") }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="federatedTimelineVisible">
|
<li v-if="federating && (currentUser || !privateMode)">
|
||||||
<router-link
|
<router-link
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
:to="{ name: 'public-external-timeline' }"
|
:to="{ name: 'public-external-timeline' }"
|
||||||
|
@ -62,7 +62,6 @@
|
||||||
:title="$t('nav.twkn_timeline_description')"
|
:title="$t('nav.twkn_timeline_description')"
|
||||||
:aria-label="$t('nav.twkn_timeline_description')"
|
:aria-label="$t('nav.twkn_timeline_description')"
|
||||||
>{{ $t("nav.twkn") }}</span>
|
>{{ $t("nav.twkn") }}</span>
|
||||||
|
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="currentUser">
|
<li v-if="currentUser">
|
||||||
|
|
|
@ -8,7 +8,6 @@ import {
|
||||||
faHome
|
faHome
|
||||||
} from '@fortawesome/free-solid-svg-icons'
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
import { faCircle } from '@fortawesome/free-regular-svg-icons'
|
import { faCircle } from '@fortawesome/free-regular-svg-icons'
|
||||||
import { federatedTimelineVisible, publicTimelineVisible, bubbleTimelineVisible } from '../../lib/timeline_visibility'
|
|
||||||
library.add(
|
library.add(
|
||||||
faUsers,
|
faUsers,
|
||||||
faGlobe,
|
faGlobe,
|
||||||
|
@ -23,10 +22,7 @@ const TimelineMenuContent = {
|
||||||
...mapState({
|
...mapState({
|
||||||
currentUser: state => state.users.currentUser,
|
currentUser: state => state.users.currentUser,
|
||||||
privateMode: state => state.instance.private,
|
privateMode: state => state.instance.private,
|
||||||
federating: state => state.instance.federating,
|
federating: state => state.instance.federating
|
||||||
publicTimelineVisible,
|
|
||||||
federatedTimelineVisible,
|
|
||||||
bubbleTimelineVisible,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
>{{ $t("nav.home_timeline") }}</span>
|
>{{ $t("nav.home_timeline") }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="bubbleTimelineVisible">
|
<li v-if="currentUser">
|
||||||
<router-link
|
<router-link
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
:to="{ name: 'bubble-timeline' }"
|
:to="{ name: 'bubble-timeline' }"
|
||||||
|
@ -32,7 +32,7 @@
|
||||||
>{{ $t("nav.bubble_timeline") }}</span>
|
>{{ $t("nav.bubble_timeline") }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="publicTimelineVisible">
|
<li v-if="currentUser || !privateMode">
|
||||||
<router-link
|
<router-link
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
:to="{ name: 'public-timeline' }"
|
:to="{ name: 'public-timeline' }"
|
||||||
|
@ -48,7 +48,7 @@
|
||||||
>{{ $t("nav.public_tl") }}</span>
|
>{{ $t("nav.public_tl") }}</span>
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if="federatedTimelineVisible">
|
<li v-if="federating && (currentUser || !privateMode)">
|
||||||
<router-link
|
<router-link
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
:to="{ name: 'public-external-timeline' }"
|
:to="{ name: 'public-external-timeline' }"
|
||||||
|
|
|
@ -4,12 +4,6 @@ import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
import {
|
||||||
faChevronDown
|
faChevronDown
|
||||||
} from '@fortawesome/free-solid-svg-icons'
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
import { mapState } from 'vuex'
|
|
||||||
import {
|
|
||||||
publicTimelineVisible,
|
|
||||||
federatedTimelineVisible,
|
|
||||||
bubbleTimelineVisible,
|
|
||||||
} from '../../lib/timeline_visibility'
|
|
||||||
|
|
||||||
library.add(faChevronDown)
|
library.add(faChevronDown)
|
||||||
|
|
||||||
|
@ -42,15 +36,12 @@ const TimelineMenuTabs = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
currentUser () {
|
||||||
|
return this.$store.state.users.currentUser
|
||||||
|
},
|
||||||
privateMode () {
|
privateMode () {
|
||||||
return this.$store.state.instance.private
|
return this.$store.state.instance.private
|
||||||
},
|
}
|
||||||
...mapState({
|
|
||||||
currentUser: state => state.users.currentUser,
|
|
||||||
publicTimelineVisible,
|
|
||||||
federatedTimelineVisible,
|
|
||||||
bubbleTimelineVisible,
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
timelineName () {
|
timelineName () {
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'public-timeline' }"
|
:to="{ name: 'public-timeline' }"
|
||||||
class="nav-icon"
|
class="nav-icon"
|
||||||
v-if="publicTimelineVisible"
|
|
||||||
>
|
>
|
||||||
<FAIcon
|
<FAIcon
|
||||||
fixed-width
|
fixed-width
|
||||||
|
@ -28,7 +27,7 @@
|
||||||
/>
|
/>
|
||||||
</router-link>
|
</router-link>
|
||||||
<router-link
|
<router-link
|
||||||
v-if="bubbleTimelineVisible"
|
v-if="currentUser"
|
||||||
:to="{ name: 'bubble-timeline' }"
|
:to="{ name: 'bubble-timeline' }"
|
||||||
class="nav-icon"
|
class="nav-icon"
|
||||||
>
|
>
|
||||||
|
@ -42,7 +41,6 @@
|
||||||
<router-link
|
<router-link
|
||||||
:to="{ name: 'public-external-timeline' }"
|
:to="{ name: 'public-external-timeline' }"
|
||||||
class="nav-icon"
|
class="nav-icon"
|
||||||
v-if="federatedTimelineVisible"
|
|
||||||
>
|
>
|
||||||
<FAIcon
|
<FAIcon
|
||||||
fixed-width
|
fixed-width
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
.user-card {
|
.user-card {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 10;
|
z-index: 1;
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
--_still-image-img-visibility: visible;
|
--_still-image-img-visibility: visible;
|
||||||
|
@ -235,7 +235,7 @@
|
||||||
line-height: 22px;
|
line-height: 22px;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
.following, .requested_by, .blocking {
|
.following, .requested_by {
|
||||||
flex: 1 0 auto;
|
flex: 1 0 auto;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
margin-bottom: .25em;
|
margin-bottom: .25em;
|
||||||
|
|
|
@ -67,17 +67,6 @@
|
||||||
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"
|
||||||
|
@ -127,12 +116,6 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="user-meta">
|
<div class="user-meta">
|
||||||
<div
|
|
||||||
v-if="relationship.blocked_by && loggedIn && isOtherUser"
|
|
||||||
class="blocking"
|
|
||||||
>
|
|
||||||
{{ $t('user_card.blocks_you') }}
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
v-if="relationship.followed_by && loggedIn && isOtherUser"
|
v-if="relationship.followed_by && loggedIn && isOtherUser"
|
||||||
class="following"
|
class="following"
|
||||||
|
@ -193,7 +176,6 @@
|
||||||
<FollowButton
|
<FollowButton
|
||||||
:relationship="relationship"
|
:relationship="relationship"
|
||||||
:user="user"
|
:user="user"
|
||||||
:disabled="relationship.blocked_by"
|
|
||||||
/>
|
/>
|
||||||
<template v-if="relationship.following">
|
<template v-if="relationship.following">
|
||||||
<ProgressButton
|
<ProgressButton
|
||||||
|
|
|
@ -10,14 +10,11 @@ import withLoadMore from '../../hocs/with_load_more/with_load_more'
|
||||||
import { debounce } from 'lodash'
|
import { debounce } from 'lodash'
|
||||||
import { library } from '@fortawesome/fontawesome-svg-core'
|
import { library } from '@fortawesome/fontawesome-svg-core'
|
||||||
import {
|
import {
|
||||||
faCircleNotch,
|
faCircleNotch
|
||||||
faCircleCheck
|
|
||||||
} from '@fortawesome/free-solid-svg-icons'
|
} from '@fortawesome/free-solid-svg-icons'
|
||||||
import FollowedTagCard from '../followed_tag_card/FollowedTagCard.vue'
|
|
||||||
|
|
||||||
library.add(
|
library.add(
|
||||||
faCircleNotch,
|
faCircleNotch
|
||||||
faCircleCheck
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const FollowerList = withLoadMore({
|
const FollowerList = withLoadMore({
|
||||||
|
@ -36,14 +33,6 @@ const FriendList = withLoadMore({
|
||||||
additionalPropNames: ['userId']
|
additionalPropNames: ['userId']
|
||||||
})(List)
|
})(List)
|
||||||
|
|
||||||
const FollowedTagList = withLoadMore({
|
|
||||||
fetch: (props, $store) => $store.dispatch('fetchFollowedTags', props.userId),
|
|
||||||
select: (props, $store) => get($store.getters.findUser(props.userId), 'followedTagIds', []).map(id => $store.getters.findTag(id)),
|
|
||||||
destroy: (props, $store) => $store.dispatch('clearFollowedTags', props.userId),
|
|
||||||
childPropName: 'items',
|
|
||||||
additionalPropNames: ['userId']
|
|
||||||
})(List)
|
|
||||||
|
|
||||||
const isUserPage = ({ name }) => name === 'user-profile' || name === 'external-user-profile'
|
const isUserPage = ({ name }) => name === 'user-profile' || name === 'external-user-profile'
|
||||||
|
|
||||||
const UserProfile = {
|
const UserProfile = {
|
||||||
|
@ -52,7 +41,6 @@ const UserProfile = {
|
||||||
error: false,
|
error: false,
|
||||||
userId: null,
|
userId: null,
|
||||||
tab: 'statuses',
|
tab: 'statuses',
|
||||||
followsTab: 'users',
|
|
||||||
footerRef: null,
|
footerRef: null,
|
||||||
note: null,
|
note: null,
|
||||||
noteLoading: false
|
noteLoading: false
|
||||||
|
@ -177,9 +165,6 @@ const UserProfile = {
|
||||||
this.tab = tab
|
this.tab = tab
|
||||||
this.$router.replace({ hash: `#${tab}` })
|
this.$router.replace({ hash: `#${tab}` })
|
||||||
},
|
},
|
||||||
onFollowsTabSwitch (tab) {
|
|
||||||
this.followsTab = tab
|
|
||||||
},
|
|
||||||
linkClicked ({ target }) {
|
linkClicked ({ target }) {
|
||||||
if (target.tagName === 'SPAN') {
|
if (target.tagName === 'SPAN') {
|
||||||
target = target.parentNode
|
target = target.parentNode
|
||||||
|
@ -215,7 +200,6 @@ const UserProfile = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
components: {
|
components: {
|
||||||
FollowedTagCard,
|
|
||||||
UserCard,
|
UserCard,
|
||||||
Timeline,
|
Timeline,
|
||||||
FollowerList,
|
FollowerList,
|
||||||
|
@ -223,8 +207,7 @@ const UserProfile = {
|
||||||
FollowCard,
|
FollowCard,
|
||||||
TabSwitcher,
|
TabSwitcher,
|
||||||
Conversation,
|
Conversation,
|
||||||
RichContent,
|
RichContent
|
||||||
FollowedTagList
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,15 +37,6 @@
|
||||||
:html="field.value"
|
:html="field.value"
|
||||||
:emoji="user.emoji"
|
:emoji="user.emoji"
|
||||||
/>
|
/>
|
||||||
<span
|
|
||||||
v-if="field.verified_at"
|
|
||||||
class="user-profile-field-validated"
|
|
||||||
>
|
|
||||||
<FAIcon
|
|
||||||
icon="check-circle"
|
|
||||||
:title="$t('user_profile.field_validated')"
|
|
||||||
/>
|
|
||||||
</span>
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
|
@ -104,48 +95,22 @@
|
||||||
v-if="followsTabVisible"
|
v-if="followsTabVisible"
|
||||||
key="followees"
|
key="followees"
|
||||||
:label="$t('user_card.followees')"
|
:label="$t('user_card.followees')"
|
||||||
|
:disabled="!user.friends_count"
|
||||||
>
|
>
|
||||||
<tab-switcher
|
<FriendList :user-id="userId">
|
||||||
:active-tab="followsTab"
|
<template v-slot:item="{item}">
|
||||||
:render-only-focused="true"
|
<FollowCard :user="item" />
|
||||||
:on-switch="onFollowsTabSwitch"
|
</template>
|
||||||
>
|
</FriendList>
|
||||||
<div
|
|
||||||
key="users"
|
|
||||||
:label="$t('user_card.followed_users')"
|
|
||||||
>
|
|
||||||
<FriendList :user-id="userId">
|
|
||||||
<template #item="{item}">
|
|
||||||
<FollowCard :user="item" />
|
|
||||||
</template>
|
|
||||||
</FriendList>
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
key="tags"
|
|
||||||
v-if="isUs"
|
|
||||||
:label="$t('user_card.followed_tags')"
|
|
||||||
>
|
|
||||||
<FollowedTagList
|
|
||||||
:user-id="userId"
|
|
||||||
:get-key="(item) => item.name"
|
|
||||||
>
|
|
||||||
<template #item="{item}">
|
|
||||||
<FollowedTagCard :tag="item" />
|
|
||||||
</template>
|
|
||||||
<template #empty>
|
|
||||||
{{ $t('user_card.not_following_any_hashtags')}}
|
|
||||||
</template>
|
|
||||||
</FollowedTagList>
|
|
||||||
</div>
|
|
||||||
</tab-switcher>
|
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="followersTabVisible"
|
v-if="followersTabVisible"
|
||||||
key="followers"
|
key="followers"
|
||||||
:label="$t('user_card.followers')"
|
:label="$t('user_card.followers')"
|
||||||
|
:disabled="!user.followers_count"
|
||||||
>
|
>
|
||||||
<FollowerList :user-id="userId">
|
<FollowerList :user-id="userId">
|
||||||
<template #item="{item}">
|
<template v-slot:item="{item}">
|
||||||
<FollowCard
|
<FollowCard
|
||||||
:user="item"
|
:user="item"
|
||||||
:no-follows-you="isUs"
|
:no-follows-you="isUs"
|
||||||
|
@ -260,11 +225,6 @@
|
||||||
padding: 0.5em 1.5em;
|
padding: 0.5em 1.5em;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-profile-field-validated {
|
|
||||||
margin-left: 1rem;
|
|
||||||
color: green;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,8 +59,7 @@ const withLoadMore = ({
|
||||||
this.loading = false
|
this.loading = false
|
||||||
this.bottomedOut = isEmpty(newEntries)
|
this.bottomedOut = isEmpty(newEntries)
|
||||||
})
|
})
|
||||||
.catch((e) => {
|
.catch(() => {
|
||||||
console.error(e)
|
|
||||||
this.loading = false
|
this.loading = false
|
||||||
this.error = true
|
this.error = true
|
||||||
})
|
})
|
||||||
|
@ -89,7 +88,7 @@ const withLoadMore = ({
|
||||||
const children = this.$slots
|
const children = this.$slots
|
||||||
return (
|
return (
|
||||||
<div class="with-load-more">
|
<div class="with-load-more">
|
||||||
<WrappedComponent {...props} >
|
<WrappedComponent {...props}>
|
||||||
{children}
|
{children}
|
||||||
</WrappedComponent>
|
</WrappedComponent>
|
||||||
<div class="with-load-more-footer">
|
<div class="with-load-more-footer">
|
||||||
|
|
17
src/i18n.js
Normal file
17
src/i18n.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
import 'custom-event-polyfill'
|
||||||
|
import './lib/event_target_polyfill.js'
|
||||||
|
import { createI18n } from 'vue-i18n'
|
||||||
|
import messages from './i18n/messages.js'
|
||||||
|
|
||||||
|
const currentLocale = (window.navigator.language || 'en').split('-')[0]
|
||||||
|
|
||||||
|
const i18n = createI18n({
|
||||||
|
// By default, use the browser locale, we will update it if neccessary
|
||||||
|
locale: 'en',
|
||||||
|
fallbackLocale: 'en',
|
||||||
|
messages: messages.default
|
||||||
|
})
|
||||||
|
|
||||||
|
messages.setLanguage(i18n, currentLocale)
|
||||||
|
|
||||||
|
export default i18n;
|
149
src/i18n/de.json
149
src/i18n/de.json
|
@ -135,7 +135,7 @@
|
||||||
},
|
},
|
||||||
"scope_in_timeline": {
|
"scope_in_timeline": {
|
||||||
"direct": "Direkt",
|
"direct": "Direkt",
|
||||||
"local": "Lokal - nur deine eigene Instanz kann diese Nachricht sehen",
|
"local": "Lokal - nur deine eigene Instanz kann diesen Beitrag sehen",
|
||||||
"private": "Nur an Folgende",
|
"private": "Nur an Folgende",
|
||||||
"public": "Öffentlich",
|
"public": "Öffentlich",
|
||||||
"unlisted": "Nicht gelistet"
|
"unlisted": "Nicht gelistet"
|
||||||
|
@ -252,10 +252,6 @@
|
||||||
"hint": "Anmelden um an der Diskussion teilzunehmen",
|
"hint": "Anmelden um an der Diskussion teilzunehmen",
|
||||||
"login": "Anmelden",
|
"login": "Anmelden",
|
||||||
"logout": "Abmelden",
|
"logout": "Abmelden",
|
||||||
"logout_confirm": "Willst du dich wirklich abmelden?",
|
|
||||||
"logout_confirm_accept_button": "Abmelden",
|
|
||||||
"logout_confirm_cancel_button": "Abbrechen",
|
|
||||||
"logout_confirm_title": "Abmelden",
|
|
||||||
"password": "Passwort",
|
"password": "Passwort",
|
||||||
"placeholder": "meinbenutzername",
|
"placeholder": "meinbenutzername",
|
||||||
"recovery_code": "Wiederherstellungscode",
|
"recovery_code": "Wiederherstellungscode",
|
||||||
|
@ -268,32 +264,6 @@
|
||||||
"next": "Weiter",
|
"next": "Weiter",
|
||||||
"previous": "Zurück"
|
"previous": "Zurück"
|
||||||
},
|
},
|
||||||
"moderation": {
|
|
||||||
"moderation": "Moderation",
|
|
||||||
"reports": {
|
|
||||||
"add_note": "Notiz hinzufügen",
|
|
||||||
"close": "Schließen",
|
|
||||||
"delete_note": "Löschen",
|
|
||||||
"delete_note_accept": "Ja, löschen",
|
|
||||||
"delete_note_cancel": "Nein, behalten",
|
|
||||||
"delete_note_confirm": "Soll diese Notiz wirklich gelöscht werden?",
|
|
||||||
"delete_note_title": "Löschen bestätigen",
|
|
||||||
"no_content": "Keine Beschreibung angegeben",
|
|
||||||
"no_reports": "Keine Meldungen verfügbar",
|
|
||||||
"note_placeholder": "Hinterlasse eine Notiz",
|
|
||||||
"notes": "{ count } Notiz | { count } Notizen",
|
|
||||||
"reopen": "Wieder öffnen",
|
|
||||||
"report": "Meldung über",
|
|
||||||
"reports": "Meldungen",
|
|
||||||
"resolve": "Lösen",
|
|
||||||
"show_closed": "Geschlossene anzeigen",
|
|
||||||
"statuses": "{ count } Post| { count } Posts",
|
|
||||||
"tag_policy_notice": "Schalte die TagPolicy-MRF ein, um Post-Beschränkungen einzustellen",
|
|
||||||
"tags": "Post-Einschränkungen einstellen"
|
|
||||||
},
|
|
||||||
"statuses": "Posts",
|
|
||||||
"users": "Benutzer"
|
|
||||||
},
|
|
||||||
"nav": {
|
"nav": {
|
||||||
"about": "Über",
|
"about": "Über",
|
||||||
"administration": "Administration",
|
"administration": "Administration",
|
||||||
|
@ -308,7 +278,6 @@
|
||||||
"interactions": "Interaktionen",
|
"interactions": "Interaktionen",
|
||||||
"lists": "Listen",
|
"lists": "Listen",
|
||||||
"mentions": "Erwähnungen",
|
"mentions": "Erwähnungen",
|
||||||
"moderation": "Moderation",
|
|
||||||
"preferences": "Voreinstellungen",
|
"preferences": "Voreinstellungen",
|
||||||
"public_timeline_description": "Öffentliche Beiträge von dieser Instanz",
|
"public_timeline_description": "Öffentliche Beiträge von dieser Instanz",
|
||||||
"public_tl": "Öffentliche Zeitleiste",
|
"public_tl": "Öffentliche Zeitleiste",
|
||||||
|
@ -376,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": "Diese Nachricht wird für alle erwähnten Benutzer sichtbar sein.",
|
"direct_warning_to_all": "Dieser Beitrag wird für alle erwähnten Benutzer sichtbar sein.",
|
||||||
"direct_warning_to_first_only": "Diese Nachricht wird für alle Benutzer, die am Anfang der Nachricht erwähnt wurden, sichtbar sein.",
|
"direct_warning_to_first_only": "Dieser Beitrag 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": "Nachricht bearbeiten",
|
"edit_status": "Beitrag ändern",
|
||||||
"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",
|
||||||
|
@ -391,22 +360,20 @@
|
||||||
"preview": "Vorschau",
|
"preview": "Vorschau",
|
||||||
"preview_empty": "Leer",
|
"preview_empty": "Leer",
|
||||||
"scope": {
|
"scope": {
|
||||||
"direct": "Direkt - Nachricht nur an erwähnte Profile",
|
"direct": "Direkt - Beitrag nur an erwähnte Profile",
|
||||||
"local": "Lokal - diese Nachricht nicht föderieren",
|
"local": "Lokal - diesen Beitrag nicht föderieren",
|
||||||
"private": "Nur Follower - Nachricht nur für Follower sichtbar",
|
"private": "Nur Follower - Beitrag nur für Follower sichtbar",
|
||||||
"public": "Öffentlich - Nachricht an öffentliche Zeitleisten",
|
"public": "Öffentlich - Beitrag 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": "Diese Nachricht wird nur für deine Follower sichtbar sein",
|
"private": "Dieser Beitrag wird nur für deine Follower sichtbar sein",
|
||||||
"public": "Diese Nachricht wird für alle sichtbar sein",
|
"public": "Dieser Beitrag wird für alle sichtbar sein",
|
||||||
"unlisted": "Diese Nachricht wird weder in der öffentlichen Zeitleiste noch im gesamten bekannten Netzwerk sichtbar sein"
|
"unlisted": "Dieser Beitrag wird weder in der öffentlichen Zeitleiste noch im gesamten bekannten Netzwerk sichtbar sein"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
"awaiting_email_confirmation": "Dein Account wurde registriert und eine E-Mail wurde an deine Adresse gesendet. Bitte lies die E-Mail, um die Registrierung abzuschließen.",
|
|
||||||
"awaiting_email_confirmation_title": "Warte auf E-Mail-Bestätigung",
|
|
||||||
"bio": "Bio",
|
"bio": "Bio",
|
||||||
"bio_placeholder": "z. B.\nHallo! Willkommen auf meinem Profil.\nIch mag Anime und Spiele. Hoffentlich können wir Freunde sein!",
|
"bio_placeholder": "z. B.\nHallo! Willkommen auf meinem Profil.\nIch mag Anime und Spiele. Hoffentlich können wir Freunde sein!",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
|
@ -420,8 +387,6 @@
|
||||||
"reason_placeholder": "Diese Instanz bestätigt Registrierungen manuell. \nLass die Admins wissen warum du dich registrieren willst.",
|
"reason_placeholder": "Diese Instanz bestätigt Registrierungen manuell. \nLass die Admins wissen warum du dich registrieren willst.",
|
||||||
"register": "Registrierung",
|
"register": "Registrierung",
|
||||||
"registration": "Registrierung",
|
"registration": "Registrierung",
|
||||||
"request_sent": "Deine Bitte zur Registrierung wurde weitergeleitet. Du erhälst eine E-Mail, wenn deiner Registrierung zugestimmt wurde.",
|
|
||||||
"request_sent_title": "Bitte zur Registrierung gesendet",
|
|
||||||
"token": "Einladungsschlüssel",
|
"token": "Einladungsschlüssel",
|
||||||
"username_placeholder": "z. B. akko",
|
"username_placeholder": "z. B. akko",
|
||||||
"validations": {
|
"validations": {
|
||||||
|
@ -500,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 einer Nachricht",
|
"confirm_dialogs_delete": "Löschen eines Beitrages",
|
||||||
"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 einer Nachricht",
|
"confirm_dialogs_repeat": "Wiederholen eines Beitrages",
|
||||||
"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",
|
||||||
|
@ -531,8 +496,6 @@
|
||||||
"enable_web_push_notifications": "Web-Pushbenachrichtigungen aktivieren",
|
"enable_web_push_notifications": "Web-Pushbenachrichtigungen aktivieren",
|
||||||
"enter_current_password_to_confirm": "Gib dein aktuelles Passwort ein, um deine Identität zu bestätigen",
|
"enter_current_password_to_confirm": "Gib dein aktuelles Passwort ein, um deine Identität zu bestätigen",
|
||||||
"expert_mode": "Erweiterte Einstellungen anzeigen",
|
"expert_mode": "Erweiterte Einstellungen anzeigen",
|
||||||
"expire_posts_enabled": "Posts löschen, die älter als eine Anzahl an Tagen sind",
|
|
||||||
"expire_posts_input_placeholder": "Anzahl an Tagen",
|
|
||||||
"export_theme": "Farbschema speichern",
|
"export_theme": "Farbschema speichern",
|
||||||
"file_export_import": {
|
"file_export_import": {
|
||||||
"backup_restore": "Einstellungen backuppen",
|
"backup_restore": "Einstellungen backuppen",
|
||||||
|
@ -572,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": "Nachrichtenstatistiken verbergen (z.B. die Anzahl der Favoriten)",
|
"hide_post_stats": "Beitragsstatistiken 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",
|
||||||
|
@ -599,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 Nachricht (leer = keine Beschränkung)",
|
"max_thumbnails": "Maximale Anzahl von Vorschaubildern pro Beitrag",
|
||||||
"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)",
|
||||||
|
@ -675,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-Format für Nachrichten",
|
"post_status_content_type": "Standard-Beitragsart",
|
||||||
"posts": "Beiträge",
|
"posts": "Beiträge",
|
||||||
"preload_images": "Bilder vorausladen",
|
"preload_images": "Bilder vorausladen",
|
||||||
"presets": "Voreinstellungen",
|
"presets": "Voreinstellungen",
|
||||||
|
@ -693,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 der Nachricht befindet",
|
"render_mfm_on_hover": "MFM-Animationen pausieren, solange sich der Mauszeiger nicht über dem Beitrag 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",
|
||||||
|
@ -717,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 die Nachricht eine Inhaltswarnung hat",
|
"sensitive_if_subject": "Bilder automatisch als heikel markieren, wenn der Beitrag 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",
|
||||||
|
@ -725,19 +688,6 @@
|
||||||
"setting_changed": "Einstellungen weichen von den Standardeinstellungen ab",
|
"setting_changed": "Einstellungen weichen von den Standardeinstellungen ab",
|
||||||
"setting_server_side": "Diese Einstellung hängt an deinem Profil und gilt für alle Sitzungen und Clients",
|
"setting_server_side": "Diese Einstellung hängt an deinem Profil und gilt für alle Sitzungen und Clients",
|
||||||
"settings": "Einstellungen",
|
"settings": "Einstellungen",
|
||||||
"settings_profile": "Einstellungs-Profile",
|
|
||||||
"settings_profile_creation": "Neues Profil erstellen",
|
|
||||||
"settings_profile_creation_new_name_label": "Name",
|
|
||||||
"settings_profile_creation_submit": "Erstellen",
|
|
||||||
"settings_profile_currently": "Benutze Profil {name} (version: {version})",
|
|
||||||
"settings_profile_delete": "Löschen",
|
|
||||||
"settings_profile_delete_confirm": "Dieses Profil wirklich löschen?",
|
|
||||||
"settings_profile_force_sync": "Synchronisieren",
|
|
||||||
"settings_profile_in_use": "In Benutzung",
|
|
||||||
"settings_profile_use": "Verwenden",
|
|
||||||
"settings_profiles_refresh": "Einstellungs-Profile neu laden",
|
|
||||||
"settings_profiles_show": "Alle Einstellungs-Profile anzeigen",
|
|
||||||
"settings_profiles_unshow": "Alle Einstellungs-Profile verbergen",
|
|
||||||
"show_admin_badge": "Zeige Admin-Abzeichen auf meinem Profil",
|
"show_admin_badge": "Zeige Admin-Abzeichen auf meinem Profil",
|
||||||
"show_moderator_badge": "Zeige Moderator-Abzeichen auf meinem Profil",
|
"show_moderator_badge": "Zeige Moderator-Abzeichen auf meinem Profil",
|
||||||
"show_nav_shortcuts": "Zusätzliche Schnellnavigation im Top-Panel anzeigen",
|
"show_nav_shortcuts": "Zusätzliche Schnellnavigation im Top-Panel anzeigen",
|
||||||
|
@ -808,8 +758,8 @@
|
||||||
"components": {
|
"components": {
|
||||||
"input": "Eingabefelder",
|
"input": "Eingabefelder",
|
||||||
"interface": "Oberfläche",
|
"interface": "Oberfläche",
|
||||||
"post": "Nachrichtentext",
|
"post": "Beitragstext",
|
||||||
"postCode": "nichtproportionaler Text in einer Nachricht (Rich-Text)"
|
"postCode": "Dicktengleicher Text in einem Beitrag (Rich-Text)"
|
||||||
},
|
},
|
||||||
"custom": "Benutzerdefiniert",
|
"custom": "Benutzerdefiniert",
|
||||||
"family": "Schriftname",
|
"family": "Schriftname",
|
||||||
|
@ -840,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 Nachrichtenanzeige)",
|
"avatarStatus": "Benutzer-Avatar (in der Beitragsanzeige)",
|
||||||
"button": "Schaltfläche",
|
"button": "Schaltfläche",
|
||||||
"buttonHover": "Schaltfläche (hover)",
|
"buttonHover": "Schaltfläche (hover)",
|
||||||
"buttonPressed": "Schaltfläche (gedrückt)",
|
"buttonPressed": "Schaltfläche (gedrückt)",
|
||||||
|
@ -911,13 +861,12 @@
|
||||||
"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 der aktuellen Nachricht schwach darstellen",
|
"tree_fade_ancestors": "Vorgänger des aktuellen Beitrags 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",
|
||||||
"useStreamingApiWarning": "(Nicht empfohlen, experimentell, bekannt dafür, Posts zu überspringen)",
|
"useStreamingApiWarning": "(Nicht empfohlen, experimentell, bekannt dafür, Posts zu überspringen)",
|
||||||
"use_at_icon": "{'@'}-Symbol als Icon und nicht als Text anzeigen",
|
"use_at_icon": "{'@'}-Symbol als Icon und nicht als Text anzeigen",
|
||||||
"use_blurhash": "Blurhash für NSFW-Vorschauen verwenden",
|
|
||||||
"use_contain_fit": "Vorschaubilder nicht zuschneiden",
|
"use_contain_fit": "Vorschaubilder nicht zuschneiden",
|
||||||
"use_one_click_nsfw": "Heikle Anhänge mit nur einem Klick öffnen",
|
"use_one_click_nsfw": "Heikle Anhänge mit nur einem Klick öffnen",
|
||||||
"user_mutes": "User",
|
"user_mutes": "User",
|
||||||
|
@ -938,21 +887,15 @@
|
||||||
"word_filter": "Wortfilter",
|
"word_filter": "Wortfilter",
|
||||||
"wordfilter": "Wortfilter"
|
"wordfilter": "Wortfilter"
|
||||||
},
|
},
|
||||||
"settings_profile": {
|
|
||||||
"creating": "Erstelle ein neues Einstellungs-Profil \"{profile}\"...",
|
|
||||||
"synchronization_error": "Konnte Einstellungen nicht synchronisieren: {err}",
|
|
||||||
"synchronized": "Einstellungen synchronisiert!",
|
|
||||||
"synchronizing": "Synchronisiere Einstellungs-Profil \"{profile}\"..."
|
|
||||||
},
|
|
||||||
"status": {
|
"status": {
|
||||||
"ancestor_follow": "Zeige {numReplies} andere Antwort unter dieser Nachricht | Zeige {numReplies} andere Antworten unter dieser Nachricht",
|
"ancestor_follow": "Zeige {numReplies} andere Antwort unter diesem Beitrag | Zeige {numReplies} andere Antworten unter diesem Beitrag",
|
||||||
"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": "Link zur Nachricht kopieren",
|
"copy_link": "Beitragslink kopieren",
|
||||||
"delete": "Lösche Nachricht",
|
"delete": "Lösche Beitrag",
|
||||||
"delete_confirm": "Möchtest du diese Nachricht wirklich löschen?",
|
"delete_confirm": "Möchtest du diese Beitrag 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",
|
||||||
|
@ -966,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": "Nachricht hat {number} Anhang | Nachricht hat {number} Anhänge",
|
"many_attachments": "Beitrag hat {number} Anhang | Beitrag 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",
|
||||||
|
@ -977,13 +920,8 @@
|
||||||
"pin": "An Profil anheften",
|
"pin": "An Profil anheften",
|
||||||
"pinned": "Angeheftet",
|
"pinned": "Angeheftet",
|
||||||
"plus_more": "+{number} mehr",
|
"plus_more": "+{number} mehr",
|
||||||
"redraft": "Löschen & neu erstellen",
|
|
||||||
"redraft_confirm": "Diesen Post wirklich löschen und neu erstellen? Interaktionen des ursprünglichen Posts werden nicht erhalten.",
|
|
||||||
"redraft_confirm_accept_button": "Ja, löschen und neu erstellen",
|
|
||||||
"redraft_confirm_cancel_button": "Nein, das Original behalten",
|
|
||||||
"redraft_confirm_title": "Löschen und neu erstellen bestätigen",
|
|
||||||
"remove_attachment": "Anhang entfernen",
|
"remove_attachment": "Anhang entfernen",
|
||||||
"repeat_confirm": "Nachricht wirklich wiederholen?",
|
"repeat_confirm": "Beitrag 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",
|
||||||
|
@ -992,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} Nachricht) | Ganzes Gespräch anzeigen (noch {numStatus} Nachrichten)",
|
"show_all_conversation": "Ganzes Gespräch anzeigen (noch {numStatus} Beitrag) | Ganzes Gespräch anzeigen (noch {numStatus} Beiträge)",
|
||||||
"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": "Diese Nachricht wurde gelöscht",
|
"status_deleted": "Dieser Beitrag wurde gelöscht",
|
||||||
"status_unavailable": "Nachricht nicht verfügbar",
|
"status_unavailable": "Beitrag 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",
|
||||||
|
@ -1010,7 +948,6 @@
|
||||||
"thread_show_full": "Zeige {numStatus} Antwort | Zeige {numStatus} Antworten",
|
"thread_show_full": "Zeige {numStatus} Antwort | Zeige {numStatus} Antworten",
|
||||||
"thread_show_full_with_icon": "{icon} {text}",
|
"thread_show_full_with_icon": "{icon} {text}",
|
||||||
"translate": "Übersetzen",
|
"translate": "Übersetzen",
|
||||||
"translated_from": "Übersetzt von {language}",
|
|
||||||
"unbookmark": "Lesezeichen entfernen",
|
"unbookmark": "Lesezeichen entfernen",
|
||||||
"unmute_conversation": "Konversation nicht mehr stummstellen",
|
"unmute_conversation": "Konversation nicht mehr stummstellen",
|
||||||
"unpin": "Nicht mehr an Profil anheften",
|
"unpin": "Nicht mehr an Profil anheften",
|
||||||
|
@ -1042,22 +979,17 @@
|
||||||
"collapse": "Einklappen",
|
"collapse": "Einklappen",
|
||||||
"conversation": "Unterhaltung",
|
"conversation": "Unterhaltung",
|
||||||
"error": "Fehler beim Lesen der Timeline: {0}",
|
"error": "Fehler beim Lesen der Timeline: {0}",
|
||||||
"follow_tag": "Hashtag folgen",
|
"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",
|
||||||
"socket_broke": "Netzverbindung verloren: CloseEvent code {0}",
|
"socket_broke": "Netzverbindung verloren: CloseEvent code {0}",
|
||||||
"socket_reconnected": "Netzverbindung hergestellt",
|
"socket_reconnected": "Netzverbindung hergestellt",
|
||||||
"unfollow_tag": "Hashtag entfolgen",
|
|
||||||
"up_to_date": "Aktuell"
|
"up_to_date": "Aktuell"
|
||||||
},
|
},
|
||||||
"toast": {
|
|
||||||
"no_translation_target_set": "Keine Zielsprache für Übersetzungen eingestellt - das könnte schiefgehen. Bitte stell eine Zielsprache in deinen Einstellungen ein."
|
|
||||||
},
|
|
||||||
"tool_tip": {
|
"tool_tip": {
|
||||||
"accept_follow_request": "Folgeanfrage annehmen",
|
"accept_follow_request": "Folgeanfrage annehmen",
|
||||||
"add_reaction": "Emoji-Reaktion hinzufügen",
|
"add_reaction": "Emoji-Reaktion hinzufügen",
|
||||||
|
@ -1117,7 +1049,6 @@
|
||||||
"block_confirm_title": "Benutzer blockieren",
|
"block_confirm_title": "Benutzer blockieren",
|
||||||
"block_progress": "Blocken…",
|
"block_progress": "Blocken…",
|
||||||
"blocked": "Blockiert!",
|
"blocked": "Blockiert!",
|
||||||
"blocks_you": "Blockt dich!",
|
|
||||||
"bot": "Bot",
|
"bot": "Bot",
|
||||||
"deactivated": "Deaktiviert",
|
"deactivated": "Deaktiviert",
|
||||||
"deny": "Ablehnen",
|
"deny": "Ablehnen",
|
||||||
|
@ -1132,10 +1063,7 @@
|
||||||
"follow_cancel": "Anfrage ablehnen",
|
"follow_cancel": "Anfrage ablehnen",
|
||||||
"follow_progress": "Anfragen…",
|
"follow_progress": "Anfragen…",
|
||||||
"follow_sent": "Anfrage gesendet!",
|
"follow_sent": "Anfrage gesendet!",
|
||||||
"follow_tag": "Hashtag folgen",
|
|
||||||
"follow_unfollow": "Folgen beenden",
|
"follow_unfollow": "Folgen beenden",
|
||||||
"followed_tags": "Gefolgte Hashtags",
|
|
||||||
"followed_users": "Gefolgte Benutzer",
|
|
||||||
"followees": "Folgt",
|
"followees": "Folgt",
|
||||||
"followers": "Folgende",
|
"followers": "Folgende",
|
||||||
"following": "Folgst du!",
|
"following": "Folgst du!",
|
||||||
|
@ -1160,16 +1088,13 @@
|
||||||
"mute_domain": "Domain blockieren",
|
"mute_domain": "Domain blockieren",
|
||||||
"mute_progress": "Stummschalten erfolgt…",
|
"mute_progress": "Stummschalten erfolgt…",
|
||||||
"muted": "Stummgeschaltet",
|
"muted": "Stummgeschaltet",
|
||||||
"not_following_any_hashtags": "Du folgst keinen Hashtags",
|
|
||||||
"note": "Private Notiz",
|
"note": "Private Notiz",
|
||||||
"per_day": "pro Tag",
|
"per_day": "pro Tag",
|
||||||
"remote_follow": "Folgen",
|
"remote_follow": "Folgen",
|
||||||
"remove_follower": "Nicht mehr folgen",
|
|
||||||
"replies": "Mit Antworten",
|
"replies": "Mit Antworten",
|
||||||
"report": "Melden",
|
"report": "Melden",
|
||||||
"requested_by": "Möchte dir gern folgen",
|
|
||||||
"show_repeats": "Geteilte Beiträge anzeigen",
|
"show_repeats": "Geteilte Beiträge anzeigen",
|
||||||
"statuses": "Nachrichten",
|
"statuses": "Beiträge",
|
||||||
"subscribe": "Folgen",
|
"subscribe": "Folgen",
|
||||||
"unblock": "Entblocken",
|
"unblock": "Entblocken",
|
||||||
"unblock_progress": "Entblocken…",
|
"unblock_progress": "Entblocken…",
|
||||||
|
@ -1177,13 +1102,11 @@
|
||||||
"unfollow_confirm_accept_button": "Ja, nicht mehr folgen",
|
"unfollow_confirm_accept_button": "Ja, nicht mehr folgen",
|
||||||
"unfollow_confirm_cancel_button": "Nein, weiter folgen",
|
"unfollow_confirm_cancel_button": "Nein, weiter folgen",
|
||||||
"unfollow_confirm_title": "Benutzer nicht mehr folgen",
|
"unfollow_confirm_title": "Benutzer nicht mehr folgen",
|
||||||
"unfollow_tag": "Hashtag nicht mehr folgen",
|
|
||||||
"unmute": "Stummschalten aufheben",
|
"unmute": "Stummschalten aufheben",
|
||||||
"unmute_progress": "Aufhebung erfolgt…",
|
"unmute_progress": "Aufhebung erfolgt…",
|
||||||
"unsubscribe": "Entfolgen"
|
"unsubscribe": "Entfolgen"
|
||||||
},
|
},
|
||||||
"user_profile": {
|
"user_profile": {
|
||||||
"field_validated": "Link verifiziert",
|
|
||||||
"profile_does_not_exist": "Profil nicht vorhanden.",
|
"profile_does_not_exist": "Profil nicht vorhanden.",
|
||||||
"profile_loading_error": "Beim Laden dieses Profils ist ein Fehler aufgetreten.",
|
"profile_loading_error": "Beim Laden dieses Profils ist ein Fehler aufgetreten.",
|
||||||
"timeline_title": "Beiträge"
|
"timeline_title": "Beiträge"
|
||||||
|
|
150
src/i18n/en.json
150
src/i18n/en.json
|
@ -86,8 +86,7 @@
|
||||||
"load_all_hint": "Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",
|
"load_all_hint": "Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",
|
||||||
"search_emoji": "Search for an emoji",
|
"search_emoji": "Search for an emoji",
|
||||||
"stickers": "Stickers",
|
"stickers": "Stickers",
|
||||||
"unicode": "Unicode emoji",
|
"unicode": "Unicode emoji"
|
||||||
"recent": "Recently used"
|
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"storage_unavailable": "Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies."
|
"storage_unavailable": "Pleroma could not access browser storage. Your login or your local settings won't be saved and you might encounter unexpected issues. Try enabling cookies."
|
||||||
|
@ -166,72 +165,72 @@
|
||||||
"moves": "User migrates"
|
"moves": "User migrates"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"bg": "Bulgarian",
|
||||||
|
"en": "English",
|
||||||
"ar": "Arabic",
|
"ar": "Arabic",
|
||||||
"az": "Azerbaijani",
|
"az": "Azerbaijani",
|
||||||
"bg": "Bulgarian",
|
"zh": "Chinese",
|
||||||
"cs": "Czech",
|
"cs": "Czech",
|
||||||
"da": "Danish",
|
"da": "Danish",
|
||||||
"de": "German",
|
"nl": "Dutch",
|
||||||
"el": "Greek",
|
|
||||||
"en": "English",
|
|
||||||
"eo": "Esperanto",
|
"eo": "Esperanto",
|
||||||
"es": "Spanish",
|
|
||||||
"fa": "Persian",
|
|
||||||
"fi": "Finnish",
|
"fi": "Finnish",
|
||||||
"fr": "French",
|
"fr": "French",
|
||||||
"ga": "Irish",
|
"de": "German",
|
||||||
|
"el": "Greek",
|
||||||
"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",
|
||||||
"lt": "Lithuanian",
|
"fa": "Persian",
|
||||||
"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",
|
||||||
"bg": "Translated from @:languages.bg",
|
"zh": "Translated from @:languages.zh",
|
||||||
"cs": "Translated from @:languages.cs",
|
"cs": "Translated from @:languages.cs",
|
||||||
"da": "Translated from @:languages.da",
|
"da": "Translated from @:languages.da",
|
||||||
"de": "Translated from @:languages.de",
|
"nl": "Translated from @:languages.nl",
|
||||||
"el": "Translated from @:languages.el",
|
|
||||||
"en": "Translated from @:languages.en",
|
|
||||||
"eo": "Translated from @:languages.eo",
|
"eo": "Translated from @:languages.eo",
|
||||||
"es": "Translated from @:languages.es",
|
|
||||||
"fa": "Translated from @:languages.fa",
|
|
||||||
"fi": "Translated from @:languages.fi",
|
"fi": "Translated from @:languages.fi",
|
||||||
"fr": "Translated from @:languages.fr",
|
"fr": "Translated from @:languages.fr",
|
||||||
"ga": "Translated from @:languages.ga",
|
"de": "Translated from @:languages.de",
|
||||||
|
"el": "Translated from @:languages.el",
|
||||||
"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",
|
||||||
"lt": "Translated from @:languages.lt",
|
"fa": "Translated from @:languages.fa",
|
||||||
"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",
|
||||||
"zh": "Translated from @:languages.zh"
|
"lt": "Translated from @:languages.lt",
|
||||||
},
|
"lv": "Translated from @:languages.lv"
|
||||||
"uk": "Ukrainian",
|
}
|
||||||
"zh": "Chinese"
|
|
||||||
},
|
},
|
||||||
"lists": {
|
"lists": {
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
|
@ -255,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}",
|
||||||
|
@ -272,30 +271,30 @@
|
||||||
"previous": "Previous"
|
"previous": "Previous"
|
||||||
},
|
},
|
||||||
"moderation": {
|
"moderation": {
|
||||||
"moderation": "Moderation",
|
"moderation": "Moderation",
|
||||||
"reports": {
|
"reports": {
|
||||||
"add_note": "Add note",
|
"no_reports": "No reports to show",
|
||||||
"close": "Close",
|
"add_note": "Add note",
|
||||||
"delete_note": "Delete",
|
"close": "Close",
|
||||||
"delete_note_accept": "Yes, delete it",
|
"delete_note": "Delete",
|
||||||
"delete_note_cancel": "No, keep it",
|
"delete_note_accept": "Yes, delete it",
|
||||||
"delete_note_confirm": "Are you sure you want to delete this note?",
|
"delete_note_cancel": "No, keep it",
|
||||||
"delete_note_title": "Confirm deletion",
|
"delete_note_confirm": "Are you sure you want to delete this note?",
|
||||||
"no_content": "No description given",
|
"delete_note_title": "Confirm deletion",
|
||||||
"no_reports": "No reports to show",
|
"no_content": "No description given",
|
||||||
"note_placeholder": "Leave a note",
|
"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 } post| { count } posts",
|
"statuses": "{ count } status | { count } statuses",
|
||||||
"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": "Posts",
|
"statuses": "Statuses",
|
||||||
"users": "Users"
|
"users": "Users"
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
"about": "About",
|
"about": "About",
|
||||||
|
@ -410,8 +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",
|
"awaiting_email_confirmation_title": "Awaiting email confirmation",
|
||||||
|
"awaiting_email_confirmation": "Your account has been registered and an email has been sent to your address. Please check the email to complete registration.",
|
||||||
"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",
|
||||||
|
@ -536,8 +535,6 @@
|
||||||
"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",
|
||||||
|
@ -732,18 +729,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_creation": "Create new profile",
|
|
||||||
"settings_profile_creation_new_name_label": "Name",
|
|
||||||
"settings_profile_creation_submit": "Create",
|
|
||||||
"settings_profile_currently": "Currently using {name} (version: {version})",
|
"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_submit": "Create",
|
||||||
|
"settings_profile_creation_new_name_label": "Name",
|
||||||
|
"settings_profile_use": "Use",
|
||||||
"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",
|
||||||
|
@ -940,15 +937,14 @@
|
||||||
"title": "Version"
|
"title": "Version"
|
||||||
},
|
},
|
||||||
"virtual_scrolling": "Optimize timeline rendering",
|
"virtual_scrolling": "Optimize timeline rendering",
|
||||||
"use_blurhash": "Use blurhashes for NSFW thumbnails",
|
|
||||||
"word_filter": "Word filter",
|
"word_filter": "Word filter",
|
||||||
"wordfilter": "Wordfilter"
|
"wordfilter": "Wordfilter"
|
||||||
},
|
},
|
||||||
"settings_profile": {
|
"settings_profile": {
|
||||||
"creating": "Creating new setting profile \"{profile}\"...",
|
"synchronizing": "Synchronizing setting profile \"{profile}\"...",
|
||||||
"synchronization_error": "Could not synchronize settings: {err}",
|
"synchronized": "Synchronized settings!",
|
||||||
"synchronized": "Synchronized settings!",
|
"synchronization_error": "Could not synchronize settings: {err}",
|
||||||
"synchronizing": "Synchronizing setting profile \"{profile}\"..."
|
"creating": "Creating new 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",
|
||||||
|
@ -1048,7 +1044,6 @@
|
||||||
"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",
|
||||||
|
@ -1058,8 +1053,6 @@
|
||||||
"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",
|
||||||
"follow_tag": "Follow hashtag",
|
|
||||||
"unfollow_tag": "Unfollow hashtag",
|
|
||||||
"up_to_date": "Up-to-date"
|
"up_to_date": "Up-to-date"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
|
@ -1124,7 +1117,6 @@
|
||||||
"block_confirm_title": "Block user",
|
"block_confirm_title": "Block user",
|
||||||
"block_progress": "Blocking…",
|
"block_progress": "Blocking…",
|
||||||
"blocked": "Blocked!",
|
"blocked": "Blocked!",
|
||||||
"blocks_you": "Blocks you!",
|
|
||||||
"bot": "Bot",
|
"bot": "Bot",
|
||||||
"deactivated": "Deactivated",
|
"deactivated": "Deactivated",
|
||||||
"deny": "Deny",
|
"deny": "Deny",
|
||||||
|
@ -1142,10 +1134,9 @@
|
||||||
"follow_unfollow": "Unfollow",
|
"follow_unfollow": "Unfollow",
|
||||||
"followees": "Following",
|
"followees": "Following",
|
||||||
"followers": "Followers",
|
"followers": "Followers",
|
||||||
"followed_tags": "Followed hashtags",
|
|
||||||
"followed_users": "Followed users",
|
|
||||||
"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": {
|
||||||
|
@ -1172,7 +1163,6 @@
|
||||||
"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",
|
||||||
|
@ -1182,9 +1172,6 @@
|
||||||
"unfollow_confirm_accept_button": "Yes, unfollow",
|
"unfollow_confirm_accept_button": "Yes, unfollow",
|
||||||
"unfollow_confirm_cancel_button": "No, don't unfollow",
|
"unfollow_confirm_cancel_button": "No, don't unfollow",
|
||||||
"unfollow_confirm_title": "Unfollow user",
|
"unfollow_confirm_title": "Unfollow user",
|
||||||
"not_following_any_hashtags": "You are not following any hashtags",
|
|
||||||
"follow_tag": "Follow hashtag",
|
|
||||||
"unfollow_tag": "Unfollow hashtag",
|
|
||||||
"unmute": "Unmute",
|
"unmute": "Unmute",
|
||||||
"unmute_progress": "Unmuting…",
|
"unmute_progress": "Unmuting…",
|
||||||
"unsubscribe": "Unsubscribe"
|
"unsubscribe": "Unsubscribe"
|
||||||
|
@ -1192,8 +1179,7 @@
|
||||||
"user_profile": {
|
"user_profile": {
|
||||||
"profile_does_not_exist": "Sorry, this profile does not exist.",
|
"profile_does_not_exist": "Sorry, this profile does not exist.",
|
||||||
"profile_loading_error": "Sorry, there was an error loading this profile.",
|
"profile_loading_error": "Sorry, there was an error loading this profile.",
|
||||||
"timeline_title": "User timeline",
|
"timeline_title": "User timeline"
|
||||||
"field_validated": "Link Verified"
|
|
||||||
},
|
},
|
||||||
"user_reporting": {
|
"user_reporting": {
|
||||||
"add_comment_description": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
|
"add_comment_description": "The report will be sent to your instance moderators. You can provide an explanation of why you are reporting this account below:",
|
||||||
|
|
|
@ -282,18 +282,18 @@
|
||||||
"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",
|
"no_reports": "No hay informes que mostrar",
|
||||||
"note_placeholder": "Dejar una nota",
|
"note_placeholder": "Dejar una nota...",
|
||||||
"notes": "{ count } nota | { count } 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": "{ count } publicación | { count } publicaciones",
|
"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"
|
||||||
},
|
},
|
||||||
"statuses": "Publicaciones",
|
"statuses": "Estados",
|
||||||
"users": "Usuarios"
|
"users": "Usuarios"
|
||||||
},
|
},
|
||||||
"nav": {
|
"nav": {
|
||||||
|
@ -409,8 +409,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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",
|
||||||
|
@ -424,8 +422,6 @@
|
||||||
"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": {
|
||||||
|
@ -535,8 +531,6 @@
|
||||||
"enable_web_push_notifications": "Habilitar las notificiaciones en el navegador",
|
"enable_web_push_notifications": "Habilitar las notificiaciones en el navegador",
|
||||||
"enter_current_password_to_confirm": "Introduce la contraseña actual para confirmar tu identidad",
|
"enter_current_password_to_confirm": "Introduce la contraseña actual para confirmar tu identidad",
|
||||||
"expert_mode": "Mostrar avanzados",
|
"expert_mode": "Mostrar avanzados",
|
||||||
"expire_posts_enabled": "Eliminar publicaciones después de una cantidad determinada de días",
|
|
||||||
"expire_posts_input_placeholder": "Número de días",
|
|
||||||
"export_theme": "Exportar tema",
|
"export_theme": "Exportar tema",
|
||||||
"file_export_import": {
|
"file_export_import": {
|
||||||
"backup_restore": "Copia de seguridad de la configuración",
|
"backup_restore": "Copia de seguridad de la configuración",
|
||||||
|
@ -670,7 +664,6 @@
|
||||||
"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",
|
||||||
|
@ -679,9 +672,7 @@
|
||||||
"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_look_feel": "Aspecto de las publicaciones",
|
"post_status_content_type": "Formato de publicación",
|
||||||
"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",
|
||||||
|
@ -695,10 +686,6 @@
|
||||||
"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",
|
|
||||||
"render_mfm_on_hover": "Pausa las animaciones MFM hasta que se desplace el mensaje",
|
|
||||||
"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",
|
||||||
|
@ -722,34 +709,13 @@
|
||||||
"security": "Seguridad",
|
"security": "Seguridad",
|
||||||
"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",
|
||||||
"sensitive_if_subject": "Marcar automáticamente las imágenes como confidenciales si se especifica una advertencia de contenido",
|
|
||||||
"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_refresh": "Recargar perfiles de configuración",
|
|
||||||
"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",
|
||||||
"show_nav_shortcuts": "Mostrar accesos directos de navegación adicionales en el panel superior",
|
|
||||||
"show_panel_nav_shortcuts": "Mostrar accesos directos de navegación de la línea de tiempo en la parte superior del panel",
|
|
||||||
"show_scrollbars": "Mostrar las barras de desplazamiento de la columna lateral",
|
|
||||||
"show_wider_shortcuts": "Mostrar una brecha más amplia entre los accesos directos del panel superior",
|
|
||||||
"show_yous": "Mostrar (Tú)s",
|
|
||||||
"stop_gifs": "Iniciar GIFs al pasar el ratón",
|
"stop_gifs": "Iniciar GIFs al pasar el ratón",
|
||||||
"streaming": "Habilitar la transmisión automática de nuevas publicaciones cuando se desplaza hacia la parte superior",
|
"streaming": "Habilitar la transmisión automática de nuevas publicaciones cuando se desplaza hacia la parte superior",
|
||||||
"style": {
|
"style": {
|
||||||
|
@ -898,9 +864,9 @@
|
||||||
"use_source": "Nueva versión"
|
"use_source": "Nueva versión"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"subject_input_always_show": "Mostrar siempre el campo de advertencia de contenido",
|
"subject_input_always_show": "Mostrar siempre el campo del tema",
|
||||||
"subject_line_behavior": "Copiar el campo de advertencia en las respuestas",
|
"subject_line_behavior": "Copiar el tema en las respuestas",
|
||||||
"subject_line_email": "Como email: \"re: advertencia\"",
|
"subject_line_email": "Como email: \"re: tema\"",
|
||||||
"subject_line_mastodon": "Como mastodon: copiar como es",
|
"subject_line_mastodon": "Como mastodon: copiar como es",
|
||||||
"subject_line_noop": "No copiar",
|
"subject_line_noop": "No copiar",
|
||||||
"text": "Texto",
|
"text": "Texto",
|
||||||
|
@ -908,13 +874,8 @@
|
||||||
"theme_help": "Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.",
|
"theme_help": "Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.",
|
||||||
"theme_help_v2_1": "También puede invalidar los colores y la opacidad de ciertos componentes si activa la casilla de verificación. Use el botón \"Borrar todo\" para deshacer los cambios.",
|
"theme_help_v2_1": "También puede invalidar los colores y la opacidad de ciertos componentes si activa la casilla de verificación. Use el botón \"Borrar todo\" para deshacer los cambios.",
|
||||||
"theme_help_v2_2": "Los iconos debajo de algunas publicaciones son indicadores de contraste de fondo/texto, desplace el ratón por encima para obtener información más detallada. Tenga en cuenta que cuando se utilizan indicadores de contraste de transparencia se muestra el peor caso posible.",
|
"theme_help_v2_2": "Los iconos debajo de algunas publicaciones son indicadores de contraste de fondo/texto, desplace el ratón por encima para obtener información más detallada. Tenga en cuenta que cuando se utilizan indicadores de contraste de transparencia se muestra el peor caso posible.",
|
||||||
"third_column_mode": "Cuando haya suficiente espacio, muestre la tercera columna",
|
|
||||||
"third_column_mode_none": "No mostrar la tercera columna en absoluto",
|
|
||||||
"third_column_mode_notifications": "Columna de notificaciones",
|
|
||||||
"third_column_mode_postform": "Formulario principal de publicación y navegación",
|
|
||||||
"token": "Token",
|
"token": "Token",
|
||||||
"tooltipRadius": "Información/alertas",
|
"tooltipRadius": "Información/alertas",
|
||||||
"translation_language": "Idioma de traducción automática",
|
|
||||||
"type_domains_to_mute": "Buscar dominios para silenciar",
|
"type_domains_to_mute": "Buscar dominios para silenciar",
|
||||||
"upload_a_photo": "Subir una foto",
|
"upload_a_photo": "Subir una foto",
|
||||||
"useStreamingApi": "Recibir publicaciones y notificaciones en tiempo real",
|
"useStreamingApi": "Recibir publicaciones y notificaciones en tiempo real",
|
||||||
|
|
|
@ -84,7 +84,6 @@
|
||||||
"keep_open": "Garder ouvert",
|
"keep_open": "Garder ouvert",
|
||||||
"load_all": "Charger tout les {emojiAmount} émojis",
|
"load_all": "Charger tout les {emojiAmount} émojis",
|
||||||
"load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.",
|
"load_all_hint": "{saneAmount} émojis chargé, charger tout les émojis peuvent causer des problèmes de performances.",
|
||||||
"recent": "Utilisé récemment",
|
|
||||||
"search_emoji": "Rechercher un émoji",
|
"search_emoji": "Rechercher un émoji",
|
||||||
"stickers": "Stickers",
|
"stickers": "Stickers",
|
||||||
"unicode": "émoji unicode"
|
"unicode": "émoji unicode"
|
||||||
|
@ -255,10 +254,6 @@
|
||||||
"hint": "Connectez-vous pour rejoindre la discussion",
|
"hint": "Connectez-vous pour rejoindre la discussion",
|
||||||
"login": "Connexion",
|
"login": "Connexion",
|
||||||
"logout": "Déconnexion",
|
"logout": "Déconnexion",
|
||||||
"logout_confirm": "Voulez-vous vraiment vous déconnecter ?",
|
|
||||||
"logout_confirm_accept_button": "Déconnexion",
|
|
||||||
"logout_confirm_cancel_button": "Annuler",
|
|
||||||
"logout_confirm_title": "Déconnexion",
|
|
||||||
"password": "Mot de passe",
|
"password": "Mot de passe",
|
||||||
"placeholder": "mon nom d'utilisateur",
|
"placeholder": "mon nom d'utilisateur",
|
||||||
"recovery_code": "Code de récupération",
|
"recovery_code": "Code de récupération",
|
||||||
|
@ -271,32 +266,6 @@
|
||||||
"next": "Suivant",
|
"next": "Suivant",
|
||||||
"previous": "Précédent"
|
"previous": "Précédent"
|
||||||
},
|
},
|
||||||
"moderation": {
|
|
||||||
"moderation": "Modération",
|
|
||||||
"reports": {
|
|
||||||
"add_note": "Ajouter une note",
|
|
||||||
"close": "Fermer",
|
|
||||||
"delete_note": "Supprimer",
|
|
||||||
"delete_note_accept": "Oui, supprimer",
|
|
||||||
"delete_note_cancel": "Non, abandonner",
|
|
||||||
"delete_note_confirm": "Voulez-vous vraiment supprimer cette note ?",
|
|
||||||
"delete_note_title": "Confirmer la suppression",
|
|
||||||
"no_content": "Description vide",
|
|
||||||
"no_reports": "Aucun rapport",
|
|
||||||
"note_placeholder": "Laisser une note",
|
|
||||||
"notes": "{ count } note | { count } notes",
|
|
||||||
"reopen": "Rouvrir",
|
|
||||||
"report": "Signaler",
|
|
||||||
"reports": "Rapports",
|
|
||||||
"resolve": "Résoudre",
|
|
||||||
"show_closed": "Afficher les rapports classés",
|
|
||||||
"statuses": "{ count } statut| { count } statuts",
|
|
||||||
"tag_policy_notice": "Activer la politique MRF pour établir les restrictions de publication",
|
|
||||||
"tags": "Établir les restrictions de publication"
|
|
||||||
},
|
|
||||||
"statuses": "Statuts",
|
|
||||||
"users": "Utilisateurs"
|
|
||||||
},
|
|
||||||
"nav": {
|
"nav": {
|
||||||
"about": "À propos",
|
"about": "À propos",
|
||||||
"administration": "Administration",
|
"administration": "Administration",
|
||||||
|
@ -313,7 +282,6 @@
|
||||||
"interactions": "Interactions",
|
"interactions": "Interactions",
|
||||||
"lists": "Listes",
|
"lists": "Listes",
|
||||||
"mentions": "Mentions",
|
"mentions": "Mentions",
|
||||||
"moderation": "Moderation",
|
|
||||||
"preferences": "Préférences",
|
"preferences": "Préférences",
|
||||||
"public_timeline_description": "Tous les statuts publics de cette instance",
|
"public_timeline_description": "Tous les statuts publics de cette instance",
|
||||||
"public_tl": "Flux publique",
|
"public_tl": "Flux publique",
|
||||||
|
@ -410,8 +378,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
"awaiting_email_confirmation": "Votre compte a été enregistré et un courriel envoyé à votre adresse. Veuillez consulter votre boîte mail pour terminer la registration.",
|
|
||||||
"awaiting_email_confirmation_title": "En attente de confirmation par courriel",
|
|
||||||
"bio": "Biographie",
|
"bio": "Biographie",
|
||||||
"bio_placeholder": "ex :\nSalut, je me présente ici !\nJ’adore les animés et les jeux vidéos. J’espère qu'on peut être amis⋅ies !",
|
"bio_placeholder": "ex :\nSalut, je me présente ici !\nJ’adore les animés et les jeux vidéos. J’espère qu'on peut être amis⋅ies !",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
|
|
376
src/i18n/id.json
376
src/i18n/id.json
|
@ -3,66 +3,35 @@
|
||||||
"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"
|
||||||
},
|
},
|
||||||
"mrf_policies": "Kebijakan MRF yang diaktifkan",
|
"mrf_policies": "Kebijakan MRF yang diaktifkan",
|
||||||
"mrf_policies_desc": "Kebijakan MRF memanipulasi federasi yang terjadi pada instansi ini. Kebijakan berikut adalah yang aktif:",
|
|
||||||
"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 tidak akan mengirim postingan publik ke instansi berikut:",
|
"quarantine_desc": "Instansi ini hanya akan mengirim postingan publik ke instansi-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 kamu benar-benar ingin menghapus pesan ini?",
|
"delete_confirm": "Apakah Anda benar-benar ingin menghapus pesan ini?",
|
||||||
"empty_chat_list_placeholder": "Kamu belum memiliki obrolan. Mulai obrolan baru!",
|
"empty_chat_list_placeholder": "Anda belum memiliki obrolan. Buat sbeuah 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": "Kamu:"
|
"you": "Anda:"
|
||||||
},
|
},
|
||||||
"display_date": {
|
"display_date": {
|
||||||
"today": "Hari Ini"
|
"today": "Hari Ini"
|
||||||
|
@ -71,7 +40,7 @@
|
||||||
"mute": "Bisukan",
|
"mute": "Bisukan",
|
||||||
"mute_progress": "Membisukan…",
|
"mute_progress": "Membisukan…",
|
||||||
"unmute": "Berhenti membisukan",
|
"unmute": "Berhenti membisukan",
|
||||||
"unmute_progress": "Menghentikan pembisuan…"
|
"unmute_progress": "Memberhentikan pembisuan…"
|
||||||
},
|
},
|
||||||
"emoji": {
|
"emoji": {
|
||||||
"add_emoji": "Sisipkan emoji",
|
"add_emoji": "Sisipkan emoji",
|
||||||
|
@ -82,17 +51,16 @@
|
||||||
"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 kamu atau pengaturan lokal kamu tidak akan tersimpan dan masalah yang tidak terduga dapat terjadi. Coba aktifkan kuki."
|
"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."
|
||||||
},
|
},
|
||||||
"exporter": {
|
"exporter": {
|
||||||
"export": "Ekspor",
|
"export": "Ekspor",
|
||||||
"processing": "Memproses, kamu akan segera diminta untuk mengunduh berkas kamu"
|
"processing": "Memproses, Anda akan segera diminta untuk mengunduh berkas Anda"
|
||||||
},
|
},
|
||||||
"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"
|
||||||
|
@ -128,12 +96,6 @@
|
||||||
"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",
|
||||||
|
@ -156,187 +118,68 @@
|
||||||
"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": "Portugis",
|
|
||||||
"ru": "Rusia",
|
|
||||||
"sk": "Slovakia",
|
|
||||||
"sv": "Swedia",
|
|
||||||
"tr": "Turki",
|
|
||||||
"translated_from": {
|
|
||||||
"ar": "Diterjemahkan dari bahasa @:languages.ar",
|
|
||||||
"az": "Diterjemahkan dari bahasa @:languages.az",
|
|
||||||
"bg": "Diterjemahkan dari bahasa @:languages.bg",
|
|
||||||
"cs": "Diterjemahkan dari bahasa @:languages.cs",
|
|
||||||
"da": "Diterjemahkan dari bahasa @:languages.da",
|
|
||||||
"de": "Diterjemahkan dari bahasa @:languages.de",
|
|
||||||
"el": "Diterjemahkan dari bahasa @:languages.el",
|
|
||||||
"en": "Diterjemahkan dari bahasa @:languages.en",
|
|
||||||
"eo": "Diterjemahkan dari bahasa @:languages.eo",
|
|
||||||
"es": "Diterjemahkan dari bahasa @:languages.es",
|
|
||||||
"fa": "Diterjemahkan dari bahasa @:languages.fa",
|
|
||||||
"fi": "Diterjemahkan dari bahasa @:languages.fi",
|
|
||||||
"fr": "Diterjemahkan dari bahasa @:languages.fr",
|
|
||||||
"ga": "Diterjemahkan dari bahasa @:languages.ga",
|
|
||||||
"he": "Diterjemahkan dari bahasa @:languages.he",
|
|
||||||
"hi": "Diterjemahkan dari bahasa @:languages.hi",
|
|
||||||
"hu": "Diterjemahkan dari bahasa @:languages.hu",
|
|
||||||
"id": "Diterjemahkan dari bahasa @:languages.id",
|
|
||||||
"it": "Diterjemahkan dari bahasa @:languages.it",
|
|
||||||
"ja": "Diterjemahkan dari bahasa @:languages.ja",
|
|
||||||
"ko": "Diterjemahkan dari bahasa @:languages.ko",
|
|
||||||
"lt": "Diterjemahkan dari bahasa @:languages.lt",
|
|
||||||
"lv": "Diterjemahkan dari bahasa @:languages.lv",
|
|
||||||
"nl": "Diterjemahkan dari bahasa @:languages.nl",
|
|
||||||
"pl": "Diterjemahkan dari bahasa @:languages.pl",
|
|
||||||
"pt": "Diterjemahkan dari bahasa @:languages.pt",
|
|
||||||
"ru": "Diterjemahkan dari bahasa @:languages.ru",
|
|
||||||
"sk": "Diterjemahkan dari bahasa @:languages.sk",
|
|
||||||
"sv": "Diterjemahkan dari bahasa @:languages.sv",
|
|
||||||
"tr": "Diterjemahkan dari bahasa @:languages.tr",
|
|
||||||
"uk": "Diterjemahkan dari bahasa @:languages.uk",
|
|
||||||
"zh": "Diterjemahkan dari bahasa @:languages.zh"
|
|
||||||
},
|
|
||||||
"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": "namapenggunaku",
|
"placeholder": "contoh: lain",
|
||||||
"recovery_code": "Kode pemulihan",
|
"recovery_code": "Kode pemulihan",
|
||||||
"register": "Daftar",
|
"register": "Daftar",
|
||||||
"username": "Nama pengguna"
|
"username": "Nama pengguna"
|
||||||
},
|
},
|
||||||
"media_modal": {
|
"media_modal": {
|
||||||
"counter": "{current} / {total}",
|
"next": "Selanjutnya",
|
||||||
"hide": "Tutup penampil media",
|
"previous": "Sebelum"
|
||||||
"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",
|
|
||||||
"notes": "{ count } catatan",
|
|
||||||
"reopen": "Buka kembali",
|
|
||||||
"reports": "Laporan",
|
|
||||||
"resolve": "Selesaikan",
|
|
||||||
"show_closed": "Tampilkan yang telah ditutup",
|
|
||||||
"statuses": "{ count } postingan",
|
|
||||||
"tag_policy_notice": "Aktifkan MRF TagPolicy untuk mengatur pembatasan postingan",
|
|
||||||
"tags": "Atur pembatasan postingan"
|
|
||||||
},
|
|
||||||
"statuses": "Postingan",
|
|
||||||
"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": "Penelusuran",
|
"search": "Cari",
|
||||||
"timeline": "Linimasa",
|
"timeline": "Linimasa",
|
||||||
"timelines": "Linimasa",
|
"timelines": "Linimasa",
|
||||||
"twkn": "Jaringan Yang Dikenal",
|
"user_search": "Pencarian Pengguna"
|
||||||
"twkn_timeline_description": "Postingan dari seluruh jaringan",
|
|
||||||
"user_search": "Penelusuran Pengguna"
|
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"broken_favorite": "Postingan tak dikenal, mencarinya…",
|
"broken_favorite": "Status tak diketahui, mencarinya…",
|
||||||
"error": "Terjadi kesalahan ketika memuat notifikasi: {0}",
|
"error": "Terjadi kesalahan ketika memuat notifikasi: {0}",
|
||||||
"favorited_you": "memfavoritkan postinganmu",
|
"favorited_you": "memfavoritkan status Anda",
|
||||||
"follow_request": "ingin mengikuti kamu",
|
"follow_request": "ingin mengikuti Anda",
|
||||||
"followed_you": "mengikuti kamu",
|
"followed_you": "mengikuti Anda",
|
||||||
"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 postinganmu"
|
"repeated_you": "mengulangi status Anda"
|
||||||
},
|
},
|
||||||
"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 kamu. Kami akan mengirimkan kamu tautan untuk mengatur ulang kata sandi.",
|
"instruction": "Masukkan surel atau nama pengguna Anda. Kami akan mengirimkan Anda 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. Silakan hubungi administrator instansi kamu.",
|
"password_reset_disabled": "Pengatur-ulangan kata sandi dinonaktifkan. Hubungi administrator instansi Anda.",
|
||||||
"password_reset_required": "Kamu harus mengatur ulang kata sandi kamu untuk masuk.",
|
"password_reset_required": "Anda harus mengatur ulang kata sandi Anda untuk masuk.",
|
||||||
"password_reset_required_but_mailer_is_disabled": "Kamu harus mengatur ulang kata sandi, tetapi pengatur-ulangan kata sandi dinonaktifkan. Silakan hubungi administrator instansimu.",
|
"password_reset_required_but_mailer_is_disabled": "Anda harus mengatur ulang kata sandi, tetapi pengatur-ulangan kata sandi dinonaktifkan. Silakan hubungi administrator instansi Anda.",
|
||||||
"placeholder": "Surel atau nama pengguna kamu",
|
"placeholder": "Surel atau nama pengguna Anda",
|
||||||
"return_home": "Kembali ke halaman beranda",
|
"return_home": "Kembali ke halaman beranda",
|
||||||
"too_many_requests": "Kamu telah mencapai batas percobaan, coba lagi nanti."
|
"too_many_requests": "Anda telah mencapai batas percobaan, coba lagi nanti."
|
||||||
},
|
},
|
||||||
"polls": {
|
"polls": {
|
||||||
"add_option": "Tambahkan opsi",
|
"add_option": "Tambahkan opsi",
|
||||||
|
@ -344,87 +187,70 @@
|
||||||
"expired": "Japat berakhir {0} yang lalu",
|
"expired": "Japat berakhir {0} yang lalu",
|
||||||
"expires_in": "Japat berakhir dalam {0}",
|
"expires_in": "Japat berakhir dalam {0}",
|
||||||
"expiry": "Usia japat",
|
"expiry": "Usia japat",
|
||||||
"multiple_choices": "Lebih dari satu opsi dapat dipilih",
|
|
||||||
"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": "Hanya satu opsi dapat dipilih",
|
|
||||||
"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 kamu tidak {0}. Siapapun dapat mengikuti kamu untuk melihat postingan hanya-pengikut kamu.",
|
"account_not_locked_warning": "Akun Anda tidak {0}. Siapapun dapat mengikuti Anda untuk melihat postingan hanya-pengikut Anda.",
|
||||||
"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": "Peringatan Konten (opsional)",
|
"content_warning": "Subyek (opsional)",
|
||||||
"default": "Baru saja tiba di Luna Nova Academy",
|
"default": "Baru saja mendarat di L.A.",
|
||||||
"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.",
|
||||||
"edit_remote_warning": "Perubahan yang dibuat pada postingan ini mungkin tidak terlihat pada beberapa instansi!",
|
"empty_status_error": "Tidak dapat memposting status kosong tanpa berkas",
|
||||||
"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",
|
||||||
"media_not_sensitive_warning": "Kamu memasang Peringatan Konten, namun lampirannya tidak ditandai sebagai sensitif!",
|
"new_status": "Posting status baru",
|
||||||
"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": {
|
||||||
"local": "Postingan ini tidak akan terlihat di instansi lain",
|
"private": "Postingan ini akan terlihat hanya oleh pengikut Anda",
|
||||||
"private": "Postingan ini akan terlihat hanya oleh pengikut kamu",
|
"public": "Postingan ini akan terlihat oleh siapa saja"
|
||||||
"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": "cth.\nHai! Selamat datang di bioku.\nAku suka menonton anime dan bermain game. Semoga kita bisa berteman!",
|
"bio_placeholder": "contoh.\nHai, aku Lain.\nAku seorang putri anime yang tinggal di pinggiran kota Jepang. Kamu mungkin mengenal aku dari Wired.",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
"email": "Surel",
|
"email": "Surel",
|
||||||
"email_language": "Dalam bahasa apa kamu ingin menerima surel dari server ini?",
|
"fullname_placeholder": "contoh. Lain Iwakura",
|
||||||
"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 kamu ingin mendaftar.",
|
"reason_placeholder": "Instansi ini menerima pendaftaran secara manual.\nBeritahu administrasinya mengapa Anda 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": "cth. akko",
|
"username_placeholder": "contoh. lain",
|
||||||
"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",
|
||||||
|
@ -437,13 +263,6 @@
|
||||||
"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",
|
|
||||||
"add_backup_error": "Gagal menambahkan cadangan baru: {error}",
|
|
||||||
"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",
|
||||||
|
@ -452,10 +271,9 @@
|
||||||
"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 blokiranmu menjadi berkas csv",
|
"block_export_button": "Ekspor blokiran Anda 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.",
|
||||||
|
@ -467,111 +285,65 @@
|
||||||
"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 kamu.",
|
"change_email_error": "Ada masalah ketika mengubah surel Anda.",
|
||||||
"change_password": "Ubah kata sandi",
|
"change_password": "Ubah kata sandi",
|
||||||
"change_password_error": "Ada masalah ketika mengubah kata sandi kamu.",
|
"change_password_error": "Ada masalah ketika mengubah kata sandi Anda.",
|
||||||
"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 percakapan",
|
|
||||||
"conversation_display_tree": "Bercabang",
|
|
||||||
"conversation_other_replies_button_below": "Di bawah postingan",
|
|
||||||
"conversation_other_replies_button_inside": "Di postingan",
|
|
||||||
"current_avatar": "Avatarmu saat ini",
|
|
||||||
"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 kamu secara permanen dan nonaktifkan akunmu.",
|
"delete_account_description": "Hapus data Anda secara permanen dan menonaktifkan akun Anda.",
|
||||||
"delete_account_error": "Ada masalah ketika menghapus akun kamu. Jika ini terus terjadi harap hubungi adminstrator instansi kamu.",
|
"delete_account_error": "Ada masalah ketika menghapus akun Anda. Jika ini terus terjadi harap hubungi adminstrator instansi Anda.",
|
||||||
"delete_account_instructions": "Ketik kata sandi kamu pada input di bawah untuk mengonfirmasi penghapusan akun.",
|
"delete_account_instructions": "Ketik kata sandi Anda pada input di bawah untuk mengkonfirmasi 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 kamu saat ini untuk mengonfirmasi identitas kamu",
|
"enter_current_password_to_confirm": "Masukkan kata sandi Anda saat ini untuk mengkonfirmasi identitas Anda",
|
||||||
"expert_mode": "Tampilkan pengaturan lanjutan",
|
|
||||||
"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",
|
|
||||||
"file_too_new": "Versi major tidak kompatibel: {fileMajor}, PleromaFE ini (versi {feMajor}) terlalu lama untuk menanganinya",
|
|
||||||
"file_too_old": "Versi major tidak kompatibel: {fileMajor}, versi berkas terlalu lama dan tidak lagi didukung (min. versi {feMajor})",
|
|
||||||
"invalid_file": "Berkas yang dipilih bukan cadangan pengaturan Pleroma yang didukung. Tidak dibuat perubahan."
|
|
||||||
},
|
|
||||||
"restore_settings": "Pulihkan pengaturan dari berkas"
|
|
||||||
},
|
|
||||||
"filtering": "Penyaringan",
|
"filtering": "Penyaringan",
|
||||||
"filtering_explanation": "Semua postingan yang mengandung kata-kata ini akan dibisukan, satu kata per baris",
|
|
||||||
"follow_import_error": "Terjadi kesalahan ketika mengimpor pengikut",
|
"follow_import_error": "Terjadi kesalahan ketika mengimpor pengikut",
|
||||||
"fun": "Seru",
|
"fun": "Seru",
|
||||||
"general": "Umum",
|
"general": "Umum",
|
||||||
"greentext": "Panah meme",
|
|
||||||
"hide_all_muted_posts": "Sembunyikan postingan yang dibisukan",
|
|
||||||
"hide_attachments_in_convo": "Sembunyikan lampiran pada percakapan",
|
|
||||||
"hide_attachments_in_tl": "Sembunyikan lampiran di linimasa",
|
|
||||||
"hide_bot_indication": "Sembunyikan tanda bot pada postingan",
|
|
||||||
"hide_filtered_statuses": "Sembunyikan semua postingan yang tersaring",
|
|
||||||
"hide_followers_count_description": "Jangan tampilkan jumlah pengikut",
|
"hide_followers_count_description": "Jangan tampilkan jumlah pengikut",
|
||||||
"hide_followers_description": "Jangan tampilkan siapa yang mengikutiku",
|
"hide_followers_description": "Jangan tampilkan siapa yang mengikuti saya",
|
||||||
"hide_follows_count_description": "Jangan tampilkan jumlah mengikuti",
|
"hide_follows_count_description": "Jangan tampilkan jumlah mengikuti",
|
||||||
"hide_follows_description": "Jangan tampilkan siapa yang aku 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 (seperti jumlah favorit)",
|
"hide_post_stats": "Sembunyikan statistik postingan (contoh. jumlah favorit)",
|
||||||
"hide_shoutbox": "Sembunyikan kotak suara instansi",
|
"hide_shoutbox": "Sembunyikan kotak suara instansi",
|
||||||
"hide_user_stats": "Sembunyikan statistik pengguna (seperti jumlah pengikut)",
|
"hide_user_stats": "Sembunyikan statistik pengguna (contoh. 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 perubahan yang dibuat pada tema kamu.",
|
"invalid_theme_imported": "Berkas yang dipilih bukan sebuah tema yang didukung Pleroma. Tidak ada perbuahan yang dibuat pada tema Anda.",
|
||||||
"limited_availability": "Tidak tersedia di browser kamu",
|
"limited_availability": "Tidak tersedia di browser Anda",
|
||||||
"links": "Tautan",
|
"links": "Tautan",
|
||||||
"lock_account_description": "Batasi akunmu kepada pengikut yang sudah disetujui saja",
|
|
||||||
"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)",
|
||||||
"max_thumbnails": "Jumlah thumbnail maksimum per postingan (kosong = tidak terbatas)",
|
"max_thumbnails": "Jumlah thumbnail maksimum per postingan",
|
||||||
"mention_link_bolden_you": "Sorot sebutan kamu apabila kamu disebut",
|
|
||||||
"mention_link_display": "Tampilkan tautan sebutan",
|
|
||||||
"mention_link_display_full": "selalu sebagai nama lengkap (cth. {'@'}foo{'@'}example.org)",
|
|
||||||
"mention_link_display_full_for_remote": "sebagai nama lengkap hanya untuk pengguna di instansi lain (cth. {'@'}foo{'@'}example.org)",
|
|
||||||
"mention_link_display_short": "selalu sebagai nama pendek (cth. {'@'}foo)",
|
|
||||||
"mention_link_show_avatar": "Tampilkan avatar pengguna di samping tautan",
|
|
||||||
"mfa": {
|
"mfa": {
|
||||||
"authentication_methods": "Metode otentikasi",
|
"authentication_methods": "Metode otentikasi",
|
||||||
"confirm_and_enable": "Konfirmasi & aktifkan OTP",
|
"confirm_and_enable": "Konfirmasi & aktifkan OTP",
|
||||||
"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 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.",
|
"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.",
|
||||||
"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 kamu:"
|
"desc": "Untuk mengaktifkan otentikasi dua-faktor, masukkan kode dari aplikasi dua-faktor Anda:"
|
||||||
},
|
},
|
||||||
"waiting_a_recovery_codes": "Menerima kode cadangan…",
|
"waiting_a_recovery_codes": "Menerima kode cadangan…",
|
||||||
"warning_of_generate_new_codes": "Ketika kamu menghasilkan kode pemulihan baru, kode lama kamu berhenti bekerja."
|
"warning_of_generate_new_codes": "Ketika Anda menghasilkan kode pemulihan baru, kode lama Anda berhenti bekerja."
|
||||||
},
|
},
|
||||||
"more_settings": "Lebih banyak pengaturan",
|
"more_settings": "Lebih banyak pengaturan",
|
||||||
"mutes_and_blocks": "Bisuan dan Blokiran",
|
"mutes_and_blocks": "Bisuan dan Blokiran",
|
||||||
|
@ -600,21 +372,21 @@
|
||||||
},
|
},
|
||||||
"profile_tab": "Profil",
|
"profile_tab": "Profil",
|
||||||
"reply_visibility_all": "Tampilkan semua balasan",
|
"reply_visibility_all": "Tampilkan semua balasan",
|
||||||
"reply_visibility_following": "Hanya tampilkan balasan yang ditujukan kepadaku atau orang yang aku ikuti",
|
"reply_visibility_following": "Hanya tampilkan balasan yang ditujukan kepada saya atau orang yang saya ikuti",
|
||||||
"reply_visibility_following_short": "Tampilkan balasan ke orang yang aku ikuti",
|
"reply_visibility_following_short": "Tampilkan balasan ke orang yang saya ikuti",
|
||||||
"reply_visibility_self": "Hanya tampilkan balasan yang ditujukan kepadaku",
|
"reply_visibility_self": "Hanya tampilkan balasan yang ditujukan kepada saya",
|
||||||
"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 ingin kamu blokir",
|
"search_user_to_block": "Cari siapa yang Anda ingin blokir",
|
||||||
"search_user_to_mute": "Cari siapa yang ingin kamu bisukan",
|
"search_user_to_mute": "Cari siapa yang ingin Anda bisukan",
|
||||||
"security": "Keamanan",
|
"security": "Keamanan",
|
||||||
"security_tab": "Keamanan",
|
"security_tab": "Keamanan",
|
||||||
"set_new_avatar": "Tetapkan avatar baru",
|
"set_new_avatar": "Tetapkan avatar baru",
|
||||||
"set_new_profile_background": "Tetapkan latar belakang profil baru",
|
"set_new_profile_background": "Tetapkan latar belakang profil baru",
|
||||||
"settings": "Pengaturan",
|
"settings": "Pengaturan",
|
||||||
"show_admin_badge": "Tampilkan lencana \"Admin\" di profilku",
|
"show_admin_badge": "Tampilkan lencana \"Admin\" di profil saya",
|
||||||
"show_moderator_badge": "Tampilkan lencana \"Moderator\" di profilku",
|
"show_moderator_badge": "Tampilkan lencana \"Moderator\" di profil saya",
|
||||||
"style": {
|
"style": {
|
||||||
"advanced_colors": {
|
"advanced_colors": {
|
||||||
"_tab_label": "Lanjutan",
|
"_tab_label": "Lanjutan",
|
||||||
|
@ -657,7 +429,7 @@
|
||||||
},
|
},
|
||||||
"preview": {
|
"preview": {
|
||||||
"button": "Tombol",
|
"button": "Tombol",
|
||||||
"checkbox": "Aku telah membaca sekilas syarat dan ketentuan",
|
"checkbox": "Saya telah membaca sekilas syarat dan ketentuan",
|
||||||
"error": "Contoh kesalahan",
|
"error": "Contoh kesalahan",
|
||||||
"faint_link": "manual berguna",
|
"faint_link": "manual berguna",
|
||||||
"fine_print": "Baca {0} kami untuk belajar sesuatu yang tak ada gunanya!",
|
"fine_print": "Baca {0} kami untuk belajar sesuatu yang tak ada gunanya!",
|
||||||
|
@ -675,9 +447,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 kamu impor dibuat pada versi FE yang lebih baru.",
|
"future_version_imported": "Berkas yang Anda impor dibuat pada versi FE yang lebih baru.",
|
||||||
"older_version_imported": "Berkas yang kamu impor dibuat pada versi FE yang lebih lama.",
|
"older_version_imported": "Berkas yang Anda impor dibuat pada versi FE yang lebih lama.",
|
||||||
"upgraded_from_v2": "PleromaFE telah diperbarui, tema dapat terlihat sedikit berbeda dari apa yang kamu ingat."
|
"upgraded_from_v2": "PleromaFE telah diperbarui, tema dapat terlihat sedikit berbeda dari apa yang Anda ingat."
|
||||||
},
|
},
|
||||||
"load_theme": "Muat tema",
|
"load_theme": "Muat tema",
|
||||||
"use_snapshot": "Versi lama",
|
"use_snapshot": "Versi lama",
|
||||||
|
@ -709,7 +481,7 @@
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"delete": "Hapus status",
|
"delete": "Hapus status",
|
||||||
"delete_confirm": "Apakah kamu benar-benar ingin menghapus postingan ini?",
|
"delete_confirm": "Apakah Anda benar-benar ingin menghapus status ini?",
|
||||||
"favorites": "Favorit",
|
"favorites": "Favorit",
|
||||||
"hide_content": "",
|
"hide_content": "",
|
||||||
"mute_conversation": "Bisukan percakapan",
|
"mute_conversation": "Bisukan percakapan",
|
||||||
|
@ -752,7 +524,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 atau dikutip",
|
"no_retweet_hint": "Postingan ditandai sebagai hanya-pengikut atau langsung dan tidak dapat diulang",
|
||||||
"no_statuses": "Tidak ada status",
|
"no_statuses": "Tidak ada status",
|
||||||
"reload": "Muat ulang",
|
"reload": "Muat ulang",
|
||||||
"repeated": "diulangi"
|
"repeated": "diulangi"
|
||||||
|
@ -804,10 +576,10 @@
|
||||||
"followees": "Mengikuti",
|
"followees": "Mengikuti",
|
||||||
"followers": "Pengikut",
|
"followers": "Pengikut",
|
||||||
"following": "Diikuti!",
|
"following": "Diikuti!",
|
||||||
"follows_you": "Mengikuti kamu!",
|
"follows_you": "Mengikuti Anda!",
|
||||||
"hidden": "Disembunyikan",
|
"hidden": "Disembunyikan",
|
||||||
"hide_repeats": "Sembunyikan ulangan",
|
"hide_repeats": "Sembunyikan ulangan",
|
||||||
"its_you": "Ini kamu!",
|
"its_you": "Ini Anda!",
|
||||||
"media": "Media",
|
"media": "Media",
|
||||||
"mention": "Sebut",
|
"mention": "Sebut",
|
||||||
"message": "Kirimkan pesan",
|
"message": "Kirimkan pesan",
|
||||||
|
@ -827,14 +599,14 @@
|
||||||
"timeline_title": "Linimasa pengguna"
|
"timeline_title": "Linimasa pengguna"
|
||||||
},
|
},
|
||||||
"user_reporting": {
|
"user_reporting": {
|
||||||
"add_comment_description": "Laporan ini akan dikirim ke moderator instansi kamu. Kamu dapat menyediakan penjelasan mengapa kamu melaporkan akun ini di bawah:",
|
"add_comment_description": "Laporan ini akan dikirim ke moderator instansi Anda. Anda dapat menyediakan penjelasan mengapa Anda 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 kamu.",
|
"generic_error": "Sebuah kesalahan terjadi ketika memproses permintaan Anda.",
|
||||||
"submit": "Kirim",
|
"submit": "Kirim",
|
||||||
"title": "Melaporkan {0}"
|
"title": "Melaporkan {0}"
|
||||||
},
|
},
|
||||||
"who_to_follow": {
|
"who_to_follow": {
|
||||||
"more": "Lebih banyak"
|
"more": "Lebih banyak"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,29 +1,20 @@
|
||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"bubble_instances": "ローカルバブルインスタンス",
|
|
||||||
"mrf": {
|
"mrf": {
|
||||||
"federation": "フェデレーション",
|
"federation": "フェデレーション",
|
||||||
"keyword": {
|
|
||||||
"keyword_policies": "キーワードポリシー",
|
|
||||||
"reject": "おことわり",
|
|
||||||
"replace": "おきかえ"
|
|
||||||
},
|
|
||||||
"mrf_policies": "ゆうこうなMRFポリシー",
|
"mrf_policies": "ゆうこうなMRFポリシー",
|
||||||
"mrf_policies_desc": "MRFポリシーは、このインスタンスのフェデレーションのふるまいを、いじります。これらのMRFポリシーがゆうこうになっています:",
|
"mrf_policies_desc": "MRFポリシーは、このインスタンスのフェデレーションのふるまいを、いじります。これらのMRFポリシーがゆうこうになっています:",
|
||||||
"simple": {
|
"simple": {
|
||||||
"accept": "うけいれ",
|
"accept": "うけいれ",
|
||||||
"accept_desc": "このインスンスは、これらのインスタンスからのメッセージのみをうけいれます:",
|
"accept_desc": "このインスンスは、これらのインスタンスからのメッセージのみをうけいれます:",
|
||||||
"ftl_removal": "「つながっているすべてのネットワーク」タイムラインからのぞく",
|
"ftl_removal": "「つながっているすべてのネットワーク」タイムラインからのぞく",
|
||||||
"ftl_removal_desc": "このインスタンスは、「つながっているすべてのネットワーク」タイムラインから、これらのインスタンスを、とりのぞきます:",
|
"ftl_removal_desc": "このインスタンスは、つながっているすべてのネットワーク」タイムラインから、これらのインスタンスを、とりのぞきます:",
|
||||||
"instance": "インスタンス",
|
|
||||||
"media_nsfw": "メディアをすべてセンシティブにする",
|
"media_nsfw": "メディアをすべてセンシティブにする",
|
||||||
"media_nsfw_desc": "このインスタンスは、これらのインスタンスからおくられてきたメディアを、すべて、センシティブにマークします:",
|
"media_nsfw_desc": "このインスタンスは、これらのインスタンスからおくられてきたメディアを、すべて、センシティブにマークします:",
|
||||||
"media_removal": "メディアをのぞく",
|
"media_removal": "メディアをのぞく",
|
||||||
"media_removal_desc": "このインスタンスは、これらのインスタンスからおくられてきたメディアを、とりのぞきます:",
|
"media_removal_desc": "このインスタンスは、これらのインスタンスからおくられてきたメディアを、とりのぞきます:",
|
||||||
"not_applicable": "なし",
|
|
||||||
"quarantine": "けんえき",
|
"quarantine": "けんえき",
|
||||||
"quarantine_desc": "このインスタンスは、これらのインスタンスに、とうこうをおくりません:",
|
"quarantine_desc": "このインスタンスは、これらのインスタンスに、パブリックなとうこうのみを、おくります:",
|
||||||
"reason": "りゆう",
|
|
||||||
"reject": "おことわり",
|
"reject": "おことわり",
|
||||||
"reject_desc": "このインスタンスは、これらのインスタンスからのメッセージをうけいれません:",
|
"reject_desc": "このインスタンスは、これらのインスタンスからのメッセージをうけいれません:",
|
||||||
"simple_policies": "インスタンスのポリシー"
|
"simple_policies": "インスタンスのポリシー"
|
||||||
|
@ -31,49 +22,6 @@
|
||||||
},
|
},
|
||||||
"staff": "スタッフ"
|
"staff": "スタッフ"
|
||||||
},
|
},
|
||||||
"announcements": {
|
|
||||||
"all_day_prompt": "いちにちじゅう",
|
|
||||||
"cancel_edit_action": "キャンセル",
|
|
||||||
"close_error": "とじる",
|
|
||||||
"delete_action": "けす",
|
|
||||||
"edit_action": "へんしゅう",
|
|
||||||
"end_time_display": "{time} におわります",
|
|
||||||
"end_time_prompt": "おわるじかん: ",
|
|
||||||
"inactive_message": "このおしらせは、アクティブではありません",
|
|
||||||
"mark_as_read_action": "よんだ!",
|
|
||||||
"page_header": "おしらせ",
|
|
||||||
"post_action": "とうこう",
|
|
||||||
"post_error": "エラーになりました: {error}",
|
|
||||||
"post_form_header": "おしらせする",
|
|
||||||
"post_placeholder": "おしらせのほんぶん",
|
|
||||||
"published_time_display": "{time} に、おしらせされました",
|
|
||||||
"start_time_display": "{time} から、はじまります",
|
|
||||||
"start_time_prompt": "はじまるじかん: ",
|
|
||||||
"submit_edit_action": "そうしん",
|
|
||||||
"title": "おしらせ"
|
|
||||||
},
|
|
||||||
"chats": {
|
|
||||||
"chats": "チャット",
|
|
||||||
"delete": "けす",
|
|
||||||
"delete_confirm": "ほんとうに、このメッセージを、けしてもいいですか?",
|
|
||||||
"empty_chat_list_placeholder": "チャットはありません。あたらしく、チャットをはじみてみましょう!",
|
|
||||||
"empty_message_error": "からっぽのメッセージは、おくれません",
|
|
||||||
"error_loading_chat": "チャットをよみこむことが、できなかったかもしれません。",
|
|
||||||
"error_sending_message": "メッセージをおくることが、できなかったかもしれません。",
|
|
||||||
"message_user": "{nickname} にメッセージ",
|
|
||||||
"more": "つづき",
|
|
||||||
"new": "あたらしいチャット",
|
|
||||||
"you": "あなた:"
|
|
||||||
},
|
|
||||||
"display_date": {
|
|
||||||
"today": "きょう"
|
|
||||||
},
|
|
||||||
"domain_mute_card": {
|
|
||||||
"mute": "ミュート",
|
|
||||||
"mute_progress": "ミュートしています…",
|
|
||||||
"unmute": "ミュートをやめる",
|
|
||||||
"unmute_progress": "ミュートをとりけしています…"
|
|
||||||
},
|
|
||||||
"emoji": {
|
"emoji": {
|
||||||
"add_emoji": "えもじをうちこむ",
|
"add_emoji": "えもじをうちこむ",
|
||||||
"custom": "カスタムえもじ",
|
"custom": "カスタムえもじ",
|
||||||
|
@ -81,7 +29,6 @@
|
||||||
"keep_open": "ピッカーをあけたままにする",
|
"keep_open": "ピッカーをあけたままにする",
|
||||||
"load_all": "すべてのえもじをロード ({emojiAmount} こあります)",
|
"load_all": "すべてのえもじをロード ({emojiAmount} こあります)",
|
||||||
"load_all_hint": "はじめの {saneAmount} このえもじだけがロードされています。すべてのえもじをロードすると、パフォーマンスがわるくなるかもしれません。",
|
"load_all_hint": "はじめの {saneAmount} このえもじだけがロードされています。すべてのえもじをロードすると、パフォーマンスがわるくなるかもしれません。",
|
||||||
"recent": "さいきんつかった",
|
|
||||||
"search_emoji": "えもじをさがす",
|
"search_emoji": "えもじをさがす",
|
||||||
"stickers": "ステッカー",
|
"stickers": "ステッカー",
|
||||||
"unicode": "ユニコードえもじ"
|
"unicode": "ユニコードえもじ"
|
||||||
|
@ -95,15 +42,8 @@
|
||||||
"scope_options": "こうかいはんいせんたく",
|
"scope_options": "こうかいはんいせんたく",
|
||||||
"text_limit": "もじのかず",
|
"text_limit": "もじのかず",
|
||||||
"title": "ゆうこうなきのう",
|
"title": "ゆうこうなきのう",
|
||||||
"upload_limit": "ファイルのおおきさのじょうげん",
|
|
||||||
"who_to_follow": "おすすめユーザー"
|
"who_to_follow": "おすすめユーザー"
|
||||||
},
|
},
|
||||||
"file_type": {
|
|
||||||
"audio": "おんせい",
|
|
||||||
"file": "ファイル",
|
|
||||||
"image": "がぞう",
|
|
||||||
"video": "ビデオ"
|
|
||||||
},
|
|
||||||
"finder": {
|
"finder": {
|
||||||
"error_fetching_user": "ユーザーけんさくがエラーになりました",
|
"error_fetching_user": "ユーザーけんさくがエラーになりました",
|
||||||
"find_user": "ユーザーをさがす"
|
"find_user": "ユーザーをさがす"
|
||||||
|
@ -111,32 +51,12 @@
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "てきよう",
|
"apply": "てきよう",
|
||||||
"cancel": "キャンセル",
|
"cancel": "キャンセル",
|
||||||
"close": "とじる",
|
|
||||||
"confirm": "たしかめる",
|
"confirm": "たしかめる",
|
||||||
"disable": "なし",
|
"disable": "なし",
|
||||||
"dismiss": "わすれる",
|
|
||||||
"enable": "あり",
|
"enable": "あり",
|
||||||
"error_retry": "もういちど、ためしてください",
|
|
||||||
"flash_content": "クリックすると、Ruffle をつかって、フラッシュさくひんをひょうじします。(うまくうごかないかもしれません)",
|
|
||||||
"flash_fail": "フラッシュさくひんのロードに、しっぱいしました。コンソールに、くわしいことがかかれています。",
|
|
||||||
"flash_security": "フラッシュさくひんは、あぶないことをしてくるかもしれないので、ちゅういしてください。",
|
|
||||||
"generic_error": "エラーになりました",
|
"generic_error": "エラーになりました",
|
||||||
"loading": "ロードしています…",
|
|
||||||
"more": "つづき",
|
"more": "つづき",
|
||||||
"optional": "かかなくてもよい",
|
"optional": "かかなくてもよい",
|
||||||
"peek": "かくす",
|
|
||||||
"retry": "もういちど、ためしてください",
|
|
||||||
"role": {
|
|
||||||
"admin": "アドミン",
|
|
||||||
"moderator": "モデレーター"
|
|
||||||
},
|
|
||||||
"scope_in_timeline": {
|
|
||||||
"direct": "ダイレクト",
|
|
||||||
"local": "ローカル: このとうこうは、このインスタンスのユーザーだけが、みることができます",
|
|
||||||
"private": "フォロワーげんてい",
|
|
||||||
"public": "パブリック",
|
|
||||||
"unlisted": "アンリステッド"
|
|
||||||
},
|
|
||||||
"show_less": "たたむ",
|
"show_less": "たたむ",
|
||||||
"show_more": "つづきをみる",
|
"show_more": "つづきをみる",
|
||||||
"submit": "そうしん",
|
"submit": "そうしん",
|
||||||
|
@ -156,86 +76,7 @@
|
||||||
"interactions": {
|
"interactions": {
|
||||||
"favs_repeats": "リピートとおきにいり",
|
"favs_repeats": "リピートとおきにいり",
|
||||||
"follows": "あたらしいフォロー",
|
"follows": "あたらしいフォロー",
|
||||||
"load_older": "ふるいやりとりをみる",
|
"load_older": "ふるいやりとりをみる"
|
||||||
"moves": "ユーザーをひっこしする"
|
|
||||||
},
|
|
||||||
"languages": {
|
|
||||||
"ar": "アラビアご",
|
|
||||||
"az": "アゼルバイジャンご",
|
|
||||||
"bg": "ブルガリアご",
|
|
||||||
"cs": "チェコご",
|
|
||||||
"da": "デンマークご",
|
|
||||||
"de": "ドイツご",
|
|
||||||
"el": "ギリシャご",
|
|
||||||
"en": "えいご",
|
|
||||||
"eo": "エスご",
|
|
||||||
"es": "スペインご",
|
|
||||||
"fa": "ペルシャご",
|
|
||||||
"fi": "フィンランドご",
|
|
||||||
"fr": "フランスご",
|
|
||||||
"ga": "アイルランドご",
|
|
||||||
"he": "ヘブライご",
|
|
||||||
"hi": "ヒンディーご",
|
|
||||||
"hu": "ハンガリーご",
|
|
||||||
"id": "インドネシアご",
|
|
||||||
"it": "イタリアご",
|
|
||||||
"ja": "にほんご",
|
|
||||||
"ko": "かんこくご",
|
|
||||||
"lt": "リトアニアご",
|
|
||||||
"lv": "ラトビアご",
|
|
||||||
"nl": "オランダご",
|
|
||||||
"pl": "ポーランドご",
|
|
||||||
"pt": "ポルトガルご",
|
|
||||||
"ru": "ロシアご",
|
|
||||||
"sk": "スロバキアご",
|
|
||||||
"sv": "スウェーデンご",
|
|
||||||
"tr": "トルコご",
|
|
||||||
"translated_from": {
|
|
||||||
"ar": "@:languages.ar から、ほんやくされました",
|
|
||||||
"az": "@:languages.az から、ほんやくされました",
|
|
||||||
"bg": "@:languages.bg から、ほんやくされました",
|
|
||||||
"cs": "@:languages.cs から、ほんやくされました",
|
|
||||||
"da": "@:languages.da から、ほんやくされました",
|
|
||||||
"de": "@:languages.de から、ほんやくされました",
|
|
||||||
"el": "@:languages.el から、ほんやくされました",
|
|
||||||
"en": "@:languages.en から、ほんやくされました",
|
|
||||||
"eo": "@:languages.eo から、ほんやくされました",
|
|
||||||
"es": "@:languages.es から、ほんやくされました",
|
|
||||||
"fa": "@:languages.fa から、ほんやくされました",
|
|
||||||
"fi": "@:languages.fi から、ほんやくされました",
|
|
||||||
"fr": "@:languages.fr から、ほんやくされました",
|
|
||||||
"ga": "@:languages.ga から、ほんやくされました",
|
|
||||||
"he": "@:languages.he から、ほんやくされました",
|
|
||||||
"hi": "@:languages.hi から、ほんやくされました",
|
|
||||||
"hu": "@:languages.hu から、ほんやくされました",
|
|
||||||
"id": "@:languages.id から、ほんやくされました",
|
|
||||||
"it": "@:languages.it から、ほんやくされました",
|
|
||||||
"ja": "@:languages.ja から、ほんやくされました",
|
|
||||||
"ko": "@:languages.ko から、ほんやくされました",
|
|
||||||
"lt": "@:languages.lt から、ほんやくされました",
|
|
||||||
"lv": "@:languages.lv から、ほんやくされました",
|
|
||||||
"nl": "@:languages.nl から、ほんやくされました",
|
|
||||||
"pl": "@:languages.pl から、ほんやくされました",
|
|
||||||
"pt": "@:languages.pt から、ほんやくされました",
|
|
||||||
"ru": "@:languages.ru から、ほんやくされました",
|
|
||||||
"sk": "@:languages.sk から、ほんやくされました",
|
|
||||||
"sv": "@:languages.sv から、ほんやくされました",
|
|
||||||
"tr": "@:languages.tr から、ほんやくされました",
|
|
||||||
"uk": "@:languages.uk から、ほんやくされました",
|
|
||||||
"zh": "@:languages.zh から、ほんやくされました"
|
|
||||||
},
|
|
||||||
"uk": "ウクライナご",
|
|
||||||
"zh": "ちゅうごくご"
|
|
||||||
},
|
|
||||||
"lists": {
|
|
||||||
"create": "つくる",
|
|
||||||
"delete": "けす",
|
|
||||||
"following_only": "フォローしているユーザーのみ",
|
|
||||||
"lists": "リスト",
|
|
||||||
"new": "リストをつくる",
|
|
||||||
"save": "セーブ",
|
|
||||||
"search": "ユーザーをさがす",
|
|
||||||
"title": "リストのなまえ"
|
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"authentication_code": "にんしょうコード",
|
"authentication_code": "にんしょうコード",
|
||||||
|
@ -249,90 +90,41 @@
|
||||||
"hint": "はなしあいにくわわるには、ログインしてください",
|
"hint": "はなしあいにくわわるには、ログインしてください",
|
||||||
"login": "ログイン",
|
"login": "ログイン",
|
||||||
"logout": "ログアウト",
|
"logout": "ログアウト",
|
||||||
"logout_confirm": "ほんとうに、ログアウトしてもいいですか?",
|
|
||||||
"logout_confirm_accept_button": "ログアウト",
|
|
||||||
"logout_confirm_cancel_button": "キャンセル",
|
|
||||||
"logout_confirm_title": "ログアウト",
|
|
||||||
"password": "パスワード",
|
"password": "パスワード",
|
||||||
"placeholder": "ユーザーめい",
|
"placeholder": "れい: lain",
|
||||||
"recovery_code": "リカバリーコード",
|
"recovery_code": "リカバリーコード",
|
||||||
"register": "はじめる",
|
"register": "はじめる",
|
||||||
"username": "ユーザーめい"
|
"username": "ユーザーめい"
|
||||||
},
|
},
|
||||||
"media_modal": {
|
"media_modal": {
|
||||||
"counter": "{current} / {total}",
|
|
||||||
"hide": "とじる",
|
|
||||||
"next": "つぎ",
|
"next": "つぎ",
|
||||||
"previous": "まえ"
|
"previous": "まえ"
|
||||||
},
|
},
|
||||||
"moderation": {
|
|
||||||
"moderation": "モデレーション",
|
|
||||||
"reports": {
|
|
||||||
"add_note": "メモする",
|
|
||||||
"close": "とじる",
|
|
||||||
"delete_note": "けす",
|
|
||||||
"delete_note_accept": "けす",
|
|
||||||
"delete_note_cancel": "キャンセル",
|
|
||||||
"delete_note_confirm": "ほんとうに、このメモをけしてもいいですか?",
|
|
||||||
"delete_note_title": "かくにんしてください",
|
|
||||||
"no_content": "せつめいはありません",
|
|
||||||
"no_reports": "つうほうはありません",
|
|
||||||
"note_placeholder": "メモする",
|
|
||||||
"notes": "{ count }こ",
|
|
||||||
"reopen": "ひらきなおす",
|
|
||||||
"report": "つうほう:",
|
|
||||||
"reports": "つうほう",
|
|
||||||
"resolve": "かいけつ",
|
|
||||||
"show_closed": "かいけつしたつうほうをみる",
|
|
||||||
"statuses": "{ count } こ",
|
|
||||||
"tag_policy_notice": "とうこうをせいげんするには、TagPolicy MRF をゆうこうにしてください",
|
|
||||||
"tags": "とうこうをせいげんする"
|
|
||||||
},
|
|
||||||
"statuses": "とうこう",
|
|
||||||
"users": "ユーザー"
|
|
||||||
},
|
|
||||||
"nav": {
|
"nav": {
|
||||||
"about": "これはなに?",
|
"about": "これはなに?",
|
||||||
"administration": "アドミニストレーション",
|
"administration": "アドミニストレーション",
|
||||||
"announcements": "おしらせ",
|
|
||||||
"back": "もどる",
|
"back": "もどる",
|
||||||
"bookmarks": "ブックマーク",
|
|
||||||
"bubble_timeline": "バブルタイムライン",
|
|
||||||
"bubble_timeline_description": "アドミンがおすすめするインスタンスからのとうこう",
|
|
||||||
"chats": "チャット",
|
|
||||||
"dms": "ダイレクトメッセージ",
|
"dms": "ダイレクトメッセージ",
|
||||||
"friend_requests": "フォローリクエスト",
|
"friend_requests": "フォローリクエスト",
|
||||||
"home_timeline": "ホームタイムライン",
|
|
||||||
"home_timeline_description": "フォローしているユーザーのとうこう",
|
|
||||||
"interactions": "やりとり",
|
"interactions": "やりとり",
|
||||||
"lists": "リスト",
|
|
||||||
"mentions": "メンション",
|
"mentions": "メンション",
|
||||||
"moderation": "モデレーション",
|
|
||||||
"preferences": "せってい",
|
"preferences": "せってい",
|
||||||
"public_timeline_description": "このインスタンスからの、パブリックなとうこう",
|
|
||||||
"public_tl": "パブリックタイムライン",
|
"public_tl": "パブリックタイムライン",
|
||||||
"search": "さがす",
|
"search": "さがす",
|
||||||
"timeline": "タイムライン",
|
"timeline": "タイムライン",
|
||||||
"timelines": "タイムライン",
|
|
||||||
"twkn": "つながっているすべてのネットワーク",
|
"twkn": "つながっているすべてのネットワーク",
|
||||||
"twkn_timeline_description": "つながっているすべてのネットワークからのとうこう",
|
|
||||||
"user_search": "ユーザーをさがす",
|
"user_search": "ユーザーをさがす",
|
||||||
"who_to_follow": "おすすめユーザー"
|
"who_to_follow": "おすすめユーザー"
|
||||||
},
|
},
|
||||||
"notifications": {
|
"notifications": {
|
||||||
"broken_favorite": "とうこうがみつかりません。さがしています…",
|
"broken_favorite": "ステータスがみつかりません。さがしています…",
|
||||||
"error": "つうちのしゅとくがエラーになりました: {0}",
|
"favorited_you": "あなたのステータスがおきにいりされました",
|
||||||
"favorited_you": "あなたのとうこうが、おきにいりされました",
|
|
||||||
"follow_request": "フォローリクエストされました",
|
|
||||||
"followed_you": "フォローされました",
|
"followed_you": "フォローされました",
|
||||||
"load_older": "ふるいつうちをみる",
|
"load_older": "ふるいつうちをみる",
|
||||||
"migrated_to": "インスタンスをひっこしました",
|
|
||||||
"no_more_notifications": "つうちはありません",
|
"no_more_notifications": "つうちはありません",
|
||||||
"notifications": "つうち",
|
"notifications": "つうち",
|
||||||
"poll_ended": "いれふだがおわりました",
|
|
||||||
"reacted_with": "{0} でリアクションされました",
|
|
||||||
"read": "よんだ!",
|
"read": "よんだ!",
|
||||||
"repeated_you": "あなたのとうこうが、リピートされました"
|
"repeated_you": "あなたのステータスがリピートされました"
|
||||||
},
|
},
|
||||||
"password_reset": {
|
"password_reset": {
|
||||||
"check_email": "パスワードをリセットするためのリンクがかかれたメールが、とどいているかどうか、みてください。",
|
"check_email": "パスワードをリセットするためのリンクがかかれたメールが、とどいているかどうか、みてください。",
|
||||||
|
@ -355,72 +147,49 @@
|
||||||
"multiple_choices": "いくつでもえらべる",
|
"multiple_choices": "いくつでもえらべる",
|
||||||
"not_enough_options": "ユニークなオプションが、たりません",
|
"not_enough_options": "ユニークなオプションが、たりません",
|
||||||
"option": "オプション",
|
"option": "オプション",
|
||||||
"people_voted_count": "{count} にんが、ふだをいれています",
|
|
||||||
"single_choice": "ひとつえらぶ",
|
"single_choice": "ひとつえらぶ",
|
||||||
"type": "いれふだのかた",
|
"type": "いれふだのかた",
|
||||||
"vote": "ふだをいれる",
|
"vote": "ふだをいれる",
|
||||||
"votes": "いれふだ",
|
"votes": "いれふだ"
|
||||||
"votes_count": "{count} ふだ"
|
|
||||||
},
|
},
|
||||||
"post_status": {
|
"post_status": {
|
||||||
"account_not_locked_warning": "あなたのアカウントは {0} ではありません。あなたをフォローすれば、だれでも、フォロワーげんていのとうこうをよむことができます。",
|
"account_not_locked_warning": "あなたのアカウントは {0} ではありません。あなたをフォローすれば、だれでも、フォロワーげんていのステータスをよむことができます。",
|
||||||
"account_not_locked_warning_link": "ロックされたアカウント",
|
"account_not_locked_warning_link": "ロックされたアカウント",
|
||||||
"attachments_sensitive": "ファイルをNSFWにする",
|
"attachments_sensitive": "ファイルをNSFWにする",
|
||||||
"content_type": {
|
"content_type": {
|
||||||
"text/bbcode": "BBCode",
|
"text/bbcode": "BBCode",
|
||||||
"text/html": "HTML",
|
"text/html": "HTML",
|
||||||
"text/markdown": "Markdown",
|
"text/markdown": "Markdown",
|
||||||
"text/plain": "プレーンテキスト",
|
"text/plain": "プレーンテキスト"
|
||||||
"text/x.misskeymarkdown": "MFM"
|
|
||||||
},
|
},
|
||||||
"content_warning": "ちゅういがき (かかなくてもよい)",
|
"content_warning": "せつめい (かかなくてもよい)",
|
||||||
"default": "はねだくうこうに、つきました。",
|
"default": "はねだくうこうに、つきました。",
|
||||||
"direct_warning_to_all": "このとうこうは、メンションされたすべてのユーザーが、みることができます。",
|
"direct_warning_to_all": "このとうこうは、メンションされたすべてのユーザーが、みることができます。",
|
||||||
"direct_warning_to_first_only": "このとうこうは、メッセージのはじめでメンションされたユーザーだけが、みることができます。",
|
"direct_warning_to_first_only": "このとうこうは、メッセージのはじめでメンションされたユーザーだけが、みることができます。",
|
||||||
"edit_remote_warning": "へんしゅうしたとうこうは、ほかのインスタンスに、はんえいされないことがあります!",
|
|
||||||
"edit_status": "へんしゅう",
|
|
||||||
"edit_unsupported_warning": "いれふだとメンションは、へんしゅうでかえることができません。",
|
|
||||||
"empty_status_error": "からっぽのとうこうは、おくることができません",
|
|
||||||
"media_description": "メディアのせつめい",
|
|
||||||
"media_description_error": "メディアのアップデートにしっぱいしました。もういちど、ためしてください",
|
|
||||||
"media_not_sensitive_warning": "ちゅういがきがついていますが、NSFWはついていません!",
|
|
||||||
"new_status": "とうこうする",
|
"new_status": "とうこうする",
|
||||||
"post": "とうこう",
|
|
||||||
"posting": "とうこう",
|
"posting": "とうこう",
|
||||||
"preview": "プレビュー",
|
|
||||||
"preview_empty": "からっぽです",
|
|
||||||
"scope": {
|
"scope": {
|
||||||
"direct": "ダイレクト: メンションされたユーザーのみにとどきます",
|
"direct": "ダイレクト: メンションされたユーザーのみにとどきます",
|
||||||
"local": "ローカル: パブリックタイムラインにとどきますが、ほかのインスタンスにはとどきません",
|
|
||||||
"private": "フォロワーげんてい: フォロワーのみにとどきます",
|
"private": "フォロワーげんてい: フォロワーのみにとどきます",
|
||||||
"public": "パブリック: パブリックタイムラインにとどきます",
|
"public": "パブリック: パブリックタイムラインにとどきます",
|
||||||
"unlisted": "アンリステッド: パブリックタイムラインにとどきません"
|
"unlisted": "アンリステッド: パブリックタイムラインにとどきません"
|
||||||
},
|
},
|
||||||
"scope_notice": {
|
"scope_notice": {
|
||||||
"local": "このとうこうは、このインスタンスのユーザーだけが、みることができます",
|
|
||||||
"private": "このとうこうは、あなたのフォロワーだけが、みることができます",
|
"private": "このとうこうは、あなたのフォロワーだけが、みることができます",
|
||||||
"public": "このとうこうは、だれでもみることができます",
|
"public": "このとうこうは、だれでもみることができます",
|
||||||
"unlisted": "このとうこうは、パブリックタイムラインと、つながっているすべてのネットワークでは、みることができません"
|
"unlisted": "このとうこうは、パブリックタイムラインと、つながっているすべてのネットワークでは、みることができません"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
"awaiting_email_confirmation": "あなたのメールアドレスに、メールをおくりました。メールをかくにんして、とうろくをかんりょうさせてください。",
|
|
||||||
"awaiting_email_confirmation_title": "メールをかくにんするのをまっています",
|
|
||||||
"bio": "プロフィール",
|
"bio": "プロフィール",
|
||||||
"bio_placeholder": "れい:\nごきげんよう。わたしはれいん。\nわたしはアニメのおんなのこで、にほんのベッドタウンにすんでいます。ワイヤードで、わたしにあったことが、あるかもしれませんね。",
|
"bio_placeholder": "れい:\nごきげんよう。わたしはれいん。\nわたしはアニメのおんなのこで、にほんのベッドタウンにすんでいます。ワイヤードで、わたしにあったことが、あるかもしれませんね。",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
"email": "Eメール",
|
"email": "Eメール",
|
||||||
"email_language": "サーバーからのメールは、どのことばで、かいてほしいですか?",
|
|
||||||
"fullname": "スクリーンネーム",
|
"fullname": "スクリーンネーム",
|
||||||
"fullname_placeholder": "れい: いわくら れいん",
|
"fullname_placeholder": "れい: いわくら れいん",
|
||||||
"new_captcha": "もじがよめないときは、がぞうをクリックすると、あたらしいがぞうになります",
|
"new_captcha": "もじがよめないときは、がぞうをクリックすると、あたらしいがぞうになります",
|
||||||
"password_confirm": "パスワードのかくにん",
|
"password_confirm": "パスワードのかくにん",
|
||||||
"reason": "とうろくしたいりゆう",
|
|
||||||
"reason_placeholder": "このインスタンスは、しゅどうで、とうろくをうけつけています。\nとうろくしたいりゆうを、アドミニストレーターにおしえてください。",
|
|
||||||
"register": "はじめる",
|
|
||||||
"registration": "はじめる",
|
"registration": "はじめる",
|
||||||
"request_sent": "とうろくリクエストをおくりました。とうろくがうけいれられると、メールがとどきます。",
|
|
||||||
"request_sent_title": "とうろくリクエストをおくりました",
|
|
||||||
"token": "しょうたいトークン",
|
"token": "しょうたいトークン",
|
||||||
"username_placeholder": "れい: lain",
|
"username_placeholder": "れい: lain",
|
||||||
"validations": {
|
"validations": {
|
||||||
|
@ -448,20 +217,6 @@
|
||||||
"select_all": "すべてえらぶ"
|
"select_all": "すべてえらぶ"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"accent": "アクセント",
|
|
||||||
"account_alias": "アカウントのエイリアス",
|
|
||||||
"account_alias_table_head": "エイリアス",
|
|
||||||
"account_backup": "アカウントのバックアップ",
|
|
||||||
"account_backup_description": "あなたのアカウントのじょうほうと、とうこうの、アーカイブをダウンロードできます。しかし、いまのところは、バックアップを Pleromaのアカウントにインポートすることはできません。",
|
|
||||||
"account_backup_table_head": "バックアップ",
|
|
||||||
"account_privacy": "プライバシー",
|
|
||||||
"add_alias_error": "エイリアスのついかがエラーになりました: {error}",
|
|
||||||
"add_backup": "あたらしいバックアップをつくる",
|
|
||||||
"add_backup_error": "バックアップのついかがエラーになりました: {error}",
|
|
||||||
"added_alias": "エイリアスをついかしました。",
|
|
||||||
"added_backup": "バックアップをつくりました。",
|
|
||||||
"allow_following_move": "フォローしているアカウントがひっこしたときに、じどうでフォローしてもよい",
|
|
||||||
"always_show_post_button": "みぎしたのとうこうボタンをいつでもひょうじする",
|
|
||||||
"app_name": "アプリのなまえ",
|
"app_name": "アプリのなまえ",
|
||||||
"attachmentRadius": "ファイル",
|
"attachmentRadius": "ファイル",
|
||||||
"attachments": "ファイル",
|
"attachments": "ファイル",
|
||||||
|
@ -471,7 +226,6 @@
|
||||||
"avatarRadius": "アバター",
|
"avatarRadius": "アバター",
|
||||||
"avatar_size_instruction": "アバターのおおきさは、150×150ピクセルか、それよりもおおきくするといいです。",
|
"avatar_size_instruction": "アバターのおおきさは、150×150ピクセルか、それよりもおおきくするといいです。",
|
||||||
"background": "バックグラウンド",
|
"background": "バックグラウンド",
|
||||||
"backup_not_ready": "このバックアップは、まだ、かんせいしていません。",
|
|
||||||
"bio": "プロフィール",
|
"bio": "プロフィール",
|
||||||
"block_export": "ブロックのエクスポート",
|
"block_export": "ブロックのエクスポート",
|
||||||
"block_export_button": "ブロックをCSVファイルにエクスポート",
|
"block_export_button": "ブロックをCSVファイルにエクスポート",
|
||||||
|
@ -479,7 +233,6 @@
|
||||||
"block_import_error": "ブロックのインポートがエラーになりました",
|
"block_import_error": "ブロックのインポートがエラーになりました",
|
||||||
"blocks_imported": "ブロックをインポートしました! じっさいにブロックするまでには、もうしばらくかかります。",
|
"blocks_imported": "ブロックをインポートしました! じっさいにブロックするまでには、もうしばらくかかります。",
|
||||||
"blocks_tab": "ブロック",
|
"blocks_tab": "ブロック",
|
||||||
"bot": "これは bot アカウントです",
|
|
||||||
"btnRadius": "ボタン",
|
"btnRadius": "ボタン",
|
||||||
"cBlue": "リプライとフォロー",
|
"cBlue": "リプライとフォロー",
|
||||||
"cGreen": "リピート",
|
"cGreen": "リピート",
|
||||||
|
@ -491,29 +244,11 @@
|
||||||
"change_password_error": "パスワードをかえることが、できなかったかもしれません。",
|
"change_password_error": "パスワードをかえることが、できなかったかもしれません。",
|
||||||
"changed_email": "メールアドレスをかえることができました!",
|
"changed_email": "メールアドレスをかえることができました!",
|
||||||
"changed_password": "パスワードが、かわりました!",
|
"changed_password": "パスワードが、かわりました!",
|
||||||
"chatMessageRadius": "チャットメッセージ",
|
|
||||||
"checkboxRadius": "チェックボックス",
|
"checkboxRadius": "チェックボックス",
|
||||||
"collapse_subject": "ちゅういがきのあるとうこうをたたむ",
|
"collapse_subject": "せつめいのあるとうこうをたたむ",
|
||||||
"columns": "カラム",
|
|
||||||
"composing": "とうこう",
|
"composing": "とうこう",
|
||||||
"confirm_dialogs": "いつ、かくにんがめんをひょうじしますか:",
|
|
||||||
"confirm_dialogs_approve_follow": "フォローリクエストをうけいれるとき",
|
|
||||||
"confirm_dialogs_block": "だれかをブロックするとき",
|
|
||||||
"confirm_dialogs_delete": "とうこうをけすとき",
|
|
||||||
"confirm_dialogs_deny_follow": "フォローリクエストをおことわりするとき",
|
|
||||||
"confirm_dialogs_mute": "だれかをミュートするとき",
|
|
||||||
"confirm_dialogs_repeat": "とうこうをリピートするとき",
|
|
||||||
"confirm_dialogs_unfollow": "だれかのフォローをやめるとき",
|
|
||||||
"confirm_new_password": "あたらしいパスワードのかくにん",
|
"confirm_new_password": "あたらしいパスワードのかくにん",
|
||||||
"confirmation_dialogs": "かくにんがめんのせってい",
|
|
||||||
"conversation_display": "スレッドのみため",
|
|
||||||
"conversation_display_linear": "リニア",
|
|
||||||
"conversation_display_tree": "ツリー",
|
|
||||||
"conversation_other_replies_button": "「ほかのへんしん」ボタンをひょうじするばしょ",
|
|
||||||
"conversation_other_replies_button_below": "とうこうのした",
|
|
||||||
"conversation_other_replies_button_inside": "とうこうのうちがわ",
|
|
||||||
"current_avatar": "いまのアバター",
|
"current_avatar": "いまのアバター",
|
||||||
"current_mascot": "いまのマスコット",
|
|
||||||
"current_password": "いまのパスワード",
|
"current_password": "いまのパスワード",
|
||||||
"data_import_export_tab": "インポートとエクスポート",
|
"data_import_export_tab": "インポートとエクスポート",
|
||||||
"default_vis": "デフォルトのこうかいはんい",
|
"default_vis": "デフォルトのこうかいはんい",
|
||||||
|
@ -521,15 +256,9 @@
|
||||||
"delete_account_description": "あなたのアカウントとメッセージが、きえます。",
|
"delete_account_description": "あなたのアカウントとメッセージが、きえます。",
|
||||||
"delete_account_error": "アカウントをけすことが、できなかったかもしれません。インスタンスのアドミニストレーターに、おといあわせください。",
|
"delete_account_error": "アカウントをけすことが、できなかったかもしれません。インスタンスのアドミニストレーターに、おといあわせください。",
|
||||||
"delete_account_instructions": "ほんとうにアカウントをけしてもいいなら、パスワードをかいてください。",
|
"delete_account_instructions": "ほんとうにアカウントをけしてもいいなら、パスワードをかいてください。",
|
||||||
"disable_sticky_headers": "カラムヘッダーを、がめんのいちばんうえにくっつけない",
|
|
||||||
"discoverable": "けんさくなどのサービスで、このアカウントをみつけてもよい",
|
"discoverable": "けんさくなどのサービスで、このアカウントをみつけてもよい",
|
||||||
"domain_mutes": "ドメイン",
|
|
||||||
"download_backup": "ダウンロード",
|
|
||||||
"email_language": "メールのことば",
|
|
||||||
"emoji_reactions_on_timeline": "えもじのリアクションをタイムラインにひょうじする",
|
|
||||||
"enable_web_push_notifications": "ウェブプッシュつうちをゆるす",
|
"enable_web_push_notifications": "ウェブプッシュつうちをゆるす",
|
||||||
"enter_current_password_to_confirm": "あなたのアイデンティティをたしかめるため、あなたのいまのパスワードをかいてください",
|
"enter_current_password_to_confirm": "あなたのアイデンティティをたしかめるため、あなたのいまのパスワードをかいてください",
|
||||||
"expert_mode": "こまかいせっていをひょうじ",
|
|
||||||
"export_theme": "セーブ",
|
"export_theme": "セーブ",
|
||||||
"filtering": "フィルタリング",
|
"filtering": "フィルタリング",
|
||||||
"filtering_explanation": "これらのことばをふくむすべてのものがミュートされます。1ぎょうに1つのことばをかいてください",
|
"filtering_explanation": "これらのことばをふくむすべてのものがミュートされます。1ぎょうに1つのことばをかいてください",
|
||||||
|
@ -600,7 +329,6 @@
|
||||||
"no_rich_text_description": "リッチテキストをつかわない",
|
"no_rich_text_description": "リッチテキストをつかわない",
|
||||||
"notification_blocks": "ブロックしているユーザーからのつうちは、すべてとまります。",
|
"notification_blocks": "ブロックしているユーザーからのつうちは、すべてとまります。",
|
||||||
"notification_mutes": "あるユーザーからのつうちをとめるには、ミュートしてください。",
|
"notification_mutes": "あるユーザーからのつうちをとめるには、ミュートしてください。",
|
||||||
"notification_setting_hide_if_cw": "ちゅういがきがあるとうこうのないようを、つうちからみえないようにする",
|
|
||||||
"notification_visibility": "ひょうじするつうち",
|
"notification_visibility": "ひょうじするつうち",
|
||||||
"notification_visibility_follows": "フォロー",
|
"notification_visibility_follows": "フォロー",
|
||||||
"notification_visibility_likes": "おきにいり",
|
"notification_visibility_likes": "おきにいり",
|
||||||
|
@ -633,7 +361,6 @@
|
||||||
"search_user_to_mute": "ミュートしたいひとを、ここでけんさくできます",
|
"search_user_to_mute": "ミュートしたいひとを、ここでけんさくできます",
|
||||||
"security": "セキュリティ",
|
"security": "セキュリティ",
|
||||||
"security_tab": "セキュリティ",
|
"security_tab": "セキュリティ",
|
||||||
"sensitive_if_subject": "ちゅういがきを、つけたときに、がぞうをじどうてきにNSFWにする",
|
|
||||||
"set_new_avatar": "あたらしいアバターをせっていする",
|
"set_new_avatar": "あたらしいアバターをせっていする",
|
||||||
"set_new_profile_background": "あたらしいプロフィールのバックグラウンドをせっていする",
|
"set_new_profile_background": "あたらしいプロフィールのバックグラウンドをせっていする",
|
||||||
"set_new_profile_banner": "あたらしいプロフィールバナーを設定する",
|
"set_new_profile_banner": "あたらしいプロフィールバナーを設定する",
|
||||||
|
@ -751,8 +478,8 @@
|
||||||
"save_load_hint": "「のこす」オプションをONにすると、テーマをえらんだときとロードしたとき、いまのせっていをのこします。また、テーマをエクスポートするとき、これらのオプションをストアします。すべてのチェックボックスをOFFにすると、テーマをエクスポートしたとき、すべてのせっていをセーブします。"
|
"save_load_hint": "「のこす」オプションをONにすると、テーマをえらんだときとロードしたとき、いまのせっていをのこします。また、テーマをエクスポートするとき、これらのオプションをストアします。すべてのチェックボックスをOFFにすると、テーマをエクスポートしたとき、すべてのせっていをセーブします。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"subject_input_always_show": "ちゅういがきフィールドをいつでもひょうじする",
|
"subject_input_always_show": "サブジェクトフィールドをいつでもひょうじする",
|
||||||
"subject_line_behavior": "リプライするとき、ちゅういがきをコピーする",
|
"subject_line_behavior": "リプライするときサブジェクトをコピーする",
|
||||||
"subject_line_email": "メールふう: \"re: サブジェクト\"",
|
"subject_line_email": "メールふう: \"re: サブジェクト\"",
|
||||||
"subject_line_mastodon": "マストドンふう: そのままコピー",
|
"subject_line_mastodon": "マストドンふう: そのままコピー",
|
||||||
"subject_line_noop": "コピーしない",
|
"subject_line_noop": "コピーしない",
|
||||||
|
@ -779,8 +506,8 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"status": {
|
"status": {
|
||||||
"delete": "とうこうをけす",
|
"delete": "ステータスをけす",
|
||||||
"delete_confirm": "ほんとうに、このとうこうを、けしてもいいですか?",
|
"delete_confirm": "ほんとうに、このステータスを、けしてもいいですか?",
|
||||||
"favorites": "おきにいり",
|
"favorites": "おきにいり",
|
||||||
"mute_conversation": "スレッドをミュートする",
|
"mute_conversation": "スレッドをミュートする",
|
||||||
"pin": "プロフィールにピンどめする",
|
"pin": "プロフィールにピンどめする",
|
||||||
|
@ -788,8 +515,6 @@
|
||||||
"repeats": "リピート",
|
"repeats": "リピート",
|
||||||
"replies_list": "へんしん:",
|
"replies_list": "へんしん:",
|
||||||
"reply_to": "へんしん:",
|
"reply_to": "へんしん:",
|
||||||
"translate": "ほんやく",
|
|
||||||
"translated_from": "{language} から、ほんやくされました",
|
|
||||||
"unmute_conversation": "スレッドをミュートするのをやめる",
|
"unmute_conversation": "スレッドをミュートするのをやめる",
|
||||||
"unpin": "プロフィールにピンどめするのをやめる"
|
"unpin": "プロフィールにピンどめするのをやめる"
|
||||||
},
|
},
|
||||||
|
@ -818,7 +543,7 @@
|
||||||
"timeline": {
|
"timeline": {
|
||||||
"collapse": "たたむ",
|
"collapse": "たたむ",
|
||||||
"conversation": "スレッド",
|
"conversation": "スレッド",
|
||||||
"load_older": "ふるいとうこう",
|
"load_older": "ふるいステータス",
|
||||||
"no_more_statuses": "これでおわりです",
|
"no_more_statuses": "これでおわりです",
|
||||||
"no_retweet_hint": "とうこうを「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります",
|
"no_retweet_hint": "とうこうを「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります",
|
||||||
"no_statuses": "ありません",
|
"no_statuses": "ありません",
|
||||||
|
@ -892,7 +617,7 @@
|
||||||
"remote_follow": "リモートフォロー",
|
"remote_follow": "リモートフォロー",
|
||||||
"report": "つうほう",
|
"report": "つうほう",
|
||||||
"show_repeats": "リピートをみる",
|
"show_repeats": "リピートをみる",
|
||||||
"statuses": "とうこう",
|
"statuses": "ステータス",
|
||||||
"subscribe": "サブスクライブ",
|
"subscribe": "サブスクライブ",
|
||||||
"unblock": "ブロックをやめる",
|
"unblock": "ブロックをやめる",
|
||||||
"unblock_progress": "ブロックをとりけしています…",
|
"unblock_progress": "ブロックをとりけしています…",
|
||||||
|
@ -918,4 +643,4 @@
|
||||||
"more": "くわしく",
|
"more": "くわしく",
|
||||||
"who_to_follow": "おすすめユーザー"
|
"who_to_follow": "おすすめユーザー"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -283,18 +283,13 @@
|
||||||
"no_content": "説明なし",
|
"no_content": "説明なし",
|
||||||
"no_reports": "通報なし",
|
"no_reports": "通報なし",
|
||||||
"note_placeholder": "メモ",
|
"note_placeholder": "メモ",
|
||||||
"notes": "{count}件",
|
"notes": "メモ",
|
||||||
"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": "このインスタンスについて",
|
||||||
|
@ -409,8 +404,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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",
|
||||||
|
@ -424,8 +417,6 @@
|
||||||
"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": {
|
||||||
|
@ -535,8 +526,6 @@
|
||||||
"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": "設定をバックアップ",
|
||||||
|
@ -1046,7 +1035,6 @@
|
||||||
"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": "投稿を「フォロワーのみ」または「ダイレクト」にすると、リピートできなくなります",
|
||||||
|
@ -1056,7 +1044,6 @@
|
||||||
"show_new": "読み込み",
|
"show_new": "読み込み",
|
||||||
"socket_broke": "コード{0}によりリアルタイム接続が切断されました",
|
"socket_broke": "コード{0}によりリアルタイム接続が切断されました",
|
||||||
"socket_reconnected": "リアルタイム接続が確立されました",
|
"socket_reconnected": "リアルタイム接続が確立されました",
|
||||||
"unfollow_tag": "タグのフォローを解除",
|
|
||||||
"up_to_date": "最新"
|
"up_to_date": "最新"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
|
|
|
@ -254,10 +254,6 @@
|
||||||
"hint": "Log in om deel te nemen aan de discussie",
|
"hint": "Log in om deel te nemen aan de discussie",
|
||||||
"login": "Inloggen",
|
"login": "Inloggen",
|
||||||
"logout": "Uitloggen",
|
"logout": "Uitloggen",
|
||||||
"logout_confirm": "Weet je zeker dat je wilt uitloggen?",
|
|
||||||
"logout_confirm_accept_button": "Uitloggen",
|
|
||||||
"logout_confirm_cancel_button": "Annuleren",
|
|
||||||
"logout_confirm_title": "Uitloggen",
|
|
||||||
"password": "Wachtwoord",
|
"password": "Wachtwoord",
|
||||||
"placeholder": "mijngebruikersnaam",
|
"placeholder": "mijngebruikersnaam",
|
||||||
"recovery_code": "Herstelcode",
|
"recovery_code": "Herstelcode",
|
||||||
|
@ -270,30 +266,6 @@
|
||||||
"next": "Volgende",
|
"next": "Volgende",
|
||||||
"previous": "Vorige"
|
"previous": "Vorige"
|
||||||
},
|
},
|
||||||
"moderation": {
|
|
||||||
"moderation": "Moderatie",
|
|
||||||
"reports": {
|
|
||||||
"add_note": "Notitie toevoegen",
|
|
||||||
"close": "Sluiten",
|
|
||||||
"delete_note": "Verwijderen",
|
|
||||||
"delete_note_accept": "Ja, verwijderen",
|
|
||||||
"delete_note_cancel": "Nee, behouden",
|
|
||||||
"delete_note_confirm": "Weet je zeker dat je deze notitie wilt verwijderen?",
|
|
||||||
"delete_note_title": "Verwijderen bevestigen",
|
|
||||||
"no_content": "Geen omschrijving beschikbaar",
|
|
||||||
"no_reports": "Geen rapporten beschikbaar",
|
|
||||||
"notes": "{ count } notitie | { count } notities",
|
|
||||||
"reopen": "Heropenen",
|
|
||||||
"reports": "Rapporten",
|
|
||||||
"resolve": "Oplossen",
|
|
||||||
"show_closed": "Afgesloten tonen",
|
|
||||||
"statuses": "{ count } bericht| { count } berichten",
|
|
||||||
"tag_policy_notice": "Activeer de TagPolicy MRF om bericht-beperkingen in te stellen",
|
|
||||||
"tags": "Bericht-beperkingen instellen"
|
|
||||||
},
|
|
||||||
"statuses": "Berichten",
|
|
||||||
"users": "Gebruikers"
|
|
||||||
},
|
|
||||||
"nav": {
|
"nav": {
|
||||||
"about": "Over ons",
|
"about": "Over ons",
|
||||||
"administration": "Beheer",
|
"administration": "Beheer",
|
||||||
|
@ -310,7 +282,6 @@
|
||||||
"interactions": "Interacties",
|
"interactions": "Interacties",
|
||||||
"lists": "Lijsten",
|
"lists": "Lijsten",
|
||||||
"mentions": "Vermeldingen",
|
"mentions": "Vermeldingen",
|
||||||
"moderation": "Moderatie",
|
|
||||||
"preferences": "Voorkeuren",
|
"preferences": "Voorkeuren",
|
||||||
"public_timeline_description": "Openbare berichten van deze instantie",
|
"public_timeline_description": "Openbare berichten van deze instantie",
|
||||||
"public_tl": "Openbare tijdlijn",
|
"public_tl": "Openbare tijdlijn",
|
||||||
|
@ -407,8 +378,6 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"registration": {
|
"registration": {
|
||||||
"awaiting_email_confirmation": "Je account is geregistreerd en een e-mail verzonden naar je e-mailadres ter bevestiging. Controleer je e-mail inbox om de registratie af te ronden.",
|
|
||||||
"awaiting_email_confirmation_title": "In afwachting van e-mail bevestiging",
|
|
||||||
"bio": "Bio",
|
"bio": "Bio",
|
||||||
"bio_placeholder": "Bijv.\nHallo! Welkom op mijn bio.\nIk vind anime en games leuk. Hopelijk kunnen we vrienden zijn!",
|
"bio_placeholder": "Bijv.\nHallo! Welkom op mijn bio.\nIk vind anime en games leuk. Hopelijk kunnen we vrienden zijn!",
|
||||||
"captcha": "CAPTCHA",
|
"captcha": "CAPTCHA",
|
||||||
|
@ -422,8 +391,6 @@
|
||||||
"reason_placeholder": "Deze instantie keurt registraties handmatig goed.\nLaat de beheerder weten waarom je je wilt registreren.",
|
"reason_placeholder": "Deze instantie keurt registraties handmatig goed.\nLaat de beheerder weten waarom je je wilt registreren.",
|
||||||
"register": "Registreren",
|
"register": "Registreren",
|
||||||
"registration": "Registratie",
|
"registration": "Registratie",
|
||||||
"request_sent": "Je registratieverzoek zal worden beoordeeld. Indien je account wordt goed gekeurd, zul je een e-mail ontvangen.",
|
|
||||||
"request_sent_title": "Registratieverzoek verzonden",
|
|
||||||
"token": "Uitnodigingstoken",
|
"token": "Uitnodigingstoken",
|
||||||
"username_placeholder": "bijv. akko",
|
"username_placeholder": "bijv. akko",
|
||||||
"validations": {
|
"validations": {
|
||||||
|
@ -533,8 +500,6 @@
|
||||||
"enable_web_push_notifications": "Web push meldingen inschakelen",
|
"enable_web_push_notifications": "Web push meldingen inschakelen",
|
||||||
"enter_current_password_to_confirm": "Voer je huidige wachtwoord in om je identiteit te bevestigen",
|
"enter_current_password_to_confirm": "Voer je huidige wachtwoord in om je identiteit te bevestigen",
|
||||||
"expert_mode": "Geavanceerde opties tonen",
|
"expert_mode": "Geavanceerde opties tonen",
|
||||||
"expire_posts_enabled": "Berichten ouder dan een ingesteld aantal dagen verwijderen",
|
|
||||||
"expire_posts_input_placeholder": "Aantal dagen",
|
|
||||||
"export_theme": "Preset opslaan",
|
"export_theme": "Preset opslaan",
|
||||||
"file_export_import": {
|
"file_export_import": {
|
||||||
"backup_restore": "Instellingen back-up",
|
"backup_restore": "Instellingen back-up",
|
||||||
|
@ -728,18 +693,6 @@
|
||||||
"setting_changed": "Instelling verschilt van standaard waarde",
|
"setting_changed": "Instelling verschilt van standaard waarde",
|
||||||
"setting_server_side": "Deze instelling is gebonden aan je profiel en beïnvloed alle sessies en clients",
|
"setting_server_side": "Deze instelling is gebonden aan je profiel en beïnvloed alle sessies en clients",
|
||||||
"settings": "Instellingen",
|
"settings": "Instellingen",
|
||||||
"settings_profile": "Instellingsprofielen",
|
|
||||||
"settings_profile_creation": "Nieuw profiel aanmaken",
|
|
||||||
"settings_profile_creation_new_name_label": "Naam",
|
|
||||||
"settings_profile_creation_submit": "Aanmaken",
|
|
||||||
"settings_profile_delete": "Verwijderen",
|
|
||||||
"settings_profile_delete_confirm": "Weet je zeker dat je dit profiel wilt verwijderen?",
|
|
||||||
"settings_profile_force_sync": "Synchroniseren",
|
|
||||||
"settings_profile_in_use": "In gebruik",
|
|
||||||
"settings_profile_use": "Gebruiken",
|
|
||||||
"settings_profiles_refresh": "Instellingsprofielen verversen",
|
|
||||||
"settings_profiles_show": "Alle instellingsprofielen tonen",
|
|
||||||
"settings_profiles_unshow": "Alle instellingsprofielen verbergen",
|
|
||||||
"show_admin_badge": "\"Beheerder\" badge in mijn profiel tonen",
|
"show_admin_badge": "\"Beheerder\" badge in mijn profiel tonen",
|
||||||
"show_moderator_badge": "\"Moderator\" badge in mijn profiel tonen",
|
"show_moderator_badge": "\"Moderator\" badge in mijn profiel tonen",
|
||||||
"show_nav_shortcuts": "Extra navigatie snelkoppelingen tonen in top paneel",
|
"show_nav_shortcuts": "Extra navigatie snelkoppelingen tonen in top paneel",
|
||||||
|
@ -919,7 +872,6 @@
|
||||||
"useStreamingApi": "Berichten en meldingen in real-time ontvangen",
|
"useStreamingApi": "Berichten en meldingen in real-time ontvangen",
|
||||||
"useStreamingApiWarning": "Iets experimenteels met berichten streamen uwu miss kun je beter uit laten ofzo?",
|
"useStreamingApiWarning": "Iets experimenteels met berichten streamen uwu miss kun je beter uit laten ofzo?",
|
||||||
"use_at_icon": "{'@'} symbool als icoon tonen in plaats van tekst",
|
"use_at_icon": "{'@'} symbool als icoon tonen in plaats van tekst",
|
||||||
"use_blurhash": "Waas tonen over NSFW-miniaturen",
|
|
||||||
"use_contain_fit": "Bijlage in miniaturen niet bijsnijden",
|
"use_contain_fit": "Bijlage in miniaturen niet bijsnijden",
|
||||||
"use_one_click_nsfw": "Gevoelige bijlagen met slechts één klik openen",
|
"use_one_click_nsfw": "Gevoelige bijlagen met slechts één klik openen",
|
||||||
"user_mutes": "Gebruikers",
|
"user_mutes": "Gebruikers",
|
||||||
|
@ -940,12 +892,6 @@
|
||||||
"word_filter": "Woord filter",
|
"word_filter": "Woord filter",
|
||||||
"wordfilter": "Woordfilter"
|
"wordfilter": "Woordfilter"
|
||||||
},
|
},
|
||||||
"settings_profile": {
|
|
||||||
"creating": "Bezig met nieuw profiel \"{profile}\" aan te maken...",
|
|
||||||
"synchronization_error": "Instellingen konden niet gesynchroniseerd worden: {err}",
|
|
||||||
"synchronized": "Instellingen gesynchroniseerd!",
|
|
||||||
"synchronizing": "Bezig met profiel \"{profile}\" te synchroniseren..."
|
|
||||||
},
|
|
||||||
"status": {
|
"status": {
|
||||||
"ancestor_follow": "{numReplies} ander antwoord onder dit bericht tonen | {numReplies} andere antwoorden onder dit bericht tonen",
|
"ancestor_follow": "{numReplies} ander antwoord onder dit bericht tonen | {numReplies} andere antwoorden onder dit bericht tonen",
|
||||||
"ancestor_follow_with_icon": "{icon} {text}",
|
"ancestor_follow_with_icon": "{icon} {text}",
|
||||||
|
@ -979,11 +925,6 @@
|
||||||
"pin": "Aan profiel vastmaken",
|
"pin": "Aan profiel vastmaken",
|
||||||
"pinned": "Vastgezet",
|
"pinned": "Vastgezet",
|
||||||
"plus_more": "+{number} meer",
|
"plus_more": "+{number} meer",
|
||||||
"redraft": "Verwijderen & opnieuw opstellen",
|
|
||||||
"redraft_confirm": "Weet je zeker at je dit bericht wilt verwijderen en opnieuw opstellen? Interacties met het originele bericht zullen vervallen.",
|
|
||||||
"redraft_confirm_accept_button": "Ja, verwijderen en opnieuw opstellen",
|
|
||||||
"redraft_confirm_cancel_button": "Nee, origineel bericht behouden",
|
|
||||||
"redraft_confirm_title": "Verwijderen & opnieuw opstellen bevestigen",
|
|
||||||
"remove_attachment": "Bijlage verwijderen",
|
"remove_attachment": "Bijlage verwijderen",
|
||||||
"repeat_confirm": "Weet je zeker dat je dit bericht wilt herhalen?",
|
"repeat_confirm": "Weet je zeker dat je dit bericht wilt herhalen?",
|
||||||
"repeat_confirm_accept_button": "Ja, herhalen",
|
"repeat_confirm_accept_button": "Ja, herhalen",
|
||||||
|
@ -1044,7 +985,6 @@
|
||||||
"collapse": "Invouwen",
|
"collapse": "Invouwen",
|
||||||
"conversation": "Gesprek",
|
"conversation": "Gesprek",
|
||||||
"error": "Fout bij het ophalen van tijdlijn: {0}",
|
"error": "Fout bij het ophalen van tijdlijn: {0}",
|
||||||
"follow_tag": "Hashtag volgen",
|
|
||||||
"load_older": "Oudere berichten laden",
|
"load_older": "Oudere berichten laden",
|
||||||
"no_more_statuses": "Geen verdere berichten",
|
"no_more_statuses": "Geen verdere berichten",
|
||||||
"no_retweet_hint": "Bericht is gemarkeerd als enkel-volgers of privé en kan niet worden herhaald of geciteerd",
|
"no_retweet_hint": "Bericht is gemarkeerd als enkel-volgers of privé en kan niet worden herhaald of geciteerd",
|
||||||
|
@ -1054,7 +994,6 @@
|
||||||
"show_new": "Nieuwe tonen",
|
"show_new": "Nieuwe tonen",
|
||||||
"socket_broke": "Realtime verbinding verloren: CloseEvent code {0}",
|
"socket_broke": "Realtime verbinding verloren: CloseEvent code {0}",
|
||||||
"socket_reconnected": "Realtime verbinding opgezet",
|
"socket_reconnected": "Realtime verbinding opgezet",
|
||||||
"unfollow_tag": "Hashtag ontvolgen",
|
|
||||||
"up_to_date": "Up-to-date"
|
"up_to_date": "Up-to-date"
|
||||||
},
|
},
|
||||||
"toast": {
|
"toast": {
|
||||||
|
@ -1119,7 +1058,6 @@
|
||||||
"block_confirm_title": "Gebruiker blokkeren",
|
"block_confirm_title": "Gebruiker blokkeren",
|
||||||
"block_progress": "Blokkeren…",
|
"block_progress": "Blokkeren…",
|
||||||
"blocked": "Geblokkeerd!",
|
"blocked": "Geblokkeerd!",
|
||||||
"blocks_you": "Blokkeert jou!",
|
|
||||||
"bot": "Bot",
|
"bot": "Bot",
|
||||||
"deactivated": "Gedeactiveerd",
|
"deactivated": "Gedeactiveerd",
|
||||||
"deny": "Weigeren",
|
"deny": "Weigeren",
|
||||||
|
@ -1134,10 +1072,7 @@
|
||||||
"follow_cancel": "Verzoek annuleren",
|
"follow_cancel": "Verzoek annuleren",
|
||||||
"follow_progress": "Aanvragen…",
|
"follow_progress": "Aanvragen…",
|
||||||
"follow_sent": "Verzoek verzonden!",
|
"follow_sent": "Verzoek verzonden!",
|
||||||
"follow_tag": "Hashtag volgen",
|
|
||||||
"follow_unfollow": "Ontvolgen",
|
"follow_unfollow": "Ontvolgen",
|
||||||
"followed_tags": "Gevolgde hashtags",
|
|
||||||
"followed_users": "Gevolgde gebruikers",
|
|
||||||
"followees": "Volgen",
|
"followees": "Volgen",
|
||||||
"followers": "Volgers",
|
"followers": "Volgers",
|
||||||
"following": "Gevolgd!",
|
"following": "Gevolgd!",
|
||||||
|
@ -1162,14 +1097,11 @@
|
||||||
"mute_domain": "Domein blokkeren",
|
"mute_domain": "Domein blokkeren",
|
||||||
"mute_progress": "Negeren…",
|
"mute_progress": "Negeren…",
|
||||||
"muted": "Genegeerd",
|
"muted": "Genegeerd",
|
||||||
"not_following_any_hashtags": "Je volgt momenteel geen hashtags",
|
|
||||||
"note": "Privé notitie",
|
"note": "Privé notitie",
|
||||||
"per_day": "per dag",
|
"per_day": "per dag",
|
||||||
"remote_follow": "Van afstand volgen",
|
"remote_follow": "Van afstand volgen",
|
||||||
"remove_follower": "Volger verwijderen",
|
|
||||||
"replies": "Met Antwoorden",
|
"replies": "Met Antwoorden",
|
||||||
"report": "Rapporteren",
|
"report": "Rapporteren",
|
||||||
"requested_by": "Heeft verzocht je te volgen",
|
|
||||||
"show_repeats": "Herhalingen tonen",
|
"show_repeats": "Herhalingen tonen",
|
||||||
"statuses": "Berichten",
|
"statuses": "Berichten",
|
||||||
"subscribe": "Abonneren",
|
"subscribe": "Abonneren",
|
||||||
|
@ -1179,13 +1111,11 @@
|
||||||
"unfollow_confirm_accept_button": "Ja, ontvolgen",
|
"unfollow_confirm_accept_button": "Ja, ontvolgen",
|
||||||
"unfollow_confirm_cancel_button": "Nee, niet ontvolgen",
|
"unfollow_confirm_cancel_button": "Nee, niet ontvolgen",
|
||||||
"unfollow_confirm_title": "Gebruiker ontvolgen",
|
"unfollow_confirm_title": "Gebruiker ontvolgen",
|
||||||
"unfollow_tag": "Hashtag ontvolgen",
|
|
||||||
"unmute": "Negeren opheffen",
|
"unmute": "Negeren opheffen",
|
||||||
"unmute_progress": "Negeren opheffen…",
|
"unmute_progress": "Negeren opheffen…",
|
||||||
"unsubscribe": "Abonnement opzeggen"
|
"unsubscribe": "Abonnement opzeggen"
|
||||||
},
|
},
|
||||||
"user_profile": {
|
"user_profile": {
|
||||||
"field_validated": "Link geverifieerd",
|
|
||||||
"profile_does_not_exist": "Sorry, dit profiel bestaat niet.",
|
"profile_does_not_exist": "Sorry, dit profiel bestaat niet.",
|
||||||
"profile_loading_error": "Sorry, er is een fout opgetreden bij het laden van dit profiel.",
|
"profile_loading_error": "Sorry, er is een fout opgetreden bij het laden van dit profiel.",
|
||||||
"timeline_title": "Gebruikerstijdlijn"
|
"timeline_title": "Gebruikerstijdlijn"
|
||||||
|
|
|
@ -16,15 +16,12 @@
|
||||||
"accept_desc": "Este domínio aceita apenas mensagens dos seguintes domínios:",
|
"accept_desc": "Este domínio aceita apenas mensagens dos seguintes domínios:",
|
||||||
"ftl_removal": "Remoção da cronologia da \"Rede conhecida por todos\"",
|
"ftl_removal": "Remoção da cronologia da \"Rede conhecida por todos\"",
|
||||||
"ftl_removal_desc": "Este domínio remove os seguintes domínios da cronologia \"Rede conhecida por todos\":",
|
"ftl_removal_desc": "Este domínio remove os seguintes domínios da cronologia \"Rede conhecida por todos\":",
|
||||||
"instance": "Domínio",
|
|
||||||
"media_nsfw": "Forçar definição de multimédia como Sensível",
|
"media_nsfw": "Forçar definição de multimédia como Sensível",
|
||||||
"media_nsfw_desc": "Este domínio força a multimédia a ser marcada como sensível nos seguintes domínios:",
|
"media_nsfw_desc": "Este domínio força a multimédia a ser marcada como sensível nos seguintes domínios:",
|
||||||
"media_removal": "Remoção de multimédia",
|
"media_removal": "Remoção de multimédia",
|
||||||
"media_removal_desc": "Este domínio remove multimédia das publicações dos seguintes domínios:",
|
"media_removal_desc": "Este domínio remove multimédia das publicações dos seguintes domínios:",
|
||||||
"not_applicable": "N/A",
|
|
||||||
"quarantine": "Quarentena",
|
"quarantine": "Quarentena",
|
||||||
"quarantine_desc": "Este domínio apenas irá publicar nos seguintes domínios:",
|
"quarantine_desc": "Este domínio apenas irá publicar nos seguintes domínios:",
|
||||||
"reason": "Razão",
|
|
||||||
"reject": "Rejeitar",
|
"reject": "Rejeitar",
|
||||||
"reject_desc": "Este domínio não aceitará mensagens dos seguintes domínios:",
|
"reject_desc": "Este domínio não aceitará mensagens dos seguintes domínios:",
|
||||||
"simple_policies": "Políticas especificas do domínio"
|
"simple_policies": "Políticas especificas do domínio"
|
||||||
|
@ -32,26 +29,6 @@
|
||||||
},
|
},
|
||||||
"staff": "Staff"
|
"staff": "Staff"
|
||||||
},
|
},
|
||||||
"announcements": {
|
|
||||||
"all_day_prompt": "Este evento dura o dia inteiro",
|
|
||||||
"cancel_edit_action": "Cancelar",
|
|
||||||
"close_error": "Fechar",
|
|
||||||
"delete_action": "Apagar",
|
|
||||||
"edit_action": "Editar",
|
|
||||||
"end_time_display": "Termina às {time}",
|
|
||||||
"inactive_message": "Este anúncio está inativo",
|
|
||||||
"mark_as_read_action": "Marcar como lido",
|
|
||||||
"page_header": "Anúncios",
|
|
||||||
"post_action": "Publicar",
|
|
||||||
"post_error": "Erro: {error}",
|
|
||||||
"post_form_header": "Publicar anúncio",
|
|
||||||
"post_placeholder": "Conteúdo do anúncio",
|
|
||||||
"published_time_display": "Publicado às {time}",
|
|
||||||
"start_time_display": "Começa às {time}",
|
|
||||||
"start_time_prompt": "Hora de início: ",
|
|
||||||
"submit_edit_action": "Enviar",
|
|
||||||
"title": "Anúncio"
|
|
||||||
},
|
|
||||||
"chats": {
|
"chats": {
|
||||||
"chats": "Chats",
|
"chats": "Chats",
|
||||||
"delete": "Apagar",
|
"delete": "Apagar",
|
||||||
|
@ -81,7 +58,6 @@
|
||||||
"keep_open": "Manter o seletor aberto",
|
"keep_open": "Manter o seletor aberto",
|
||||||
"load_all": "A carregar todos os {emojiAmount} emojis",
|
"load_all": "A carregar todos os {emojiAmount} emojis",
|
||||||
"load_all_hint": "Carregado o primeiro emoji {saneAmount}, carregar todos os emojis pode causar problemas de desempenho.",
|
"load_all_hint": "Carregado o primeiro emoji {saneAmount}, carregar todos os emojis pode causar problemas de desempenho.",
|
||||||
"recent": "Usado recentemente",
|
|
||||||
"search_emoji": "Pesquisar por um emoji",
|
"search_emoji": "Pesquisar por um emoji",
|
||||||
"stickers": "Autocolantes",
|
"stickers": "Autocolantes",
|
||||||
"unicode": "Emoji Unicode"
|
"unicode": "Emoji Unicode"
|
||||||
|
@ -825,4 +801,4 @@
|
||||||
"more": "Mais",
|
"more": "Mais",
|
||||||
"who_to_follow": "Quem seguir"
|
"who_to_follow": "Quem seguir"
|
||||||
}
|
}
|
||||||
}
|
}
|
647
src/i18n/uk.json
647
src/i18n/uk.json
File diff suppressed because it is too large
Load diff
758
src/i18n/zh.json
758
src/i18n/zh.json
File diff suppressed because it is too large
Load diff
|
@ -19,8 +19,7 @@ const saveImmedeatelyActions = [
|
||||||
'setOption',
|
'setOption',
|
||||||
'setClientData',
|
'setClientData',
|
||||||
'setToken',
|
'setToken',
|
||||||
'clearToken',
|
'clearToken'
|
||||||
'emojiUsed',
|
|
||||||
]
|
]
|
||||||
|
|
||||||
const defaultStorage = (() => {
|
const defaultStorage = (() => {
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
const timelineVisibleUnauthenticated = (state, timeline) => (
|
|
||||||
state.instance.publicTimelineVisibility[timeline] ?? false
|
|
||||||
);
|
|
||||||
|
|
||||||
const currentUser = (state) => state.users.currentUser;
|
|
||||||
|
|
||||||
const currentUserOrTimelineVisibleUnauthenticated = (state, timeline) => (
|
|
||||||
currentUser(state) || timelineVisibleUnauthenticated(state, timeline)
|
|
||||||
);
|
|
||||||
|
|
||||||
const federatedTimelineAvailable = (state) => state.instance.federatedTimelineAvailable;
|
|
||||||
|
|
||||||
export const federatedTimelineVisible = (state) => (
|
|
||||||
federatedTimelineAvailable(state) && currentUserOrTimelineVisibleUnauthenticated(state, 'federated')
|
|
||||||
);
|
|
||||||
|
|
||||||
export const publicTimelineVisible = (state) => (
|
|
||||||
currentUserOrTimelineVisibleUnauthenticated(state, 'local')
|
|
||||||
);
|
|
||||||
|
|
||||||
export const bubbleTimelineVisible = (state) => (
|
|
||||||
state.instance.localBubbleInstances.length > 0 && currentUserOrTimelineVisibleUnauthenticated(state, 'bubble')
|
|
||||||
);
|
|
112
src/main.js
112
src/main.js
|
@ -1,116 +1,12 @@
|
||||||
import { createStore } from 'vuex'
|
import getStore from './store';
|
||||||
|
import i18n from './i18n';
|
||||||
import 'custom-event-polyfill'
|
import 'custom-event-polyfill'
|
||||||
import './lib/event_target_polyfill.js'
|
import './lib/event_target_polyfill.js'
|
||||||
|
|
||||||
import interfaceModule from './modules/interface.js'
|
|
||||||
import instanceModule from './modules/instance.js'
|
|
||||||
import statusesModule from './modules/statuses.js'
|
|
||||||
import listsModule from './modules/lists.js'
|
|
||||||
import usersModule from './modules/users.js'
|
|
||||||
import apiModule from './modules/api.js'
|
|
||||||
import configModule from './modules/config.js'
|
|
||||||
import serverSideConfigModule from './modules/serverSideConfig.js'
|
|
||||||
import oauthModule from './modules/oauth.js'
|
|
||||||
import authFlowModule from './modules/auth_flow.js'
|
|
||||||
import mediaViewerModule from './modules/media_viewer.js'
|
|
||||||
import oauthTokensModule from './modules/oauth_tokens.js'
|
|
||||||
import reportsModule from './modules/reports.js'
|
|
||||||
import pollsModule from './modules/polls.js'
|
|
||||||
import postStatusModule from './modules/postStatus.js'
|
|
||||||
import announcementsModule from './modules/announcements.js'
|
|
||||||
import editStatusModule from './modules/editStatus.js'
|
|
||||||
import statusHistoryModule from './modules/statusHistory.js'
|
|
||||||
import tagModule from './modules/tags.js'
|
|
||||||
import recentEmojisModule from './modules/recentEmojis.js'
|
|
||||||
|
|
||||||
import { createI18n } from 'vue-i18n'
|
|
||||||
|
|
||||||
import createPersistedState from './lib/persisted_state.js'
|
|
||||||
import pushNotifications from './lib/push_notifications_plugin.js'
|
|
||||||
|
|
||||||
import messages from './i18n/messages.js'
|
|
||||||
|
|
||||||
import afterStoreSetup from './boot/after_store.js'
|
import afterStoreSetup from './boot/after_store.js'
|
||||||
|
|
||||||
const currentLocale = (window.navigator.language || 'en').split('-')[0]
|
|
||||||
|
|
||||||
const i18n = createI18n({
|
|
||||||
// By default, use the browser locale, we will update it if neccessary
|
|
||||||
locale: 'en',
|
|
||||||
fallbackLocale: 'en',
|
|
||||||
messages: messages.default
|
|
||||||
})
|
|
||||||
|
|
||||||
messages.setLanguage(i18n, currentLocale)
|
|
||||||
|
|
||||||
const persistedStateOptions = {
|
|
||||||
paths: [
|
|
||||||
'config',
|
|
||||||
'users.lastLoginName',
|
|
||||||
'oauth',
|
|
||||||
'recentEmojis.emojis',
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
if ('serviceWorker' in navigator) {
|
const store = await getStore();
|
||||||
// declaring scope manually
|
return afterStoreSetup({ store, i18n })
|
||||||
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
|
|
||||||
const plugins = [pushNotifications]
|
|
||||||
try {
|
|
||||||
const persistedState = await createPersistedState(persistedStateOptions)
|
|
||||||
plugins.push(persistedState)
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e)
|
|
||||||
storageError = true
|
|
||||||
}
|
|
||||||
const store = createStore({
|
|
||||||
modules: {
|
|
||||||
i18n: {
|
|
||||||
getters: {
|
|
||||||
i18n: () => i18n.global
|
|
||||||
}
|
|
||||||
},
|
|
||||||
interface: interfaceModule,
|
|
||||||
instance: instanceModule,
|
|
||||||
// TODO refactor users/statuses modules, they depend on each other
|
|
||||||
users: usersModule,
|
|
||||||
statuses: statusesModule,
|
|
||||||
lists: listsModule,
|
|
||||||
api: apiModule,
|
|
||||||
config: configModule,
|
|
||||||
serverSideConfig: serverSideConfigModule,
|
|
||||||
oauth: oauthModule,
|
|
||||||
authFlow: authFlowModule,
|
|
||||||
mediaViewer: mediaViewerModule,
|
|
||||||
oauthTokens: oauthTokensModule,
|
|
||||||
reports: reportsModule,
|
|
||||||
polls: pollsModule,
|
|
||||||
postStatus: postStatusModule,
|
|
||||||
announcements: announcementsModule,
|
|
||||||
editStatus: editStatusModule,
|
|
||||||
statusHistory: statusHistoryModule,
|
|
||||||
tags: tagModule,
|
|
||||||
recentEmojis: recentEmojisModule,
|
|
||||||
},
|
|
||||||
plugins,
|
|
||||||
strict: false // Socket modifies itself, let's ignore this for now.
|
|
||||||
// strict: process.env.NODE_ENV !== 'production'
|
|
||||||
})
|
|
||||||
if (storageError) {
|
|
||||||
store.dispatch('pushGlobalNotice', { messageKey: 'errors.storage_unavailable', level: 'error' })
|
|
||||||
}
|
|
||||||
afterStoreSetup({ store, i18n })
|
|
||||||
})()
|
})()
|
||||||
|
|
||||||
// These are inlined by webpack's DefinePlugin
|
// These are inlined by webpack's DefinePlugin
|
||||||
|
|
|
@ -1,29 +1,18 @@
|
||||||
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
|
import backendInteractorService from '../services/backend_interactor_service/backend_interactor_service.js'
|
||||||
import { WSConnectionStatus } from '../services/api/api.service.js'
|
import { WSConnectionStatus } from '../services/api/api.service.js'
|
||||||
import { map } from 'lodash'
|
|
||||||
|
|
||||||
const retryTimeout = (multiplier) => 1000 * multiplier
|
const retryTimeout = (multiplier) => 1000 * multiplier
|
||||||
|
|
||||||
const isVisible = (store, message, visibility) => {
|
const isVisible = (store, message, visibility) => {
|
||||||
if (visibility == 'all') {
|
if (visibility === 'all') {
|
||||||
return true
|
return true
|
||||||
}
|
} else if (visibility === 'following') {
|
||||||
|
return store.getters.relationship(message.in_reply_to_user_id).following
|
||||||
if (visibility == 'following') {
|
} else if (visibility === 'self') {
|
||||||
if (message.in_reply_to_user_id === null) {
|
|
||||||
return true
|
|
||||||
} else {
|
|
||||||
return store.getters.relationship(message.in_reply_to_user_id).following
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (visibility == 'self') {
|
|
||||||
return message.in_reply_to_user_id === store.rootState.users.currentUser.id
|
return message.in_reply_to_user_id === store.rootState.users.currentUser.id
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
const api = {
|
const api = {
|
||||||
state: {
|
state: {
|
||||||
retryMultiplier: 1,
|
retryMultiplier: 1,
|
||||||
|
@ -51,6 +40,9 @@ const api = {
|
||||||
setSocket (state, socket) {
|
setSocket (state, socket) {
|
||||||
state.socket = socket
|
state.socket = socket
|
||||||
},
|
},
|
||||||
|
setFollowRequests (state, value) {
|
||||||
|
state.followRequests = value
|
||||||
|
},
|
||||||
setMastoUserSocketStatus (state, value) {
|
setMastoUserSocketStatus (state, value) {
|
||||||
state.mastoUserSocketStatus = value
|
state.mastoUserSocketStatus = value
|
||||||
},
|
},
|
||||||
|
@ -59,15 +51,6 @@ const api = {
|
||||||
},
|
},
|
||||||
resetRetryMultiplier (state) {
|
resetRetryMultiplier (state) {
|
||||||
state.retryMultiplier = 1
|
state.retryMultiplier = 1
|
||||||
},
|
|
||||||
setFollowRequests (state, value) {
|
|
||||||
state.followRequests = [...value]
|
|
||||||
},
|
|
||||||
saveFollowRequests (state, requests) {
|
|
||||||
state.followRequests = [...state.followRequests, ...requests]
|
|
||||||
},
|
|
||||||
saveFollowRequestPagination (state, pagination) {
|
|
||||||
state.followRequestsPagination = pagination
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
actions: {
|
actions: {
|
||||||
|
@ -257,22 +240,24 @@ const api = {
|
||||||
...rest
|
...rest
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Follow requests
|
||||||
|
startFetchingFollowRequests (store) {
|
||||||
|
if (store.state.fetchers['followRequests']) return
|
||||||
|
const fetcher = store.state.backendInteractor.startFetchingFollowRequests({ store })
|
||||||
|
|
||||||
|
store.commit('addFetcher', { fetcherName: 'followRequests', fetcher })
|
||||||
|
},
|
||||||
|
stopFetchingFollowRequests (store) {
|
||||||
|
const fetcher = store.state.fetchers.followRequests
|
||||||
|
if (!fetcher) return
|
||||||
|
store.commit('removeFetcher', { fetcherName: 'followRequests', fetcher })
|
||||||
|
},
|
||||||
removeFollowRequest (store, request) {
|
removeFollowRequest (store, request) {
|
||||||
let requests = [...store.state.followRequests].filter((it) => it.id !== request.id)
|
let requests = store.state.followRequests.filter((it) => it !== request)
|
||||||
store.commit('setFollowRequests', requests)
|
store.commit('setFollowRequests', requests)
|
||||||
},
|
},
|
||||||
fetchFollowRequests ({ rootState, commit }) {
|
|
||||||
const pagination = rootState.api.followRequestsPagination
|
|
||||||
return rootState.api.backendInteractor.getFollowRequests({ pagination })
|
|
||||||
.then((requests) => {
|
|
||||||
if (requests.data.length > 0) {
|
|
||||||
commit('addNewUsers', requests.data)
|
|
||||||
commit('saveFollowRequests', requests.data)
|
|
||||||
commit('saveFollowRequestPagination', requests.pagination)
|
|
||||||
}
|
|
||||||
return requests
|
|
||||||
})
|
|
||||||
},
|
|
||||||
// Lists
|
// Lists
|
||||||
startFetchingLists (store) {
|
startFetchingLists (store) {
|
||||||
if (store.state.fetchers['lists']) return
|
if (store.state.fetchers['lists']) return
|
||||||
|
|
|
@ -117,8 +117,7 @@ export const defaultState = {
|
||||||
maxDepthInThread: undefined, // instance default
|
maxDepthInThread: undefined, // instance default
|
||||||
translationLanguage: undefined, // instance default,
|
translationLanguage: undefined, // instance default,
|
||||||
supportedTranslationLanguages: {}, // instance default
|
supportedTranslationLanguages: {}, // instance default
|
||||||
userProfileDefaultTab: 'statuses',
|
userProfileDefaultTab: 'statuses'
|
||||||
useBlurhash: true,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// caching the instance default properties
|
// caching the instance default properties
|
||||||
|
|
|
@ -178,7 +178,7 @@ const instance = {
|
||||||
|
|
||||||
async getCustomEmoji ({ commit, state }) {
|
async getCustomEmoji ({ commit, state }) {
|
||||||
try {
|
try {
|
||||||
const res = await window.fetch('/api/v1/pleroma/emoji')
|
const res = await window.fetch('/api/pleroma/emoji.json')
|
||||||
if (res.ok) {
|
if (res.ok) {
|
||||||
const result = await res.json()
|
const result = await res.json()
|
||||||
const values = Array.isArray(result) ? Object.assign({}, ...result) : result
|
const values = Array.isArray(result) ? Object.assign({}, ...result) : result
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue