Merge remote-tracking branch 'upstream/main'
This commit is contained in:
commit
d8e2598ae2
671 changed files with 25632 additions and 5343 deletions
|
@ -1,39 +0,0 @@
|
||||||
version: '2'
|
|
||||||
checks:
|
|
||||||
argument-count:
|
|
||||||
enabled: false
|
|
||||||
complex-logic:
|
|
||||||
enabled: false
|
|
||||||
file-lines:
|
|
||||||
enabled: false
|
|
||||||
method-complexity:
|
|
||||||
enabled: false
|
|
||||||
method-count:
|
|
||||||
enabled: false
|
|
||||||
method-lines:
|
|
||||||
enabled: false
|
|
||||||
nested-control-flow:
|
|
||||||
enabled: false
|
|
||||||
return-statements:
|
|
||||||
enabled: false
|
|
||||||
similar-code:
|
|
||||||
enabled: false
|
|
||||||
identical-code:
|
|
||||||
enabled: false
|
|
||||||
plugins:
|
|
||||||
brakeman:
|
|
||||||
enabled: true
|
|
||||||
bundler-audit:
|
|
||||||
enabled: false
|
|
||||||
eslint:
|
|
||||||
enabled: false
|
|
||||||
rubocop:
|
|
||||||
enabled: false
|
|
||||||
sass-lint:
|
|
||||||
enabled: false
|
|
||||||
exclude_patterns:
|
|
||||||
- spec/
|
|
||||||
- vendor/asset/
|
|
||||||
|
|
||||||
- app/javascript/mastodon/locales/**/*.json
|
|
||||||
- config/locales/**/*.yml
|
|
|
@ -15,6 +15,7 @@
|
||||||
"forwardPorts": [3000, 4000],
|
"forwardPorts": [3000, 4000],
|
||||||
|
|
||||||
// Use 'postCreateCommand' to run commands after the container is created.
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
|
"onCreateCommand": "git config --global --add safe.directory ${containerWorkspaceFolder}",
|
||||||
"postCreateCommand": ".devcontainer/post-create.sh",
|
"postCreateCommand": ".devcontainer/post-create.sh",
|
||||||
"waitFor": "postCreateCommand",
|
"waitFor": "postCreateCommand",
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ services:
|
||||||
environment:
|
environment:
|
||||||
RAILS_ENV: development
|
RAILS_ENV: development
|
||||||
NODE_ENV: development
|
NODE_ENV: development
|
||||||
|
BIND: 0.0.0.0
|
||||||
REDIS_HOST: redis
|
REDIS_HOST: redis
|
||||||
REDIS_PORT: '6379'
|
REDIS_PORT: '6379'
|
||||||
DB_HOST: db
|
DB_HOST: db
|
||||||
|
@ -23,6 +23,10 @@ services:
|
||||||
LIBRE_TRANSLATE_ENDPOINT: http://libretranslate:5000
|
LIBRE_TRANSLATE_ENDPOINT: http://libretranslate:5000
|
||||||
# Overrides default command so things don't shut down after the process ends.
|
# Overrides default command so things don't shut down after the process ends.
|
||||||
command: sleep infinity
|
command: sleep infinity
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:3000:3000'
|
||||||
|
- '127.0.0.1:4000:4000'
|
||||||
|
- '127.0.0.1:80:3000'
|
||||||
networks:
|
networks:
|
||||||
- external_network
|
- external_network
|
||||||
- internal_network
|
- internal_network
|
||||||
|
@ -66,15 +70,19 @@ services:
|
||||||
hard: -1
|
hard: -1
|
||||||
|
|
||||||
libretranslate:
|
libretranslate:
|
||||||
image: libretranslate/libretranslate:v1.2.9
|
image: libretranslate/libretranslate:v1.3.10
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
volumes:
|
||||||
|
- lt-data:/home/libretranslate/.local
|
||||||
networks:
|
networks:
|
||||||
|
- external_network
|
||||||
- internal_network
|
- internal_network
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres-data:
|
postgres-data:
|
||||||
redis-data:
|
redis-data:
|
||||||
es-data:
|
es-data:
|
||||||
|
lt-data:
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
external_network:
|
external_network:
|
||||||
|
|
|
@ -3,17 +3,22 @@
|
||||||
set -e # Fail the whole script on first error
|
set -e # Fail the whole script on first error
|
||||||
|
|
||||||
# Fetch Ruby gem dependencies
|
# Fetch Ruby gem dependencies
|
||||||
bundle install --path vendor/bundle --with='development test'
|
bundle config path 'vendor/bundle'
|
||||||
|
bundle config with 'development test'
|
||||||
# Fetch Javascript dependencies
|
bundle install
|
||||||
yarn install
|
|
||||||
|
|
||||||
# Make Gemfile.lock pristine again
|
# Make Gemfile.lock pristine again
|
||||||
git checkout -- Gemfile.lock
|
git checkout -- Gemfile.lock
|
||||||
|
|
||||||
|
# Fetch Javascript dependencies
|
||||||
|
yarn --frozen-lockfile
|
||||||
|
|
||||||
# [re]create, migrate, and seed the test database
|
# [re]create, migrate, and seed the test database
|
||||||
RAILS_ENV=test ./bin/rails db:setup
|
RAILS_ENV=test ./bin/rails db:setup
|
||||||
|
|
||||||
|
# [re]create, migrate, and seed the development database
|
||||||
|
RAILS_ENV=development ./bin/rails db:setup
|
||||||
|
|
||||||
# Precompile assets for development
|
# Precompile assets for development
|
||||||
RAILS_ENV=development ./bin/rails assets:precompile
|
RAILS_ENV=development ./bin/rails assets:precompile
|
||||||
|
|
||||||
|
|
47
.eslintrc.js
47
.eslintrc.js
|
@ -13,20 +13,20 @@ module.exports = {
|
||||||
browser: true,
|
browser: true,
|
||||||
node: true,
|
node: true,
|
||||||
es6: true,
|
es6: true,
|
||||||
jest: true,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
globals: {
|
globals: {
|
||||||
ATTACHMENT_HOST: false,
|
ATTACHMENT_HOST: false,
|
||||||
},
|
},
|
||||||
|
|
||||||
parser: '@babel/eslint-parser',
|
parser: '@typescript-eslint/parser',
|
||||||
|
|
||||||
plugins: [
|
plugins: [
|
||||||
'react',
|
'react',
|
||||||
'jsx-a11y',
|
'jsx-a11y',
|
||||||
'import',
|
'import',
|
||||||
'promise',
|
'promise',
|
||||||
|
'@typescript-eslint',
|
||||||
],
|
],
|
||||||
|
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
|
@ -46,9 +46,6 @@ module.exports = {
|
||||||
react: {
|
react: {
|
||||||
version: 'detect',
|
version: 'detect',
|
||||||
},
|
},
|
||||||
'import/extensions': [
|
|
||||||
'.js', '.jsx',
|
|
||||||
],
|
|
||||||
'import/ignore': [
|
'import/ignore': [
|
||||||
'node_modules',
|
'node_modules',
|
||||||
'\\.(css|scss|json)$',
|
'\\.(css|scss|json)$',
|
||||||
|
@ -56,7 +53,7 @@ module.exports = {
|
||||||
'import/resolver': {
|
'import/resolver': {
|
||||||
node: {
|
node: {
|
||||||
paths: ['app/javascript'],
|
paths: ['app/javascript'],
|
||||||
extensions: ['.js', '.jsx'],
|
extensions: ['.js', '.jsx', '.ts', '.tsx'],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -97,7 +94,8 @@ module.exports = {
|
||||||
'no-self-assign': 'off',
|
'no-self-assign': 'off',
|
||||||
'no-trailing-spaces': 'warn',
|
'no-trailing-spaces': 'warn',
|
||||||
'no-unused-expressions': 'error',
|
'no-unused-expressions': 'error',
|
||||||
'no-unused-vars': [
|
'no-unused-vars': 'off',
|
||||||
|
'@typescript-eslint/no-unused-vars': [
|
||||||
'error',
|
'error',
|
||||||
{
|
{
|
||||||
vars: 'all',
|
vars: 'all',
|
||||||
|
@ -116,7 +114,7 @@ module.exports = {
|
||||||
semi: 'error',
|
semi: 'error',
|
||||||
'valid-typeof': 'error',
|
'valid-typeof': 'error',
|
||||||
|
|
||||||
'react/jsx-filename-extension': ['error', { 'allow': 'as-needed' }],
|
'react/jsx-filename-extension': ['error', { extensions: ['.jsx', 'tsx'] }],
|
||||||
'react/jsx-boolean-value': 'error',
|
'react/jsx-boolean-value': 'error',
|
||||||
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
|
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
|
||||||
'react/jsx-curly-spacing': 'error',
|
'react/jsx-curly-spacing': 'error',
|
||||||
|
@ -192,6 +190,8 @@ module.exports = {
|
||||||
{
|
{
|
||||||
js: 'never',
|
js: 'never',
|
||||||
jsx: 'never',
|
jsx: 'never',
|
||||||
|
ts: 'never',
|
||||||
|
tsx: 'never',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
'import/newline-after-import': 'error',
|
'import/newline-after-import': 'error',
|
||||||
|
@ -200,6 +200,7 @@ module.exports = {
|
||||||
{
|
{
|
||||||
devDependencies: [
|
devDependencies: [
|
||||||
'config/webpack/**',
|
'config/webpack/**',
|
||||||
|
'app/javascript/mastodon/performance.js',
|
||||||
'app/javascript/mastodon/test_setup.js',
|
'app/javascript/mastodon/test_setup.js',
|
||||||
'app/javascript/**/__tests__/**',
|
'app/javascript/**/__tests__/**',
|
||||||
],
|
],
|
||||||
|
@ -235,5 +236,35 @@ module.exports = {
|
||||||
sourceType: 'script',
|
sourceType: 'script',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'**/*.ts',
|
||||||
|
'**/*.tsx',
|
||||||
|
],
|
||||||
|
|
||||||
|
extends: [
|
||||||
|
'eslint:recommended',
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
'plugin:react/recommended',
|
||||||
|
'plugin:jsx-a11y/recommended',
|
||||||
|
'plugin:import/recommended',
|
||||||
|
'plugin:import/typescript',
|
||||||
|
'plugin:promise/recommended',
|
||||||
|
],
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: [
|
||||||
|
'**/__tests__/*.js',
|
||||||
|
'**/__tests__/*.jsx',
|
||||||
|
],
|
||||||
|
|
||||||
|
env: {
|
||||||
|
jest: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
17
.github/workflows/check-i18n.yml
vendored
17
.github/workflows/check-i18n.yml
vendored
|
@ -30,13 +30,28 @@ jobs:
|
||||||
ruby-version: .ruby-version
|
ruby-version: .ruby-version
|
||||||
bundler-cache: true
|
bundler-cache: true
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- name: Check for missing strings in English JSON
|
||||||
|
run: |
|
||||||
|
yarn build:development
|
||||||
|
yarn manage:translations
|
||||||
|
git diff --exit-code
|
||||||
|
|
||||||
- name: Check locale file normalization
|
- name: Check locale file normalization
|
||||||
run: bundle exec i18n-tasks check-normalized
|
run: bundle exec i18n-tasks check-normalized
|
||||||
|
|
||||||
- name: Check for unused strings
|
- name: Check for unused strings
|
||||||
run: bundle exec i18n-tasks unused
|
run: bundle exec i18n-tasks unused
|
||||||
|
|
||||||
- name: Check for missing strings in English
|
- name: Check for missing strings in English YML
|
||||||
run: |
|
run: |
|
||||||
bundle exec i18n-tasks add-missing -l en
|
bundle exec i18n-tasks add-missing -l en
|
||||||
git diff --exit-code
|
git diff --exit-code
|
||||||
|
|
4
.github/workflows/lint-haml.yml
vendored
4
.github/workflows/lint-haml.yml
vendored
|
@ -30,7 +30,9 @@ jobs:
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install native Ruby dependencies
|
- name: Install native Ruby dependencies
|
||||||
run: sudo apt-get install -y libicu-dev libidn11-dev
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up Ruby
|
- name: Set up Ruby
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
|
|
9
.github/workflows/lint-js.yml
vendored
9
.github/workflows/lint-js.yml
vendored
|
@ -6,22 +6,28 @@ on:
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
|
- 'tsconfig.json'
|
||||||
- '.nvmrc'
|
- '.nvmrc'
|
||||||
- '.prettier*'
|
- '.prettier*'
|
||||||
- '.eslint*'
|
- '.eslint*'
|
||||||
- '**/*.js'
|
- '**/*.js'
|
||||||
- '**/*.jsx'
|
- '**/*.jsx'
|
||||||
|
- '**/*.ts'
|
||||||
|
- '**/*.tsx'
|
||||||
- '.github/workflows/lint-js.yml'
|
- '.github/workflows/lint-js.yml'
|
||||||
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
- 'yarn.lock'
|
- 'yarn.lock'
|
||||||
|
- 'tsconfig.json'
|
||||||
- '.nvmrc'
|
- '.nvmrc'
|
||||||
- '.prettier*'
|
- '.prettier*'
|
||||||
- '.eslint*'
|
- '.eslint*'
|
||||||
- '**/*.js'
|
- '**/*.js'
|
||||||
- '**/*.jsx'
|
- '**/*.jsx'
|
||||||
|
- '**/*.ts'
|
||||||
|
- '**/*.tsx'
|
||||||
- '.github/workflows/lint-js.yml'
|
- '.github/workflows/lint-js.yml'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -43,3 +49,6 @@ jobs:
|
||||||
|
|
||||||
- name: ESLint
|
- name: ESLint
|
||||||
run: yarn test:lint:js
|
run: yarn test:lint:js
|
||||||
|
|
||||||
|
- name: Typecheck
|
||||||
|
run: yarn test:typecheck
|
||||||
|
|
|
@ -16,7 +16,7 @@ jobs:
|
||||||
- id: skip_check
|
- id: skip_check
|
||||||
uses: fkirc/skip-duplicate-actions@v5
|
uses: fkirc/skip-duplicate-actions@v5
|
||||||
with:
|
with:
|
||||||
paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-one-step.yml"]'
|
paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-one-step.yml", "lib/tasks/tests.rake"]'
|
||||||
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -64,7 +64,9 @@ jobs:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install native Ruby dependencies
|
- name: Install native Ruby dependencies
|
||||||
run: sudo apt-get install -y libicu-dev libidn11-dev
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up bundler cache
|
- name: Set up bundler cache
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
|
|
|
@ -16,7 +16,7 @@ jobs:
|
||||||
- id: skip_check
|
- id: skip_check
|
||||||
uses: fkirc/skip-duplicate-actions@v5
|
uses: fkirc/skip-duplicate-actions@v5
|
||||||
with:
|
with:
|
||||||
paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-two-step.yml"]'
|
paths: '["Gemfile*", ".ruby-version", "**/*.rb", ".github/workflows/test-migrations-two-step.yml", "lib/tasks/tests.rake"]'
|
||||||
|
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -63,7 +63,9 @@ jobs:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Install native Ruby dependencies
|
- name: Install native Ruby dependencies
|
||||||
run: sudo apt-get install -y libicu-dev libidn11-dev
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up bundler cache
|
- name: Set up bundler cache
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
|
|
7
.github/workflows/test-ruby.yml
vendored
7
.github/workflows/test-ruby.yml
vendored
|
@ -32,7 +32,9 @@ jobs:
|
||||||
node-version-file: '.nvmrc'
|
node-version-file: '.nvmrc'
|
||||||
|
|
||||||
- name: Install native Ruby dependencies
|
- name: Install native Ruby dependencies
|
||||||
run: sudo apt-get install -y libicu-dev libidn11-dev
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
- name: Set up bundler cache
|
- name: Set up bundler cache
|
||||||
uses: ruby/setup-ruby@v1
|
uses: ruby/setup-ruby@v1
|
||||||
|
@ -119,6 +121,9 @@ jobs:
|
||||||
path: './public'
|
path: './public'
|
||||||
name: ${{ github.sha }}
|
name: ${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Update package index
|
||||||
|
run: sudo apt-get update
|
||||||
|
|
||||||
- name: Install native Ruby dependencies
|
- name: Install native Ruby dependencies
|
||||||
run: sudo apt-get install -y libicu-dev libidn11-dev
|
run: sudo apt-get install -y libicu-dev libidn11-dev
|
||||||
|
|
||||||
|
|
4
.husky/pre-commit
Executable file
4
.husky/pre-commit
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/sh
|
||||||
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
|
yarn lint-staged
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
||||||
16.19
|
16.20
|
||||||
|
|
|
@ -70,6 +70,8 @@ app/javascript/styles/mastodon/reset.scss
|
||||||
# Ignore Javascript pending https://github.com/mastodon/mastodon/pull/23631
|
# Ignore Javascript pending https://github.com/mastodon/mastodon/pull/23631
|
||||||
*.js
|
*.js
|
||||||
*.jsx
|
*.jsx
|
||||||
|
*.ts
|
||||||
|
*.tsx
|
||||||
|
|
||||||
# Ignore HTML till cleaned and included in CI
|
# Ignore HTML till cleaned and included in CI
|
||||||
*.html
|
*.html
|
||||||
|
|
88
.rubocop.yml
88
.rubocop.yml
|
@ -1,5 +1,7 @@
|
||||||
|
# Can be removed once all rules are addressed or moved to this file as documented overrides
|
||||||
inherit_from: .rubocop_todo.yml
|
inherit_from: .rubocop_todo.yml
|
||||||
|
|
||||||
|
# Used for merging with exclude lists with .rubocop_todo.yml
|
||||||
inherit_mode:
|
inherit_mode:
|
||||||
merge:
|
merge:
|
||||||
- Exclude
|
- Exclude
|
||||||
|
@ -11,13 +13,13 @@ require:
|
||||||
- rubocop-capybara
|
- rubocop-capybara
|
||||||
|
|
||||||
AllCops:
|
AllCops:
|
||||||
TargetRubyVersion: 2.7
|
TargetRubyVersion: 2.7 # Set to minimum supported version of CI
|
||||||
DisplayCopNames: true
|
DisplayCopNames: true
|
||||||
DisplayStyleGuide: true
|
DisplayStyleGuide: true
|
||||||
ExtraDetails: true
|
ExtraDetails: true
|
||||||
UseCache: true
|
UseCache: true
|
||||||
CacheRootDirectory: tmp
|
CacheRootDirectory: tmp
|
||||||
NewCops: enable
|
NewCops: enable # Opt-in to newly added rules
|
||||||
Exclude:
|
Exclude:
|
||||||
- db/schema.rb
|
- db/schema.rb
|
||||||
- 'bin/*'
|
- 'bin/*'
|
||||||
|
@ -25,12 +27,16 @@ AllCops:
|
||||||
- 'node_modules/**/*'
|
- 'node_modules/**/*'
|
||||||
- 'Vagrantfile'
|
- 'Vagrantfile'
|
||||||
- 'vendor/**/*'
|
- 'vendor/**/*'
|
||||||
- 'lib/json_ld/*'
|
- 'lib/json_ld/*' # Generated files
|
||||||
- 'lib/templates/**/*'
|
- 'lib/templates/**/*'
|
||||||
|
|
||||||
|
# Reason: Prefer Hashes without extreme indentation
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutfirsthashelementindentation
|
||||||
Layout/FirstHashElementIndentation:
|
Layout/FirstHashElementIndentation:
|
||||||
EnforcedStyle: consistent
|
EnforcedStyle: consistent
|
||||||
|
|
||||||
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_layout.html#layoutlinelength
|
||||||
Layout/LineLength:
|
Layout/LineLength:
|
||||||
AllowedPatterns:
|
AllowedPatterns:
|
||||||
# Allow comments to be long lines
|
# Allow comments to be long lines
|
||||||
|
@ -41,20 +47,50 @@ Layout/LineLength:
|
||||||
- db/*migrate/**/*
|
- db/*migrate/**/*
|
||||||
- db/seeds/**/*
|
- db/seeds/**/*
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_lint.html#lintuselessaccessmodifier
|
||||||
Lint/UselessAccessModifier:
|
Lint/UselessAccessModifier:
|
||||||
ContextCreatingMethods:
|
ContextCreatingMethods:
|
||||||
- class_methods
|
- class_methods
|
||||||
|
|
||||||
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsabcsize
|
||||||
Metrics/AbcSize:
|
Metrics/AbcSize:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/**/*cli*.rb'
|
- 'lib/**/*cli*.rb'
|
||||||
- db/*migrate/**/*
|
- db/*migrate/**/*
|
||||||
|
|
||||||
|
# Reason: Some functions cannot be broken up, but others may be refactor candidates
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocklength
|
||||||
Metrics/BlockLength:
|
Metrics/BlockLength:
|
||||||
CountAsOne: [array, heredoc]
|
CountAsOne: ['array', 'hash', 'heredoc', 'method_call']
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
- 'lib/tasks/*.rake'
|
||||||
|
- 'app/models/concerns/account_associations.rb'
|
||||||
|
- 'app/models/concerns/account_interactions.rb'
|
||||||
|
- 'app/models/concerns/ldap_authenticable.rb'
|
||||||
|
- 'app/models/concerns/omniauthable.rb'
|
||||||
|
- 'app/models/concerns/pam_authenticable.rb'
|
||||||
|
- 'app/models/concerns/remotable.rb'
|
||||||
|
- 'app/services/suspend_account_service.rb'
|
||||||
|
- 'app/services/unsuspend_account_service.rb'
|
||||||
|
- 'app/views/accounts/show.rss.ruby'
|
||||||
|
- 'app/views/tags/show.rss.ruby'
|
||||||
|
- 'config/environments/development.rb'
|
||||||
|
- 'config/environments/production.rb'
|
||||||
|
- 'config/initializers/devise.rb'
|
||||||
|
- 'config/initializers/doorkeeper.rb'
|
||||||
|
- 'config/initializers/omniauth.rb'
|
||||||
|
- 'config/initializers/simple_form.rb'
|
||||||
|
- 'config/navigation.rb'
|
||||||
|
- 'config/routes.rb'
|
||||||
|
- 'db/post_migrate/20221101190723_backfill_admin_action_logs.rb'
|
||||||
|
- 'db/post_migrate/20221206114142_backfill_admin_action_logs_again.rb'
|
||||||
|
- 'lib/paperclip/gif_transcoder.rb'
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsblocknesting
|
||||||
Metrics/BlockNesting:
|
Metrics/BlockNesting:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
@ -103,22 +139,32 @@ Metrics/ClassLength:
|
||||||
- 'app/services/update_status_service.rb'
|
- 'app/services/update_status_service.rb'
|
||||||
- 'lib/paperclip/color_extractor.rb'
|
- 'lib/paperclip/color_extractor.rb'
|
||||||
|
|
||||||
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricscyclomaticcomplexity
|
||||||
Metrics/CyclomaticComplexity:
|
Metrics/CyclomaticComplexity:
|
||||||
Exclude:
|
Exclude:
|
||||||
- lib/mastodon/*cli*.rb
|
- lib/mastodon/*cli*.rb
|
||||||
- db/*migrate/**/*
|
- db/*migrate/**/*
|
||||||
|
|
||||||
|
# Reason: Currently disabled in .rubocop_todo.yml
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_metrics.html#metricsmethodlength
|
||||||
Metrics/MethodLength:
|
Metrics/MethodLength:
|
||||||
CountAsOne: [array, heredoc]
|
CountAsOne: [array, heredoc]
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
|
||||||
Metrics/ModuleLength:
|
Metrics/ModuleLength:
|
||||||
CountAsOne: [array, heredoc]
|
CountAsOne: [array, heredoc]
|
||||||
|
|
||||||
|
# Reason: Prevailing style uses numeric status codes, matches RSpec/Rails/HttpStatus
|
||||||
|
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railshttpstatus
|
||||||
Rails/HttpStatus:
|
Rails/HttpStatus:
|
||||||
EnforcedStyle: numeric
|
EnforcedStyle: numeric
|
||||||
|
|
||||||
|
# Reason: Allowed only in the `tootctl` CLI application code
|
||||||
|
# https://docs.rubocop.org/rubocop-rails/cops_rails.html#railsexit
|
||||||
Rails/Exit:
|
Rails/Exit:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'lib/mastodon/*_cli.rb'
|
- 'lib/mastodon/*_cli.rb'
|
||||||
|
@ -146,9 +192,18 @@ RSpec/FilePath:
|
||||||
- 'spec/controllers/concerns/signature_verification_spec.rb'
|
- 'spec/controllers/concerns/signature_verification_spec.rb'
|
||||||
- 'spec/controllers/concerns/user_tracking_concern_spec.rb'
|
- 'spec/controllers/concerns/user_tracking_concern_spec.rb'
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnamedsubject
|
||||||
|
RSpec/NamedSubject:
|
||||||
|
EnforcedStyle: named_only
|
||||||
|
|
||||||
|
# Reason: Prevailing style choice
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec.html#rspecnottonot
|
||||||
RSpec/NotToNot:
|
RSpec/NotToNot:
|
||||||
EnforcedStyle: to_not
|
EnforcedStyle: to_not
|
||||||
|
|
||||||
|
# Reason: Prevailing style uses numeric status codes, matches Rails/HttpStatus
|
||||||
|
# https://docs.rubocop.org/rubocop-rspec/cops_rspec_rails.html#rspecrailshttpstatus
|
||||||
RSpec/Rails/HttpStatus:
|
RSpec/Rails/HttpStatus:
|
||||||
EnforcedStyle: numeric
|
EnforcedStyle: numeric
|
||||||
|
|
||||||
|
@ -162,26 +217,45 @@ Style/ClassAndModuleChildren:
|
||||||
Style/Documentation:
|
Style/Documentation:
|
||||||
Enabled: false
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason: Enforce modern Ruby style
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylehashsyntax
|
||||||
Style/HashSyntax:
|
Style/HashSyntax:
|
||||||
EnforcedStyle: ruby19_no_mixed_keys
|
EnforcedStyle: ruby19_no_mixed_keys
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylenumericliterals
|
||||||
Style/NumericLiterals:
|
Style/NumericLiterals:
|
||||||
AllowedPatterns:
|
AllowedPatterns:
|
||||||
- \d{4}_\d{2}_\d{2}_\d{6} # For DB migration date version number readability
|
- \d{4}_\d{2}_\d{2}_\d{6} # For DB migration date version number readability
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylepercentliteraldelimiters
|
||||||
Style/PercentLiteralDelimiters:
|
Style/PercentLiteralDelimiters:
|
||||||
PreferredDelimiters:
|
PreferredDelimiters:
|
||||||
'%i': '()'
|
'%i': '()'
|
||||||
'%w': '()'
|
'%w': '()'
|
||||||
|
|
||||||
|
# Reason: Prefer less indentation in conditional assignments
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styleredundantbegin
|
||||||
|
Style/RedundantBegin:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason: Overridden to reduce implicit StandardError rescues
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylerescuestandarderror
|
||||||
Style/RescueStandardError:
|
Style/RescueStandardError:
|
||||||
EnforcedStyle: implicit
|
EnforcedStyle: implicit
|
||||||
|
|
||||||
|
# Reason: Originally disabled for CodeClimate, and no config consensus has been found
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#stylesymbolarray
|
||||||
|
Style/SymbolArray:
|
||||||
|
Enabled: false
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainarrayliteral
|
||||||
Style/TrailingCommaInArrayLiteral:
|
Style/TrailingCommaInArrayLiteral:
|
||||||
EnforcedStyleForMultiline: 'comma'
|
EnforcedStyleForMultiline: 'comma'
|
||||||
|
|
||||||
|
# Reason:
|
||||||
|
# https://docs.rubocop.org/rubocop/cops_style.html#styletrailingcommainhashliteral
|
||||||
Style/TrailingCommaInHashLiteral:
|
Style/TrailingCommaInHashLiteral:
|
||||||
EnforcedStyleForMultiline: 'comma'
|
EnforcedStyleForMultiline: 'comma'
|
||||||
|
|
||||||
Style/SymbolArray:
|
|
||||||
Enabled: false
|
|
||||||
|
|
|
@ -117,7 +117,6 @@ Lint/ConstantDefinitionInBlock:
|
||||||
- 'spec/lib/activitypub/adapter_spec.rb'
|
- 'spec/lib/activitypub/adapter_spec.rb'
|
||||||
- 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
|
- 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
|
||||||
- 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
|
- 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
|
||||||
- 'spec/lib/settings/extend_spec.rb'
|
|
||||||
- 'spec/models/concerns/remotable_spec.rb'
|
- 'spec/models/concerns/remotable_spec.rb'
|
||||||
|
|
||||||
# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
|
# Configuration parameters: IgnoreLiteralBranches, IgnoreConstantBranches.
|
||||||
|
@ -233,11 +232,6 @@ Lint/Void:
|
||||||
Metrics/AbcSize:
|
Metrics/AbcSize:
|
||||||
Max: 150
|
Max: 150
|
||||||
|
|
||||||
# Configuration parameters: CountComments, CountAsOne, AllowedMethods, AllowedPatterns, inherit_mode.
|
|
||||||
# AllowedMethods: refine
|
|
||||||
Metrics/BlockLength:
|
|
||||||
Max: 544
|
|
||||||
|
|
||||||
# Configuration parameters: CountBlocks, Max.
|
# Configuration parameters: CountBlocks, Max.
|
||||||
Metrics/BlockNesting:
|
Metrics/BlockNesting:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
@ -259,6 +253,7 @@ Metrics/ModuleLength:
|
||||||
- 'app/helpers/jsonld_helper.rb'
|
- 'app/helpers/jsonld_helper.rb'
|
||||||
- 'app/helpers/statuses_helper.rb'
|
- 'app/helpers/statuses_helper.rb'
|
||||||
- 'app/models/concerns/account_interactions.rb'
|
- 'app/models/concerns/account_interactions.rb'
|
||||||
|
- 'app/models/concerns/has_user_settings.rb'
|
||||||
|
|
||||||
# Configuration parameters: Max, CountKeywordArgs, MaxOptionalParameters.
|
# Configuration parameters: Max, CountKeywordArgs, MaxOptionalParameters.
|
||||||
Metrics/ParameterLists:
|
Metrics/ParameterLists:
|
||||||
|
@ -478,6 +473,7 @@ RSpec/ContextWording:
|
||||||
- 'spec/lib/activitypub/activity/create_spec.rb'
|
- 'spec/lib/activitypub/activity/create_spec.rb'
|
||||||
- 'spec/lib/activitypub/activity/follow_spec.rb'
|
- 'spec/lib/activitypub/activity/follow_spec.rb'
|
||||||
- 'spec/lib/activitypub/activity/reject_spec.rb'
|
- 'spec/lib/activitypub/activity/reject_spec.rb'
|
||||||
|
- 'spec/lib/advanced_text_formatter_spec.rb'
|
||||||
- 'spec/lib/emoji_formatter_spec.rb'
|
- 'spec/lib/emoji_formatter_spec.rb'
|
||||||
- 'spec/lib/entity_cache_spec.rb'
|
- 'spec/lib/entity_cache_spec.rb'
|
||||||
- 'spec/lib/feed_manager_spec.rb'
|
- 'spec/lib/feed_manager_spec.rb'
|
||||||
|
@ -730,7 +726,6 @@ RSpec/LeakyConstantDeclaration:
|
||||||
- 'spec/lib/activitypub/adapter_spec.rb'
|
- 'spec/lib/activitypub/adapter_spec.rb'
|
||||||
- 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
|
- 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
|
||||||
- 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
|
- 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
|
||||||
- 'spec/lib/settings/extend_spec.rb'
|
|
||||||
- 'spec/models/concerns/remotable_spec.rb'
|
- 'spec/models/concerns/remotable_spec.rb'
|
||||||
|
|
||||||
RSpec/LetSetup:
|
RSpec/LetSetup:
|
||||||
|
@ -880,204 +875,6 @@ RSpec/MultipleSubjects:
|
||||||
- 'spec/controllers/follower_accounts_controller_spec.rb'
|
- 'spec/controllers/follower_accounts_controller_spec.rb'
|
||||||
- 'spec/controllers/following_accounts_controller_spec.rb'
|
- 'spec/controllers/following_accounts_controller_spec.rb'
|
||||||
|
|
||||||
# Configuration parameters: EnforcedStyle, IgnoreSharedExamples.
|
|
||||||
# SupportedStyles: always, named_only
|
|
||||||
RSpec/NamedSubject:
|
|
||||||
Exclude:
|
|
||||||
- 'spec/controllers/admin/account_moderation_notes_controller_spec.rb'
|
|
||||||
- 'spec/controllers/admin/accounts_controller_spec.rb'
|
|
||||||
- 'spec/controllers/admin/confirmations_controller_spec.rb'
|
|
||||||
- 'spec/controllers/admin/custom_emojis_controller_spec.rb'
|
|
||||||
- 'spec/controllers/admin/domain_blocks_controller_spec.rb'
|
|
||||||
- 'spec/controllers/admin/instances_controller_spec.rb'
|
|
||||||
- 'spec/controllers/admin/invites_controller_spec.rb'
|
|
||||||
- 'spec/controllers/admin/report_notes_controller_spec.rb'
|
|
||||||
- 'spec/controllers/api/v1/accounts/notes_controller_spec.rb'
|
|
||||||
- 'spec/controllers/api/v1/accounts/pins_controller_spec.rb'
|
|
||||||
- 'spec/controllers/api/v1/admin/domain_blocks_controller_spec.rb'
|
|
||||||
- 'spec/controllers/auth/passwords_controller_spec.rb'
|
|
||||||
- 'spec/controllers/auth/registrations_controller_spec.rb'
|
|
||||||
- 'spec/controllers/home_controller_spec.rb'
|
|
||||||
- 'spec/controllers/invites_controller_spec.rb'
|
|
||||||
- 'spec/controllers/oauth/authorizations_controller_spec.rb'
|
|
||||||
- 'spec/controllers/oauth/authorized_applications_controller_spec.rb'
|
|
||||||
- 'spec/controllers/relationships_controller_spec.rb'
|
|
||||||
- 'spec/controllers/settings/featured_tags_controller_spec.rb'
|
|
||||||
- 'spec/controllers/settings/migrations_controller_spec.rb'
|
|
||||||
- 'spec/controllers/settings/sessions_controller_spec.rb'
|
|
||||||
- 'spec/controllers/settings/two_factor_authentication/confirmations_controller_spec.rb'
|
|
||||||
- 'spec/controllers/well_known/webfinger_controller_spec.rb'
|
|
||||||
- 'spec/features/log_in_spec.rb'
|
|
||||||
- 'spec/features/profile_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/accept_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/add_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/announce_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/block_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/create_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/delete_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/flag_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/follow_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/like_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/move_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/reject_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/remove_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/undo_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/activity/update_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/adapter_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/dereferencer_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/linked_data_signature_spec.rb'
|
|
||||||
- 'spec/lib/activitypub/tag_manager_spec.rb'
|
|
||||||
- 'spec/lib/connection_pool/shared_connection_pool_spec.rb'
|
|
||||||
- 'spec/lib/connection_pool/shared_timed_stack_spec.rb'
|
|
||||||
- 'spec/lib/delivery_failure_tracker_spec.rb'
|
|
||||||
- 'spec/lib/emoji_formatter_spec.rb'
|
|
||||||
- 'spec/lib/entity_cache_spec.rb'
|
|
||||||
- 'spec/lib/fast_ip_map_spec.rb'
|
|
||||||
- 'spec/lib/feed_manager_spec.rb'
|
|
||||||
- 'spec/lib/hashtag_normalizer_spec.rb'
|
|
||||||
- 'spec/lib/html_aware_formatter_spec.rb'
|
|
||||||
- 'spec/lib/link_details_extractor_spec.rb'
|
|
||||||
- 'spec/lib/ostatus/tag_manager_spec.rb'
|
|
||||||
- 'spec/lib/plain_text_formatter_spec.rb'
|
|
||||||
- 'spec/lib/request_pool_spec.rb'
|
|
||||||
- 'spec/lib/request_spec.rb'
|
|
||||||
- 'spec/lib/sanitize_config_spec.rb'
|
|
||||||
- 'spec/lib/status_finder_spec.rb'
|
|
||||||
- 'spec/lib/status_reach_finder_spec.rb'
|
|
||||||
- 'spec/lib/suspicious_sign_in_detector_spec.rb'
|
|
||||||
- 'spec/lib/text_formatter_spec.rb'
|
|
||||||
- 'spec/lib/vacuum/access_tokens_vacuum_spec.rb'
|
|
||||||
- 'spec/lib/vacuum/backups_vacuum_spec.rb'
|
|
||||||
- 'spec/lib/vacuum/feeds_vacuum_spec.rb'
|
|
||||||
- 'spec/lib/vacuum/media_attachments_vacuum_spec.rb'
|
|
||||||
- 'spec/lib/vacuum/preview_cards_vacuum_spec.rb'
|
|
||||||
- 'spec/lib/vacuum/statuses_vacuum_spec.rb'
|
|
||||||
- 'spec/lib/vacuum/system_keys_vacuum_spec.rb'
|
|
||||||
- 'spec/models/account/field_spec.rb'
|
|
||||||
- 'spec/models/account_migration_spec.rb'
|
|
||||||
- 'spec/models/account_spec.rb'
|
|
||||||
- 'spec/models/account_statuses_cleanup_policy_spec.rb'
|
|
||||||
- 'spec/models/account_statuses_filter_spec.rb'
|
|
||||||
- 'spec/models/admin/account_action_spec.rb'
|
|
||||||
- 'spec/models/canonical_email_block_spec.rb'
|
|
||||||
- 'spec/models/concerns/account_interactions_spec.rb'
|
|
||||||
- 'spec/models/custom_emoji_filter_spec.rb'
|
|
||||||
- 'spec/models/custom_emoji_spec.rb'
|
|
||||||
- 'spec/models/follow_spec.rb'
|
|
||||||
- 'spec/models/home_feed_spec.rb'
|
|
||||||
- 'spec/models/media_attachment_spec.rb'
|
|
||||||
- 'spec/models/notification_spec.rb'
|
|
||||||
- 'spec/models/public_feed_spec.rb'
|
|
||||||
- 'spec/models/relationship_filter_spec.rb'
|
|
||||||
- 'spec/models/remote_follow_spec.rb'
|
|
||||||
- 'spec/models/report_spec.rb'
|
|
||||||
- 'spec/models/session_activation_spec.rb'
|
|
||||||
- 'spec/models/setting_spec.rb'
|
|
||||||
- 'spec/models/status_spec.rb'
|
|
||||||
- 'spec/models/tag_spec.rb'
|
|
||||||
- 'spec/models/trends/statuses_spec.rb'
|
|
||||||
- 'spec/models/trends/tags_spec.rb'
|
|
||||||
- 'spec/models/user_role_spec.rb'
|
|
||||||
- 'spec/models/user_spec.rb'
|
|
||||||
- 'spec/models/web/push_subscription_spec.rb'
|
|
||||||
- 'spec/policies/account_moderation_note_policy_spec.rb'
|
|
||||||
- 'spec/policies/account_policy_spec.rb'
|
|
||||||
- 'spec/policies/backup_policy_spec.rb'
|
|
||||||
- 'spec/policies/custom_emoji_policy_spec.rb'
|
|
||||||
- 'spec/policies/domain_block_policy_spec.rb'
|
|
||||||
- 'spec/policies/email_domain_block_policy_spec.rb'
|
|
||||||
- 'spec/policies/instance_policy_spec.rb'
|
|
||||||
- 'spec/policies/invite_policy_spec.rb'
|
|
||||||
- 'spec/policies/relay_policy_spec.rb'
|
|
||||||
- 'spec/policies/report_note_policy_spec.rb'
|
|
||||||
- 'spec/policies/report_policy_spec.rb'
|
|
||||||
- 'spec/policies/settings_policy_spec.rb'
|
|
||||||
- 'spec/policies/status_policy_spec.rb'
|
|
||||||
- 'spec/policies/tag_policy_spec.rb'
|
|
||||||
- 'spec/policies/user_policy_spec.rb'
|
|
||||||
- 'spec/presenters/familiar_followers_presenter_spec.rb'
|
|
||||||
- 'spec/serializers/activitypub/note_serializer_spec.rb'
|
|
||||||
- 'spec/serializers/activitypub/update_poll_serializer_spec.rb'
|
|
||||||
- 'spec/serializers/rest/account_serializer_spec.rb'
|
|
||||||
- 'spec/services/account_search_service_spec.rb'
|
|
||||||
- 'spec/services/account_statuses_cleanup_service_spec.rb'
|
|
||||||
- 'spec/services/activitypub/fetch_remote_account_service_spec.rb'
|
|
||||||
- 'spec/services/activitypub/fetch_remote_actor_service_spec.rb'
|
|
||||||
- 'spec/services/activitypub/fetch_remote_status_service_spec.rb'
|
|
||||||
- 'spec/services/activitypub/fetch_replies_service_spec.rb'
|
|
||||||
- 'spec/services/activitypub/process_account_service_spec.rb'
|
|
||||||
- 'spec/services/activitypub/process_collection_service_spec.rb'
|
|
||||||
- 'spec/services/activitypub/process_status_update_service_spec.rb'
|
|
||||||
- 'spec/services/after_block_domain_from_account_service_spec.rb'
|
|
||||||
- 'spec/services/after_block_service_spec.rb'
|
|
||||||
- 'spec/services/app_sign_up_service_spec.rb'
|
|
||||||
- 'spec/services/authorize_follow_service_spec.rb'
|
|
||||||
- 'spec/services/batched_remove_status_service_spec.rb'
|
|
||||||
- 'spec/services/block_domain_service_spec.rb'
|
|
||||||
- 'spec/services/block_service_spec.rb'
|
|
||||||
- 'spec/services/bootstrap_timeline_service_spec.rb'
|
|
||||||
- 'spec/services/clear_domain_media_service_spec.rb'
|
|
||||||
- 'spec/services/delete_account_service_spec.rb'
|
|
||||||
- 'spec/services/fan_out_on_write_service_spec.rb'
|
|
||||||
- 'spec/services/favourite_service_spec.rb'
|
|
||||||
- 'spec/services/fetch_link_card_service_spec.rb'
|
|
||||||
- 'spec/services/fetch_oembed_service_spec.rb'
|
|
||||||
- 'spec/services/fetch_remote_status_service_spec.rb'
|
|
||||||
- 'spec/services/fetch_resource_service_spec.rb'
|
|
||||||
- 'spec/services/follow_service_spec.rb'
|
|
||||||
- 'spec/services/import_service_spec.rb'
|
|
||||||
- 'spec/services/mute_service_spec.rb'
|
|
||||||
- 'spec/services/notify_service_spec.rb'
|
|
||||||
- 'spec/services/post_status_service_spec.rb'
|
|
||||||
- 'spec/services/precompute_feed_service_spec.rb'
|
|
||||||
- 'spec/services/process_mentions_service_spec.rb'
|
|
||||||
- 'spec/services/purge_domain_service_spec.rb'
|
|
||||||
- 'spec/services/reblog_service_spec.rb'
|
|
||||||
- 'spec/services/reject_follow_service_spec.rb'
|
|
||||||
- 'spec/services/remove_from_followers_service_spec.rb'
|
|
||||||
- 'spec/services/remove_status_service_spec.rb'
|
|
||||||
- 'spec/services/report_service_spec.rb'
|
|
||||||
- 'spec/services/resolve_account_service_spec.rb'
|
|
||||||
- 'spec/services/resolve_url_service_spec.rb'
|
|
||||||
- 'spec/services/search_service_spec.rb'
|
|
||||||
- 'spec/services/suspend_account_service_spec.rb'
|
|
||||||
- 'spec/services/unallow_domain_service_spec.rb'
|
|
||||||
- 'spec/services/unblock_domain_service_spec.rb'
|
|
||||||
- 'spec/services/unblock_service_spec.rb'
|
|
||||||
- 'spec/services/unfollow_service_spec.rb'
|
|
||||||
- 'spec/services/unsuspend_account_service_spec.rb'
|
|
||||||
- 'spec/services/update_account_service_spec.rb'
|
|
||||||
- 'spec/services/update_status_service_spec.rb'
|
|
||||||
- 'spec/services/verify_link_service_spec.rb'
|
|
||||||
- 'spec/validators/blacklisted_email_validator_spec.rb'
|
|
||||||
- 'spec/validators/email_mx_validator_spec.rb'
|
|
||||||
- 'spec/validators/note_length_validator_spec.rb'
|
|
||||||
- 'spec/validators/reaction_validator_spec.rb'
|
|
||||||
- 'spec/validators/status_length_validator_spec.rb'
|
|
||||||
- 'spec/validators/status_pin_validator_spec.rb'
|
|
||||||
- 'spec/validators/unique_username_validator_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/delivery_worker_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/distribute_poll_update_worker_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/distribution_worker_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/fetch_replies_worker_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/move_distribution_worker_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/processing_worker_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/status_update_distribution_worker_spec.rb'
|
|
||||||
- 'spec/workers/activitypub/update_distribution_worker_spec.rb'
|
|
||||||
- 'spec/workers/admin/domain_purge_worker_spec.rb'
|
|
||||||
- 'spec/workers/domain_block_worker_spec.rb'
|
|
||||||
- 'spec/workers/domain_clear_media_worker_spec.rb'
|
|
||||||
- 'spec/workers/feed_insert_worker_spec.rb'
|
|
||||||
- 'spec/workers/move_worker_spec.rb'
|
|
||||||
- 'spec/workers/publish_scheduled_announcement_worker_spec.rb'
|
|
||||||
- 'spec/workers/publish_scheduled_status_worker_spec.rb'
|
|
||||||
- 'spec/workers/refollow_worker_spec.rb'
|
|
||||||
- 'spec/workers/regeneration_worker_spec.rb'
|
|
||||||
- 'spec/workers/scheduler/accounts_statuses_cleanup_scheduler_spec.rb'
|
|
||||||
- 'spec/workers/scheduler/user_cleanup_scheduler_spec.rb'
|
|
||||||
- 'spec/workers/unfollow_follow_worker_spec.rb'
|
|
||||||
- 'spec/workers/web/push_notification_worker_spec.rb'
|
|
||||||
|
|
||||||
# Configuration parameters: AllowedGroups.
|
# Configuration parameters: AllowedGroups.
|
||||||
RSpec/NestedGroups:
|
RSpec/NestedGroups:
|
||||||
Max: 6
|
Max: 6
|
||||||
|
@ -1476,7 +1273,6 @@ Rails/CompactBlank:
|
||||||
- 'app/helpers/statuses_helper.rb'
|
- 'app/helpers/statuses_helper.rb'
|
||||||
- 'app/models/concerns/attachmentable.rb'
|
- 'app/models/concerns/attachmentable.rb'
|
||||||
- 'app/models/poll.rb'
|
- 'app/models/poll.rb'
|
||||||
- 'app/models/user.rb'
|
|
||||||
- 'app/services/import_service.rb'
|
- 'app/services/import_service.rb'
|
||||||
- 'config/initializers/paperclip.rb'
|
- 'config/initializers/paperclip.rb'
|
||||||
|
|
||||||
|
@ -1526,8 +1322,8 @@ Rails/FilePath:
|
||||||
- 'app/models/setting.rb'
|
- 'app/models/setting.rb'
|
||||||
- 'app/validators/reaction_validator.rb'
|
- 'app/validators/reaction_validator.rb'
|
||||||
- 'config/environments/test.rb'
|
- 'config/environments/test.rb'
|
||||||
|
- 'config/initializers/locale.rb'
|
||||||
- 'db/migrate/20170716191202_add_hide_notifications_to_mute.rb'
|
- 'db/migrate/20170716191202_add_hide_notifications_to_mute.rb'
|
||||||
- 'db/migrate/20170918125918_ids_to_bigints.rb'
|
|
||||||
- 'db/migrate/20171005171936_add_disabled_to_custom_emojis.rb'
|
- 'db/migrate/20171005171936_add_disabled_to_custom_emojis.rb'
|
||||||
- 'db/migrate/20171028221157_add_reblogs_to_follows.rb'
|
- 'db/migrate/20171028221157_add_reblogs_to_follows.rb'
|
||||||
- 'db/migrate/20171107143332_add_memorial_to_accounts.rb'
|
- 'db/migrate/20171107143332_add_memorial_to_accounts.rb'
|
||||||
|
@ -1637,18 +1433,6 @@ Rails/I18nLocaleTexts:
|
||||||
- 'lib/tasks/mastodon.rake'
|
- 'lib/tasks/mastodon.rake'
|
||||||
- 'spec/helpers/flashes_helper_spec.rb'
|
- 'spec/helpers/flashes_helper_spec.rb'
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
|
||||||
Rails/IgnoredColumnsAssignment:
|
|
||||||
Exclude:
|
|
||||||
- 'app/models/account.rb'
|
|
||||||
- 'app/models/account_stat.rb'
|
|
||||||
- 'app/models/admin/action_log.rb'
|
|
||||||
- 'app/models/custom_filter.rb'
|
|
||||||
- 'app/models/email_domain_block.rb'
|
|
||||||
- 'app/models/report.rb'
|
|
||||||
- 'app/models/status_edit.rb'
|
|
||||||
- 'app/models/user.rb'
|
|
||||||
|
|
||||||
# Configuration parameters: IgnoreScopes, Include.
|
# Configuration parameters: IgnoreScopes, Include.
|
||||||
# Include: app/models/**/*.rb
|
# Include: app/models/**/*.rb
|
||||||
Rails/InverseOf:
|
Rails/InverseOf:
|
||||||
|
@ -2425,11 +2209,6 @@ Style/HashTransformValues:
|
||||||
- 'app/serializers/rest/web_push_subscription_serializer.rb'
|
- 'app/serializers/rest/web_push_subscription_serializer.rb'
|
||||||
- 'app/services/import_service.rb'
|
- 'app/services/import_service.rb'
|
||||||
|
|
||||||
# This cop supports unsafe autocorrection (--autocorrect-all).
|
|
||||||
Style/IdenticalConditionalBranches:
|
|
||||||
Exclude:
|
|
||||||
- 'config/initializers/content_security_policy.rb'
|
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
Style/IfUnlessModifier:
|
Style/IfUnlessModifier:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
@ -2529,11 +2308,6 @@ Style/PreferredHashMethods:
|
||||||
Exclude:
|
Exclude:
|
||||||
- 'config/initializers/paperclip.rb'
|
- 'config/initializers/paperclip.rb'
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
|
||||||
Style/RedundantBegin:
|
|
||||||
Exclude:
|
|
||||||
- 'config/initializers/simple_form.rb'
|
|
||||||
|
|
||||||
# This cop supports safe autocorrection (--autocorrect).
|
# This cop supports safe autocorrection (--autocorrect).
|
||||||
Style/RedundantConstantBase:
|
Style/RedundantConstantBase:
|
||||||
Exclude:
|
Exclude:
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
3.2.1
|
3.2.2
|
||||||
|
|
|
@ -44,3 +44,6 @@ Gruntfile.js
|
||||||
# for specific ignore
|
# for specific ignore
|
||||||
!.svgo.yml
|
!.svgo.yml
|
||||||
!sass-lint/**/*.yml
|
!sass-lint/**/*.yml
|
||||||
|
|
||||||
|
# breaks lint-staged or generally anything using https://github.com/eemeli/yaml/issues/384
|
||||||
|
!**/yaml/dist/**/doc
|
||||||
|
|
14
CHANGELOG.md
14
CHANGELOG.md
|
@ -2,6 +2,20 @@
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [4.1.2] - 2023-04-04
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fix crash in `tootctl` commands making use of parallelization when Elasticsearch is enabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24182), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/24377))
|
||||||
|
- Fix crash in `db:setup` when Elasticsearch is enabled ([rrgeorge](https://github.com/mastodon/mastodon/pull/24302))
|
||||||
|
- Fix user archive takeout when using OpenStack Swift or S3 providers with no ACL support ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24200))
|
||||||
|
- Fix invalid/expired invites being processed on sign-up ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24337))
|
||||||
|
|
||||||
|
### Security
|
||||||
|
|
||||||
|
- Update Ruby to 3.0.6 due to ReDoS vulnerabilities ([saizai](https://github.com/mastodon/mastodon/pull/24334))
|
||||||
|
- Fix unescaped user input in LDAP query ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/24379))
|
||||||
|
|
||||||
## [4.1.1] - 2023-03-16
|
## [4.1.1] - 2023-03-16
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# Contributing to Mastodon Glitch Edition #
|
# Contributing to Mastodon Glitch Edition
|
||||||
|
|
||||||
Thank you for your interest in contributing to the `glitch-soc` project!
|
Thank you for your interest in contributing to the `glitch-soc` project!
|
||||||
Here are some guidelines, and ways you can help.
|
Here are some guidelines, and ways you can help.
|
||||||
|
|
||||||
> (This document is a bit of a work-in-progress, so please bear with us.
|
> (This document is a bit of a work-in-progress, so please bear with us.
|
||||||
> If you don't see what you're looking for here, please don't hesitate to reach out!)
|
> If you don't see what you're looking for here, please don't hesitate to reach out!)
|
||||||
|
|
||||||
## Translations
|
## Translations
|
||||||
|
|
||||||
|
@ -12,26 +12,26 @@ You can submit glitch-soc-specific translations via [Crowdin](https://crowdin.co
|
||||||
|
|
||||||
[![Crowdin](https://badges.crowdin.net/glitch-soc/localized.svg)](https://crowdin.com/project/glitch-soc)
|
[![Crowdin](https://badges.crowdin.net/glitch-soc/localized.svg)](https://crowdin.com/project/glitch-soc)
|
||||||
|
|
||||||
## Planning ##
|
## Planning
|
||||||
|
|
||||||
Right now a lot of the planning for this project takes place in our development Discord, or through GitHub Issues and Projects.
|
Right now a lot of the planning for this project takes place in our development Discord, or through GitHub Issues and Projects.
|
||||||
We're working on ways to improve the planning structure and better solicit feedback, and if you feel like you can help in this respect, feel free to give us a holler.
|
We're working on ways to improve the planning structure and better solicit feedback, and if you feel like you can help in this respect, feel free to give us a holler.
|
||||||
|
|
||||||
## Documentation ##
|
## Documentation
|
||||||
|
|
||||||
The documentation for this repository is available at [`glitch-soc/docs`](https://github.com/glitch-soc/docs) (online at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/)).
|
The documentation for this repository is available at [`glitch-soc/docs`](https://github.com/glitch-soc/docs) (online at [glitch-soc.github.io/docs/](https://glitch-soc.github.io/docs/)).
|
||||||
Right now, we've mostly focused on the features that make this fork different from upstream in some manner.
|
Right now, we've mostly focused on the features that make this fork different from upstream in some manner.
|
||||||
Adding screenshots, improving descriptions, and so forth are all ways to help contribute to the project even if you don't know any code.
|
Adding screenshots, improving descriptions, and so forth are all ways to help contribute to the project even if you don't know any code.
|
||||||
|
|
||||||
## Frontend Development ##
|
## Frontend Development
|
||||||
|
|
||||||
Check out [the documentation here](https://glitch-soc.github.io/docs/contributing/frontend/) for more information.
|
Check out [the documentation here](https://glitch-soc.github.io/docs/contributing/frontend/) for more information.
|
||||||
|
|
||||||
## Backend Development ##
|
## Backend Development
|
||||||
|
|
||||||
See the guidelines below.
|
See the guidelines below.
|
||||||
|
|
||||||
- - -
|
---
|
||||||
|
|
||||||
You should also try to follow the guidelines set out in the original `CONTRIBUTING.md` from `mastodon/mastodon`, reproduced below.
|
You should also try to follow the guidelines set out in the original `CONTRIBUTING.md` from `mastodon/mastodon`, reproduced below.
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
# syntax=docker/dockerfile:1.4
|
# syntax=docker/dockerfile:1.4
|
||||||
# This needs to be bullseye-slim because the Ruby image is built on bullseye-slim
|
# This needs to be bullseye-slim because the Ruby image is built on bullseye-slim
|
||||||
ARG NODE_VERSION="16.19-bullseye-slim"
|
ARG NODE_VERSION="16.20-bullseye-slim"
|
||||||
|
|
||||||
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.1-slim as ruby
|
FROM ghcr.io/moritzheiber/ruby-jemalloc:3.2.2-slim as ruby
|
||||||
FROM node:${NODE_VERSION} as build
|
FROM node:${NODE_VERSION} as build
|
||||||
|
|
||||||
COPY --link --from=ruby /opt/ruby /opt/ruby
|
COPY --link --from=ruby /opt/ruby /opt/ruby
|
||||||
|
@ -18,7 +18,6 @@ COPY Gemfile* package.json yarn.lock /opt/mastodon/
|
||||||
# hadolint ignore=DL3008
|
# hadolint ignore=DL3008
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y --no-install-recommends build-essential \
|
apt-get install -y --no-install-recommends build-essential \
|
||||||
ca-certificates \
|
|
||||||
git \
|
git \
|
||||||
libicu-dev \
|
libicu-dev \
|
||||||
libidn11-dev \
|
libidn11-dev \
|
||||||
|
|
10
Gemfile
10
Gemfile
|
@ -5,7 +5,7 @@ ruby '>= 2.7.0', '< 3.3.0'
|
||||||
|
|
||||||
gem 'pkg-config', '~> 1.5'
|
gem 'pkg-config', '~> 1.5'
|
||||||
|
|
||||||
gem 'puma', '~> 6.1'
|
gem 'puma', '~> 6.2'
|
||||||
gem 'rails', '~> 6.1.7'
|
gem 'rails', '~> 6.1.7'
|
||||||
gem 'sprockets', '~> 3.7.2'
|
gem 'sprockets', '~> 3.7.2'
|
||||||
gem 'thor', '~> 1.2'
|
gem 'thor', '~> 1.2'
|
||||||
|
@ -17,7 +17,7 @@ gem 'makara', '~> 0.5'
|
||||||
gem 'pghero'
|
gem 'pghero'
|
||||||
gem 'dotenv-rails', '~> 2.8'
|
gem 'dotenv-rails', '~> 2.8'
|
||||||
|
|
||||||
gem 'aws-sdk-s3', '~> 1.119', require: false
|
gem 'aws-sdk-s3', '~> 1.120', require: false
|
||||||
gem 'fog-core', '<= 2.4.0'
|
gem 'fog-core', '<= 2.4.0'
|
||||||
gem 'fog-openstack', '~> 0.3', require: false
|
gem 'fog-openstack', '~> 0.3', require: false
|
||||||
gem 'kt-paperclip', '~> 7.1', github: 'kreeti/kt-paperclip', ref: '11abf222dc31bff71160a1d138b445214f434b2b'
|
gem 'kt-paperclip', '~> 7.1', github: 'kreeti/kt-paperclip', ref: '11abf222dc31bff71160a1d138b445214f434b2b'
|
||||||
|
@ -87,10 +87,10 @@ gem 'simple-navigation', '~> 4.4'
|
||||||
gem 'simple_form', '~> 5.2'
|
gem 'simple_form', '~> 5.2'
|
||||||
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
|
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
|
||||||
gem 'stoplight', '~> 3.0.1'
|
gem 'stoplight', '~> 3.0.1'
|
||||||
gem 'strong_migrations', '~> 0.7'
|
gem 'strong_migrations', '~> 0.8'
|
||||||
gem 'tty-prompt', '~> 0.23', require: false
|
gem 'tty-prompt', '~> 0.23', require: false
|
||||||
gem 'twitter-text', '~> 3.1.0'
|
gem 'twitter-text', '~> 3.1.0'
|
||||||
gem 'tzinfo-data', '~> 1.2022'
|
gem 'tzinfo-data', '~> 1.2023'
|
||||||
gem 'webpacker', '~> 5.4'
|
gem 'webpacker', '~> 5.4'
|
||||||
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
|
gem 'webpush', github: 'ClearlyClaire/webpush', ref: 'f14a4d52e201128b1b00245d11b6de80d6cfdcd9'
|
||||||
gem 'webauthn', '~> 3.0'
|
gem 'webauthn', '~> 3.0'
|
||||||
|
@ -118,7 +118,7 @@ group :production, :test do
|
||||||
end
|
end
|
||||||
|
|
||||||
group :test do
|
group :test do
|
||||||
gem 'capybara', '~> 3.38'
|
gem 'capybara', '~> 3.39'
|
||||||
gem 'climate_control'
|
gem 'climate_control'
|
||||||
gem 'faker', '~> 3.1'
|
gem 'faker', '~> 3.1'
|
||||||
gem 'json-schema', '~> 3.0'
|
gem 'json-schema', '~> 3.0'
|
||||||
|
|
48
Gemfile.lock
48
Gemfile.lock
|
@ -94,7 +94,7 @@ GEM
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
tzinfo (~> 2.0)
|
tzinfo (~> 2.0)
|
||||||
zeitwerk (~> 2.3)
|
zeitwerk (~> 2.3)
|
||||||
addressable (2.8.1)
|
addressable (2.8.2)
|
||||||
public_suffix (>= 2.0.2, < 6.0)
|
public_suffix (>= 2.0.2, < 6.0)
|
||||||
aes_key_wrap (1.1.0)
|
aes_key_wrap (1.1.0)
|
||||||
airbrussh (1.4.1)
|
airbrussh (1.4.1)
|
||||||
|
@ -109,16 +109,16 @@ GEM
|
||||||
attr_required (1.0.1)
|
attr_required (1.0.1)
|
||||||
awrence (1.2.1)
|
awrence (1.2.1)
|
||||||
aws-eventstream (1.2.0)
|
aws-eventstream (1.2.0)
|
||||||
aws-partitions (1.711.0)
|
aws-partitions (1.739.0)
|
||||||
aws-sdk-core (3.170.0)
|
aws-sdk-core (3.171.0)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1, >= 1.651.0)
|
aws-partitions (~> 1, >= 1.651.0)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
jmespath (~> 1, >= 1.6.1)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.62.0)
|
aws-sdk-kms (1.63.0)
|
||||||
aws-sdk-core (~> 3, >= 3.165.0)
|
aws-sdk-core (~> 3, >= 3.165.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.119.1)
|
aws-sdk-s3 (1.120.0)
|
||||||
aws-sdk-core (~> 3, >= 3.165.0)
|
aws-sdk-core (~> 3, >= 3.165.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.4)
|
aws-sigv4 (~> 1.4)
|
||||||
|
@ -166,7 +166,7 @@ GEM
|
||||||
sshkit (~> 1.3)
|
sshkit (~> 1.3)
|
||||||
capistrano-yarn (2.0.2)
|
capistrano-yarn (2.0.2)
|
||||||
capistrano (~> 3.0)
|
capistrano (~> 3.0)
|
||||||
capybara (3.38.0)
|
capybara (3.39.0)
|
||||||
addressable
|
addressable
|
||||||
matrix
|
matrix
|
||||||
mini_mime (>= 0.1.3)
|
mini_mime (>= 0.1.3)
|
||||||
|
@ -200,7 +200,7 @@ GEM
|
||||||
addressable
|
addressable
|
||||||
date (3.3.3)
|
date (3.3.3)
|
||||||
debug_inspector (1.0.0)
|
debug_inspector (1.0.0)
|
||||||
devise (4.9.0)
|
devise (4.9.2)
|
||||||
bcrypt (~> 3.0)
|
bcrypt (~> 3.0)
|
||||||
orm_adapter (~> 0.1)
|
orm_adapter (~> 0.1)
|
||||||
railties (>= 4.1.0)
|
railties (>= 4.1.0)
|
||||||
|
@ -221,7 +221,7 @@ GEM
|
||||||
docile (1.4.0)
|
docile (1.4.0)
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
doorkeeper (5.6.5)
|
doorkeeper (5.6.6)
|
||||||
railties (>= 5)
|
railties (>= 5)
|
||||||
dotenv (2.8.1)
|
dotenv (2.8.1)
|
||||||
dotenv-rails (2.8.1)
|
dotenv-rails (2.8.1)
|
||||||
|
@ -398,7 +398,7 @@ GEM
|
||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
railties (>= 4)
|
railties (>= 4)
|
||||||
request_store (~> 1.0)
|
request_store (~> 1.0)
|
||||||
loofah (2.19.1)
|
loofah (2.20.0)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.5.9)
|
nokogiri (>= 1.5.9)
|
||||||
mail (2.8.1)
|
mail (2.8.1)
|
||||||
|
@ -438,7 +438,7 @@ GEM
|
||||||
net-smtp (0.3.3)
|
net-smtp (0.3.3)
|
||||||
net-protocol
|
net-protocol
|
||||||
net-ssh (7.0.1)
|
net-ssh (7.0.1)
|
||||||
nio4r (2.5.8)
|
nio4r (2.5.9)
|
||||||
nokogiri (1.14.2)
|
nokogiri (1.14.2)
|
||||||
mini_portile2 (~> 2.8.0)
|
mini_portile2 (~> 2.8.0)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
|
@ -481,7 +481,7 @@ GEM
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
ox (2.14.14)
|
ox (2.14.14)
|
||||||
parallel (1.22.1)
|
parallel (1.22.1)
|
||||||
parser (3.2.1.1)
|
parser (3.2.2.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
parslet (2.0.0)
|
parslet (2.0.0)
|
||||||
pastel (0.8.0)
|
pastel (0.8.0)
|
||||||
|
@ -501,7 +501,7 @@ GEM
|
||||||
premailer (~> 1.7, >= 1.7.9)
|
premailer (~> 1.7, >= 1.7.9)
|
||||||
private_address_check (0.5.0)
|
private_address_check (0.5.0)
|
||||||
public_suffix (5.0.1)
|
public_suffix (5.0.1)
|
||||||
puma (6.1.1)
|
puma (6.2.1)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
pundit (2.3.0)
|
pundit (2.3.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
|
@ -603,17 +603,17 @@ GEM
|
||||||
rspec_chunked (0.6)
|
rspec_chunked (0.6)
|
||||||
rspec_junit_formatter (0.6.0)
|
rspec_junit_formatter (0.6.0)
|
||||||
rspec-core (>= 2, < 4, != 2.12.0)
|
rspec-core (>= 2, < 4, != 2.12.0)
|
||||||
rubocop (1.48.1)
|
rubocop (1.49.0)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.2.0.0)
|
parser (>= 3.2.0.0)
|
||||||
rainbow (>= 2.2.2, < 4.0)
|
rainbow (>= 2.2.2, < 4.0)
|
||||||
regexp_parser (>= 1.8, < 3.0)
|
regexp_parser (>= 1.8, < 3.0)
|
||||||
rexml (>= 3.2.5, < 4.0)
|
rexml (>= 3.2.5, < 4.0)
|
||||||
rubocop-ast (>= 1.26.0, < 2.0)
|
rubocop-ast (>= 1.28.0, < 2.0)
|
||||||
ruby-progressbar (~> 1.7)
|
ruby-progressbar (~> 1.7)
|
||||||
unicode-display_width (>= 2.4.0, < 3.0)
|
unicode-display_width (>= 2.4.0, < 3.0)
|
||||||
rubocop-ast (1.27.0)
|
rubocop-ast (1.28.0)
|
||||||
parser (>= 3.2.1.0)
|
parser (>= 3.2.1.0)
|
||||||
rubocop-capybara (2.17.1)
|
rubocop-capybara (2.17.1)
|
||||||
rubocop (~> 1.41)
|
rubocop (~> 1.41)
|
||||||
|
@ -685,8 +685,8 @@ GEM
|
||||||
statsd-ruby (1.5.0)
|
statsd-ruby (1.5.0)
|
||||||
stoplight (3.0.1)
|
stoplight (3.0.1)
|
||||||
redlock (~> 1.0)
|
redlock (~> 1.0)
|
||||||
strong_migrations (0.7.9)
|
strong_migrations (0.8.0)
|
||||||
activerecord (>= 5)
|
activerecord (>= 5.2)
|
||||||
swd (1.3.0)
|
swd (1.3.0)
|
||||||
activesupport (>= 3)
|
activesupport (>= 3)
|
||||||
attr_required (>= 0.0.5)
|
attr_required (>= 0.0.5)
|
||||||
|
@ -719,13 +719,13 @@ GEM
|
||||||
unf (~> 0.1.0)
|
unf (~> 0.1.0)
|
||||||
tzinfo (2.0.6)
|
tzinfo (2.0.6)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
tzinfo-data (1.2022.7)
|
tzinfo-data (1.2023.3)
|
||||||
tzinfo (>= 1.0.0)
|
tzinfo (>= 1.0.0)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.8.2)
|
unf_ext (0.0.8.2)
|
||||||
unicode-display_width (2.4.2)
|
unicode-display_width (2.4.2)
|
||||||
uri (0.12.0)
|
uri (0.12.1)
|
||||||
validate_email (0.1.6)
|
validate_email (0.1.6)
|
||||||
activemodel (>= 3.0)
|
activemodel (>= 3.0)
|
||||||
mail (>= 2.2.5)
|
mail (>= 2.2.5)
|
||||||
|
@ -771,7 +771,7 @@ DEPENDENCIES
|
||||||
active_model_serializers (~> 0.10)
|
active_model_serializers (~> 0.10)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
annotate (~> 3.2)
|
annotate (~> 3.2)
|
||||||
aws-sdk-s3 (~> 1.119)
|
aws-sdk-s3 (~> 1.120)
|
||||||
better_errors (~> 2.9)
|
better_errors (~> 2.9)
|
||||||
binding_of_caller (~> 1.0)
|
binding_of_caller (~> 1.0)
|
||||||
blurhash (~> 0.1)
|
blurhash (~> 0.1)
|
||||||
|
@ -783,7 +783,7 @@ DEPENDENCIES
|
||||||
capistrano-rails (~> 1.6)
|
capistrano-rails (~> 1.6)
|
||||||
capistrano-rbenv (~> 2.2)
|
capistrano-rbenv (~> 2.2)
|
||||||
capistrano-yarn (~> 2.0)
|
capistrano-yarn (~> 2.0)
|
||||||
capybara (~> 3.38)
|
capybara (~> 3.39)
|
||||||
charlock_holmes (~> 0.7.7)
|
charlock_holmes (~> 0.7.7)
|
||||||
chewy (~> 7.2)
|
chewy (~> 7.2)
|
||||||
climate_control
|
climate_control
|
||||||
|
@ -847,7 +847,7 @@ DEPENDENCIES
|
||||||
premailer-rails
|
premailer-rails
|
||||||
private_address_check (~> 0.5)
|
private_address_check (~> 0.5)
|
||||||
public_suffix (~> 5.0)
|
public_suffix (~> 5.0)
|
||||||
puma (~> 6.1)
|
puma (~> 6.2)
|
||||||
pundit (~> 2.3)
|
pundit (~> 2.3)
|
||||||
rack (~> 2.2.6)
|
rack (~> 2.2.6)
|
||||||
rack-attack (~> 6.6)
|
rack-attack (~> 6.6)
|
||||||
|
@ -885,11 +885,11 @@ DEPENDENCIES
|
||||||
sprockets-rails (~> 3.4)
|
sprockets-rails (~> 3.4)
|
||||||
stackprof
|
stackprof
|
||||||
stoplight (~> 3.0.1)
|
stoplight (~> 3.0.1)
|
||||||
strong_migrations (~> 0.7)
|
strong_migrations (~> 0.8)
|
||||||
thor (~> 1.2)
|
thor (~> 1.2)
|
||||||
tty-prompt (~> 0.23)
|
tty-prompt (~> 0.23)
|
||||||
twitter-text (~> 3.1.0)
|
twitter-text (~> 3.1.0)
|
||||||
tzinfo-data (~> 1.2022)
|
tzinfo-data (~> 1.2023)
|
||||||
webauthn (~> 3.0)
|
webauthn (~> 3.0)
|
||||||
webmock (~> 3.18)
|
webmock (~> 3.18)
|
||||||
webpacker (~> 5.4)
|
webpacker (~> 5.4)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Mastodon Glitch Edition #
|
# Mastodon Glitch Edition
|
||||||
|
|
||||||
> Now with automated deploys!
|
> Now with automated deploys!
|
||||||
|
|
||||||
[![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci]
|
[![Build Status](https://img.shields.io/circleci/project/github/glitch-soc/mastodon.svg)][circleci]
|
||||||
[![Code Climate](https://img.shields.io/codeclimate/maintainability/glitch-soc/mastodon.svg)][code_climate]
|
[![Code Climate](https://img.shields.io/codeclimate/maintainability/glitch-soc/mastodon.svg)][code_climate]
|
||||||
|
|
|
@ -13,7 +13,7 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
|
||||||
def update
|
def update
|
||||||
@account = current_account
|
@account = current_account
|
||||||
UpdateAccountService.new.call(@account, account_params, raise_error: true)
|
UpdateAccountService.new.call(@account, account_params, raise_error: true)
|
||||||
UserSettingsDecorator.new(current_user).update(user_settings_params) if user_settings_params
|
current_user.update(user_params) if user_params
|
||||||
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
|
ActivityPub::UpdateDistributionWorker.perform_async(@account.id)
|
||||||
render json: @account, serializer: REST::CredentialAccountSerializer
|
render json: @account, serializer: REST::CredentialAccountSerializer
|
||||||
end
|
end
|
||||||
|
@ -34,15 +34,17 @@ class Api::V1::Accounts::CredentialsController < Api::BaseController
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_settings_params
|
def user_params
|
||||||
return nil if params[:source].blank?
|
return nil if params[:source].blank?
|
||||||
|
|
||||||
source_params = params.require(:source)
|
source_params = params.require(:source)
|
||||||
|
|
||||||
{
|
{
|
||||||
'setting_default_privacy' => source_params.fetch(:privacy, @account.user.setting_default_privacy),
|
settings_attributes: {
|
||||||
'setting_default_sensitive' => source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
|
default_privacy: source_params.fetch(:privacy, @account.user.setting_default_privacy),
|
||||||
'setting_default_language' => source_params.fetch(:language, @account.user.setting_default_language),
|
default_sensitive: source_params.fetch(:sensitive, @account.user.setting_default_sensitive),
|
||||||
|
default_language: source_params.fetch(:language, @account.user.setting_default_language),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,7 +5,7 @@ class Api::V1::StreamingController < Api::BaseController
|
||||||
if Rails.configuration.x.streaming_api_base_url == request.host
|
if Rails.configuration.x.streaming_api_base_url == request.host
|
||||||
not_found
|
not_found
|
||||||
else
|
else
|
||||||
redirect_to streaming_api_url, status: 301
|
redirect_to streaming_api_url, status: 301, allow_other_host: true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ class Api::V1::Timelines::PublicController < Api::BaseController
|
||||||
only_media: truthy_param?(:only_media),
|
only_media: truthy_param?(:only_media),
|
||||||
allow_local_only: truthy_param?(:allow_local_only),
|
allow_local_only: truthy_param?(:allow_local_only),
|
||||||
with_replies: Setting.show_replies_in_public_timelines,
|
with_replies: Setting.show_replies_in_public_timelines,
|
||||||
with_reblogs: Setting.show_reblogs_in_public_timelines,
|
with_reblogs: Setting.show_reblogs_in_public_timelines
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -15,12 +15,6 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
|
||||||
|
|
||||||
skip_before_action :require_functional!
|
skip_before_action :require_functional!
|
||||||
|
|
||||||
def new
|
|
||||||
super
|
|
||||||
|
|
||||||
resource.email = current_user.unconfirmed_email || current_user.email if user_signed_in?
|
|
||||||
end
|
|
||||||
|
|
||||||
def show
|
def show
|
||||||
old_session_values = session.to_hash
|
old_session_values = session.to_hash
|
||||||
reset_session
|
reset_session
|
||||||
|
@ -29,6 +23,12 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
|
||||||
super
|
super
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def new
|
||||||
|
super
|
||||||
|
|
||||||
|
resource.email = current_user.unconfirmed_email || current_user.email if user_signed_in?
|
||||||
|
end
|
||||||
|
|
||||||
def confirm_captcha
|
def confirm_captcha
|
||||||
check_captcha! do |message|
|
check_captcha! do |message|
|
||||||
flash.now[:alert] = message
|
flash.now[:alert] = message
|
||||||
|
@ -51,6 +51,7 @@ class Auth::ConfirmationsController < Devise::ConfirmationsController
|
||||||
# step.
|
# step.
|
||||||
confirmation_token = params[:confirmation_token]
|
confirmation_token = params[:confirmation_token]
|
||||||
return if confirmation_token.nil?
|
return if confirmation_token.nil?
|
||||||
|
|
||||||
@confirmation_user = User.find_first_by_auth_conditions(confirmation_token: confirmation_token)
|
@confirmation_user = User.find_first_by_auth_conditions(confirmation_token: confirmation_token)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ class Auth::RegistrationsController < Devise::RegistrationsController
|
||||||
super(hash)
|
super(hash)
|
||||||
|
|
||||||
resource.locale = I18n.locale
|
resource.locale = I18n.locale
|
||||||
resource.invite_code = params[:invite_code] if resource.invite_code.blank?
|
resource.invite_code = @invite&.code if resource.invite_code.blank?
|
||||||
resource.registration_form_time = session[:registration_form_time]
|
resource.registration_form_time = session[:registration_form_time]
|
||||||
resource.sign_up_ip = request.remote_ip
|
resource.sign_up_ip = request.remote_ip
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,11 @@ class BackupsController < ApplicationController
|
||||||
when :s3
|
when :s3
|
||||||
redirect_to @backup.dump.expiring_url(10)
|
redirect_to @backup.dump.expiring_url(10)
|
||||||
when :fog
|
when :fog
|
||||||
redirect_to @backup.dump.expiring_url(Time.now.utc + 10)
|
if Paperclip::Attachment.default_options.dig(:fog_credentials, :openstack_temp_url_key).present?
|
||||||
|
redirect_to @backup.dump.expiring_url(Time.now.utc + 10)
|
||||||
|
else
|
||||||
|
redirect_to full_asset_url(@backup.dump.url)
|
||||||
|
end
|
||||||
when :filesystem
|
when :filesystem
|
||||||
redirect_to full_asset_url(@backup.dump.url)
|
redirect_to full_asset_url(@backup.dump.url)
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,7 +10,8 @@ module AccountControllerConcern
|
||||||
|
|
||||||
included do
|
included do
|
||||||
before_action :set_instance_presenter
|
before_action :set_instance_presenter
|
||||||
before_action :set_link_headers, if: -> { request.format.nil? || request.format == :html }
|
|
||||||
|
after_action :set_link_headers, if: -> { request.format.nil? || request.format == :html }
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -23,7 +23,7 @@ class MediaProxyController < ApplicationController
|
||||||
redownload! if @media_attachment.needs_redownload? && !reject_media?
|
redownload! if @media_attachment.needs_redownload? && !reject_media?
|
||||||
end
|
end
|
||||||
|
|
||||||
redirect_to full_asset_url(@media_attachment.file.url(version))
|
redirect_to full_asset_url(@media_attachment.file.url(version)), allow_other_host: true
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -12,27 +12,15 @@ class Settings::FlavoursController < Settings::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
unless Themes.instance.flavours.include?(params[:flavour]) || (params[:flavour] == current_flavour)
|
redirect_to action: 'show', flavour: current_flavour unless Themes.instance.flavours.include?(params[:flavour]) || (params[:flavour] == current_flavour)
|
||||||
redirect_to action: 'show', flavour: current_flavour
|
|
||||||
end
|
|
||||||
|
|
||||||
@listing = Themes.instance.flavours
|
@listing = Themes.instance.flavours
|
||||||
@selected = params[:flavour]
|
@selected = params[:flavour]
|
||||||
end
|
end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
user_settings.update(user_settings_params)
|
current_user.settings.update(flavour: params.require(:flavour), skin: params.dig(:user, :setting_skin))
|
||||||
|
current_user.save
|
||||||
redirect_to action: 'show', flavour: params[:flavour]
|
redirect_to action: 'show', flavour: params[:flavour]
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def user_settings
|
|
||||||
UserSettingsDecorator.new(current_user)
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_settings_params
|
|
||||||
{ setting_flavour: params.require(:flavour),
|
|
||||||
setting_skin: params.dig(:user, :setting_skin) }.with_indifferent_access
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,8 +4,6 @@ class Settings::PreferencesController < Settings::BaseController
|
||||||
def show; end
|
def show; end
|
||||||
|
|
||||||
def update
|
def update
|
||||||
user_settings.update(user_settings_params.to_h)
|
|
||||||
|
|
||||||
if current_user.update(user_params)
|
if current_user.update(user_params)
|
||||||
I18n.locale = current_user.locale
|
I18n.locale = current_user.locale
|
||||||
redirect_to after_update_redirect_path, notice: I18n.t('generic.changes_saved_msg')
|
redirect_to after_update_redirect_path, notice: I18n.t('generic.changes_saved_msg')
|
||||||
|
@ -20,47 +18,7 @@ class Settings::PreferencesController < Settings::BaseController
|
||||||
settings_preferences_path
|
settings_preferences_path
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_settings
|
|
||||||
UserSettingsDecorator.new(current_user)
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_params
|
def user_params
|
||||||
params.require(:user).permit(
|
params.require(:user).permit(:locale, chosen_languages: [], settings_attributes: UserSettings.keys)
|
||||||
:locale,
|
|
||||||
chosen_languages: []
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_settings_params
|
|
||||||
params.require(:user).permit(
|
|
||||||
:setting_default_privacy,
|
|
||||||
:setting_default_sensitive,
|
|
||||||
:setting_default_language,
|
|
||||||
:setting_unfollow_modal,
|
|
||||||
:setting_boost_modal,
|
|
||||||
:setting_favourite_modal,
|
|
||||||
:setting_delete_modal,
|
|
||||||
:setting_auto_play_gif,
|
|
||||||
:setting_display_media,
|
|
||||||
:setting_expand_spoilers,
|
|
||||||
:setting_reduce_motion,
|
|
||||||
:setting_disable_swiping,
|
|
||||||
:setting_system_font_ui,
|
|
||||||
:setting_system_emoji_font,
|
|
||||||
:setting_noindex,
|
|
||||||
:setting_hide_followers_count,
|
|
||||||
:setting_aggregate_reblogs,
|
|
||||||
:setting_show_application,
|
|
||||||
:setting_advanced_layout,
|
|
||||||
:setting_default_content_type,
|
|
||||||
:setting_use_blurhash,
|
|
||||||
:setting_use_pending_items,
|
|
||||||
:setting_trends,
|
|
||||||
:setting_crop_images,
|
|
||||||
:setting_visible_reactions,
|
|
||||||
:setting_always_send_emails,
|
|
||||||
notification_emails: %i(follow follow_request reblog favourite mention report pending_account trending_tag trending_link trending_status appeal),
|
|
||||||
interactions: %i(must_be_follower must_be_following must_be_following_dm)
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -22,18 +22,9 @@ module Settings
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def confirmation_params
|
|
||||||
params.require(:form_two_factor_confirmation).permit(:otp_attempt)
|
|
||||||
end
|
|
||||||
|
|
||||||
def verify_otp_not_enabled
|
def verify_otp_not_enabled
|
||||||
redirect_to settings_two_factor_authentication_methods_path if current_user.otp_enabled?
|
redirect_to settings_two_factor_authentication_methods_path if current_user.otp_enabled?
|
||||||
end
|
end
|
||||||
|
|
||||||
def acceptable_code?
|
|
||||||
current_user.validate_and_consume_otp!(confirmation_params[:otp_attempt]) ||
|
|
||||||
current_user.invalidate_otp_backup_code!(confirmation_params[:otp_attempt])
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -9,11 +9,12 @@ class StatusesController < ApplicationController
|
||||||
before_action :require_account_signature!, only: [:show, :activity], if: -> { request.format == :json && authorized_fetch_mode? }
|
before_action :require_account_signature!, only: [:show, :activity], if: -> { request.format == :json && authorized_fetch_mode? }
|
||||||
before_action :set_status
|
before_action :set_status
|
||||||
before_action :set_instance_presenter
|
before_action :set_instance_presenter
|
||||||
before_action :set_link_headers
|
|
||||||
before_action :redirect_to_original, only: :show
|
before_action :redirect_to_original, only: :show
|
||||||
before_action :set_cache_headers
|
before_action :set_cache_headers
|
||||||
before_action :set_body_classes, only: :embed
|
before_action :set_body_classes, only: :embed
|
||||||
|
|
||||||
|
after_action :set_link_headers
|
||||||
|
|
||||||
skip_around_action :set_locale, if: -> { request.format == :json }
|
skip_around_action :set_locale, if: -> { request.format == :json }
|
||||||
skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode?
|
skip_before_action :require_functional!, only: [:show, :embed], unless: :whitelist_mode?
|
||||||
|
|
||||||
|
@ -71,6 +72,6 @@ class StatusesController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def redirect_to_original
|
def redirect_to_original
|
||||||
redirect_to ActivityPub::TagManager.instance.url_for(@status.reblog) if @status.reblog?
|
redirect_to(ActivityPub::TagManager.instance.url_for(@status.reblog), allow_other_host: true) if @status.reblog?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -28,7 +28,7 @@ module AccountsHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def hide_followers_count?(account)
|
def hide_followers_count?(account)
|
||||||
Setting.hide_followers_count || account.user&.setting_hide_followers_count
|
Setting.hide_followers_count || account.user&.settings&.[]('hide_followers_count')
|
||||||
end
|
end
|
||||||
|
|
||||||
def account_description(account)
|
def account_description(account)
|
||||||
|
|
|
@ -8,7 +8,7 @@ module HomeHelper
|
||||||
end
|
end
|
||||||
|
|
||||||
def account_link_to(account, button = '', path: nil)
|
def account_link_to(account, button = '', path: nil)
|
||||||
content_tag(:div, class: 'account') do
|
content_tag(:div, class: 'account account--minimal') do
|
||||||
content_tag(:div, class: 'account__wrapper') do
|
content_tag(:div, class: 'account__wrapper') do
|
||||||
section = if account.nil?
|
section = if account.nil?
|
||||||
content_tag(:div, class: 'account__display-name') do
|
content_tag(:div, class: 'account__display-name') do
|
||||||
|
|
|
@ -55,7 +55,7 @@ export const synchronouslySubmitMarkers = () => (dispatch, getState) => {
|
||||||
client.open('POST', '/api/v1/markers', false);
|
client.open('POST', '/api/v1/markers', false);
|
||||||
client.setRequestHeader('Content-Type', 'application/json');
|
client.setRequestHeader('Content-Type', 'application/json');
|
||||||
client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
|
client.setRequestHeader('Authorization', `Bearer ${accessToken}`);
|
||||||
client.SUBMIT(JSON.stringify(params));
|
client.send(JSON.stringify(params));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Do not make the BeforeUnload handler error out
|
// Do not make the BeforeUnload handler error out
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,11 @@
|
||||||
import 'intl';
|
import 'intl';
|
||||||
import 'intl/locale-data/jsonp/en';
|
import 'intl/locale-data/jsonp/en';
|
||||||
import 'es6-symbol/implement';
|
import 'es6-symbol/implement';
|
||||||
import includes from 'array-includes';
|
|
||||||
import assign from 'object-assign';
|
import assign from 'object-assign';
|
||||||
import values from 'object.values';
|
import values from 'object.values';
|
||||||
import { decode as decodeBase64 } from './utils/base64';
|
import { decode as decodeBase64 } from './utils/base64';
|
||||||
import promiseFinally from 'promise.prototype.finally';
|
import promiseFinally from 'promise.prototype.finally';
|
||||||
|
|
||||||
if (!Array.prototype.includes) {
|
|
||||||
includes.shim();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Object.assign) {
|
if (!Object.assign) {
|
||||||
Object.assign = assign;
|
Object.assign = assign;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ class Category extends React.PureComponent {
|
||||||
const { id, text, disabled, selected, children } = this.props;
|
const { id, text, disabled, selected, children } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div tabIndex='0' role='button' className={classNames('report-reason-selector__category', { selected, disabled })} onClick={this.handleClick}>
|
<div tabIndex={0} role='button' className={classNames('report-reason-selector__category', { selected, disabled })} onClick={this.handleClick}>
|
||||||
{selected && <input type='hidden' name='report[category]' value={id} />}
|
{selected && <input type='hidden' name='report[category]' value={id} />}
|
||||||
|
|
||||||
<div className='report-reason-selector__category__label'>
|
<div className='report-reason-selector__category__label'>
|
||||||
|
@ -74,7 +74,7 @@ class Rule extends React.PureComponent {
|
||||||
const { id, text, disabled, selected } = this.props;
|
const { id, text, disabled, selected } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div tabIndex='0' role='button' className={classNames('report-reason-selector__rule', { selected, disabled })} onClick={this.handleClick}>
|
<div tabIndex={0} role='button' className={classNames('report-reason-selector__rule', { selected, disabled })} onClick={this.handleClick}>
|
||||||
<span className={classNames('poll__input', { checkbox: true, active: selected, disabled })} />
|
<span className={classNames('poll__input', { checkbox: true, active: selected, disabled })} />
|
||||||
{selected && <input type='hidden' name='report[rule_ids][]' value={id} />}
|
{selected && <input type='hidden' name='report[rule_ids][]' value={id} />}
|
||||||
{text}
|
{text}
|
||||||
|
|
|
@ -180,7 +180,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
|
<div role='button' tabIndex={0} key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
|
||||||
{inner}
|
{inner}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -186,7 +186,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div role='button' tabIndex='0' key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
|
<div role='button' tabIndex={0} key={key} data-index={i} className={classNames('autosuggest-textarea__suggestions__item', { selected: i === selectedSuggestion })} onMouseDown={this.onSuggestionClick}>
|
||||||
{inner}
|
{inner}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -26,7 +26,7 @@ export default class ColumnBackButtonSlim extends React.PureComponent {
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<div className='column-back-button--slim'>
|
<div className='column-back-button--slim'>
|
||||||
<div role='button' tabIndex='0' onClick={this.handleClick} className='column-back-button column-back-button--slim-button'>
|
<div role='button' tabIndex={0} onClick={this.handleClick} className='column-back-button column-back-button--slim-button'>
|
||||||
<Icon id='chevron-left' className='column-back-button__icon' fixedWidth />
|
<Icon id='chevron-left' className='column-back-button__icon' fixedWidth />
|
||||||
<FormattedMessage id='column_back_button.label' defaultMessage='Back' />
|
<FormattedMessage id='column_back_button.label' defaultMessage='Back' />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -119,7 +119,7 @@ class DropdownMenu extends React.PureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<li className='dropdown-menu__item' key={`${text}-${i}`}>
|
<li className='dropdown-menu__item' key={`${text}-${i}`}>
|
||||||
<a href={href} target={target} data-method={method} rel='noopener noreferrer' role='button' tabIndex='0' ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyPress={this.handleItemKeyPress} data-index={i}>
|
<a href={href} target={target} data-method={method} rel='noopener noreferrer' role='button' tabIndex={0} ref={i === 0 ? this.setFocusRef : null} onClick={this.handleClick} onKeyPress={this.handleItemKeyPress} data-index={i}>
|
||||||
{text}
|
{text}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
|
@ -72,7 +72,7 @@ export default class ErrorBoundary extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div tabIndex='-1'>
|
<div tabIndex={-1}>
|
||||||
<div className='error-boundary'>
|
<div className='error-boundary'>
|
||||||
<h1><FormattedMessage id='web_app_crash.title' defaultMessage="We're sorry, but something went wrong with the Mastodon app." /></h1>
|
<h1><FormattedMessage id='web_app_crash.title' defaultMessage="We're sorry, but something went wrong with the Mastodon app." /></h1>
|
||||||
<p>
|
<p>
|
||||||
|
|
|
@ -46,7 +46,7 @@ export default class GIFV extends React.PureComponent {
|
||||||
width={width}
|
width={width}
|
||||||
height={height}
|
height={height}
|
||||||
role='button'
|
role='button'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
aria-label={alt}
|
aria-label={alt}
|
||||||
title={alt}
|
title={alt}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
|
@ -57,7 +57,7 @@ export default class GIFV extends React.PureComponent {
|
||||||
<video
|
<video
|
||||||
src={src}
|
src={src}
|
||||||
role='button'
|
role='button'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
aria-label={alt}
|
aria-label={alt}
|
||||||
title={alt}
|
title={alt}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
|
|
|
@ -120,7 +120,7 @@ export default class IntersectionObserverArticle extends React.Component {
|
||||||
aria-posinset={index + 1}
|
aria-posinset={index + 1}
|
||||||
aria-setsize={listLength}
|
aria-setsize={listLength}
|
||||||
data-id={id}
|
data-id={id}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
style={style}
|
style={style}
|
||||||
>
|
>
|
||||||
{children && React.cloneElement(children, { hidden: !isIntersecting && (isHidden || !!cachedHeight) })}
|
{children && React.cloneElement(children, { hidden: !isIntersecting && (isHidden || !!cachedHeight) })}
|
||||||
|
|
|
@ -58,7 +58,7 @@ class PictureInPicturePlaceholder extends React.PureComponent {
|
||||||
const { height } = this.state;
|
const { height } = this.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div ref={this.setRef} className='picture-in-picture-placeholder' style={{ height }} role='button' tabIndex='0' onClick={this.handleClick}>
|
<div ref={this.setRef} className='picture-in-picture-placeholder' style={{ height }} role='button' tabIndex={0} onClick={this.handleClick}>
|
||||||
<Icon id='window-restore' />
|
<Icon id='window-restore' />
|
||||||
<FormattedMessage id='picture_in_picture.restore' defaultMessage='Put it back' />
|
<FormattedMessage id='picture_in_picture.restore' defaultMessage='Put it back' />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -154,7 +154,7 @@ class Poll extends ImmutablePureComponent {
|
||||||
{!showResults && (
|
{!showResults && (
|
||||||
<span
|
<span
|
||||||
className={classNames('poll__input', { checkbox: poll.get('multiple'), active })}
|
className={classNames('poll__input', { checkbox: poll.get('multiple'), active })}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
role={poll.get('multiple') ? 'checkbox' : 'radio'}
|
role={poll.get('multiple') ? 'checkbox' : 'radio'}
|
||||||
onKeyPress={this.handleOptionKeyPress}
|
onKeyPress={this.handleOptionKeyPress}
|
||||||
aria-checked={active}
|
aria-checked={active}
|
||||||
|
|
|
@ -38,7 +38,7 @@ class Spoilers extends React.PureComponent {
|
||||||
<p className='spoiler__text'>
|
<p className='spoiler__text'>
|
||||||
{spoilerText}
|
{spoilerText}
|
||||||
{' '}
|
{' '}
|
||||||
<button tabIndex='0' className='status__content__spoiler-link' onClick={this.handleSpoilerClick}>
|
<button tabIndex={0} className='status__content__spoiler-link' onClick={this.handleSpoilerClick}>
|
||||||
{toggleText}
|
{toggleText}
|
||||||
</button>
|
</button>
|
||||||
</p>,
|
</p>,
|
||||||
|
|
|
@ -568,7 +568,7 @@ class Status extends ImmutablePureComponent {
|
||||||
if (hidden) {
|
if (hidden) {
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={handlers}>
|
<HotKeys handlers={handlers}>
|
||||||
<div ref={this.handleRef} className='status focusable' tabIndex='0'>
|
<div ref={this.handleRef} className='status focusable' tabIndex={0}>
|
||||||
<span>{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}</span>
|
<span>{status.getIn(['account', 'display_name']) || status.getIn(['account', 'username'])}</span>
|
||||||
<span>{status.get('content')}</span>
|
<span>{status.get('content')}</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -585,7 +585,7 @@ class Status extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={minHandlers}>
|
<HotKeys handlers={minHandlers}>
|
||||||
<div className='status__wrapper status__wrapper--filtered focusable' tabIndex='0' ref={this.handleRef}>
|
<div className='status__wrapper status__wrapper--filtered focusable' tabIndex={0} ref={this.handleRef}>
|
||||||
<FormattedMessage id='status.filtered' defaultMessage='Filtered' />: {matchedFilters.join(', ')}.
|
<FormattedMessage id='status.filtered' defaultMessage='Filtered' />: {matchedFilters.join(', ')}.
|
||||||
{' '}
|
{' '}
|
||||||
<button className='status__wrapper--filtered__button' onClick={this.handleUnfilterClick}>
|
<button className='status__wrapper--filtered__button' onClick={this.handleUnfilterClick}>
|
||||||
|
@ -774,7 +774,7 @@ class Status extends ImmutablePureComponent {
|
||||||
style={isCollapsed && background ? { backgroundImage: `url(${background})` } : null}
|
style={isCollapsed && background ? { backgroundImage: `url(${background})` } : null}
|
||||||
{...selectorAttribs}
|
{...selectorAttribs}
|
||||||
ref={handleRef}
|
ref={handleRef}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
data-featured={featured ? 'true' : null}
|
data-featured={featured ? 'true' : null}
|
||||||
aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}
|
aria-label={textForScreenReader(intl, status, rebloggedByText, !status.get('hidden'))}
|
||||||
>
|
>
|
||||||
|
|
|
@ -387,7 +387,7 @@ class StatusContent extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames} tabIndex='0' onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
|
<div className={classNames} tabIndex={0} onMouseDown={this.handleMouseDown} onMouseUp={this.handleMouseUp}>
|
||||||
<p
|
<p
|
||||||
style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}
|
style={{ marginBottom: hidden && status.get('mentions').isEmpty() ? '0px' : null }}
|
||||||
>
|
>
|
||||||
|
@ -424,14 +424,14 @@ class StatusContent extends React.PureComponent {
|
||||||
className={classNames}
|
className={classNames}
|
||||||
onMouseDown={this.handleMouseDown}
|
onMouseDown={this.handleMouseDown}
|
||||||
onMouseUp={this.handleMouseUp}
|
onMouseUp={this.handleMouseUp}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
ref={this.setContentsRef}
|
ref={this.setContentsRef}
|
||||||
key={`contents-${tagLinks}-${rewriteMentions}`}
|
key={`contents-${tagLinks}-${rewriteMentions}`}
|
||||||
dangerouslySetInnerHTML={content}
|
dangerouslySetInnerHTML={content}
|
||||||
className='status__content__text translate'
|
className='status__content__text translate'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
onMouseEnter={this.handleMouseEnter}
|
onMouseEnter={this.handleMouseEnter}
|
||||||
onMouseLeave={this.handleMouseLeave}
|
onMouseLeave={this.handleMouseLeave}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
|
@ -445,14 +445,14 @@ class StatusContent extends React.PureComponent {
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className='status__content'
|
className='status__content'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
ref={this.setContentsRef}
|
ref={this.setContentsRef}
|
||||||
key={`contents-${tagLinks}`}
|
key={`contents-${tagLinks}`}
|
||||||
className='status__content__text translate'
|
className='status__content__text translate'
|
||||||
dangerouslySetInnerHTML={content}
|
dangerouslySetInnerHTML={content}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
onMouseEnter={this.handleMouseEnter}
|
onMouseEnter={this.handleMouseEnter}
|
||||||
onMouseLeave={this.handleMouseLeave}
|
onMouseLeave={this.handleMouseLeave}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
|
|
|
@ -54,7 +54,7 @@ export default class MediaContainer extends PureComponent {
|
||||||
|
|
||||||
handleCloseMedia = () => {
|
handleCloseMedia = () => {
|
||||||
document.body.classList.remove('with-modals--active');
|
document.body.classList.remove('with-modals--active');
|
||||||
document.documentElement.style.marginRight = 0;
|
document.documentElement.style.marginRight = '0';
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
media: null,
|
media: null,
|
||||||
|
|
|
@ -67,7 +67,7 @@ class Section extends React.PureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames('about__section', { active: !collapsed })}>
|
<div className={classNames('about__section', { active: !collapsed })}>
|
||||||
<div className='about__section__title' role='button' tabIndex='0' onClick={this.handleClick}>
|
<div className='about__section__title' role='button' tabIndex={0} onClick={this.handleClick}>
|
||||||
<Icon id={collapsed ? 'chevron-right' : 'chevron-down'} fixedWidth /> {title}
|
<Icon id={collapsed ? 'chevron-right' : 'chevron-down'} fixedWidth /> {title}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -53,11 +53,11 @@ class Header extends ImmutablePureComponent {
|
||||||
if (isEditing) {
|
if (isEditing) {
|
||||||
action_buttons = (
|
action_buttons = (
|
||||||
<div className='account__header__account-note__buttons'>
|
<div className='account__header__account-note__buttons'>
|
||||||
<button className='icon-button' tabIndex='0' onClick={this.props.onCancelAccountNote} disabled={isSubmitting}>
|
<button className='icon-button' tabIndex={0} onClick={this.props.onCancelAccountNote} disabled={isSubmitting}>
|
||||||
<Icon id='times' size={15} /> <FormattedMessage id='account_note.cancel' defaultMessage='Cancel' />
|
<Icon id='times' size={15} /> <FormattedMessage id='account_note.cancel' defaultMessage='Cancel' />
|
||||||
</button>
|
</button>
|
||||||
<div className='flex-spacer' />
|
<div className='flex-spacer' />
|
||||||
<button className='icon-button' tabIndex='0' onClick={this.props.onSaveAccountNote} disabled={isSubmitting}>
|
<button className='icon-button' tabIndex={0} onClick={this.props.onSaveAccountNote} disabled={isSubmitting}>
|
||||||
<Icon id='check' size={15} /> <FormattedMessage id='account_note.save' defaultMessage='Save' />
|
<Icon id='check' size={15} /> <FormattedMessage id='account_note.save' defaultMessage='Save' />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -65,7 +65,7 @@ class Header extends ImmutablePureComponent {
|
||||||
} else {
|
} else {
|
||||||
action_buttons = (
|
action_buttons = (
|
||||||
<div className='account__header__account-note__buttons'>
|
<div className='account__header__account-note__buttons'>
|
||||||
<button className='icon-button' tabIndex='0' onClick={this.props.onEditAccountNote} disabled={isSubmitting}>
|
<button className='icon-button' tabIndex={0} onClick={this.props.onEditAccountNote} disabled={isSubmitting}>
|
||||||
<Icon id='pencil' size={15} /> <FormattedMessage id='account_note.edit' defaultMessage='Edit' />
|
<Icon id='pencil' size={15} /> <FormattedMessage id='account_note.edit' defaultMessage='Edit' />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -476,7 +476,7 @@ class Audio extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={classNames('audio-player', { editable, inactive: !revealed })} ref={this.setPlayerRef} style={{ backgroundColor: this._getBackgroundColor(), color: this._getForegroundColor(), width: '100%', height: this.props.fullscreen ? '100%' : (this.state.height || this.props.height) }} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} tabIndex='0' onKeyDown={this.handleKeyDown}>
|
<div className={classNames('audio-player', { editable, inactive: !revealed })} ref={this.setPlayerRef} style={{ backgroundColor: this._getBackgroundColor(), color: this._getForegroundColor(), width: '100%', height: this.props.fullscreen ? '100%' : (this.state.height || this.props.height) }} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave} tabIndex={0} onKeyDown={this.handleKeyDown}>
|
||||||
|
|
||||||
<Blurhash
|
<Blurhash
|
||||||
hash={blurhash}
|
hash={blurhash}
|
||||||
|
@ -499,7 +499,7 @@ class Audio extends React.PureComponent {
|
||||||
|
|
||||||
<canvas
|
<canvas
|
||||||
role='button'
|
role='button'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
className='audio-player__canvas'
|
className='audio-player__canvas'
|
||||||
width={this.state.width}
|
width={this.state.width}
|
||||||
height={this.state.height}
|
height={this.state.height}
|
||||||
|
@ -532,7 +532,7 @@ class Audio extends React.PureComponent {
|
||||||
|
|
||||||
<span
|
<span
|
||||||
className={classNames('video-player__seek__handle', { active: dragging })}
|
className={classNames('video-player__seek__handle', { active: dragging })}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
style={{ left: `${progress}%`, backgroundColor: this._getAccentColor() }}
|
style={{ left: `${progress}%`, backgroundColor: this._getAccentColor() }}
|
||||||
onKeyDown={this.handleAudioKeyDown}
|
onKeyDown={this.handleAudioKeyDown}
|
||||||
/>
|
/>
|
||||||
|
@ -549,7 +549,7 @@ class Audio extends React.PureComponent {
|
||||||
|
|
||||||
<span
|
<span
|
||||||
className='video-player__volume__handle'
|
className='video-player__volume__handle'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }}
|
style={{ left: `${volume * 100}%`, backgroundColor: this._getAccentColor() }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -169,7 +169,7 @@ export default class ComposerOptionsDropdownContent extends React.PureComponent
|
||||||
onClick={this.handleClick}
|
onClick={this.handleClick}
|
||||||
onKeyDown={this.handleKeyDown}
|
onKeyDown={this.handleKeyDown}
|
||||||
role='option'
|
role='option'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
key={name}
|
key={name}
|
||||||
data-index={i}
|
data-index={i}
|
||||||
ref={active ? this.setFocusRef : null}
|
ref={active ? this.setFocusRef : null}
|
||||||
|
|
|
@ -209,7 +209,7 @@ class LanguageDropdownMenu extends React.PureComponent {
|
||||||
const { value } = this.props;
|
const { value } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={lang[0]} role='option' tabIndex='0' data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}>
|
<div key={lang[0]} role='option' tabIndex={0} data-index={lang[0]} className={classNames('language-dropdown__dropdown__results__item', { active: lang[0] === value })} aria-selected={lang[0] === value} onClick={this.handleClick} onKeyDown={this.handleKeyDown}>
|
||||||
<span className='language-dropdown__dropdown__results__item__native-name' lang={lang[0]}>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span>
|
<span className='language-dropdown__dropdown__results__item__native-name' lang={lang[0]}>{lang[2]}</span> <span className='language-dropdown__dropdown__results__item__common-name'>({lang[1]})</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -147,7 +147,7 @@ class Search extends React.PureComponent {
|
||||||
onBlur={this.handleBlur}
|
onBlur={this.handleBlur}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
|
<div role='button' tabIndex={0} className='search__icon' onClick={this.handleClear}>
|
||||||
<Icon id='search' className={hasValue ? '' : 'active'} />
|
<Icon id='search' className={hasValue ? '' : 'active'} />
|
||||||
<Icon id='times-circle' className={hasValue ? 'active' : ''} />
|
<Icon id='times-circle' className={hasValue ? 'active' : ''} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -43,7 +43,7 @@ export default class Upload extends ImmutablePureComponent {
|
||||||
const y = ((focusY / -2) + .5) * 100;
|
const y = ((focusY / -2) + .5) * 100;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='compose-form__upload' tabIndex='0' role='button'>
|
<div className='compose-form__upload' tabIndex={0} role='button'>
|
||||||
<Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>
|
<Motion defaultStyle={{ scale: 0.8 }} style={{ scale: spring(1, { stiffness: 180, damping: 12 }) }}>
|
||||||
{({ scale }) => (
|
{({ scale }) => (
|
||||||
<div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>
|
<div className='compose-form__upload-thumbnail' style={{ transform: `scale(${scale})`, backgroundImage: `url(${media.get('preview_url')})`, backgroundPosition: `${x}% ${y}%` }}>
|
||||||
|
|
|
@ -182,7 +182,7 @@ class Conversation extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={handlers}>
|
<HotKeys handlers={handlers}>
|
||||||
<div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex='0'>
|
<div className={classNames('conversation focusable muted', { 'conversation--unread': unread })} tabIndex={0}>
|
||||||
<div className='conversation__avatar' onClick={this.handleClick} role='presentation'>
|
<div className='conversation__avatar' onClick={this.handleClick} role='presentation'>
|
||||||
<AvatarComposite accounts={accounts} size={48} />
|
<AvatarComposite accounts={accounts} size={48} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -55,10 +55,10 @@ export default class ConversationsList extends ImmutablePureComponent {
|
||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { conversations, onLoadMore, ...other } = this.props;
|
const { conversations, isLoading, onLoadMore, ...other } = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ScrollableList {...other} onLoadMore={onLoadMore && this.handleLoadOlder} ref={this.setRef}>
|
<ScrollableList {...other} isLoading={isLoading} showLoading={isLoading && conversations.isEmpty()} onLoadMore={onLoadMore && this.handleLoadOlder} ref={this.setRef}>
|
||||||
{conversations.map(item => (
|
{conversations.map(item => (
|
||||||
<ConversationContainer
|
<ConversationContainer
|
||||||
key={item.get('id')}
|
key={item.get('id')}
|
||||||
|
|
|
@ -108,8 +108,10 @@ class DirectTimeline extends React.PureComponent {
|
||||||
trackScroll={!pinned}
|
trackScroll={!pinned}
|
||||||
scrollKey={`direct_timeline-${columnId}`}
|
scrollKey={`direct_timeline-${columnId}`}
|
||||||
timelineId='direct'
|
timelineId='direct'
|
||||||
|
bindToDocument={!multiColumn}
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
prepend={<div className='follow_requests-unlocked_explanation'><span><FormattedMessage id='compose_form.encryption_warning' defaultMessage='Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a></span></div>}
|
prepend={<div className='follow_requests-unlocked_explanation'><span><FormattedMessage id='compose_form.encryption_warning' defaultMessage='Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a></span></div>}
|
||||||
|
alwaysPrepend
|
||||||
emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage="You don't have any direct messages yet. When you send or receive one, it will show up here." />}
|
emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage="You don't have any direct messages yet. When you send or receive one, it will show up here." />}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -119,8 +121,10 @@ class DirectTimeline extends React.PureComponent {
|
||||||
trackScroll={!pinned}
|
trackScroll={!pinned}
|
||||||
scrollKey={`direct_timeline-${columnId}`}
|
scrollKey={`direct_timeline-${columnId}`}
|
||||||
timelineId='direct'
|
timelineId='direct'
|
||||||
|
bindToDocument={!multiColumn}
|
||||||
onLoadMore={this.handleLoadMoreTimeline}
|
onLoadMore={this.handleLoadMoreTimeline}
|
||||||
prepend={<div className='follow_requests-unlocked_explanation'><span><FormattedMessage id='compose_form.encryption_warning' defaultMessage='Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a></span></div>}
|
prepend={<div className='follow_requests-unlocked_explanation'><span><FormattedMessage id='compose_form.encryption_warning' defaultMessage='Posts on Mastodon are not end-to-end encrypted. Do not share any dangerous information over Mastodon.' /> <a href='/terms' target='_blank'><FormattedMessage id='compose_form.direct_message_warning_learn_more' defaultMessage='Learn more' /></a></span></div>}
|
||||||
|
alwaysPrepend
|
||||||
emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage="You don't have any direct messages yet. When you send or receive one, it will show up here." />}
|
emptyMessage={<FormattedMessage id='empty_column.direct' defaultMessage="You don't have any direct messages yet. When you send or receive one, it will show up here." />}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
|
@ -50,7 +50,7 @@ const emojifyTextNode = (node, customEmojis) => {
|
||||||
if (shortname in customEmojis) {
|
if (shortname in customEmojis) {
|
||||||
const filename = autoPlayGif ? customEmojis[shortname].url : customEmojis[shortname].static_url;
|
const filename = autoPlayGif ? customEmojis[shortname].url : customEmojis[shortname].static_url;
|
||||||
replacement = document.createElement('img');
|
replacement = document.createElement('img');
|
||||||
replacement.setAttribute('draggable', false);
|
replacement.setAttribute('draggable', 'false');
|
||||||
replacement.setAttribute('class', 'emojione custom-emoji');
|
replacement.setAttribute('class', 'emojione custom-emoji');
|
||||||
replacement.setAttribute('alt', shortname);
|
replacement.setAttribute('alt', shortname);
|
||||||
replacement.setAttribute('title', shortname);
|
replacement.setAttribute('title', shortname);
|
||||||
|
@ -65,7 +65,7 @@ const emojifyTextNode = (node, customEmojis) => {
|
||||||
const { filename, shortCode } = unicodeMapping[match];
|
const { filename, shortCode } = unicodeMapping[match];
|
||||||
const title = shortCode ? `:${shortCode}:` : '';
|
const title = shortCode ? `:${shortCode}:` : '';
|
||||||
replacement = document.createElement('img');
|
replacement = document.createElement('img');
|
||||||
replacement.setAttribute('draggable', false);
|
replacement.setAttribute('draggable', 'false');
|
||||||
replacement.setAttribute('class', 'emojione');
|
replacement.setAttribute('class', 'emojione');
|
||||||
replacement.setAttribute('alt', match);
|
replacement.setAttribute('alt', match);
|
||||||
replacement.setAttribute('title', title);
|
replacement.setAttribute('title', title);
|
||||||
|
|
|
@ -88,7 +88,9 @@ class Explore extends React.PureComponent {
|
||||||
<Route path='/explore/tags' component={Tags} />
|
<Route path='/explore/tags' component={Tags} />
|
||||||
<Route path='/explore/links' component={Links} />
|
<Route path='/explore/links' component={Links} />
|
||||||
<Route path='/explore/suggestions' component={Suggestions} />
|
<Route path='/explore/suggestions' component={Suggestions} />
|
||||||
<Route exact path={['/explore', '/explore/posts', '/search']} component={Statuses} componentParams={{ multiColumn }} />
|
<Route exact path={['/explore', '/explore/posts', '/search']}>
|
||||||
|
<Statuses multiColumn={multiColumn} />
|
||||||
|
</Route>
|
||||||
</Switch>
|
</Switch>
|
||||||
|
|
||||||
<Helmet>
|
<Helmet>
|
||||||
|
|
|
@ -65,7 +65,7 @@ class SelectFilter extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div key={filter[0]} role='button' tabIndex='0' data-index={filter[0]} className='language-dropdown__dropdown__results__item' onClick={this.handleItemClick} onKeyDown={this.handleKeyDown}>
|
<div key={filter[0]} role='button' tabIndex={0} data-index={filter[0]} className='language-dropdown__dropdown__results__item' onClick={this.handleItemClick} onKeyDown={this.handleKeyDown}>
|
||||||
<span className='language-dropdown__dropdown__results__item__native-name'>{filter[1]}</span> {warning}
|
<span className='language-dropdown__dropdown__results__item__native-name'>{filter[1]}</span> {warning}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -73,7 +73,7 @@ class SelectFilter extends React.PureComponent {
|
||||||
|
|
||||||
renderCreateNew (name) {
|
renderCreateNew (name) {
|
||||||
return (
|
return (
|
||||||
<div key='add-new-filter' role='button' tabIndex='0' className='language-dropdown__dropdown__results__item' onClick={this.handleNewFilterClick} onKeyDown={this.handleKeyDown}>
|
<div key='add-new-filter' role='button' tabIndex={0} className='language-dropdown__dropdown__results__item' onClick={this.handleNewFilterClick} onKeyDown={this.handleKeyDown}>
|
||||||
<Icon id='plus' fixedWidth /> <FormattedMessage id='filter_modal.select_filter.prompt_new' defaultMessage='New category: {name}' values={{ name }} />
|
<Icon id='plus' fixedWidth /> <FormattedMessage id='filter_modal.select_filter.prompt_new' defaultMessage='New category: {name}' values={{ name }} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
@ -418,7 +418,7 @@ class Announcements extends ImmutablePureComponent {
|
||||||
<img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />
|
<img className='announcements__mastodon' alt='' draggable='false' src={mascot || elephantUIPlane} />
|
||||||
|
|
||||||
<div className='announcements__container'>
|
<div className='announcements__container'>
|
||||||
<ReactSwipeableViews animateHeight={!reduceMotion} adjustHeight={reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>
|
<ReactSwipeableViews animateHeight animateTransitions={!reduceMotion} index={index} onChangeIndex={this.handleChangeIndex}>
|
||||||
{announcements.map((announcement, idx) => (
|
{announcements.map((announcement, idx) => (
|
||||||
<Announcement
|
<Announcement
|
||||||
key={announcement.get('id')}
|
key={announcement.get('id')}
|
||||||
|
|
|
@ -191,8 +191,12 @@ class HashtagTimeline extends React.PureComponent {
|
||||||
if (tag) {
|
if (tag) {
|
||||||
const following = tag.get('following');
|
const following = tag.get('following');
|
||||||
|
|
||||||
|
const classes = classNames('column-header__button', {
|
||||||
|
active: following,
|
||||||
|
});
|
||||||
|
|
||||||
followButton = (
|
followButton = (
|
||||||
<button className={classNames('column-header__button')} onClick={this.handleFollow} disabled={!signedIn} active={following} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
|
<button className={classes} onClick={this.handleFollow} disabled={!signedIn} title={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)} aria-label={intl.formatMessage(following ? messages.unfollowHashtag : messages.followHashtag)}>
|
||||||
<Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
|
<Icon id={following ? 'user-times' : 'user-plus'} fixedWidth className='column-header__icon' />
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|
|
@ -51,7 +51,7 @@ export default class Search extends React.PureComponent {
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div role='button' tabIndex='0' className='search__icon' onClick={this.handleClear}>
|
<div role='button' tabIndex={0} className='search__icon' onClick={this.handleClear}>
|
||||||
<Icon id='search' className={classNames({ active: !hasValue })} />
|
<Icon id='search' className={classNames({ active: !hasValue })} />
|
||||||
<Icon id='times-circle' aria-label={intl.formatMessage(messages.search)} className={classNames({ active: hasValue })} />
|
<Icon id='times-circle' aria-label={intl.formatMessage(messages.search)} className={classNames({ active: hasValue })} />
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -60,7 +60,7 @@ class ListEditor extends ImmutablePureComponent {
|
||||||
{accountIds.map(accountId => <AccountContainer key={accountId} accountId={accountId} added />)}
|
{accountIds.map(accountId => <AccountContainer key={accountId} accountId={accountId} added />)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{showSearch && <div role='button' tabIndex='-1' className='drawer__backdrop' onClick={onClear} />}
|
{showSearch && <div role='button' tabIndex={-1} className='drawer__backdrop' onClick={onClear} />}
|
||||||
|
|
||||||
<Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
|
<Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
|
||||||
{({ x }) =>
|
{({ x }) =>
|
||||||
|
|
|
@ -177,11 +177,11 @@ class ListTimeline extends React.PureComponent {
|
||||||
multiColumn={multiColumn}
|
multiColumn={multiColumn}
|
||||||
>
|
>
|
||||||
<div className='column-settings__row column-header__links'>
|
<div className='column-settings__row column-header__links'>
|
||||||
<button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleEditClick}>
|
<button className='text-btn column-header__setting-btn' tabIndex={0} onClick={this.handleEditClick}>
|
||||||
<Icon id='pencil' /> <FormattedMessage id='lists.edit' defaultMessage='Edit list' />
|
<Icon id='pencil' /> <FormattedMessage id='lists.edit' defaultMessage='Edit list' />
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.handleDeleteClick}>
|
<button className='text-btn column-header__setting-btn' tabIndex={0} onClick={this.handleDeleteClick}>
|
||||||
<Icon id='trash' /> <FormattedMessage id='lists.delete' defaultMessage='Delete list' />
|
<Icon id='trash' /> <FormattedMessage id='lists.delete' defaultMessage='Delete list' />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -60,7 +60,7 @@ export default class LocalSettingsPage extends React.PureComponent {
|
||||||
<a
|
<a
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
role='button'
|
role='button'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
className={finalClassName}
|
className={finalClassName}
|
||||||
title={title}
|
title={title}
|
||||||
aria-label={title}
|
aria-label={title}
|
||||||
|
|
|
@ -91,7 +91,7 @@ export default class AdminReport extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className={classNames('notification notification-admin-report focusable', { unread })} tabIndex='0'>
|
<div className={classNames('notification notification-admin-report focusable', { unread })} tabIndex={0}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon id='flag' fixedWidth />
|
<Icon id='flag' fixedWidth />
|
||||||
|
|
|
@ -78,7 +78,7 @@ export default class NotificationFollow extends ImmutablePureComponent {
|
||||||
// Renders.
|
// Renders.
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className={classNames('notification notification-admin-sign-up focusable', { unread })} tabIndex='0'>
|
<div className={classNames('notification notification-admin-sign-up focusable', { unread })} tabIndex={0}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon fixedWidth id='user-plus' />
|
<Icon fixedWidth id='user-plus' />
|
||||||
|
|
|
@ -11,7 +11,7 @@ export default class ClearColumnButton extends React.Component {
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<button className='text-btn column-header__setting-btn' tabIndex='0' onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>
|
<button className='text-btn column-header__setting-btn' tabIndex={0} onClick={this.props.onClick}><Icon id='eraser' /> <FormattedMessage id='notifications.clear' defaultMessage='Clear notifications' /></button>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ export default class NotificationFollow extends ImmutablePureComponent {
|
||||||
// Renders.
|
// Renders.
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className={classNames('notification notification-follow focusable', { unread })} tabIndex='0'>
|
<div className={classNames('notification notification-follow focusable', { unread })} tabIndex={0}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon fixedWidth id='user-plus' />
|
<Icon fixedWidth id='user-plus' />
|
||||||
|
|
|
@ -95,7 +95,7 @@ class FollowRequest extends ImmutablePureComponent {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<HotKeys handlers={this.getHandlers()}>
|
<HotKeys handlers={this.getHandlers()}>
|
||||||
<div className={classNames('notification notification-follow-request focusable', { unread })} tabIndex='0'>
|
<div className={classNames('notification notification-follow-request focusable', { unread })} tabIndex={0}>
|
||||||
<div className='notification__message'>
|
<div className='notification__message'>
|
||||||
<div className='notification__favourite-icon-wrapper'>
|
<div className='notification__favourite-icon-wrapper'>
|
||||||
<Icon id='user' fixedWidth />
|
<Icon id='user' fixedWidth />
|
||||||
|
|
|
@ -10,7 +10,7 @@ export default class GrantPermissionButton extends React.PureComponent {
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
<button className='text-btn column-header__permission-btn' tabIndex='0' onClick={this.props.onClick}>
|
<button className='text-btn column-header__permission-btn' tabIndex={0} onClick={this.props.onClick}>
|
||||||
<FormattedMessage id='notifications.grant_permission' defaultMessage='Grant permission.' />
|
<FormattedMessage id='notifications.grant_permission' defaultMessage='Grant permission.' />
|
||||||
</button>
|
</button>
|
||||||
);
|
);
|
||||||
|
|
|
@ -59,7 +59,7 @@ class PinnedAccountsEditor extends ImmutablePureComponent {
|
||||||
{accountIds.map(accountId => <AccountContainer key={accountId} accountId={accountId} added />)}
|
{accountIds.map(accountId => <AccountContainer key={accountId} accountId={accountId} added />)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{showSearch && <div role='button' tabIndex='-1' className='drawer__backdrop' onClick={onClear} />}
|
{showSearch && <div role='button' tabIndex={-1} className='drawer__backdrop' onClick={onClear} />}
|
||||||
|
|
||||||
<Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
|
<Motion defaultStyle={{ x: -100 }} style={{ x: spring(showSearch ? 0 : -100, { stiffness: 210, damping: 20 }) }}>
|
||||||
{({ x }) =>
|
{({ x }) =>
|
||||||
|
|
|
@ -40,7 +40,7 @@ export default class Option extends React.PureComponent {
|
||||||
|
|
||||||
<span
|
<span
|
||||||
className={classNames('poll__input', { active: checked, checkbox: multiple })}
|
className={classNames('poll__input', { active: checked, checkbox: multiple })}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
role='radio'
|
role='radio'
|
||||||
onKeyPress={this.handleKeyPress}
|
onKeyPress={this.handleKeyPress}
|
||||||
aria-checked={checked}
|
aria-checked={checked}
|
||||||
|
|
|
@ -700,7 +700,7 @@ class Status extends ImmutablePureComponent {
|
||||||
{ancestors}
|
{ancestors}
|
||||||
|
|
||||||
<HotKeys handlers={handlers}>
|
<HotKeys handlers={handlers}>
|
||||||
<div className='focusable' tabIndex='0' aria-label={textForScreenReader(intl, status, false, isExpanded)}>
|
<div className='focusable' tabIndex={0} aria-label={textForScreenReader(intl, status, false, isExpanded)}>
|
||||||
<DetailedStatus
|
<DetailedStatus
|
||||||
key={`details-${status.get('id')}`}
|
key={`details-${status.get('id')}`}
|
||||||
status={status}
|
status={status}
|
||||||
|
|
|
@ -36,7 +36,7 @@ export default class ActionsModal extends ImmutablePureComponent {
|
||||||
if (!contents) {
|
if (!contents) {
|
||||||
contents = (
|
contents = (
|
||||||
<React.Fragment>
|
<React.Fragment>
|
||||||
{icon && <IconButton title={text} icon={icon} role='presentation' tabIndex='-1' inverted />}
|
{icon && <IconButton title={text} icon={icon} role='presentation' tabIndex={-1} inverted />}
|
||||||
<div>
|
<div>
|
||||||
<div className={classNames({ 'actions-modal__item-label': !!meta })}>{text}</div>
|
<div className={classNames({ 'actions-modal__item-label': !!meta })}>{text}</div>
|
||||||
<div>{meta}</div>
|
<div>{meta}</div>
|
||||||
|
|
|
@ -32,7 +32,7 @@ const ColumnLink = ({ icon, text, to, onClick, href, method, badge, transparent,
|
||||||
return onClick(e);
|
return onClick(e);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<a href='#' onClick={onClick && handleOnClick} className={className} title={text} {...other} tabIndex='0'>
|
<a href='#' onClick={onClick && handleOnClick} className={className} title={text} {...other} tabIndex={0}>
|
||||||
{iconElement}
|
{iconElement}
|
||||||
<span>{text}</span>
|
<span>{text}</span>
|
||||||
{badgeElement}
|
{badgeElement}
|
||||||
|
|
|
@ -140,8 +140,8 @@ class MediaModal extends ImmutablePureComponent {
|
||||||
|
|
||||||
const index = this.getIndex();
|
const index = this.getIndex();
|
||||||
|
|
||||||
const leftNav = media.size > 1 && <button tabIndex='0' className='media-modal__nav media-modal__nav--left' onClick={this.handlePrevClick} aria-label={intl.formatMessage(messages.previous)}><Icon id='chevron-left' fixedWidth /></button>;
|
const leftNav = media.size > 1 && <button tabIndex={0} className='media-modal__nav media-modal__nav--left' onClick={this.handlePrevClick} aria-label={intl.formatMessage(messages.previous)}><Icon id='chevron-left' fixedWidth /></button>;
|
||||||
const rightNav = media.size > 1 && <button tabIndex='0' className='media-modal__nav media-modal__nav--right' onClick={this.handleNextClick} aria-label={intl.formatMessage(messages.next)}><Icon id='chevron-right' fixedWidth /></button>;
|
const rightNav = media.size > 1 && <button tabIndex={0} className='media-modal__nav media-modal__nav--right' onClick={this.handleNextClick} aria-label={intl.formatMessage(messages.next)}><Icon id='chevron-right' fixedWidth /></button>;
|
||||||
|
|
||||||
const content = media.map((image) => {
|
const content = media.map((image) => {
|
||||||
const width = image.getIn(['meta', 'original', 'width']) || null;
|
const width = image.getIn(['meta', 'original', 'width']) || null;
|
||||||
|
|
|
@ -83,7 +83,7 @@ export default class ModalRoot extends React.PureComponent {
|
||||||
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
|
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
|
||||||
} else {
|
} else {
|
||||||
document.body.classList.remove('with-modals--active');
|
document.body.classList.remove('with-modals--active');
|
||||||
document.documentElement.style.marginRight = 0;
|
document.documentElement.style.marginRight = '0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -299,7 +299,7 @@ class OnboardingModal extends React.PureComponent {
|
||||||
<div
|
<div
|
||||||
key={`dot-${i}`}
|
key={`dot-${i}`}
|
||||||
role='button'
|
role='button'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
data-index={i}
|
data-index={i}
|
||||||
onClick={this.handleDot}
|
onClick={this.handleDot}
|
||||||
className={className}
|
className={className}
|
||||||
|
|
|
@ -600,7 +600,7 @@ class Video extends React.PureComponent {
|
||||||
preload={preload}
|
preload={preload}
|
||||||
loop
|
loop
|
||||||
role='button'
|
role='button'
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
aria-label={alt}
|
aria-label={alt}
|
||||||
title={alt}
|
title={alt}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
|
@ -629,7 +629,7 @@ class Video extends React.PureComponent {
|
||||||
|
|
||||||
<span
|
<span
|
||||||
className={classNames('video-player__seek__handle', { active: dragging })}
|
className={classNames('video-player__seek__handle', { active: dragging })}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
style={{ left: `${progress}%` }}
|
style={{ left: `${progress}%` }}
|
||||||
onKeyDown={this.handleVideoKeyDown}
|
onKeyDown={this.handleVideoKeyDown}
|
||||||
/>
|
/>
|
||||||
|
@ -645,7 +645,7 @@ class Video extends React.PureComponent {
|
||||||
|
|
||||||
<span
|
<span
|
||||||
className={classNames('video-player__volume__handle')}
|
className={classNames('video-player__volume__handle')}
|
||||||
tabIndex='0'
|
tabIndex={0}
|
||||||
style={{ left: `${volume * 100}%` }}
|
style={{ left: `${volume * 100}%` }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
* @property {boolean=} delete_modal
|
* @property {boolean=} delete_modal
|
||||||
* @property {boolean=} disable_swiping
|
* @property {boolean=} disable_swiping
|
||||||
* @property {string=} disabled_account_id
|
* @property {string=} disabled_account_id
|
||||||
* @property {boolean} display_media
|
* @property {string} display_media
|
||||||
* @property {string} domain
|
* @property {string} domain
|
||||||
* @property {boolean=} expand_spoilers
|
* @property {boolean=} expand_spoilers
|
||||||
* @property {boolean} limited_federation_mode
|
* @property {boolean} limited_federation_mode
|
||||||
|
|
|
@ -12,7 +12,6 @@ function importExtraPolyfills() {
|
||||||
|
|
||||||
function loadPolyfills() {
|
function loadPolyfills() {
|
||||||
const needsBasePolyfills = !(
|
const needsBasePolyfills = !(
|
||||||
Array.prototype.includes &&
|
|
||||||
HTMLCanvasElement.prototype.toBlob &&
|
HTMLCanvasElement.prototype.toBlob &&
|
||||||
window.Intl &&
|
window.Intl &&
|
||||||
Object.assign &&
|
Object.assign &&
|
||||||
|
|
|
@ -1 +1,206 @@
|
||||||
{}
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
|
"settings.content_warnings": "Content warnings",
|
||||||
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
|
}
|
||||||
|
|
|
@ -1 +1,206 @@
|
||||||
{}
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
|
"settings.content_warnings": "Content warnings",
|
||||||
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,206 @@
|
||||||
{
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
"settings.content_warnings": "Content warnings",
|
"settings.content_warnings": "Content warnings",
|
||||||
"settings.preferences": "Preferences"
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,206 @@
|
||||||
{
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
"settings.content_warnings": "Content warnings",
|
"settings.content_warnings": "Content warnings",
|
||||||
"settings.preferences": "Preferences"
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1,206 @@
|
||||||
{}
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
|
"settings.content_warnings": "Content warnings",
|
||||||
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,206 @@
|
||||||
{
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
"settings.content_warnings": "Content warnings",
|
"settings.content_warnings": "Content warnings",
|
||||||
"settings.preferences": "Preferences"
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,206 @@
|
||||||
{
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
"settings.content_warnings": "Content warnings",
|
"settings.content_warnings": "Content warnings",
|
||||||
"settings.preferences": "Preferences"
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,206 @@
|
||||||
{
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
"settings.content_warnings": "Content warnings",
|
"settings.content_warnings": "Content warnings",
|
||||||
"settings.preferences": "Preferences"
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1,206 @@
|
||||||
{}
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
|
"settings.content_warnings": "Content warnings",
|
||||||
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,206 @@
|
||||||
{
|
{
|
||||||
|
"about.fork_disclaimer": "Glitch-soc is free open source software forked from Mastodon.",
|
||||||
|
"account.add_account_note": "Add note for @{name}",
|
||||||
|
"account.disclaimer_full": "Information below may reflect the user's profile incompletely.",
|
||||||
|
"account.follows": "Follows",
|
||||||
|
"account.joined": "Joined {date}",
|
||||||
|
"account.suspended_disclaimer_full": "This user has been suspended by a moderator.",
|
||||||
|
"account.view_full_profile": "View full profile",
|
||||||
|
"account_note.cancel": "Cancel",
|
||||||
|
"account_note.edit": "Edit",
|
||||||
|
"account_note.glitch_placeholder": "No comment provided",
|
||||||
|
"account_note.save": "Save",
|
||||||
|
"advanced_options.icon_title": "Advanced options",
|
||||||
|
"advanced_options.local-only.long": "Do not post to other instances",
|
||||||
|
"advanced_options.local-only.short": "Local-only",
|
||||||
|
"advanced_options.local-only.tooltip": "This post is local-only",
|
||||||
|
"advanced_options.threaded_mode.long": "Automatically opens a reply on posting",
|
||||||
|
"advanced_options.threaded_mode.short": "Threaded mode",
|
||||||
|
"advanced_options.threaded_mode.tooltip": "Threaded mode enabled",
|
||||||
|
"boost_modal.missing_description": "This toot contains some media without description",
|
||||||
|
"column.favourited_by": "Favourited by",
|
||||||
|
"column.heading": "Misc",
|
||||||
|
"column.reblogged_by": "Boosted by",
|
||||||
|
"column.subheading": "Miscellaneous options",
|
||||||
|
"column_header.profile": "Profile",
|
||||||
|
"column_subheading.lists": "Lists",
|
||||||
|
"column_subheading.navigation": "Navigation",
|
||||||
|
"community.column_settings.allow_local_only": "Show local-only toots",
|
||||||
|
"compose.attach": "Attach...",
|
||||||
|
"compose.attach.doodle": "Draw something",
|
||||||
|
"compose.attach.upload": "Upload a file",
|
||||||
|
"compose.content-type.html": "HTML",
|
||||||
|
"compose.content-type.markdown": "Markdown",
|
||||||
|
"compose.content-type.plain": "Plain text",
|
||||||
|
"compose_form.poll.multiple_choices": "Allow multiple choices",
|
||||||
|
"compose_form.poll.single_choice": "Allow one choice",
|
||||||
|
"compose_form.spoiler": "Hide text behind warning",
|
||||||
|
"confirmation_modal.do_not_ask_again": "Do not ask for confirmation again",
|
||||||
|
"confirmations.deprecated_settings.confirm": "Use Mastodon preferences",
|
||||||
|
"confirmations.deprecated_settings.message": "Some of the glitch-soc device-specific {app_settings} you are using have been replaced by Mastodon {preferences} and will be overriden:",
|
||||||
|
"confirmations.missing_media_description.confirm": "Send anyway",
|
||||||
|
"confirmations.missing_media_description.edit": "Edit media",
|
||||||
|
"confirmations.missing_media_description.message": "At least one media attachment is lacking a description. Consider describing all media attachments for the visually impaired before sending your toot.",
|
||||||
|
"confirmations.unfilter.author": "Author",
|
||||||
|
"confirmations.unfilter.confirm": "Show",
|
||||||
|
"confirmations.unfilter.edit_filter": "Edit filter",
|
||||||
|
"confirmations.unfilter.filters": "Matching {count, plural, one {filter} other {filters}}",
|
||||||
|
"content-type.change": "Content type",
|
||||||
|
"direct.group_by_conversations": "Group by conversation",
|
||||||
|
"endorsed_accounts_editor.endorsed_accounts": "Featured accounts",
|
||||||
|
"favourite_modal.combo": "You can press {combo} to skip this next time",
|
||||||
|
"getting_started.onboarding": "Show me around",
|
||||||
|
"home.column_settings.advanced": "Advanced",
|
||||||
|
"home.column_settings.filter_regex": "Filter out by regular expressions",
|
||||||
|
"home.column_settings.show_direct": "Show DMs",
|
||||||
|
"home.settings": "Column settings",
|
||||||
|
"keyboard_shortcuts.bookmark": "to bookmark",
|
||||||
|
"keyboard_shortcuts.secondary_toot": "to send toot using secondary privacy setting",
|
||||||
|
"keyboard_shortcuts.toggle_collapse": "to collapse/uncollapse toots",
|
||||||
|
"layout.auto": "Auto",
|
||||||
|
"layout.desktop": "Desktop",
|
||||||
|
"layout.hint.auto": "Automatically chose layout based on “Enable advanced web interface” setting and screen size.",
|
||||||
|
"layout.hint.desktop": "Use multiple-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.hint.single": "Use single-column layout regardless of the “Enable advanced web interface” setting or screen size.",
|
||||||
|
"layout.single": "Mobile",
|
||||||
|
"media_gallery.sensitive": "Sensitive",
|
||||||
|
"moved_to_warning": "This account is marked as moved to {moved_to_link}, and may thus not accept new follows.",
|
||||||
|
"navigation_bar.app_settings": "App settings",
|
||||||
|
"navigation_bar.featured_users": "Featured users",
|
||||||
|
"navigation_bar.keyboard_shortcuts": "Keyboard shortcuts",
|
||||||
|
"navigation_bar.misc": "Misc",
|
||||||
|
"notification.markForDeletion": "Mark for deletion",
|
||||||
|
"notification_purge.btn_all": "Select\nall",
|
||||||
|
"notification_purge.btn_apply": "Clear\nselected",
|
||||||
|
"notification_purge.btn_invert": "Invert\nselection",
|
||||||
|
"notification_purge.btn_none": "Select\nnone",
|
||||||
|
"notification_purge.start": "Enter notification cleaning mode",
|
||||||
|
"notifications.marked_clear": "Clear selected notifications",
|
||||||
|
"notifications.marked_clear_confirmation": "Are you sure you want to permanently clear all selected notifications?",
|
||||||
|
"onboarding.done": "Done",
|
||||||
|
"onboarding.next": "Next",
|
||||||
|
"onboarding.page_five.public_timelines": "The local timeline shows public posts from everyone on {domain}. The federated timeline shows public posts from everyone who people on {domain} follow. These are the Public Timelines, a great way to discover new people.",
|
||||||
|
"onboarding.page_four.home": "The home timeline shows posts from people you follow.",
|
||||||
|
"onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.",
|
||||||
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
"onboarding.page_one.federation": "{domain} is an \"instance\" of Mastodon. Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.",
|
||||||
|
"onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}",
|
||||||
|
"onboarding.page_one.welcome": "Welcome to {domain}!",
|
||||||
|
"onboarding.page_six.admin": "Your instance's admin is {admin}.",
|
||||||
|
"onboarding.page_six.almost_done": "Almost done...",
|
||||||
|
"onboarding.page_six.appetoot": "Bon Appetoot!",
|
||||||
|
"onboarding.page_six.apps_available": "There are {apps} available for iOS, Android and other platforms.",
|
||||||
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
"onboarding.page_six.github": "{domain} runs on Glitchsoc. Glitchsoc is a friendly {fork} of {Mastodon}. Glitchsoc is fully compatible with all Mastodon apps and instances. Glitchsoc is free open-source software. You can report bugs, request features, or contribute to the code on {github}.",
|
||||||
|
"onboarding.page_six.guidelines": "community guidelines",
|
||||||
|
"onboarding.page_six.read_guidelines": "Please read {domain}'s {guidelines}!",
|
||||||
|
"onboarding.page_six.various_app": "mobile apps",
|
||||||
|
"onboarding.page_three.profile": "Edit your profile to change your avatar, bio, and display name. There, you will also find other preferences.",
|
||||||
|
"onboarding.page_three.search": "Use the search bar to find people and look at hashtags, such as {illustration} and {introductions}. To look for a person who is not on this instance, use their full handle.",
|
||||||
|
"onboarding.page_two.compose": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.",
|
||||||
|
"onboarding.skip": "Skip",
|
||||||
|
"search_popout.search_format": "Advanced search format",
|
||||||
|
"search_popout.tips.full_text": "Simple text returns statuses you have written, favourited, boosted, or have been mentioned in, as well as matching usernames, display names, and hashtags.",
|
||||||
|
"search_popout.tips.hashtag": "hashtag",
|
||||||
|
"search_popout.tips.status": "status",
|
||||||
|
"search_popout.tips.text": "Simple text returns matching display names, usernames and hashtags",
|
||||||
|
"search_popout.tips.user": "user",
|
||||||
|
"settings.always_show_spoilers_field": "Always enable the Content Warning field",
|
||||||
|
"settings.auto_collapse": "Automatic collapsing",
|
||||||
|
"settings.auto_collapse_all": "Everything",
|
||||||
|
"settings.auto_collapse_height": "Height (in pixels) for a toot to be considered lengthy",
|
||||||
|
"settings.auto_collapse_lengthy": "Lengthy toots",
|
||||||
|
"settings.auto_collapse_media": "Toots with media",
|
||||||
|
"settings.auto_collapse_notifications": "Notifications",
|
||||||
|
"settings.auto_collapse_reblogs": "Boosts",
|
||||||
|
"settings.auto_collapse_replies": "Replies",
|
||||||
|
"settings.close": "Close",
|
||||||
|
"settings.collapsed_statuses": "Collapsed toots",
|
||||||
|
"settings.compose_box_opts": "Compose box",
|
||||||
|
"settings.confirm_before_clearing_draft": "Show confirmation dialog before overwriting the message being composed",
|
||||||
|
"settings.confirm_boost_missing_media_description": "Show confirmation dialog before boosting toots lacking media descriptions",
|
||||||
|
"settings.confirm_missing_media_description": "Show confirmation dialog before sending toots lacking media descriptions",
|
||||||
"settings.content_warnings": "Content warnings",
|
"settings.content_warnings": "Content warnings",
|
||||||
"settings.preferences": "Preferences"
|
"settings.content_warnings.regexp": "Regular expression",
|
||||||
|
"settings.content_warnings_filter": "Content warnings to not automatically unfold:",
|
||||||
|
"settings.content_warnings_media_outside": "Display media attachments outside content warnings",
|
||||||
|
"settings.content_warnings_media_outside_hint": "Reproduce upstream Mastodon behavior by having the Content Warning toggle not affect media attachments",
|
||||||
|
"settings.content_warnings_shared_state": "Show/hide content of all copies at once",
|
||||||
|
"settings.content_warnings_shared_state_hint": "Reproduce upstream Mastodon behavior by having the Content Warning button affect all copies of a post at once. This will prevent automatic collapsing of any copy of a toot with unfolded CW",
|
||||||
|
"settings.content_warnings_unfold_opts": "Auto-unfolding options",
|
||||||
|
"settings.deprecated_setting": "This setting is now controlled from Mastodon's {settings_page_link}",
|
||||||
|
"settings.enable_collapsed": "Enable collapsed toots",
|
||||||
|
"settings.enable_collapsed_hint": "Collapsed posts have parts of their contents hidden to take up less screen space. This is distinct from the Content Warning feature",
|
||||||
|
"settings.enable_content_warnings_auto_unfold": "Automatically unfold content-warnings",
|
||||||
|
"settings.general": "General",
|
||||||
|
"settings.hicolor_privacy_icons": "High color privacy icons",
|
||||||
|
"settings.hicolor_privacy_icons.hint": "Display privacy icons in bright and easily distinguishable colors",
|
||||||
|
"settings.image_backgrounds": "Image backgrounds",
|
||||||
|
"settings.image_backgrounds_media": "Preview collapsed toot media",
|
||||||
|
"settings.image_backgrounds_media_hint": "If the post has any media attachment, use the first one as a background",
|
||||||
|
"settings.image_backgrounds_users": "Give collapsed toots an image background",
|
||||||
|
"settings.inline_preview_cards": "Inline preview cards for external links",
|
||||||
|
"settings.layout": "Layout:",
|
||||||
|
"settings.layout_opts": "Layout options",
|
||||||
|
"settings.media": "Media",
|
||||||
|
"settings.media_fullwidth": "Full-width media previews",
|
||||||
|
"settings.media_letterbox": "Letterbox media",
|
||||||
|
"settings.media_letterbox_hint": "Scale down and letterbox media to fill the image containers instead of stretching and cropping them",
|
||||||
|
"settings.media_reveal_behind_cw": "Reveal sensitive media behind a CW by default",
|
||||||
|
"settings.notifications.favicon_badge": "Unread notifications favicon badge",
|
||||||
|
"settings.notifications.favicon_badge.hint": "Add a badge for unread notifications to the favicon",
|
||||||
|
"settings.notifications.tab_badge": "Unread notifications badge",
|
||||||
|
"settings.notifications.tab_badge.hint": "Display a badge for unread notifications in the column icons when the notifications column isn't open",
|
||||||
|
"settings.notifications_opts": "Notifications options",
|
||||||
|
"settings.pop_in_left": "Left",
|
||||||
|
"settings.pop_in_player": "Enable pop-in player",
|
||||||
|
"settings.pop_in_position": "Pop-in player position:",
|
||||||
|
"settings.pop_in_right": "Right",
|
||||||
|
"settings.preferences": "Preferences",
|
||||||
|
"settings.prepend_cw_re": "Prepend “re: ” to content warnings when replying",
|
||||||
|
"settings.preselect_on_reply": "Pre-select usernames on reply",
|
||||||
|
"settings.preselect_on_reply_hint": "When replying to a conversation with multiple participants, pre-select usernames past the first",
|
||||||
|
"settings.rewrite_mentions": "Rewrite mentions in displayed statuses",
|
||||||
|
"settings.rewrite_mentions_acct": "Rewrite with username and domain (when the account is remote)",
|
||||||
|
"settings.rewrite_mentions_no": "Do not rewrite mentions",
|
||||||
|
"settings.rewrite_mentions_username": "Rewrite with username",
|
||||||
|
"settings.shared_settings_link": "user preferences",
|
||||||
|
"settings.show_action_bar": "Show action buttons in collapsed toots",
|
||||||
|
"settings.show_content_type_choice": "Show content-type choice when authoring toots",
|
||||||
|
"settings.show_reply_counter": "Display an estimate of the reply count",
|
||||||
|
"settings.side_arm": "Secondary toot button:",
|
||||||
|
"settings.side_arm.none": "None",
|
||||||
|
"settings.side_arm_reply_mode": "When replying to a toot, the secondary toot button should:",
|
||||||
|
"settings.side_arm_reply_mode.copy": "Copy privacy setting of the toot being replied to",
|
||||||
|
"settings.side_arm_reply_mode.keep": "Keep its set privacy",
|
||||||
|
"settings.side_arm_reply_mode.restrict": "Restrict privacy setting to that of the toot being replied to",
|
||||||
|
"settings.status_icons": "Toot icons",
|
||||||
|
"settings.status_icons_language": "Language indicator",
|
||||||
|
"settings.status_icons_local_only": "Local-only indicator",
|
||||||
|
"settings.status_icons_media": "Media and poll indicators",
|
||||||
|
"settings.status_icons_reply": "Reply indicator",
|
||||||
|
"settings.status_icons_visibility": "Toot privacy indicator",
|
||||||
|
"settings.swipe_to_change_columns": "Allow swiping to change columns (Mobile only)",
|
||||||
|
"settings.tag_misleading_links": "Tag misleading links",
|
||||||
|
"settings.tag_misleading_links.hint": "Add a visual indication with the link target host to every link not mentioning it explicitly",
|
||||||
|
"settings.wide_view": "Wide view (Desktop mode only)",
|
||||||
|
"settings.wide_view_hint": "Stretches columns to better fill the available space.",
|
||||||
|
"status.collapse": "Collapse",
|
||||||
|
"status.has_audio": "Features attached audio files",
|
||||||
|
"status.has_pictures": "Features attached pictures",
|
||||||
|
"status.has_preview_card": "Features an attached preview card",
|
||||||
|
"status.has_video": "Features attached videos",
|
||||||
|
"status.in_reply_to": "This toot is a reply",
|
||||||
|
"status.is_poll": "This toot is a poll",
|
||||||
|
"status.local_only": "Only visible from your instance",
|
||||||
|
"status.sensitive_toggle": "Click to view",
|
||||||
|
"status.uncollapse": "Uncollapse",
|
||||||
|
"web_app_crash.change_your_settings": "Change your {settings}",
|
||||||
|
"web_app_crash.content": "You could try any of the following:",
|
||||||
|
"web_app_crash.debug_info": "Debug information",
|
||||||
|
"web_app_crash.disable_addons": "Disable browser add-ons or built-in translation tools",
|
||||||
|
"web_app_crash.issue_tracker": "issue tracker",
|
||||||
|
"web_app_crash.reload": "Reload",
|
||||||
|
"web_app_crash.reload_page": "{reload} the current page",
|
||||||
|
"web_app_crash.report_issue": "Report a bug in the {issuetracker}",
|
||||||
|
"web_app_crash.settings": "settings",
|
||||||
|
"web_app_crash.title": "We're sorry, but something went wrong with the Mastodon app."
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue